1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-19 17:39:23 +03:00

Began parsing dialogue choices

This commit is contained in:
Graham Nelson 2022-09-14 11:03:49 +01:00
parent aaf708d3e6
commit 1e278c663c
57 changed files with 1600 additions and 893 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6V59 'Krypton' (13 September 2022)
[Version](notes/versioning.md): 10.2.0-beta+6V60 'Krypton' (14 September 2022)
## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 13 September 2022
Build Number: 6V59
Build Date: 14 September 2022
Build Number: 6V60

View file

@ -218,6 +218,9 @@ organisation, and are not directly functional in themselves.
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIALOGUE_CUE_NT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_pass_state</span><span class="plain-syntax">.</span><span class="element-syntax">pass</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">DialogueBeats::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIALOGUE_CHOICE_NT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_pass_state</span><span class="plain-syntax">.</span><span class="element-syntax">pass</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">DialogueChoices::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIALOGUE_LINE_NT:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_pass_state</span><span class="plain-syntax">.</span><span class="element-syntax">pass</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">DialogueLines::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>

View file

@ -289,7 +289,9 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="definition-keyword">enum</span> <span class="constant-syntax">auxiliary_file_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">cached_understanding_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_beat_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_choice_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_line_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_node_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">direction_inference_data_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">explicit_action_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">found_in_inference_data_CLASS</span>
@ -328,7 +330,9 @@ We begin with <a href="index.html" class="internal">core</a> itself.
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">auxiliary_file</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">cached_understanding</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_beat</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_choice</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_line</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_node</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">direction_inference_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">found_in_inference_data</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="identifier-syntax">cg_line</span><span class="plain-syntax">)</span>

View file

@ -392,6 +392,7 @@ which compilation unit the node belongs.
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">classified_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: this sentence has been classified</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">clears_pronouns_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: this sentence erases the current value of "it"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_beat_clause_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: for clauses of dialogue cues introducing beats</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: for clauses of dialogue choice points</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">dialogue_line_clause_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: for clauses of dialogue lines</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">impdef_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">imperative_defn</span></span><span class="comment-syntax">: for blocks of imperative code</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">implicit_in_creation_of_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">inference_subject</span></span><span class="comment-syntax">: for assemblies</span>
@ -425,6 +426,8 @@ which compilation unit the node belongs.
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">dialogue_line_clause_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP13" class="function-link"><span class="function-syntax">CoreSyntax::write_dialogue_line_clause_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP13" class="function-link"><span class="function-syntax">CoreSyntax::write_dialogue_choice_clause_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">impdef_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP13" class="function-link"><span class="function-syntax">CoreSyntax::write_impdef_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">implicit_in_creation_of_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP13" class="function-link"><span class="function-syntax">CoreSyntax::write_implicit_in_creation_of_ANNOT</span></a><span class="plain-syntax">);</span>
@ -459,6 +462,13 @@ which compilation unit the node belongs.
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}"</span><span class="plain-syntax">);</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">CoreSyntax::write_dialogue_choice_clause_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</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">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {choice clause: "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DialogueChoices::write_dcc</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}"</span><span class="plain-syntax">);</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">CoreSyntax::write_impdef_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</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">Node::get_impdef</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {imperative definition: %d}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_impdef</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
@ -496,6 +506,7 @@ which compilation unit the node belongs.
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">classified_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_beat_clause_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_line_clause_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Annotations of Level 3 nodes. </b></p>

View file

@ -217,7 +217,7 @@ scenes &mdash; to express which, the <a href="3-scn.html#SP10" class="internal">
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Instances::get_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">sc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_instance</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure scene is accessed in 6/dlg, 6/db, 6/dl, 6/ps and here.</li><li>The structure scene_end is private to this section.</li><li>The structure scene_connector is accessed in 2/ri, 3/tm, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 5/us, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure scene is accessed in 6/dlg, 6/db, 6/dl, 6/ps and here.</li><li>The structure scene_end is private to this section.</li><li>The structure scene_connector is accessed in 2/ri, 3/tm, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 5/us, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>A feature called <span class="extract"><span class="extract-syntax">xyzzy</span></span> generally has a hunk of subject data called <span class="extract"><span class="extract-syntax">xyzzy_data</span></span>,
so we would normally have a structure called <span class="extract"><span class="extract-syntax">scenes_data</span></span>, but in fact that
structure is just going to be <a href="3-scn.html#SP10" class="internal">scene</a>. So:

View file

@ -86,7 +86,7 @@ kind <span class="extract"><span class="extract-syntax">K_action_name</span></sp
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">action_name</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure action_name is accessed in 4/ap, 4/as, 4/av, 4/ann, 4/anl, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure action_name is accessed in 4/ap, 4/as, 4/av, 4/ann, 4/anl, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Note that we notify the <span class="extract"><span class="extract-syntax">K_action_name</span></span> kind that a new enumerated value
for it exists; we don't need to record the reply (i.e. the number used as
this value at run-time) because it will be the same as the allocation ID

View file

@ -145,7 +145,7 @@ values.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">ap_clause</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure ap_clause is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/ap2, 4/anl, 4/pc, 4/ea, 4/gng, 5/us, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure ap_clause is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/ap2, 4/anl, 4/pc, 4/ea, 4/gng, 5/us, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>This loop conveniently runs through the clauses for <span class="extract"><span class="extract-syntax">ap</span></span>:
</p>

View file

@ -80,7 +80,7 @@ this category if it matches one of the patterns.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">named_action_pattern_entry</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure named_action_pattern is accessed in 4/ap, 4/anaa, 4/act, 4/as, 4/ann, 4/anl, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl and here.</li><li>The structure named_action_pattern_entry is private to this section.</li></ul>
<ul class="endnotetexts"><li>The structure named_action_pattern is accessed in 4/ap, 4/anaa, 4/act, 4/as, 4/ann, 4/anl, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl, 6/dc and here.</li><li>The structure named_action_pattern_entry is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>We are allowed to give names to certain kinds of behaviour by "characterising"
an action.
</p>

View file

@ -131,7 +131,7 @@ form, so this is not as bloated a structure as it looks.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">command_grammar</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure command_grammar is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cgl, 5/ts, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure command_grammar is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cgl, 5/ts, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>We begin as usual with a constructor and some debug log tracing.
</p>

View file

@ -126,7 +126,7 @@ removing it from action. That's a feature only seen in lines for
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">cg_line</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure cg_line is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/us, 5/cg, 5/ts, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure cg_line is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/us, 5/cg, 5/ts, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -138,7 +138,7 @@ and in particular, to every object instance and every kind of object.
<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>
</pre>
<ul class="endnotetexts"><li>The structure parsing_data is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure parsing_data is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>We make use of a new kind of rvalue in this feature: <span class="extract"><span class="extract-syntax">K_understanding</span></span>. This
is created in <a href="../kinds-module/2-fk.html" class="internal">Familiar Kinds (in kinds)</a>, not here, but we do have to provide
the following functions to handle its constant rvalues. These correspond to

View file

@ -70,7 +70,7 @@ stipulations on place and possessions attached.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">test_scenario</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure test_scenario is accessed in 2/bd, 3/sm, 3/tp, 3/bck, 3/rgn, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure test_scenario is accessed in 2/bd, 3/sm, 3/tp, 3/bck, 3/rgn, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -183,7 +183,7 @@ objects, which are really just unions of being a text in quotes or a property na
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ui1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure understanding_item is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure understanding_item is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>So, then, the Preform for the subject phrase is as follows:
</p>
@ -292,7 +292,7 @@ they are <a href="5-us.html#SP7" class="internal">understanding_reference</a> ob
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ur1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure understanding_reference is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 5/cgl, 6/db, 6/dl and here.</li></ul>
<ul class="endnotetexts"><li>The structure understanding_reference is accessed in 2/ri, 3/tm, 3/scn, 3/ts, 3/mhr, 4/ap, 4/av, 4/apc, 5/cgl, 6/db, 6/dl, 6/dc and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Unlike the case above, though, we will build these more complicated objects
in a multi-stage way. There is always one being built; when we're done, we
call <a href="5-us.html#SP8" class="internal">Understand::preserve_ur</a> to obtain a permanent record of it.

View file

@ -87,7 +87,7 @@ is so marked).
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">dialogue_section_being_scanned</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">previous_dialogue_beat</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">current_dialogue_beat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="6-dl.html#SP1" class="function-link"><span class="function-syntax">DialogueLines::clear_precursors</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-dn.html#SP1" class="function-link"><span class="function-syntax">DialogueNodes::clear_precursors</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Beats. </b>The following is called each time the cue paragraph for a new beat is found:
@ -117,7 +117,7 @@ each of which is a <span class="extract"><span class="extract-syntax">DIALOGUE_C
<span class="plain-syntax"> </span><span class="identifier-syntax">previous_dialogue_beat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_dialogue_beat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_dialogue_beat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">db</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="6-dl.html#SP1" class="function-link"><span class="function-syntax">DialogueLines::clear_precursors</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-dn.html#SP1" class="function-link"><span class="function-syntax">DialogueNodes::clear_precursors</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-db.html#SP3_4" class="named-paragraph-link"><span class="named-paragraph">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">3.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-db.html#SP3_7" class="named-paragraph-link"><span class="named-paragraph">Look through the clauses for a name</span><span class="named-paragraph-number">3.7</span></a></span><span class="plain-syntax">;</span>
@ -160,12 +160,12 @@ dialogue, so the internal error here should be impossible to hit.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">some_time_before</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">parse_node</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">about_list</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">parse_node</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opening_line</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">root</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">dialogue_beat_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="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_beat is accessed in 3/scn, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/dlg, 6/dl, 6/ps and here.</li></ul>
<ul class="endnotetexts"><li>The structure dialogue_beat is accessed in 3/scn, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/dlg, 6/dl, 6/dc, 6/dn, 6/ps and here.</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">Initialise the beat</span><span class="named-paragraph-number">3.3</span></span><span class="comment-syntax"> =</span>
</p>
@ -180,7 +180,7 @@ dialogue, so the internal error here should be impossible to hit.
<span class="plain-syntax"> </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">some_time_after</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">some_time_before</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">about_list</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opening_line</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">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root</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">db</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTDialogue::new_beat</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">db</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-db.html#SP3">&#167;3</a>.</li></ul>
@ -532,7 +532,7 @@ in the <span class="extract"><span class="extract-syntax">UNPARSED_NOUN_NT</span
</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">DialogueBeats::parse_topic</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">DialogueBeats::parse_topic</span></span>:<br/><a href="6-db.html#SP6">&#167;6</a><br/>Dialogue Lines - <a href="6-dl.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">about_list</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">DialogueBeats::parse_topic</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">DialogueBeats::parse_topic</span></span>:<br/><a href="6-db.html#SP6">&#167;6</a><br/>Dialogue Lines - <a href="6-dl.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">about_list</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</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">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">AND_NT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="6-db.html#SP7" class="function-link"><span class="function-syntax">DialogueBeats::parse_topic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">about_list</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-db.html#SP7" class="function-link"><span class="function-syntax">DialogueBeats::parse_topic</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">about_list</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</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="identifier-syntax">nt</span><span class="plain-syntax">);</span>
@ -664,7 +664,7 @@ that when compiling the runtime representation of a beat. See <a href="../runtim
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-dlg.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresscurrent">db</li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-dl.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="6-dlg.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresscurrent">db</li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-dc.html">dc</a></li><li class="progresssection"><a href="6-dn.html">dn</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-dl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

150
docs/if-module/6-dc.html Normal file
View file

@ -0,0 +1,150 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Dialogue Choices</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../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">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Dialogue Choices' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#6">Chapter 6: Dialogue</a></li><li><b>Dialogue Choices</b></li></ul></div>
<p class="purpose">To manage dialogue choices.</p>
<ul class="toc"><li><a href="6-dc.html#SP1">&#167;1. Scanning the dialogue choices in pass 0</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Scanning the dialogue choices in pass 0. </b>Choices have already been parsed a little. For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> -- (</span><span class="identifier-syntax">if</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">shortbread</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">carried</span><span class="plain-syntax">) </span><span class="string-syntax">"Offer the shortbread"</span>
</pre>
<p class="commentary">will have become:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> DIALOGUE_CHOICE_NT</span>
<span class="plain-syntax"> DIALOGUE_SELECTION_NT ""Offer the shortbread""</span>
<span class="plain-syntax"> DIALOGUE_CLAUSE_NT "if the shortbread is carried"</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">dialogue_choice</span><span class="plain-syntax"> *</span><span class="function-syntax">DialogueChoices::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</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">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_level_ANNOT</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">L</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</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">dialogue_choice</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_choice</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dc.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Initialise the choice</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_node</span><span class="plain-syntax"> = </span><a href="6-dn.html#SP3" class="function-link"><span class="function-syntax">DialogueNodes::add_to_current_beat</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">dc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dc.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">2.3</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">dc</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b></p>
<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">dialogue_choice</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">as_node</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">selection</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">dialogue_choice_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="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">dialogue_choice</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_choice is accessed in 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/db, 6/dl and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the choice</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">dc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_node</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">dc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">selection</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">dc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTDialogue::new_choice</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dc</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dc.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">2.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">clause</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">clause</span><span class="plain-syntax">; </span><span class="identifier-syntax">clause</span><span class="plain-syntax"> = </span><span class="identifier-syntax">clause</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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</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">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">, </span><span class="identifier-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;dialogue-choice-clause&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_choice_clause_ANNOT</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</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">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">, </span><span class="identifier-syntax">DIALOGUE_SELECTION_NT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">selection</span><span class="plain-syntax"> = </span><span class="identifier-syntax">clause</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"damaged DIALOGUE_CHOICE_NT subtree"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dc.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>As with the analogous clauses for <a href="6-db.html" class="internal">Dialogue Beats</a>, each clause can be one
of the following possibilities:
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">ANYTHING_DCC</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Using:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;dialogue-choice-clause&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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { ANYTHING_DCC, - }</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="SP5" class="paragraph-anchor"></a><b>&#167;5. </b></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">DialogueChoices::write_dcc</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ANYTHING_DCC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ANYTHING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"?"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-dl.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresscurrent">dc</li><li class="progresssection"><a href="6-dn.html">dn</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-dn.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -60,41 +60,9 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#6">Chapter 6: Dialogue</a></li><li><b>Dialogue Lines</b></li></ul></div>
<p class="purpose">To manage dialogue lines.</p>
<ul class="toc"><li><a href="6-dl.html#SP1">&#167;1. Scanning within a beat</a></li><li><a href="6-dl.html#SP2">&#167;2. Scanning the dialogue lines in pass 0</a></li><li><a href="6-dl.html#SP3">&#167;3. Processing lines after pass 1</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="6-dl.html#SP1">&#167;1. Scanning the dialogue lines in pass 0</a></li><li><a href="6-dl.html#SP2">&#167;2. Processing lines after pass 1</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Scanning within a beat. </b>Inside any given beat, we have to keep track of the indentation of lines in
order to see what is subordinate to what. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">(</span><span class="identifier-syntax">About</span><span class="plain-syntax"> </span><span class="identifier-syntax">Elsinore</span><span class="plain-syntax">.)</span>
<span class="identifier-syntax">Marcellus</span><span class="plain-syntax">: </span><span class="string-syntax">"What, has this thing appear'd again to-night?"</span>
<span class="identifier-syntax">Bernardo</span><span class="plain-syntax">: </span><span class="string-syntax">"I have seen naught but [list of things in the Battlements]."</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Marcellus</span><span class="plain-syntax">: </span><span class="string-syntax">"Horatio says 'tis but our fantasy."</span>
</pre>
<p class="commentary">Here the lines are at levels 0, 0 and 1. We actually allow them to go in as
far as <span class="extract"><span class="extract-syntax">MAX_DIALOGUE_LINE_NESTING</span></span>, which is a lot of tab stops: no human
author would want that many.
</p>
<p class="commentary">As we go through the beat looking for lines, we track the most recent line
seen at each level. These are called "precursors".
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_DIALOGUE_LINE_NESTING</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_DIALOGUE_LINE_NESTING</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">DialogueLines::clear_precursors</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">DialogueLines::clear_precursors</span></span>:<br/>Dialogue Beats - <a href="6-db.html#SP2">&#167;2</a>, <a href="6-db.html#SP3">&#167;3</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">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_DIALOGUE_LINE_NESTING</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_lines</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>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Scanning the dialogue lines in pass 0. </b>Lines have already been parsed a little. For example,
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Scanning the dialogue lines in pass 0. </b>Lines have already been parsed a little. For example,
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -116,58 +84,18 @@ any number of <span class="extract"><span class="extract-syntax">DIALOGUE_CLAUSE
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="function-syntax">DialogueLines::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">See if we are expecting a dialogue line</span><span class="named-paragraph-number">2.1</span></a></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">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_level_ANNOT</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">L</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">See if that level of indentation is feasible</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_4" class="named-paragraph-link"><span class="named-paragraph">Initialise the line</span><span class="named-paragraph-number">2.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_5" class="named-paragraph-link"><span class="named-paragraph">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">2.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_8" class="named-paragraph-link"><span class="named-paragraph">Look for a line name</span><span class="named-paragraph-number">2.8</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_11" class="named-paragraph-link"><span class="named-paragraph">Build the tree structure</span><span class="named-paragraph-number">2.11</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_12" class="named-paragraph-link"><span class="named-paragraph">Add the line to the world model</span><span class="named-paragraph-number">2.12</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP1_2" class="named-paragraph-link"><span class="named-paragraph">Initialise the line</span><span class="named-paragraph-number">1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP1_6" class="named-paragraph-link"><span class="named-paragraph">Look for a line name</span><span class="named-paragraph-number">1.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_node</span><span class="plain-syntax"> = </span><a href="6-dn.html#SP3" class="function-link"><span class="function-syntax">DialogueNodes::add_to_current_beat</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">dl</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP1_9" class="named-paragraph-link"><span class="named-paragraph">Add the line to the world model</span><span class="named-paragraph-number">1.9</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">dl</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b>Note that a <span class="extract"><span class="extract-syntax">DIALOGUE_LINE_NT</span></span> is only made under a section marked as containing
dialogue, so the internal error here should be impossible to hit.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">See if we are expecting a dialogue line</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
</p>
<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">dialogue_section_being_scanned</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"line outside dialogue section"</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">current_dialogue_beat</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">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_LineWithoutBeat</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue line seems to appear before any beat has begun"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is not allowed - every line has to be part of a 'beat', which "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"has to be introduced with a bracketed paragraph looking like a stage "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"direction in a play."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">See if that level of indentation is feasible</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
</p>
<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">L</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_DIALOGUE_LINE_NESTING</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_OvernestedLine</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue line is indented further than I can cope with"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and indeed further than any human reader could really make sense of."</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>
<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">L</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1] == </span><span class="identifier-syntax">NULL</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_OrphanLine</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue line is indented too far"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and should either not be indented at all, or indented by just one tab "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"stop from the line it is dependent on."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b></p>
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>&#167;1.1. </b></p>
<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">dialogue_line</span><span class="plain-syntax"> {</span>
@ -178,40 +106,34 @@ dialogue, so the internal error here should be impossible to hit.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">without_speaking</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">speaker_text</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">speech_text</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">speaker_description</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">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mentioning</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">parse_node</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">how_performed</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">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">interlocutor</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">dialogue_beat</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_beat</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">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parent_line</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">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">child_line</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">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_line</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">as_node</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">dialogue_line_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="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_line is accessed in 3/scn, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/dlg, 6/db, 6/ps and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>&#167;2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the line</span><span class="named-paragraph-number">2.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>The structure dialogue_line is accessed in 3/scn, 4/ap, 4/act, 4/as, 4/nap, 4/gng, 5/pp, 5/cg, 5/cgl, 5/ts, 6/dlg, 6/db, 6/dc, 6/ps and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_2" class="paragraph-anchor"></a><b>&#167;1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the line</span><span class="named-paragraph-number">1.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">line_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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">line_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">narration</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">without_speaking</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_beat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_dialogue_beat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_line</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="identifier-syntax">L</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_line</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_line</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTDialogue::new_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">speaker_text</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">speaker_description</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">without_speaking</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RTDialogue::new_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">speech_text</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">mentioning</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">how_performed</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP10" class="function-link"><span class="function-syntax">PerformanceStyles::default</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">how_performed</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP9" class="function-link"><span class="function-syntax">PerformanceStyles::default</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">interlocutor</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>&#167;2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">2.5</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_3" class="paragraph-anchor"></a><b>&#167;1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the clauses just enough to classify them</span><span class="named-paragraph-number">1.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -230,8 +152,8 @@ dialogue, so the internal error here should be impossible to hit.
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"damaged DIALOGUE_LINE_NT subtree"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_6" class="paragraph-anchor"></a><b>&#167;2.6. </b>The special speaker "narration" marks out a line which isn't a speech at all:
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_4" class="paragraph-anchor"></a><b>&#167;1.4. </b>The special speaker "narration" marks out a line which isn't a speech at all:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -239,7 +161,7 @@ dialogue, so the internal error here should be impossible to hit.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">narration</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_7" class="paragraph-anchor"></a><b>&#167;2.7. </b>As with the analogous clauses for <a href="6-db.html" class="internal">Dialogue Beats</a>, each clause can be one
<p class="commentary firstcommentary"><a id="SP1_5" class="paragraph-anchor"></a><b>&#167;1.5. </b>As with the analogous clauses for <a href="6-db.html" class="internal">Dialogue Beats</a>, each clause can be one
of the following possibilities:
</p>
@ -253,10 +175,12 @@ of the following possibilities:
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">TO_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">WITHOUT_SPEAKING_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">ENDING_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">ENDING_IN_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">ENDING_SAYING_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">ENDING_FINALLY_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">ENDING_FINALLY_SAYING_DLC</span>
<span class="definition-keyword">enum</span> <span class="Preform-constant-syntax">STYLE_DLC</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_8" class="paragraph-anchor"></a><b>&#167;2.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Look for a line name</span><span class="named-paragraph-number">2.8</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP1_6" class="paragraph-anchor"></a><b>&#167;1.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Look for a line name</span><span class="named-paragraph-number">1.6</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -277,70 +201,56 @@ of the following possibilities:
<span class="plain-syntax"> </span><span class="string-syntax">"which is not allowed. It can be anonymous, but otherwise can only have "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"one name."</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_9" class="paragraph-anchor"></a><b>&#167;2.9. </b>Using:
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_7" class="paragraph-anchor"></a><b>&#167;1.7. </b>Using:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;dialogue-line-clause&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">this</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">is</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</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-constant-syntax">line</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"> { LINE_NAME_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">mentioning</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MENTIONING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">if</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { IF_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">unless</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { UNLESS_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">before</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { BEFORE_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">after</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { AFTER_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TO_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">now</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { NOW_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">without</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">speaking</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"> { WITHOUT_SPEAKING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</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"> { ENDING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { ENDING_IN_DLC, - }</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"> { STYLE_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">this</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">is</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</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-constant-syntax">line</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"> { LINE_NAME_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">mentioning</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { MENTIONING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">if</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { IF_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">unless</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { UNLESS_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">before</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { BEFORE_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">after</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { AFTER_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TO_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">now</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-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { NOW_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">without</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">speaking</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"> { WITHOUT_SPEAKING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</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"> { ENDING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">finally</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"> { ENDING_FINALLY_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">saying</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;quoted-text&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"> { ENDING_SAYING_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">finally</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"> { ENDING_FINALLY_DLC, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ending</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">story</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">finally</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">saying</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;quoted-text&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"> { ENDING_FINALLY_SAYING_DLC, - }</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"> { STYLE_DLC, - }</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_10" class="paragraph-anchor"></a><b>&#167;2.10. </b></p>
<p class="commentary firstcommentary"><a id="SP1_8" class="paragraph-anchor"></a><b>&#167;1.8. </b></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">DialogueLines::write_dlc</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LINE_NAME_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"LINE_NAME"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"IF"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNLESS_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"UNLESS"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">BEFORE_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"BEFORE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">AFTER_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"AFTER"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NOW_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"NOW"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TO_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"TO"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WITHOUT_SPEAKING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WITHOUT_SPEAKING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_IN_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING_IN"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STYLE_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"STYLE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"?"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LINE_NAME_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"LINE_NAME"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"IF"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNLESS_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"UNLESS"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">BEFORE_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"BEFORE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">AFTER_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"AFTER"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">NOW_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"NOW"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TO_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"TO"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WITHOUT_SPEAKING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WITHOUT_SPEAKING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_SAYING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING_SAYING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_FINALLY_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING_FINALLY"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">ENDING_FINALLY_SAYING_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"ENDING_FINALLY_SAYING"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STYLE_DLC:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"STYLE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"?"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_11" class="paragraph-anchor"></a><b>&#167;2.11. </b>The whole point of the indentation on lines is to provide a hierarchy of
lines within a beat, and this is where we use precursors to sort that out:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Build the tree structure</span><span class="named-paragraph-number">2.11</span></span><span class="comment-syntax"> =</span>
</p>
<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">current_dialogue_beat</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opening_line</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">current_dialogue_beat</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opening_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</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">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">])</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">next_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1]-&gt;</span><span class="element-syntax">child_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">] = </span><span class="identifier-syntax">dl</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">=</span><span class="identifier-syntax">L</span><span class="plain-syntax">+1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">MAX_DIALOGUE_LINE_NESTING</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">precursor_dialogue_lines</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>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>&#167;2.12. </b>Each line produces an instance of the kind <span class="extract"><span class="extract-syntax">dialogue line</span></span>, using the name
<p class="commentary firstcommentary"><a id="SP1_9" class="paragraph-anchor"></a><b>&#167;1.9. </b>Each line produces an instance of the kind <span class="extract"><span class="extract-syntax">dialogue line</span></span>, using the name
given in its clauses if one was.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add the line to the world model</span><span class="named-paragraph-number">2.12</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add the line to the world model</span><span class="named-paragraph-number">1.9</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -356,9 +266,12 @@ given in its clauses if one was.
<span class="plain-syntax"> </span><span class="identifier-syntax">Assert::true</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop</span><span class="plain-syntax">, </span><span class="identifier-syntax">CERTAIN_CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_instance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::latest</span><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Processing lines after pass 1. </b>It's now a little later, and the following is called to look at each line and
parse its clauses further.
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Processing lines after pass 1. </b>It's now a little later, and the following is called to look at each line and
parse its clauses further. By this point, all instances have been created,
and we can therefore parse the speaker name, "mentioning ..." clauses, "to ..."
clauses, and so on. Instances of the "performance style" kind exist now, too,
so we can also deal with style clauses.
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -391,37 +304,76 @@ parse its clauses further.
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">STYLE_DLC:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;dialogue-line-clause&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</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">A</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;dialogue-line-clause&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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">how_performed</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP10" class="function-link"><span class="function-syntax">PerformanceStyles::parse_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">how_performed</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP13" class="function-link"><span class="function-syntax">PerformanceStyles::parse_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</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">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">narration</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-dl.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Parse the speaker description</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<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">Parse the speaker description</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
</p>
<span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">DialogueLines::parse_interlocutor</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</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-uncached&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">)) {</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">speaker_text</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-uncached&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</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">desc</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="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">desc</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">Kinds::Behaviour::is_subkind_of_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">"To $T\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">speaker_description</span><span class="plain-syntax"> = </span><span class="identifier-syntax">desc</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="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Speaker parsed as $T\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</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">CW</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">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">K</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="identifier-syntax">_p_</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_LineSpeakerNonObject</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">"The dialogue line %1 is apparently spoken to '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"seems to describe %3, not an object."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="string-syntax">"The dialogue line %1 is apparently spoken by '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"seems to describe %3, not a person or some other object."</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><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">else</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">S</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_LineSpeakerUnknown</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">"The dialogue line %1 is apparently spoken by '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"isn't something I recognise as the name of a thing or person."</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>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dl.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>Note that the interlocutor &mdash; the person addressed "to", if any &mdash; must be
specified exactly, and not simply given a generic description like "somebody".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="function-syntax">DialogueLines::parse_interlocutor</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">DialogueLines::parse_interlocutor</span></span>:<br/><a href="6-dl.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</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-uncached&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</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">desc</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="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</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">I</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">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">;</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">desc</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">"Interlocutor parsed as $T\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</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">CW</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="identifier-syntax">_p_</span><span class="plain-syntax">(...));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_kind</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">K</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_LineToNonObject</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">"The dialogue line %1 is apparently spoken to '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"seems to describe %3, not an object."</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><span class="identifier-syntax">NULL</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="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">CW</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_LineToUnknown</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">"The dialogue line %1 is apparently spoken to '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"isn't something I recognise as the name of a thing or person."</span><span class="plain-syntax">);</span>
@ -430,8 +382,13 @@ parse its clauses further.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>So what remains to be done? The unparsed clauses remaining are <span class="extract"><span class="extract-syntax">IF</span></span> and <span class="extract"><span class="extract-syntax">UNLESS</span></span>,
<span class="extract"><span class="extract-syntax">BEFORE</span></span> and <span class="extract"><span class="extract-syntax">AFTER</span></span>, <span class="extract"><span class="extract-syntax">NOW</span></span>, and the various story-ending clauses: but all of those
are essentially code rather than data, and we will parse those in <a href="../runtime-module/5-dlg.html" class="internal">Dialogue (in runtime)</a>.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-db.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresscurrent">dl</li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-ps.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="6-db.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresscurrent">dl</li><li class="progresssection"><a href="6-dc.html">dc</a></li><li class="progresssection"><a href="6-dn.html">dn</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-dc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -63,11 +63,15 @@ function togglePopup(material_id) {
belongs in this module.
</p>
<p class="commentary">Note that a child feature called <span class="extract"><span class="extract-syntax">performance styles</span></span> &mdash; see <a href="6-ps.html" class="internal">Performance Styles</a> &mdash;
handles that kind, so it won't be dealt with in the code for this feature.
</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">Dialogue::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP6" class="function-link"><span class="function-syntax">Dialogue::declare_annotations</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP7" class="function-link"><span class="function-syntax">Dialogue::declare_annotations</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="6-dlg.html#SP3" class="function-link"><span class="function-syntax">Dialogue::new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPARE_CONSTANT_PLUG</span><span class="plain-syntax">, </span><a href="6-dlg.html#SP4" class="function-link"><span class="function-syntax">Dialogue::compare_CONSTANT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPARE_CONSTANT_PLUG</span><span class="plain-syntax">, </span><a href="6-dlg.html#SP5" class="function-link"><span class="function-syntax">Dialogue::compare_CONSTANT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>These two kinds are both created by a Neptune file belonging to <a href="../DialogueKit/index.html" class="internal">DialogueKit</a>,
@ -91,15 +95,25 @@ and are recognised by their Inter identifiers:
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>The rest of this section is to some extent boiler-plate code: it provides for
specific beats and lines to be represented as rvalues, both inside the compiler
(and when typechecking) and at runtime.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_from_dialogue_beat</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">Dialogue::rvalue_from_dialogue_beat</span></span>:<br/>Dialogue Beats - <a href="6-db.html#SP4_2">&#167;4.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) { </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_dialogue_beat</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_to_dialogue_beat</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">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">) }</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_from_dialogue_line</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) { </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_dialogue_line</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_to_dialogue_line</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">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">) }</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_from_dialogue_beat</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">Dialogue::rvalue_from_dialogue_beat</span></span>:<br/>Dialogue Beats - <a href="6-db.html#SP4_2">&#167;4.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_dialogue_beat</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_to_dialogue_beat</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">Dialogue::rvalue_to_dialogue_beat</span></span>:<br/><a href="6-dlg.html#SP5">&#167;5</a></span></button><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">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">) }</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_from_dialogue_line</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_dialogue_line</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="function-syntax">Dialogue::rvalue_to_dialogue_line</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">Dialogue::rvalue_to_dialogue_line</span></span>:<br/><a href="6-dlg.html#SP5">&#167;5</a></span></button><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">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">) }</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>These can be compared at compile time, which means that type-checking can be
used to select phrases or rules depending on specific beats or lines.
</p>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Dialogue::compare_CONSTANT</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">Dialogue::compare_CONSTANT</span></span>:<br/><a href="6-dlg.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rv</span><span class="plain-syntax">) {</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Dialogue::compare_CONSTANT</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">Dialogue::compare_CONSTANT</span></span>:<br/><a href="6-dlg.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rv</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">Node::get_kind_of_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_dialogue_beat</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="6-dlg.html#SP4" class="function-link"><span class="function-syntax">Dialogue::rvalue_to_dialogue_beat</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">) ==</span>
@ -120,7 +134,7 @@ and are recognised by their Inter identifiers:
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>This feature needs one extra syntax tree annotation:
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>The following syntax tree annotations are used for the constant rvalues:
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">constant_dialogue_beat_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">dialogue_beat</span></span><span class="comment-syntax">: for constant values</span>
@ -130,18 +144,18 @@ and are recognised by their Inter identifiers:
<span class="identifier-syntax">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_dialogue_beat</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_dialogue_line</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b></p>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_dialogue_beat</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_beat</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_dialogue_line</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Dialogue::declare_annotations</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">Dialogue::declare_annotations</span></span>:<br/><a href="6-dlg.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Dialogue::declare_annotations</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">Dialogue::declare_annotations</span></span>:<br/><a href="6-dlg.html#SP1">&#167;1</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="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span><span class="constant-syntax">constant_dialogue_beat_ANNOT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP6" class="function-link"><span class="function-syntax">Dialogue::write_constant_dialogue_beat_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP7" class="function-link"><span class="function-syntax">Dialogue::write_constant_dialogue_beat_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_dialogue_beat_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span><span class="constant-syntax">constant_dialogue_line_ANNOT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP6" class="function-link"><span class="function-syntax">Dialogue::write_constant_dialogue_line_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-dlg.html#SP7" class="function-link"><span class="function-syntax">Dialogue::write_constant_dialogue_line_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_dialogue_line_ANNOT</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">Dialogue::write_constant_dialogue_beat_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
@ -154,7 +168,7 @@ and are recognised by their Inter identifiers:
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ts.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">dlg</li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-db.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-ts.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">dlg</li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-dc.html">dc</a></li><li class="progresssection"><a href="6-dn.html">dn</a></li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-db.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

208
docs/if-module/6-dn.html Normal file
View file

@ -0,0 +1,208 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Dialogue Nodes</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../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">
<script>
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">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Dialogue Nodes' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#6">Chapter 6: Dialogue</a></li><li><b>Dialogue Nodes</b></li></ul></div>
<p class="purpose">The structure of a dialogue beat as a tree of nodes, each of which can be either a line or a choice.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>Inside any given beat, we have to keep track of the indentation of material
in order to see what is subordinate to what. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">(</span><span class="identifier-syntax">About</span><span class="plain-syntax"> </span><span class="identifier-syntax">Elsinore</span><span class="plain-syntax">.)</span>
<span class="identifier-syntax">Marcellus</span><span class="plain-syntax">: </span><span class="string-syntax">"What, has this thing appear'd again to-night?"</span>
<span class="identifier-syntax">Bernardo</span><span class="plain-syntax">: </span><span class="string-syntax">"I have seen naught but [list of things in the Battlements]."</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Marcellus</span><span class="plain-syntax">: </span><span class="string-syntax">"Horatio says 'tis but our fantasy."</span>
</pre>
<p class="commentary">Here the lines are at levels 0, 0 and 1. We actually allow them to go in as
far as <span class="extract"><span class="extract-syntax">MAX_DIALOGUE_NODE_NESTING</span></span>, which is a lot of tab stops: no human
author would want that many.
</p>
<p class="commentary">As we go through the beat looking for lines, we track the most recent line
or choice seen at each level. These are called "precursors".
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_DIALOGUE_NODE_NESTING</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_DIALOGUE_NODE_NESTING</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">DialogueNodes::clear_precursors</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">DialogueNodes::clear_precursors</span></span>:<br/><a href="6-dn.html#SP3_3">&#167;3.3</a><br/>Dialogue Beats - <a href="6-db.html#SP2">&#167;2</a>, <a href="6-db.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</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">=</span><span class="identifier-syntax">from</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">MAX_DIALOGUE_NODE_NESTING</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_nodes</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>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Other than the connectivity for the tree structure, a node is basically a
union type: it can either be a line or a choice.
</p>
<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">dialogue_node</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">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">if_line</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">dialogue_choice</span><span class="plain-syntax"> *</span><span class="identifier-syntax">if_choice</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">dialogue_beat</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owning_beat</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parent_node</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">child_node</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">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">dialogue_node</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_node is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And therefore the following should be called with exactly one non-<span class="extract"><span class="extract-syntax">NULL</span></span>
pointer.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">dialogue_node</span><span class="plain-syntax"> *</span><span class="function-syntax">DialogueNodes::add_to_current_beat</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">DialogueNodes::add_to_current_beat</span></span>:<br/>Dialogue Lines - <a href="6-dl.html#SP1">&#167;1</a><br/>Dialogue Choices - <a href="6-dc.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dl</span><span class="plain-syntax">, </span><span class="reserved-syntax">dialogue_choice</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dc</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">w</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dl</span><span class="plain-syntax">) </span><span class="identifier-syntax">w</span><span class="plain-syntax">++; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dc</span><span class="plain-syntax">) </span><span class="identifier-syntax">w</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">w</span><span class="plain-syntax"> != </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"exactly one should be non-NULL"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dn.html#SP3_4" class="named-paragraph-link"><span class="named-paragraph">See if we are expecting a dialogue node</span><span class="named-paragraph-number">3.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dn.html#SP3_5" class="named-paragraph-link"><span class="named-paragraph">See if that level of indentation is feasible</span><span class="named-paragraph-number">3.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">dialogue_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dn.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Initialise the node</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dn.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Join the node to the current beat's tree</span><span class="named-paragraph-number">3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-dn.html#SP3_3" class="named-paragraph-link"><span class="named-paragraph">Make the node a precursor</span><span class="named-paragraph-number">3.3</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">dn</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<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">Initialise the node</span><span class="named-paragraph-number">3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">if_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">if_choice</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_beat</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_dialogue_beat</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">L</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_node</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">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</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">dn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dn.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">Join the node to the current beat's tree</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
</p>
<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">current_dialogue_beat</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root</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">current_dialogue_beat</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dn</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">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">])</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1]-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dn</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dn.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">Make the node a precursor</span><span class="named-paragraph-number">3.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">] = </span><span class="identifier-syntax">dn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="6-dn.html#SP1" class="function-link"><span class="function-syntax">DialogueNodes::clear_precursors</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">+1);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dn.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_4" class="paragraph-anchor"></a><b>&#167;3.4. </b>Note that a <span class="extract"><span class="extract-syntax">DIALOGUE_LINE_NT</span></span> or <span class="extract"><span class="extract-syntax">DIALOGUE_CHOICE_NT</span></span> is only made under a
section marked as containing dialogue, so the internal error here should be
impossible to hit.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">See if we are expecting a dialogue node</span><span class="named-paragraph-number">3.4</span></span><span class="comment-syntax"> =</span>
</p>
<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">dialogue_section_being_scanned</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"node outside dialogue section"</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">current_dialogue_beat</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">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_LineWithoutBeat</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue material seems to appear before any beat has begun"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which is not allowed - every line or choice has to be part of a 'beat', which "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"has to be introduced with a bracketed paragraph looking like a stage "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"direction in a play."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dn.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_5" class="paragraph-anchor"></a><b>&#167;3.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">See if that level of indentation is feasible</span><span class="named-paragraph-number">3.5</span></span><span class="comment-syntax"> =</span>
</p>
<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">L</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_DIALOGUE_NODE_NESTING</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_OvernestedLine</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue material is indented further than I can cope with"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and indeed further than any human reader could really make sense of."</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>
<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">L</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">precursor_dialogue_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-1] == </span><span class="identifier-syntax">NULL</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="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_OrphanLine</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this dialogue material is indented too far"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and should either not be indented at all, or indented by just one tab "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"stop from the material it is dependent on."</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>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-dn.html#SP3">&#167;3</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-dc.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-dc.html">dc</a></li><li class="progresscurrent">dn</li><li class="progresssection"><a href="6-ps.html">ps</a></li><li class="progressnext"><a href="6-ps.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -60,17 +60,15 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#6">Chapter 6: Dialogue</a></li><li><b>Performance Styles</b></li></ul></div>
<p class="purpose">Manners of speaking, used in dialogue.</p>
<ul class="toc"><li><a href="6-ps.html#SP7">&#167;7. Introduction</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>This feature, <span class="extract"><span class="extract-syntax">performance styles</span></span>, is technically part of <span class="extract"><span class="extract-syntax">dialogue</span></span>, not part of <span class="extract"><span class="extract-syntax">if</span></span>.
</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">PerformanceStyles::start</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">PerformanceStyles::start</span></span>:<br/>IF Module - <a href="1-im.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP6" class="function-link"><span class="function-syntax">PerformanceStyles::declare_annotations</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP7" class="function-link"><span class="function-syntax">PerformanceStyles::declare_annotations</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_INSTANCE_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="6-ps.html#SP4" class="function-link"><span class="function-syntax">PerformanceStyles::new_named_instance_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">NEW_BASE_KIND_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="6-ps.html#SP3" class="function-link"><span class="function-syntax">PerformanceStyles::new_base_kind_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPARE_CONSTANT_PLUG</span><span class="plain-syntax">, </span><a href="6-ps.html#SP4" class="function-link"><span class="function-syntax">PerformanceStyles::compare_CONSTANT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginCalls::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPARE_CONSTANT_PLUG</span><span class="plain-syntax">, </span><a href="6-ps.html#SP5" class="function-link"><span class="function-syntax">PerformanceStyles::compare_CONSTANT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Performance styles are the instances of a built-in enumeration kind, created by a
@ -96,20 +94,25 @@ identifier <span class="extract"><span class="extract-syntax">PERFORMANCE_STYLE_
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PerformanceStyles::new_named_instance_notify</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">PerformanceStyles::new_named_instance_notify</span></span>:<br/><a href="6-ps.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</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">K_scene</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">), </span><span class="identifier-syntax">K_performance_style</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP9" class="function-link"><span class="function-syntax">PerformanceStyles::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP11" class="function-link"><span class="function-syntax">PerformanceStyles::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">TRUE</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">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b></p>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::rvalue_from_performance_style</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) { </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_performance_style</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</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">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">) }</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::rvalue_from_performance_style</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CONV_FROM</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_performance_style</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</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="plain-syntax"> </span><span class="identifier-syntax">CONV_TO</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">) }</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PerformanceStyles::compare_CONSTANT</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">PerformanceStyles::compare_CONSTANT</span></span>:<br/><a href="6-ps.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rv</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">Node::get_kind_of_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_performance_style</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="6-ps.html#SP4" class="function-link"><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">) ==</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP4" class="function-link"><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="6-ps.html#SP5" class="function-link"><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec1</span><span class="plain-syntax">) ==</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP5" class="function-link"><span class="function-syntax">PerformanceStyles::rvalue_to_performance_style</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">spec2</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -118,7 +121,7 @@ identifier <span class="extract"><span class="extract-syntax">PERFORMANCE_STYLE_
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>This feature needs one extra syntax tree annotation:
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>This feature needs one extra syntax tree annotation:
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">constant_performance_style_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">performance_style</span></span><span class="comment-syntax">: for constant values</span>
@ -126,14 +129,14 @@ identifier <span class="extract"><span class="extract-syntax">PERFORMANCE_STYLE_
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DECLARE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_performance_style</span><span class="plain-syntax">, </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b></p>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">MAKE_ANNOTATION_FUNCTIONS</span><span class="plain-syntax">(</span><span class="identifier-syntax">constant_performance_style</span><span class="plain-syntax">, </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PerformanceStyles::declare_annotations</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">PerformanceStyles::declare_annotations</span></span>:<br/><a href="6-ps.html#SP1">&#167;1</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="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span><span class="constant-syntax">constant_performance_style_ANNOT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP6" class="function-link"><span class="function-syntax">PerformanceStyles::write_constant_performance_style_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-ps.html#SP7" class="function-link"><span class="function-syntax">PerformanceStyles::write_constant_performance_style_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTANT_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">constant_performance_style_ANNOT</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">PerformanceStyles::write_constant_performance_style_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
@ -141,50 +144,90 @@ identifier <span class="extract"><span class="extract-syntax">PERFORMANCE_STYLE_
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {performance_style: %I}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_constant_performance_style</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">as_instance</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Introduction. </b></p>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Internally, styles have the following additional data:
</p>
<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">performance_style</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">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">as_instance</span><span class="plain-syntax">; </span><span class="comment-syntax"> the constant for the name of the style</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">stem_of_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PS_spoken_normally</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">PerformanceStyles::get_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ps</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">Instances::get_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">ps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_instance</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure performance_style is accessed in 3/scn, 6/dlg, 6/db, 6/dl and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>A feature called <span class="extract"><span class="extract-syntax">xyzzy</span></span> generally has a hunk of subject data called <span class="extract"><span class="extract-syntax">xyzzy_data</span></span>,
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>The default style, created by the Standard Rules, is here:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PS_spoken_normally</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::default</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">PerformanceStyles::default</span></span>:<br/>Dialogue Lines - <a href="6-dl.html#SP1_2">&#167;1.2</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PS_spoken_normally</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>A feature called <span class="extract"><span class="extract-syntax">xyzzy</span></span> generally has a hunk of subject data called <span class="extract"><span class="extract-syntax">xyzzy_data</span></span>,
so we would normally have a structure called <span class="extract"><span class="extract-syntax">performance_styles_data</span></span>, but in fact that
structure is just going to be <a href="6-ps.html#SP7" class="internal">performance_style</a>. So:
structure is just going to be <a href="6-ps.html#SP8" class="internal">performance_style</a>. So:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">performance_styles_data</span><span class="plain-syntax"> </span><span class="reserved-syntax">performance_style</span>
<span class="definition-keyword">define</span> <span class="identifier-syntax">PERFORMANCE_STYLES_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) </span><span class="identifier-syntax">FEATURE_DATA_ON_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">performance_styles</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>The following is called whenever a new instance of "performance style" is created:
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>The following is called whenever a new instance of "performance style" is created:
</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">PerformanceStyles::new</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">PerformanceStyles::new</span></span>:<br/><a href="6-ps.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PerformanceStyles::new</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">PerformanceStyles::new</span></span>:<br/><a href="6-ps.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ps</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">performance_style</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ps.html#SP9_3" class="named-paragraph-link"><span class="named-paragraph">Connect the performance style structure to the instance</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="6-ps.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Initialise the performance style structure</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ps.html#SP11_4" class="named-paragraph-link"><span class="named-paragraph">Connect the performance style structure to the instance</span><span class="named-paragraph-number">11.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-ps.html#SP11_2" class="named-paragraph-link"><span class="named-paragraph">Initialise the performance style structure</span><span class="named-paragraph-number">11.2</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">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::get_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;performance-style-name-convention&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stem_of_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;performance-style-name-convention&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="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;dialogue-line-clause&gt;(ps-&gt;</span><span class="element-syntax">stem_of_name</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax"> != </span><span class="constant-syntax">STYLE_DLC</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">ps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stem_of_name</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_AmbiguousPerformanceStyle</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">"The sentence %1 creates a performance style which would have "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to be used by marking a line as '(%2)', but that already has "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a meaning as a line annotation, so this would be ambiguous. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Call it something else?"</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="plain-syntax"> } </span><span class="reserved-syntax">else</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">N</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_NonspokenPerformanceStyle</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">"The sentence %1 creates a performance style called '%2', "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"but all performance style names have to begin with 'spoken' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(for example, 'spoken quickly')."</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="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b>A performance style begins with two ends, 0 (beginning) and 1 (standard end).
</p>
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>&#167;11.1. </b></p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the performance style structure</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;performance-style-name-convention&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">spoken</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</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="SP11_2" class="paragraph-anchor"></a><b>&#167;11.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the performance style structure</span><span class="named-paragraph-number">11.2</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> ;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stem_of_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-ps.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>&#167;9.2. </b>This is a style name which Inform provides special support for; it recognises
<ul class="endnotetexts"><li>This code is used in <a href="6-ps.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_3" class="paragraph-anchor"></a><b>&#167;11.3. </b>This is a style name which Inform provides special support for; it recognises
the English name, so there is no need to translate this to other languages.
</p>
@ -193,7 +236,7 @@ the English name, so there is no need to translate this to other languages.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">spoken</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">normally</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="SP9_3" class="paragraph-anchor"></a><b>&#167;9.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Connect the performance style structure to the instance</span><span class="named-paragraph-number">9.3</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP11_4" class="paragraph-anchor"></a><b>&#167;11.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Connect the performance style structure to the instance</span><span class="named-paragraph-number">11.4</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -202,38 +245,51 @@ the English name, so there is no need to translate this to other languages.
<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">Instances::get_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;notable-performance-styles&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">PS_spoken_normally</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ps</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-ps.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>So we sometimes want to be able to get from an instance to its performance style
<ul class="endnotetexts"><li>This code is used in <a href="6-ps.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>So we sometimes want to be able to get from an instance to its performance style
structure.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::from_named_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::from_named_constant</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">PerformanceStyles::from_named_constant</span></span>:<br/><a href="6-ps.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</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">K_performance_style</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="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Instances::to_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_performance_style</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">FEATURE_DATA_ON_SUBJECT</span><span class="plain-syntax">(</span><span class="identifier-syntax">performance_styles</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_subject</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>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>We parse the name of a style first by the regular excerpt parser, which
would pick up something like "spoken normally", and then by hand if that
fails, looking for the abbreviated form "normally". Speed isn't very important
here, since the only context in which the word "spoken" can be omitted is in
the bracketed clauses of a line, so the total number of calls to this function
will never be more than the number of dialogue lines in the story.
</p>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::default</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">PerformanceStyles::default</span></span>:<br/>Dialogue Lines - <a href="6-dl.html#SP2_4">&#167;2.4</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PS_spoken_normally</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::parse_style</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">PerformanceStyles::parse_style</span></span>:<br/>Dialogue Lines - <a href="6-dl.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax">) {</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="function-syntax">PerformanceStyles::parse_style</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">PerformanceStyles::parse_style</span></span>:<br/>Dialogue Lines - <a href="6-dl.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</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-uncached&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</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">desc</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="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">desc</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">Kinds::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_performance_style</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Rvalues::to_instance</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</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">I</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ps</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP10" class="function-link"><span class="function-syntax">PerformanceStyles::from_named_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ps</span><span class="plain-syntax"> = </span><a href="6-ps.html#SP12" class="function-link"><span class="function-syntax">PerformanceStyles::from_named_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</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">ps</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ps</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">performance_style</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ps</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">ps</span><span class="plain-syntax">, </span><span class="reserved-syntax">performance_style</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::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">, </span><span class="identifier-syntax">ps</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stem_of_name</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">ps</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">CW</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="identifier-syntax">_p_</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_LineInUnknownPerformanceStyle</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">"The dialogue line %1 is apparently spoken in the style '%2', but that "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"doesn't seem to correspond to any style I know of."</span><span class="plain-syntax">);</span>
@ -242,7 +298,7 @@ structure.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-dl.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresscurrent">ps</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="6-dn.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="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresschapter"><a href="5-pp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-dlg.html">dlg</a></li><li class="progresssection"><a href="6-db.html">db</a></li><li class="progresssection"><a href="6-dl.html">dl</a></li><li class="progresssection"><a href="6-dc.html">dc</a></li><li class="progresssection"><a href="6-dn.html">dn</a></li><li class="progresscurrent">ps</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -338,6 +338,16 @@
<spon class="sectiontitle">Dialogue Lines</span></a> -
<span class="sectionpurpose">To manage dialogue lines.</span></p>
</li>
<li>
<p class="sectionentry"><a href="6-dc.html">
<spon class="sectiontitle">Dialogue Choices</span></a> -
<span class="sectionpurpose">To manage dialogue choices.</span></p>
</li>
<li>
<p class="sectionentry"><a href="6-dn.html">
<spon class="sectiontitle">Dialogue Nodes</span></a> -
<span class="sectionpurpose">The structure of a dialogue beat as a tree of nodes, each of which can be either a line or a choice.</span></p>
</li>
<li>
<p class="sectionentry"><a href="6-ps.html">
<spon class="sectiontitle">Performance Styles</span></a> -

View file

@ -182,7 +182,7 @@ number of successes.
</li></ul>
<pre class="undisplayed-code all-displayed-code code-font">
<span class="plain-syntax">Size of lexicon: 3112 excerpt meanings</span>
<span class="plain-syntax"> Stored among 842 words out of total vocabulary of 10558</span>
<span class="plain-syntax"> Stored among 842 words out of total vocabulary of 10560</span>
<span class="plain-syntax"> 712 words have a start list: longest belongs to report (with 293 meanings)</span>
<span class="plain-syntax"> 15 words have an end list: longest belongs to case (with 6 meanings)</span>
<span class="plain-syntax"> 29 words have a middle list: longest belongs to to (with 4 meanings)</span>

View file

@ -51,7 +51,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#5">Chapter 5: Provision Submodules</a></li><li><b>Dialogue</b></li></ul></div>
<p class="purpose">To compile the dialogue submodule for a compilation unit, which contains something to be worked out.</p>
<ul class="toc"><li><a href="5-dlg.html#SP1">&#167;1. Compilation data for dialogue beats</a></li><li><a href="5-dlg.html#SP2">&#167;2. Compilation data for dialogue lines</a></li><li><a href="5-dlg.html#SP3">&#167;3. Compilation of dialogue</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-dlg.html#SP1">&#167;1. Compilation data for dialogue beats</a></li><li><a href="5-dlg.html#SP2">&#167;2. Compilation data for dialogue lines</a></li><li><a href="5-dlg.html#SP3">&#167;3. Compilation data for dialogue choices</a></li><li><a href="5-dlg.html#SP4">&#167;4. Compilation of dialogue</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Compilation data for dialogue beats. </b>Each <span class="extract"><span class="extract-syntax">dialogue_beat</span></span> object contains this data:
</p>
@ -83,7 +83,22 @@
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_line_compilation_data is accessed in 3/uo, 5/mlt, 5/tbl, 5/prp, 5/lp, 5/act2, 5/nap and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Compilation of dialogue. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Compilation data for dialogue choices. </b>Each <span class="extract"><span class="extract-syntax">dialogue_choice</span></span> object contains this data:
</p>
<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">dialogue_choice_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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">dialogue_choice_compilation_data</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">dialogue_choice_compilation_data</span><span class="plain-syntax"> </span><span class="function-syntax">RTDialogue::new_choice</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_choice</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dialogue_choice_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">dlcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dlcd</span><span class="plain-syntax">.</span><span class="element-syntax">where_created</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</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">dlcd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure dialogue_choice_compilation_data is accessed in 3/uo, 5/mlt, 5/tbl, 5/prp, 5/lp, 5/act2, 5/nap and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Compilation of dialogue. </b></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">RTDialogue::compile</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
@ -91,13 +106,13 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">db</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_beat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"dialogue beat %d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">db</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">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="5-dlg.html#SP3" class="function-link"><span class="function-syntax">RTDialogue::beat_compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_dialogue_beat</span><span class="plain-syntax">(</span><span class="identifier-syntax">db</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="5-dlg.html#SP4" class="function-link"><span class="function-syntax">RTDialogue::beat_compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_dialogue_beat</span><span class="plain-syntax">(</span><span class="identifier-syntax">db</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dl</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">dl</span><span class="plain-syntax">, </span><span class="identifier-syntax">dialogue_line</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="string-syntax">"dialogue line %d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">dl</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">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="5-dlg.html#SP3" class="function-link"><span class="function-syntax">RTDialogue::line_compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_dialogue_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">dl</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sequence::queue</span><span class="plain-syntax">(&amp;</span><a href="5-dlg.html#SP4" class="function-link"><span class="function-syntax">RTDialogue::line_compilation_agent</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">STORE_POINTER_dialogue_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">dl</span><span class="plain-syntax">), </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -106,7 +121,7 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">where_created</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">"Beat %d = %W name '%W' scene '%W'\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">), </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">beat_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">scene_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-dlg.html#SP3" class="function-link"><span class="function-syntax">RTDialogue::log_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">opening_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-dlg.html#SP4" class="function-link"><span class="function-syntax">RTDialogue::log_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">db</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">root</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">RTDialogue::line_compilation_agent</span><span class="plain-syntax">(</span><span class="identifier-syntax">compilation_subtask</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ct</span><span class="plain-syntax">) {</span>
@ -115,17 +130,21 @@
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Line %d = %W name '%W'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">), </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">line_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">RTDialogue::log_r</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dl</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">"Line %d = %W\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">where_created</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">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_line</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">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_line</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_line</span><span class="plain-syntax"> != </span><span class="identifier-syntax">dl</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"*** Broken parentage ***\n"</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTDialogue::log_r</span><span class="plain-syntax">(</span><span class="identifier-syntax">dialogue_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dn</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">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_line</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">"Line %d = %W\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_line</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_line</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">where_created</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">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_choice</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">"Choice %d = %W\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_choice</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">if_choice</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">where_created</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">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_node</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">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_node</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parent_node</span><span class="plain-syntax"> != </span><span class="identifier-syntax">dn</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"*** Broken parentage ***\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-dlg.html#SP3" class="function-link"><span class="function-syntax">RTDialogue::log_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-dlg.html#SP4" class="function-link"><span class="function-syntax">RTDialogue::log_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">child_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -721,7 +721,7 @@ reads them in for every kit which is included in the project.
</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">Projects::activate_elements</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">Projects::activate_elements</span></span>:<br/><a href="5-ps2.html#SP31_4">&#167;31.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inform_project</span><span class="plain-syntax"> *</span><span class="identifier-syntax">project</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Projects::activate_elements</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">Projects::activate_elements</span></span>:<br/><a href="5-ps2.html#SP28">&#167;28</a>, <a href="5-ps2.html#SP31_4">&#167;31.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inform_project</span><span class="plain-syntax"> *</span><span class="identifier-syntax">project</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Features::activate_bare_minimum</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">element_activation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">EA</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">EA</span><span class="plain-syntax">, </span><span class="reserved-syntax">element_activation</span><span class="plain-syntax">, </span><span class="identifier-syntax">project</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activations</span><span class="plain-syntax">) {</span>
@ -842,8 +842,10 @@ rather like a family tree for a minor European royal family.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">chosen_build_target</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-ps2.html#SP20" class="function-link"><span class="function-syntax">Projects::finalise_kit_dependencies</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP7" class="function-link"><span class="function-syntax">Copies::get_source_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</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">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">contains_dialogue</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">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">contains_dialogue</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-ps2.html#SP18" class="function-link"><span class="function-syntax">Projects::add_kit_dependency</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DialogueKit"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-ps2.html#SP22" class="function-link"><span class="function-syntax">Projects::activate_elements</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">build_vertex</span><span class="plain-syntax"> *</span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">vertex</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ps2.html#SP28_1" class="named-paragraph-link"><span class="named-paragraph">Construct the graph upstream of V</span><span class="named-paragraph-number">28.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ps2.html#SP28_2" class="named-paragraph-link"><span class="named-paragraph">Construct the graph downstream of V</span><span class="named-paragraph-number">28.2</span></a></span><span class="plain-syntax">;</span>

View file

@ -240,7 +240,7 @@ one (on the same node) overwrites it, but this is not an error.
</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">Annotations::write_int</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">Annotations::write_int</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_7">&#167;6.9.7</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::write_int</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">Annotations::write_int</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_7">&#167;6.9.7</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">newpna</span><span class="plain-syntax">, *</span><span class="identifier-syntax">pna</span><span class="plain-syntax">, *</span><span class="identifier-syntax">final</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="identifier-syntax">PN</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"annotated null PN"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">pna</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_annotation</span><span class="plain-syntax">) {</span>
@ -339,6 +339,7 @@ node will throw an internal error &mdash; it must mean a bug in Inform.
<span class="plain-syntax"> </span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">implied_heading_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">language_element_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CUE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_level_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CHOICE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_level_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_LINE_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_level_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>

View file

@ -275,30 +275,34 @@ do this. All a bit clumsy, but it works.
<span class="definition-keyword">enum</span> <span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> Marks an ambiguous set of readings in the tree</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "arfle barfle gloop"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_CUE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A dialogue cue under a dialogue Section heading</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_CHOICE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A branch point in dialogue</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_LINE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A line of dialogue under a dialogue Section heading</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_SPEAKER_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "James" in "James: "Hello!""</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_SPEECH_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> ""Hello!"" in "James: "Hello!""</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_SELECTION_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "instead of examining a door"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A bracketed term used in a cue or line</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::metadata_setup</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">NodeType::metadata_setup</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"(INVALID_NT)"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">INVALID_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"(INVALID_NT)"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">INVALID_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ROOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUSION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"HEADING_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUDE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"BEGINHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ENDHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"SENTENCE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"AMBIGUITY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UNKNOWN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ROOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUSION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"HEADING_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUDE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"BEGINHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ENDHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"SENTENCE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"AMBIGUITY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UNKNOWN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CUE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_CUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_LINE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_LINE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SPEAKER_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_SPEAKER_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SPEECH_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_SPEECH_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_CLAUSE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CUE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_CUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CHOICE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_CHOICE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_LINE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_LINE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SPEAKER_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_SPEAKER_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SPEECH_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_SPEECH_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SELECTION_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_SELECTION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DIALOGUE_CLAUSE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">NODE_METADATA_SETUP_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NODE_METADATA_SETUP_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>
@ -333,6 +337,9 @@ parent to another, but there are exceptions.
<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">t_parent</span><span class="plain-syntax"> == </span><span class="constant-syntax">DIALOGUE_CUE_NT</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">t_child</span><span class="plain-syntax"> == </span><span class="constant-syntax">DIALOGUE_CLAUSE_NT</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">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">t_parent</span><span class="plain-syntax"> == </span><span class="constant-syntax">DIALOGUE_CHOICE_NT</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">t_child</span><span class="plain-syntax"> == </span><span class="constant-syntax">DIALOGUE_CLAUSE_NT</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">t_child</span><span class="plain-syntax"> == </span><span class="constant-syntax">DIALOGUE_SELECTION_NT</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">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">, </span><span class="identifier-syntax">cat_parent</span><span class="plain-syntax">, </span><span class="identifier-syntax">t_child</span><span class="plain-syntax">, </span><span class="identifier-syntax">cat_child</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">TRUE</span><span class="plain-syntax">;</span>

View file

@ -97,7 +97,7 @@ MathJax = {
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Creation. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::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">Node::new</span></span>:<br/><a href="2-pn.html#SP3">&#167;3</a>, <a href="2-pn.html#SP9">&#167;9</a>, <a href="2-pn.html#SP11">&#167;11</a><br/>Syntax Trees - <a href="2-st.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_2_1_1">&#167;6.9.9.2.1.1</a>, <a href="3-snt.html#SP6_9_9_2_3">&#167;6.9.9.2.3</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::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">Node::new</span></span>:<br/><a href="2-pn.html#SP3">&#167;3</a>, <a href="2-pn.html#SP9">&#167;9</a>, <a href="2-pn.html#SP11">&#167;11</a><br/>Syntax Trees - <a href="2-st.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>, <a href="3-snt.html#SP6_9_9_3_1_1">&#167;6.9.9.3.1.1</a>, <a href="3-snt.html#SP6_9_9_3_3">&#167;6.9.9.3.3</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
@ -128,7 +128,7 @@ Here's one if a word range is to be attached:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_parsed</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">Node::set_text</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">Node::set_text</span></span>:<br/><a href="2-pn.html#SP2">&#167;2</a>, <a href="2-pn.html#SP3">&#167;3</a><br/>Simple Preform Cache - <a href="2-spc.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_6">&#167;6.9.6</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_2_1_1">&#167;6.9.9.2.1.1</a>, <a href="3-snt.html#SP6_9_9_2_3">&#167;6.9.9.2.3</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::set_text</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">Node::set_text</span></span>:<br/><a href="2-pn.html#SP2">&#167;2</a>, <a href="2-pn.html#SP3">&#167;3</a><br/>Simple Preform Cache - <a href="2-spc.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_6">&#167;6.9.6</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>, <a href="3-snt.html#SP6_9_9_3_1_1">&#167;6.9.9.3.1.1</a>, <a href="3-snt.html#SP6_9_9_3_3">&#167;6.9.9.3.3</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to set words for null node"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -130,7 +130,7 @@ it includes, will form a single <a href="2-st.html#SP2" class="internal">parse_n
</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">SyntaxTree::graft_sentence</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">SyntaxTree::graft_sentence</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_2_1_1">&#167;6.9.9.2.1.1</a>, <a href="3-snt.html#SP6_9_9_2_3">&#167;6.9.9.2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::graft_sentence</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">SyntaxTree::graft_sentence</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>, <a href="3-snt.html#SP6_9_9_3_1_1">&#167;6.9.9.3.1.1</a>, <a href="3-snt.html#SP6_9_9_3_3">&#167;6.9.9.3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</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">T</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">bud_parent_sp</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no attachment point"</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-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-st.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Adjust bud point for a heading</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sentence_attachment_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_sp</span><span class="plain-syntax">-1];</span>
@ -191,7 +191,7 @@ if it previously had no children).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">SyntaxTree::graft</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">SyntaxTree::graft</span></span>:<br/><a href="2-st.html#SP4">&#167;4</a><br/>Sentences - <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scion</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rootstock</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">SyntaxTree::graft</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">SyntaxTree::graft</span></span>:<br/><a href="2-st.html#SP4">&#167;4</a><br/>Sentences - <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">scion</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rootstock</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">elder</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="identifier-syntax">scion</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"scion is 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="identifier-syntax">rootstock</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"rootstock is null"</span><span class="plain-syntax">);</span>

View file

@ -946,7 +946,9 @@ order to catch improbable unmatched-bracket errors with tidy error messages.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Lexer::word</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">OPENBRACKET_V</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Lexer::word</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><span class="identifier-syntax">CLOSEBRACKET_V</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_1" class="named-paragraph-link"><span class="named-paragraph">This is a dialogue cue</span><span class="named-paragraph-number">6.9.9.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2" class="named-paragraph-link"><span class="named-paragraph">Otherwise this has to be a dialogue line</span><span class="named-paragraph-number">6.9.9.2</span></a></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">Lexer::word</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">DOUBLEDASH_V</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2" class="named-paragraph-link"><span class="named-paragraph">This is a dialogue choice</span><span class="named-paragraph-number">6.9.9.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3" class="named-paragraph-link"><span class="named-paragraph">Otherwise this has to be a dialogue line</span><span class="named-paragraph-number">6.9.9.3</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_1" class="paragraph-anchor"></a><b>&#167;6.9.9.1. </b>Here we are trying to match <span class="extract"><span class="extract-syntax">(Cue notes.)</span></span>.
@ -966,27 +968,61 @@ order to catch improbable unmatched-bracket errors with tidy error messages.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9">&#167;6.9.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_2" class="paragraph-anchor"></a><b>&#167;6.9.9.2. </b>Here we are trying to match <span class="extract"><span class="extract-syntax">Speaker (notes): "Speech."</span></span>.
<p class="commentary firstcommentary"><a id="SP6_9_9_2" class="paragraph-anchor"></a><b>&#167;6.9.9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is a dialogue choice</span><span class="named-paragraph-number">6.9.9.2</span></span><span class="comment-syntax"> =</span>
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Otherwise this has to be a dialogue line</span><span class="named-paragraph-number">6.9.9.2</span></span><span class="comment-syntax"> =</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clauses_from</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="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">clauses_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">clauses_from</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">speech_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">clauses_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">speech_to</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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">speech_from</span><span class="plain-syntax">) == </span><span class="identifier-syntax">OPENBRACKET_V</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">bl</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</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">i</span><span class="plain-syntax">&lt;=</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><span class="identifier-syntax">i</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">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="identifier-syntax">OPENBRACKET_V</span><span class="plain-syntax">) </span><span class="identifier-syntax">bl</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">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CLOSEBRACKET_V</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bl</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">bl</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="identifier-syntax">clauses_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">; </span><span class="identifier-syntax">speech_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1; </span><span class="reserved-syntax">break</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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">clauses_from</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">clauses_to</span><span class="plain-syntax">-1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">TW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">speech_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">speech_to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_CHOICE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP8" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">dialogue_level_ANNOT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Lexer::indentation_level</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="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</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::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">TW</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">selection</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_SELECTION_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">selection</span><span class="plain-syntax">, </span><span class="identifier-syntax">TW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP6" class="function-link"><span class="function-syntax">SyntaxTree::graft</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">selection</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::add_dialogue_clauses</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9">&#167;6.9.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_3" class="paragraph-anchor"></a><b>&#167;6.9.9.3. </b>Here we are trying to match <span class="extract"><span class="extract-syntax">Speaker (notes): "Speech."</span></span>.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Otherwise this has to be a dialogue line</span><span class="named-paragraph-number">6.9.9.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">colon_at</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2_1" class="named-paragraph-link"><span class="named-paragraph">Find the colon position</span><span class="named-paragraph-number">6.9.9.2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3_1" class="named-paragraph-link"><span class="named-paragraph">Find the colon position</span><span class="named-paragraph-number">6.9.9.3.1</span></a></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">speaker_from</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">speaker_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">colon_at</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clauses_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">colon_at</span><span class="plain-syntax">, </span><span class="identifier-syntax">clauses_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">colon_at</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">speech_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">colon_at</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">speech_to</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>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2_2" class="named-paragraph-link"><span class="named-paragraph">Trim away bracketed clauses after the speaker name</span><span class="named-paragraph-number">6.9.9.2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3_2" class="named-paragraph-link"><span class="named-paragraph">Trim away bracketed clauses after the speaker name</span><span class="named-paragraph-number">6.9.9.3.2</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">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">speaker_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">speaker_to</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">CW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">clauses_from</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">clauses_to</span><span class="plain-syntax">-1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">TW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">speech_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">speech_to</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;quoted-text&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">TW</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2_3" class="named-paragraph-link"><span class="named-paragraph">Dialogue speech not in double-quotes</span><span class="named-paragraph-number">6.9.9.2.3</span></a></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;quoted-text&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">TW</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3_3" class="named-paragraph-link"><span class="named-paragraph">Dialogue speech not in double-quotes</span><span class="named-paragraph-number">6.9.9.3.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DIALOGUE_LINE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
@ -1004,12 +1040,12 @@ order to catch improbable unmatched-bracket errors with tidy error messages.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9">&#167;6.9.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_2_1" class="paragraph-anchor"></a><b>&#167;6.9.9.2.1. </b>The colon should always occur outside of parentheses, but if we can't find
<p class="commentary firstcommentary"><a id="SP6_9_9_3_1" class="paragraph-anchor"></a><b>&#167;6.9.9.3.1. </b>The colon should always occur outside of parentheses, but if we can't find
one in that happy condition, we just find the first one that's there (for the
sake of issuing better problem messages: it won't lead to valid syntax).
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Find the colon position</span><span class="named-paragraph-number">6.9.9.2.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Find the colon position</span><span class="named-paragraph-number">6.9.9.3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1023,15 +1059,15 @@ sake of issuing better problem messages: it won't lead to valid syntax).
<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">=</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">i</span><span class="plain-syntax">&lt;=</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><span class="identifier-syntax">i</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">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="identifier-syntax">COLON_V</span><span class="plain-syntax">) { </span><span class="identifier-syntax">colon_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</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">colon_at</span><span class="plain-syntax"> == -1) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.2.1.1</span></a></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">colon_at</span><span class="plain-syntax"> == -1) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.3.1.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_2_2" class="paragraph-anchor"></a><b>&#167;6.9.9.2.2. </b>Similarly, we want to trim away bracketed clauses in a way which respects
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_3_2" class="paragraph-anchor"></a><b>&#167;6.9.9.3.2. </b>Similarly, we want to trim away bracketed clauses in a way which respects
bracket nesting, and if we can't do that then the text is certainly erroneous:
but we trim away the best we can for the sake of reporting a good problem.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Trim away bracketed clauses after the speaker name</span><span class="named-paragraph-number">6.9.9.2.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Trim away bracketed clauses after the speaker name</span><span class="named-paragraph-number">6.9.9.3.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1050,7 +1086,7 @@ but we trim away the best we can for the sake of reporting a good problem.
<span class="plain-syntax"> </span><span class="identifier-syntax">clauses_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">; </span><span class="identifier-syntax">speaker_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">-1; </span><span class="identifier-syntax">cut</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</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">cut</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.2.1.1</span></a></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">cut</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.3.1.1</span></a></span><span class="plain-syntax">;</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">bl</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">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">=</span><span class="identifier-syntax">speaker_from</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">speaker_to</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
@ -1065,8 +1101,8 @@ but we trim away the best we can for the sake of reporting a good problem.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_2_1_1" class="paragraph-anchor"></a><b>&#167;6.9.9.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.2.1.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_3_1_1" class="paragraph-anchor"></a><b>&#167;6.9.9.3.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Not a dialogue line after all</span><span class="named-paragraph-number">6.9.9.3.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1076,8 +1112,8 @@ but we trim away the best we can for the sake of reporting a good problem.
<span class="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_2_1">&#167;6.9.9.2.1</a>, <a href="3-snt.html#SP6_9_9_2_2">&#167;6.9.9.2.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_2_3" class="paragraph-anchor"></a><b>&#167;6.9.9.2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Dialogue speech not in double-quotes</span><span class="named-paragraph-number">6.9.9.2.3</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_3_1">&#167;6.9.9.3.1</a>, <a href="3-snt.html#SP6_9_9_3_2">&#167;6.9.9.3.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9_3_3" class="paragraph-anchor"></a><b>&#167;6.9.9.3.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Dialogue speech not in double-quotes</span><span class="named-paragraph-number">6.9.9.3.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -1087,7 +1123,7 @@ but we trim away the best we can for the sake of reporting a good problem.
<span class="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>This is shared by both cues and lines, each of which can have multiple
clauses in brackets. Punctuation divides these only outside of brackets, so
<span class="extract"><span class="extract-syntax">(hello, there), (and. here.)</span></span> divides only at the central comma, and results
@ -1096,7 +1132,7 @@ in two <span class="extract"><span class="extract-syntax">DIALOGUE_CLAUSE_NT</sp
</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">Sentences::add_dialogue_clauses</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">Sentences::add_dialogue_clauses</span></span>:<br/><a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::add_dialogue_clauses</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">Sentences::add_dialogue_clauses</span></span>:<br/><a href="3-snt.html#SP6_9_9_1">&#167;6.9.9.1</a>, <a href="3-snt.html#SP6_9_9_2">&#167;6.9.9.2</a>, <a href="3-snt.html#SP6_9_9_3">&#167;6.9.9.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">CW</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</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">start</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">), </span><span class="identifier-syntax">bl</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">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">=</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">CW</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</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">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="identifier-syntax">OPENBRACKET_V</span><span class="plain-syntax">) </span><span class="identifier-syntax">bl</span><span class="plain-syntax">++;</span>
@ -1143,7 +1179,7 @@ to some routine of her own, gazumping this one.
</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">Sentences::syntax_problem</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">Sentences::syntax_problem</span></span>:<br/><a href="3-snt.html#SP5_3_1">&#167;5.3.1</a>, <a href="3-snt.html#SP5_3_2">&#167;5.3.2</a>, <a href="3-snt.html#SP5_3_3">&#167;5.3.3</a>, <a href="3-snt.html#SP5_3_4">&#167;5.3.4</a>, <a href="3-snt.html#SP5_3_5">&#167;5.3.5</a>, <a href="3-snt.html#SP6_2">&#167;6.2</a>, <a href="3-snt.html#SP6_4">&#167;6.4</a>, <a href="3-snt.html#SP6_5">&#167;6.5</a>, <a href="3-snt.html#SP5_4">&#167;5.4</a>, <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_9_2_1_1">&#167;6.9.9.2.1.1</a>, <a href="3-snt.html#SP6_9_9_2_3">&#167;6.9.9.2.3</a>, <a href="3-snt.html#SP7">&#167;7</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</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="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::syntax_problem</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">Sentences::syntax_problem</span></span>:<br/><a href="3-snt.html#SP5_3_1">&#167;5.3.1</a>, <a href="3-snt.html#SP5_3_2">&#167;5.3.2</a>, <a href="3-snt.html#SP5_3_3">&#167;5.3.3</a>, <a href="3-snt.html#SP5_3_4">&#167;5.3.4</a>, <a href="3-snt.html#SP5_3_5">&#167;5.3.5</a>, <a href="3-snt.html#SP6_2">&#167;6.2</a>, <a href="3-snt.html#SP6_4">&#167;6.4</a>, <a href="3-snt.html#SP6_5">&#167;6.5</a>, <a href="3-snt.html#SP5_4">&#167;5.4</a>, <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_9_3_1_1">&#167;6.9.9.3.1.1</a>, <a href="3-snt.html#SP6_9_9_3_3">&#167;6.9.9.3.3</a>, <a href="3-snt.html#SP7">&#167;7</a>, <a href="3-snt.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</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="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROBLEM_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PROBLEM_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>

View file

@ -1,5 +1,5 @@
Size of lexicon: 3112 excerpt meanings
Stored among 842 words out of total vocabulary of 10558
Stored among 842 words out of total vocabulary of 10560
712 words have a start list: longest belongs to report (with 293 meanings)
15 words have an end list: longest belongs to case (with 6 meanings)
29 words have a middle list: longest belongs to to (with 4 meanings)

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
Total memory consumption was 120970K = 118 MB
Total memory consumption was 120971K = 118 MB
---- was used for 2048510 objects, in 364849 frames in 0 x 800K = 0K = 0 MB:
---- was used for 2048537 objects, in 364876 frames in 0 x 800K = 0K = 0 MB:
33.7% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
20.9% text_stream_array 4618 x 100 = 461800 objects, 26008576 bytes
@ -27,8 +27,8 @@ Total memory consumption was 120970K = 118 MB
0.8% id_body 942 objects, 1077648 bytes
0.8% adjective_meaning 202 objects, 1000304 bytes
0.7% excerpt_meaning 3112 objects, 970944 bytes
0.7% production 3911 objects, 907352 bytes
0.7% ptoken 8486 objects, 882544 bytes
0.7% production 3916 objects, 908512 bytes
0.7% ptoken 8503 objects, 884312 bytes
0.7% grammatical_usage 3616 objects, 867840 bytes
0.6% individual_form 2566 objects, 862176 bytes
0.6% inter_schema_node 8917 objects, 856032 bytes
@ -47,7 +47,7 @@ Total memory consumption was 120970K = 118 MB
0.1% hierarchy_location 1127 objects, 162288 bytes
0.1% linguistic_stock_item 3321 objects, 159408 bytes
0.1% rule_family_data 401 objects, 147568 bytes
0.1% nonterminal 764 objects, 140576 bytes
0.1% nonterminal 766 objects, 140944 bytes
0.1% nascent_array 2127 objects, 136128 bytes
---- inference 1703 objects, 122616 bytes
---- documentation_ref 1273 objects, 112024 bytes
@ -85,9 +85,9 @@ Total memory consumption was 120970K = 118 MB
---- shared_variable_access_list_array 12 x 100 = 1200 objects, 38784 bytes
---- heading 199 objects, 38208 bytes
---- parsing_data 671 objects, 37576 bytes
---- production_list 621 objects, 34776 bytes
---- regions_data 671 objects, 32208 bytes
---- production_list 623 objects, 34888 bytes
---- counting_data 671 objects, 32208 bytes
---- regions_data 671 objects, 32208 bytes
---- property_permission 96 objects, 31488 bytes
---- stack_frame_box 305 objects, 29280 bytes
---- verb_sense 403 objects, 29016 bytes
@ -109,8 +109,8 @@ Total memory consumption was 120970K = 118 MB
---- build_vertex 136 objects, 16320 bytes
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- to_phrase_request 59 objects, 16048 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- adjective 137 objects, 15344 bytes
---- pathname 380 objects, 15200 bytes
---- booking_list 407 objects, 13024 bytes
@ -138,9 +138,9 @@ Total memory consumption was 120970K = 118 MB
---- compatibility_specification 84 objects, 4032 bytes
---- activity 35 objects, 3920 bytes
---- command_line_switch 49 objects, 3920 bytes
---- parse_node_annotation_type 117 objects, 3744 bytes
---- submodule_request 84 objects, 3360 bytes
---- parse_node_annotation_type 118 objects, 3776 bytes
---- property_setting_bp_data 84 objects, 3360 bytes
---- submodule_request 84 objects, 3360 bytes
---- method_set 104 objects, 3328 bytes
---- kind_constructor_comparison_schema_array 1 x 100 objects, 3232 bytes
---- semver_range 31 objects, 3224 bytes
@ -175,10 +175,10 @@ Total memory consumption was 120970K = 118 MB
---- runtime_kind_structure 13 objects, 1040 bytes
---- quantifier 16 objects, 1024 bytes
---- submodule_identity 31 objects, 992 bytes
---- named_rulebook_outcome 15 objects, 960 bytes
---- pipeline_stage 20 objects, 960 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- named_rulebook_outcome 15 objects, 960 bytes
---- web_md 6 objects, 864 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- cached_understanding 21 objects, 840 bytes
---- JSON_pair_requirement 26 objects, 832 bytes
---- phrase_option_array 1 x 100 objects, 824 bytes
@ -188,8 +188,8 @@ Total memory consumption was 120970K = 118 MB
---- implication 13 objects, 624 bytes
---- inform_kit 6 objects, 624 bytes
---- code_generation 1 object, 576 bytes
---- inter_warehouse_room 10 objects, 560 bytes
---- generated_segment 14 objects, 560 bytes
---- inter_warehouse_room 10 objects, 560 bytes
---- rulebook_outcome 17 objects, 544 bytes
---- chapter_md 6 objects, 528 bytes
---- small_word_set 11 objects, 528 bytes
@ -203,51 +203,51 @@ Total memory consumption was 120970K = 118 MB
---- article_usage 8 objects, 384 bytes
---- source_file 5 objects, 360 bytes
---- inbuild_genre 7 objects, 336 bytes
---- pronoun 8 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- module_request 8 objects, 320 bytes
---- door_dir_notice 5 objects, 320 bytes
---- cached_kind_declaration 8 objects, 320 bytes
---- inter_pipeline 1 object, 312 bytes
---- door_dir_notice 5 objects, 320 bytes
---- module_request 8 objects, 320 bytes
---- grammatical_category 8 objects, 320 bytes
---- pronoun 8 objects, 320 bytes
---- tree_inventory 1 object, 312 bytes
---- inter_pipeline 1 object, 312 bytes
---- up_family 9 objects, 288 bytes
---- compilation_unit 5 objects, 280 bytes
---- contents_entry 7 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- explicit_bp_data 5 objects, 280 bytes
---- compilation_unit 5 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- contents_entry 7 objects, 280 bytes
---- verb_usage_tier 5 objects, 240 bytes
---- inform_project 1 object, 224 bytes
---- adjective_meaning_family 7 objects, 224 bytes
---- inform_project 1 object, 224 bytes
---- test_scenario 1 object, 216 bytes
---- release_instructions 1 object, 208 bytes
---- build_skill 5 objects, 200 bytes
---- code_generator 5 objects, 200 bytes
---- kit_dependency 4 objects, 192 bytes
---- plural_dictionary_entry 4 objects, 192 bytes
---- element_activation 5 objects, 160 bytes
---- kit_dependency 4 objects, 192 bytes
---- inter_architecture 4 objects, 160 bytes
---- attachment_instruction 4 objects, 160 bytes
---- inference_subject_family 5 objects, 160 bytes
---- imperative_defn_family 4 objects, 160 bytes
---- element_activation 5 objects, 160 bytes
---- attachment_instruction 4 objects, 160 bytes
---- inbuild_nest 3 objects, 120 bytes
---- local_block_value 2 objects, 112 bytes
---- inform_kit_ittt 2 objects, 96 bytes
---- compile_task_data 1 object, 80 bytes
---- article 2 objects, 80 bytes
---- group_together_function 2 objects, 80 bytes
---- inter_warehouse 1 object, 56 bytes
---- figures_data 1 object, 56 bytes
---- article 2 objects, 80 bytes
---- compile_task_data 1 object, 80 bytes
---- build_methodology 1 object, 56 bytes
---- HTML_file_state 1 object, 48 bytes
---- figures_data 1 object, 56 bytes
---- inter_warehouse 1 object, 56 bytes
---- star_invention 1 object, 48 bytes
---- by_function_bp_data 1 object, 40 bytes
---- loop_over_scope 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
---- HTML_file_state 1 object, 48 bytes
---- I6_generation_data 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
---- loop_over_scope 1 object, 40 bytes
---- by_function_bp_data 1 object, 40 bytes
100.0% was used for memory not allocated for objects:
56.8% text stream storage 70370696 bytes in 478922 claims
56.8% text stream storage 70371176 bytes in 478926 claims
4.2% dictionary storage 5296128 bytes in 7589 claims
---- sorting 1552 bytes in 159 claims
5.8% source text 7200000 bytes in 3 claims
@ -265,5 +265,5 @@ Total memory consumption was 120970K = 118 MB
---- code generation workspace for objects 3480 bytes in 19 claims
0.2% emitter array storage 280288 bytes in 1999 claims
-150.-1% was overhead - -185982624 bytes = -181623K = -177 MB
-150.-1% was overhead - -185986064 bytes = -181627K = -177 MB

View file

@ -16,10 +16,10 @@
(@1)<s-literal-truth-state>=1
(hits 78/1307) (matched: 'false') constraint CS = {15} extremes [1, 1]
<s-literal-list>=1
(hits 0/3275) constraint DS = {17} extremes [2, infinity)
(hits 0/3287) constraint DS = {17} extremes [2, infinity)
(@1)unicode <s-unicode-character>=1
(hits 0/3387) constraint DS = {21} extremes [2, infinity)
<s-literal-time>=1
(hits 0/3846) constraint DW = {18, 19, 20} extremes [2, 5]
(hits 0/3868) constraint DW = {18, 19, 20} extremes [2, 5]
<s-literal-unit-notation>=1
(hits 0/9846) constraint (none) extremes [1, infinity)

View file

@ -1,32 +1,33 @@
100.0% in inform7 run
70.7% in compilation to Inter
50.4% in //Sequence::undertake_queued_tasks//
4.6% in //MajorNodes::pre_pass//
3.5% in //MajorNodes::pass_1//
70.8% in compilation to Inter
50.5% in //Sequence::undertake_queued_tasks//
4.5% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all//
1.4% in //RTKindConstructors::compile//
1.4% in //RTPhrasebook::compile_entries//
1.0% in //Sequence::lint_inter//
0.6% in //MajorNodes::pass_2//
0.6% in //Sequence::undertake_queued_tasks//
0.6% in //World::stage_V//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.2% in //CompletionModule::compile//
0.2% in //InferenceSubjects::emit_all//
0.2% in //RTKindConstructors::compile_permissions//
0.2% in //Task::make_built_in_kind_constructors//
0.2% in //World::stages_II_and_III//
2.9% not specifically accounted for
26.0% in running Inter pipeline
10.0% in step 14/15: generate inform6 -> auto.inf
5.8% in step 5/15: load-binary-kits
5.4% in step 6/15: make-synoptic-module
26.2% in running Inter pipeline
10.2% in step 14/15: generate inform6 -> auto.inf
5.9% in step 5/15: load-binary-kits
5.5% in step 6/15: make-synoptic-module
1.4% in step 9/15: make-identifiers-unique
0.4% in step 12/15: eliminate-redundant-operations
0.4% in step 4/15: compile-splats
0.4% in step 7/15: shorten-wiring
0.2% in step 11/15: eliminate-redundant-labels
0.2% in step 8/15: detect-indirect-calls
1.5% not specifically accounted for
2.5% in supervisor
0.7% not specifically accounted for
1.4% not specifically accounted for
2.4% in supervisor
0.5% not specifically accounted for

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformExtrasKit",
"version": "10.2.0-beta+6V59"
"version": "10.2.0-beta+6V60"
},
"kit-details": {
"has-priority": 1

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformKit",
"version": "10.2.0-beta+6V59"
"version": "10.2.0-beta+6V60"
},
"needs": [ {
"unless": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "CommandParserKit",
"version": "10.2.0-beta+6V59"
"version": "10.2.0-beta+6V60"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "EnglishLanguageKit",
"version": "10.2.0-beta+6V59"
"version": "10.2.0-beta+6V60"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "WorldModelKit",
"version": "10.2.0-beta+6V59"
"version": "10.2.0-beta+6V60"
},
"needs": [ {
"need": {

View file

@ -2,12 +2,12 @@ Inform 7 v10.2.0 has started.
I've now read your source text, which is 17 words long.
I've also read Basic Inform by Graham Nelson, which is 7691 words long.
I've also read English Language by Graham Nelson, which is 2328 words long.
I've also read Standard Rules by Graham Nelson, which is 32187 words long.
I've also read Standard Rules by Graham Nelson, which is 32205 words long.
Problem__ PM_LineWithoutBeat
In Section 1 - Meeting:
>--> You wrote 'Marcellus: "What, has this thing appear'd again to-night?"' (source
text, line 5): but this dialogue line seems to appear before any beat has
begun, which is not allowed - every line has to be part of a 'beat', which
has to be introduced with a bracketed paragraph looking like a stage
direction in a play.
text, line 5): but this dialogue material seems to appear before any beat
has begun, which is not allowed - every line or choice has to be part of a
'beat', which has to be introduced with a bracketed paragraph looking like
a stage direction in a play.
Inform 7 has finished.

View file

@ -2,14 +2,14 @@ Inform 7 v10.2.0 has started.
I've now read your source text, which is 39 words long.
I've also read Basic Inform by Graham Nelson, which is 7691 words long.
I've also read English Language by Graham Nelson, which is 2328 words long.
I've also read Standard Rules by Graham Nelson, which is 32187 words long.
I've also read Standard Rules by Graham Nelson, which is 32205 words long.
Problem__ PM_OrphanLine
In Section 1 - Meeting:
>--> You wrote 'Marcellus: "What, has this thing appear'd again to-night?"' (source
text, line 7): but this dialogue line is indented too far, and should
text, line 7): but this dialogue material is indented too far, and should
either not be indented at all, or indented by just one tab stop from the
line it is dependent on.
material it is dependent on.
Problem__ PM_OrphanLine
>--> You wrote 'Marcellus: "Horatio says 'tis but our fantasy."' (source text, line 11):
again, this dialogue line is indented too far.
again, this dialogue material is indented too far.
Inform 7 has finished.

View file

@ -2,10 +2,11 @@ Inform 7 v10.2.0 has started.
I've now read your source text, which is 39 words long.
I've also read Basic Inform by Graham Nelson, which is 7691 words long.
I've also read English Language by Graham Nelson, which is 2328 words long.
I've also read Standard Rules by Graham Nelson, which is 32187 words long.
I've also read Standard Rules by Graham Nelson, which is 32205 words long.
Problem__ PM_OvernestedLine
In Section 1 - Meeting:
>--> You wrote 'Marcellus: "What, has this thing appear'd again to-night?"' (source
text, line 7): but this dialogue line is indented further than I can cope
with, and indeed further than any human reader could really make sense of.
text, line 7): but this dialogue material is indented further than I can
cope with, and indeed further than any human reader could really make sense
of.
Inform 7 has finished.

View file

@ -139,6 +139,9 @@ organisation, and are not directly functional in themselves.
case DIALOGUE_CUE_NT:
if (global_pass_state.pass == 0) DialogueBeats::new(p);
break;
case DIALOGUE_CHOICE_NT:
if (global_pass_state.pass == 0) DialogueChoices::new(p);
break;
case DIALOGUE_LINE_NT:
if (global_pass_state.pass == 0) DialogueLines::new(p);
break;

View file

@ -232,7 +232,9 @@ DECLARE_CLASS_ALLOCATED_IN_ARRAYS(activity_crossref, 100)
@e auxiliary_file_CLASS
@e cached_understanding_CLASS
@e dialogue_beat_CLASS
@e dialogue_choice_CLASS
@e dialogue_line_CLASS
@e dialogue_node_CLASS
@e direction_inference_data_CLASS
@e explicit_action_CLASS
@e found_in_inference_data_CLASS
@ -272,7 +274,9 @@ DECLARE_CLASS(actions_rcd_data)
DECLARE_CLASS(auxiliary_file)
DECLARE_CLASS(cached_understanding)
DECLARE_CLASS(dialogue_beat)
DECLARE_CLASS(dialogue_choice)
DECLARE_CLASS(dialogue_line)
DECLARE_CLASS(dialogue_node)
DECLARE_CLASS(direction_inference_data)
DECLARE_CLASS(found_in_inference_data)
DECLARE_CLASS(cg_line)

View file

@ -284,6 +284,7 @@ void CoreSyntax::grant_unit_permissions(void) {
@e classified_ANNOT /* |int|: this sentence has been classified */
@e clears_pronouns_ANNOT /* |int|: this sentence erases the current value of "it" */
@e dialogue_beat_clause_ANNOT /* |int|: for clauses of dialogue cues introducing beats */
@e dialogue_choice_clause_ANNOT /* |int|: for clauses of dialogue choice points */
@e dialogue_line_clause_ANNOT /* |int|: for clauses of dialogue lines */
@e impdef_ANNOT /* |imperative_defn|: for blocks of imperative code */
@e implicit_in_creation_of_ANNOT /* |inference_subject|: for assemblies */
@ -312,6 +313,8 @@ void CoreSyntax::declare_L2_annotations(void) {
dialogue_beat_clause_ANNOT, CoreSyntax::write_dialogue_beat_clause_ANNOT);
Annotations::declare_type(
dialogue_line_clause_ANNOT, CoreSyntax::write_dialogue_line_clause_ANNOT);
Annotations::declare_type(
dialogue_choice_clause_ANNOT, CoreSyntax::write_dialogue_choice_clause_ANNOT);
Annotations::declare_type(
impdef_ANNOT, CoreSyntax::write_impdef_ANNOT);
Annotations::declare_type(
@ -347,6 +350,13 @@ void CoreSyntax::write_dialogue_line_clause_ANNOT(text_stream *OUT, parse_node *
WRITE("}");
}
}
void CoreSyntax::write_dialogue_choice_clause_ANNOT(text_stream *OUT, parse_node *p) {
if (Annotations::read_int(p, dialogue_choice_clause_ANNOT) > 0) {
WRITE(" {choice clause: ");
DialogueChoices::write_dcc(OUT, Annotations::read_int(p, dialogue_choice_clause_ANNOT));
WRITE("}");
}
}
void CoreSyntax::write_impdef_ANNOT(text_stream *OUT, parse_node *p) {
if (Node::get_impdef(p))
WRITE(" {imperative definition: %d}", Node::get_impdef(p)->allocation_id);
@ -384,6 +394,7 @@ void CoreSyntax::grant_L2_permissions(void) {
Annotations::allow(SENTENCE_NT, classified_ANNOT);
Annotations::allow(DIALOGUE_CLAUSE_NT, dialogue_beat_clause_ANNOT);
Annotations::allow(DIALOGUE_CLAUSE_NT, dialogue_line_clause_ANNOT);
Annotations::allow(DIALOGUE_CLAUSE_NT, dialogue_choice_clause_ANNOT);
}
@h Annotations of Level 3 nodes.

View file

@ -26,7 +26,7 @@ void DialogueBeats::note_heading(heading *h) {
else dialogue_section_being_scanned = NULL;
previous_dialogue_beat = NULL;
current_dialogue_beat = NULL;
DialogueLines::clear_precursors();
DialogueNodes::clear_precursors(0);
}
@h Beats.
@ -52,7 +52,7 @@ dialogue_beat *DialogueBeats::new(parse_node *PN) {
previous_dialogue_beat = current_dialogue_beat;
current_dialogue_beat = db;
DialogueLines::clear_precursors();
DialogueNodes::clear_precursors(0);
@<Parse the clauses just enough to classify them@>;
@<Look through the clauses for a name@>;
@ -89,7 +89,7 @@ typedef struct dialogue_beat {
struct linked_list *some_time_before; /* of |parse_node| */
struct linked_list *about_list; /* of |parse_node| */
struct dialogue_line *opening_line;
struct dialogue_node *root;
struct dialogue_beat_compilation_data compilation_data;
CLASS_DEFINITION
} dialogue_beat;
@ -105,7 +105,7 @@ typedef struct dialogue_beat {
db->some_time_after = NEW_LINKED_LIST(parse_node);
db->some_time_before = NEW_LINKED_LIST(parse_node);
db->about_list = NEW_LINKED_LIST(parse_node);
db->opening_line = NULL;
db->root = NULL;
db->compilation_data = RTDialogue::new_beat(PN, db);
@ Each clause can be one of about 10 possibilities, as follows, and the

View file

@ -0,0 +1,72 @@
[DialogueChoices::] Dialogue Choices.
To manage dialogue choices.
@h Scanning the dialogue choices in pass 0.
Choices have already been parsed a little. For example,
= (text as Inform 7)
-- (if the shortbread is carried) "Offer the shortbread"
=
will have become:
= (text)
DIALOGUE_CHOICE_NT
DIALOGUE_SELECTION_NT ""Offer the shortbread""
DIALOGUE_CLAUSE_NT "if the shortbread is carried"
=
@
=
dialogue_choice *DialogueChoices::new(parse_node *PN) {
int L = Annotations::read_int(PN, dialogue_level_ANNOT);
if (L < 0) L = 0;
dialogue_choice *dc = CREATE(dialogue_choice);
@<Initialise the choice@>;
dc->as_node = DialogueNodes::add_to_current_beat(L, NULL, dc);
@<Parse the clauses just enough to classify them@>;
return dc;
}
@ =
typedef struct dialogue_choice {
struct dialogue_node *as_node;
struct parse_node *selection;
struct dialogue_choice_compilation_data compilation_data;
CLASS_DEFINITION
} dialogue_choice;
@<Initialise the choice@> =
dc->as_node = NULL;
dc->selection = NULL;
dc->compilation_data = RTDialogue::new_choice(PN, dc);
@<Parse the clauses just enough to classify them@> =
for (parse_node *clause = PN->down; clause; clause = clause->next) {
wording CW = Node::get_text(clause);
if (Node::is(clause, DIALOGUE_CLAUSE_NT)) {
<dialogue-choice-clause>(CW);
Annotations::write_int(clause, dialogue_choice_clause_ANNOT, <<r>>);
} else if (Node::is(clause, DIALOGUE_SELECTION_NT)) {
dc->selection = clause;
} else internal_error("damaged DIALOGUE_CHOICE_NT subtree");
}
@ As with the analogous clauses for //Dialogue Beats//, each clause can be one
of the following possibilities:
@e ANYTHING_DCC from 1
@ Using:
=
<dialogue-choice-clause> ::=
... ==> { ANYTHING_DCC, - }
@ =
void DialogueChoices::write_dcc(OUTPUT_STREAM, int c) {
switch(c) {
case ANYTHING_DCC: WRITE("ANYTHING"); break;
default: WRITE("?"); break;
}
}

View file

@ -2,35 +2,6 @@
To manage dialogue lines.
@h Scanning within a beat.
Inside any given beat, we have to keep track of the indentation of lines in
order to see what is subordinate to what. For example:
= (text as Inform 7)
(About Elsinore.)
Marcellus: "What, has this thing appear'd again to-night?"
Bernardo: "I have seen naught but [list of things in the Battlements]."
Marcellus: "Horatio says 'tis but our fantasy."
=
Here the lines are at levels 0, 0 and 1. We actually allow them to go in as
far as |MAX_DIALOGUE_LINE_NESTING|, which is a lot of tab stops: no human
author would want that many.
As we go through the beat looking for lines, we track the most recent line
seen at each level. These are called "precursors".
@d MAX_DIALOGUE_LINE_NESTING 25
=
dialogue_line *precursor_dialogue_lines[MAX_DIALOGUE_LINE_NESTING];
void DialogueLines::clear_precursors(void) {
for (int i=0; i<MAX_DIALOGUE_LINE_NESTING; i++)
precursor_dialogue_lines[i] = NULL;
}
@h Scanning the dialogue lines in pass 0.
Lines have already been parsed a little. For example,
= (text as Inform 7)
@ -49,48 +20,17 @@ any number of |DIALOGUE_CLAUSE_NT| nodes (including none at all).
=
dialogue_line *DialogueLines::new(parse_node *PN) {
@<See if we are expecting a dialogue line@>;
int L = Annotations::read_int(PN, dialogue_level_ANNOT);
if (L < 0) L = 0;
@<See if that level of indentation is feasible@>;
dialogue_line *dl = CREATE(dialogue_line);
@<Initialise the line@>;
@<Parse the clauses just enough to classify them@>;
@<Look for a line name@>;
@<Build the tree structure@>;
dl->as_node = DialogueNodes::add_to_current_beat(L, dl, NULL);
@<Add the line to the world model@>;
return dl;
}
@ Note that a |DIALOGUE_LINE_NT| is only made under a section marked as containing
dialogue, so the internal error here should be impossible to hit.
@<See if we are expecting a dialogue line@> =
if (dialogue_section_being_scanned == NULL) internal_error("line outside dialogue section");
if (current_dialogue_beat == NULL) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LineWithoutBeat),
"this dialogue line seems to appear before any beat has begun",
"which is not allowed - every line has to be part of a 'beat', which "
"has to be introduced with a bracketed paragraph looking like a stage "
"direction in a play.");
return NULL;
}
@<See if that level of indentation is feasible@> =
if (L >= MAX_DIALOGUE_LINE_NESTING) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OvernestedLine),
"this dialogue line is indented further than I can cope with",
"and indeed further than any human reader could really make sense of.");
return NULL;
}
if ((L > 0) && (precursor_dialogue_lines[L-1] == NULL)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OrphanLine),
"this dialogue line is indented too far",
"and should either not be indented at all, or indented by just one tab "
"stop from the line it is dependent on.");
return NULL;
}
@ =
typedef struct dialogue_line {
struct wording line_name;
@ -104,10 +44,7 @@ typedef struct dialogue_line {
struct linked_list *mentioning; /* of |parse_node| */
struct performance_style *how_performed;
struct instance *interlocutor;
struct dialogue_beat *owning_beat;
struct dialogue_line *parent_line;
struct dialogue_line *child_line;
struct dialogue_line *next_line;
struct dialogue_node *as_node;
struct dialogue_line_compilation_data compilation_data;
CLASS_DEFINITION
} dialogue_line;
@ -119,11 +56,6 @@ typedef struct dialogue_line {
dl->speaker_text = EMPTY_WORDING;
dl->speaker_description = NULL;
dl->without_speaking = FALSE;
dl->owning_beat = current_dialogue_beat;
dl->parent_line = NULL;
if (L > 0) dl->parent_line = precursor_dialogue_lines[L-1];
dl->child_line = NULL;
dl->next_line = NULL;
dl->compilation_data = RTDialogue::new_line(PN, dl);
dl->speech_text = EMPTY_WORDING;
dl->mentioning = NEW_LINKED_LIST(parse_node);
@ -228,20 +160,6 @@ void DialogueLines::write_dlc(OUTPUT_STREAM, int c) {
}
}
@ The whole point of the indentation on lines is to provide a hierarchy of
lines within a beat, and this is where we use precursors to sort that out:
@<Build the tree structure@> =
if (current_dialogue_beat->opening_line == NULL)
current_dialogue_beat->opening_line = dl;
else if (precursor_dialogue_lines[L])
precursor_dialogue_lines[L]->next_line = dl;
else
precursor_dialogue_lines[L-1]->child_line = dl;
precursor_dialogue_lines[L] = dl;
for (int i=L+1; i<MAX_DIALOGUE_LINE_NESTING; i++) precursor_dialogue_lines[i] = NULL;
@ Each line produces an instance of the kind |dialogue line|, using the name
given in its clauses if one was.

View file

@ -0,0 +1,115 @@
[DialogueNodes::] Dialogue Nodes.
The structure of a dialogue beat as a tree of nodes, each of which can be
either a line or a choice.
@ Inside any given beat, we have to keep track of the indentation of material
in order to see what is subordinate to what. For example:
= (text as Inform 7)
(About Elsinore.)
Marcellus: "What, has this thing appear'd again to-night?"
Bernardo: "I have seen naught but [list of things in the Battlements]."
Marcellus: "Horatio says 'tis but our fantasy."
=
Here the lines are at levels 0, 0 and 1. We actually allow them to go in as
far as |MAX_DIALOGUE_NODE_NESTING|, which is a lot of tab stops: no human
author would want that many.
As we go through the beat looking for lines, we track the most recent line
or choice seen at each level. These are called "precursors".
@d MAX_DIALOGUE_NODE_NESTING 25
=
dialogue_node *precursor_dialogue_nodes[MAX_DIALOGUE_NODE_NESTING];
void DialogueNodes::clear_precursors(int from) {
for (int i=from; i<MAX_DIALOGUE_NODE_NESTING; i++)
precursor_dialogue_nodes[i] = NULL;
}
@ Other than the connectivity for the tree structure, a node is basically a
union type: it can either be a line or a choice.
=
typedef struct dialogue_node {
struct dialogue_line *if_line;
struct dialogue_choice *if_choice;
struct dialogue_beat *owning_beat;
struct dialogue_node *parent_node;
struct dialogue_node *child_node;
struct dialogue_node *next_node;
CLASS_DEFINITION
} dialogue_node;
@ And therefore the following should be called with exactly one non-|NULL|
pointer.
=
dialogue_node *DialogueNodes::add_to_current_beat(int L, dialogue_line *dl, dialogue_choice *dc) {
int w = 0; if (dl) w++; if (dc) w++;
if (w != 1) internal_error("exactly one should be non-NULL");
@<See if we are expecting a dialogue node@>;
@<See if that level of indentation is feasible@>;
dialogue_node *dn = CREATE(dialogue_node);
@<Initialise the node@>;
@<Join the node to the current beat's tree@>;
@<Make the node a precursor@>;
return dn;
}
@<Initialise the node@> =
dn->if_line = dl;
dn->if_choice = dc;
dn->owning_beat = current_dialogue_beat;
if (L > 0) dn->parent_node = precursor_dialogue_nodes[L-1];
else dn->parent_node = NULL;
dn->child_node = NULL;
dn->next_node = NULL;
@<Join the node to the current beat's tree@> =
if (current_dialogue_beat->root == NULL)
current_dialogue_beat->root = dn;
else if (precursor_dialogue_nodes[L])
precursor_dialogue_nodes[L]->next_node = dn;
else
precursor_dialogue_nodes[L-1]->child_node = dn;
@<Make the node a precursor@> =
precursor_dialogue_nodes[L] = dn;
DialogueNodes::clear_precursors(L+1);
@ Note that a |DIALOGUE_LINE_NT| or |DIALOGUE_CHOICE_NT| is only made under a
section marked as containing dialogue, so the internal error here should be
impossible to hit.
@<See if we are expecting a dialogue node@> =
if (dialogue_section_being_scanned == NULL) internal_error("node outside dialogue section");
if (current_dialogue_beat == NULL) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_LineWithoutBeat),
"this dialogue material seems to appear before any beat has begun",
"which is not allowed - every line or choice has to be part of a 'beat', which "
"has to be introduced with a bracketed paragraph looking like a stage "
"direction in a play.");
return NULL;
}
@<See if that level of indentation is feasible@> =
if (L >= MAX_DIALOGUE_NODE_NESTING) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OvernestedLine),
"this dialogue material is indented further than I can cope with",
"and indeed further than any human reader could really make sense of.");
return NULL;
}
if ((L > 0) && (precursor_dialogue_nodes[L-1] == NULL)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OrphanLine),
"this dialogue material is indented too far",
"and should either not be indented at all, or indented by just one tab "
"stop from the material it is dependent on.");
return NULL;
}

View file

@ -70,4 +70,6 @@ Chapter 6: Dialogue
Dialogue
Dialogue Beats
Dialogue Lines
Dialogue Choices
Dialogue Nodes
Performance Styles

View file

@ -31,6 +31,20 @@ dialogue_line_compilation_data RTDialogue::new_line(parse_node *PN, dialogue_lin
return dlcd;
}
@h Compilation data for dialogue choices.
Each |dialogue_choice| object contains this data:
=
typedef struct dialogue_choice_compilation_data {
struct parse_node *where_created;
} dialogue_choice_compilation_data;
dialogue_choice_compilation_data RTDialogue::new_choice(parse_node *PN, dialogue_choice *dc) {
dialogue_choice_compilation_data dlcd;
dlcd.where_created = PN;
return dlcd;
}
@h Compilation of dialogue.
=
@ -54,7 +68,7 @@ void RTDialogue::beat_compilation_agent(compilation_subtask *ct) {
current_sentence = db->compilation_data.where_created;
LOG("Beat %d = %W name '%W' scene '%W'\n",
db->allocation_id, Node::get_text(current_sentence), db->beat_name, db->scene_name);
RTDialogue::log_r(db->opening_line);
RTDialogue::log_r(db->root);
}
void RTDialogue::line_compilation_agent(compilation_subtask *ct) {
@ -63,16 +77,20 @@ void RTDialogue::line_compilation_agent(compilation_subtask *ct) {
LOG("Line %d = %W name '%W'\n", dl->allocation_id, Node::get_text(current_sentence), dl->line_name);
}
void RTDialogue::log_r(dialogue_line *dl) {
while (dl) {
LOG("Line %d = %W\n",
dl->allocation_id, Node::get_text(dl->compilation_data.where_created));
if (dl->child_line) {
if (dl->child_line->parent_line != dl) LOG("*** Broken parentage ***\n");
void RTDialogue::log_r(dialogue_node *dn) {
while (dn) {
if (dn->if_line)
LOG("Line %d = %W\n",
dn->if_line->allocation_id, Node::get_text(dn->if_line->compilation_data.where_created));
if (dn->if_choice)
LOG("Choice %d = %W\n",
dn->if_choice->allocation_id, Node::get_text(dn->if_choice->compilation_data.where_created));
if (dn->child_node) {
if (dn->child_node->parent_node != dn) LOG("*** Broken parentage ***\n");
LOG_INDENT;
RTDialogue::log_r(dl->child_line);
RTDialogue::log_r(dn->child_node);
LOG_OUTDENT;
}
dl = dl->next_line;
dn = dn->next_node;
}
}

View file

@ -1,5 +1,5 @@
Size of lexicon: 3112 excerpt meanings
Stored among 842 words out of total vocabulary of 10558
Stored among 842 words out of total vocabulary of 10560
712 words have a start list: longest belongs to report (with 293 meanings)
15 words have an end list: longest belongs to case (with 6 meanings)
29 words have a middle list: longest belongs to to (with 4 meanings)

View file

@ -270,6 +270,7 @@ void Annotations::make_annotation_allowed_table(void) {
Annotations::allow(HEADING_NT, implied_heading_ANNOT);
Annotations::allow(SENTENCE_NT, language_element_ANNOT);
Annotations::allow(DIALOGUE_CUE_NT, dialogue_level_ANNOT);
Annotations::allow(DIALOGUE_CHOICE_NT, dialogue_level_ANNOT);
Annotations::allow(DIALOGUE_LINE_NT, dialogue_level_ANNOT);
#ifdef ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK
ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK();

View file

@ -213,30 +213,34 @@ do this. All a bit clumsy, but it works.
@e AMBIGUITY_NT /* Marks an ambiguous set of readings in the tree */
@e UNKNOWN_NT /* "arfle barfle gloop" */
@e DIALOGUE_CUE_NT /* A dialogue cue under a dialogue Section heading */
@e DIALOGUE_CHOICE_NT /* A branch point in dialogue */
@e DIALOGUE_LINE_NT /* A line of dialogue under a dialogue Section heading */
@e DIALOGUE_SPEAKER_NT /* "James" in "James: "Hello!"" */
@e DIALOGUE_SPEECH_NT /* ""Hello!"" in "James: "Hello!"" */
@e DIALOGUE_SELECTION_NT /* "instead of examining a door" */
@e DIALOGUE_CLAUSE_NT /* A bracketed term used in a cue or line */
=
void NodeType::metadata_setup(void) {
NodeType::new(INVALID_NT, I"(INVALID_NT)", 0, INFTY, INVALID_NCAT, 0);
NodeType::new(INVALID_NT, I"(INVALID_NT)", 0, INFTY, INVALID_NCAT, 0);
NodeType::new(ROOT_NT, I"ROOT_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
NodeType::new(INCLUSION_NT, I"INCLUSION_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
NodeType::new(HEADING_NT, I"HEADING_NT", 0, INFTY, L1_NCAT, 0);
NodeType::new(INCLUDE_NT, I"INCLUDE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(BEGINHERE_NT, I"BEGINHERE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(ENDHERE_NT, I"ENDHERE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(SENTENCE_NT, I"SENTENCE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(AMBIGUITY_NT, I"AMBIGUITY_NT", 0, INFTY, L1_NCAT, 0);
NodeType::new(UNKNOWN_NT, I"UNKNOWN_NT", 0, INFTY, UNKNOWN_NCAT, 0);
NodeType::new(ROOT_NT, I"ROOT_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
NodeType::new(INCLUSION_NT, I"INCLUSION_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
NodeType::new(HEADING_NT, I"HEADING_NT", 0, INFTY, L1_NCAT, 0);
NodeType::new(INCLUDE_NT, I"INCLUDE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(BEGINHERE_NT, I"BEGINHERE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(ENDHERE_NT, I"ENDHERE_NT", 0, 0, L2_NCAT, 0);
NodeType::new(SENTENCE_NT, I"SENTENCE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(AMBIGUITY_NT, I"AMBIGUITY_NT", 0, INFTY, L1_NCAT, 0);
NodeType::new(UNKNOWN_NT, I"UNKNOWN_NT", 0, INFTY, UNKNOWN_NCAT, 0);
NodeType::new(DIALOGUE_CUE_NT, I"DIALOGUE_CUE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_LINE_NT, I"DIALOGUE_LINE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_SPEAKER_NT, I"DIALOGUE_SPEAKER_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_SPEECH_NT, I"DIALOGUE_SPEECH_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_CLAUSE_NT, I"DIALOGUE_CLAUSE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_CUE_NT, I"DIALOGUE_CUE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_CHOICE_NT, I"DIALOGUE_CHOICE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_LINE_NT, I"DIALOGUE_LINE_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_SPEAKER_NT, I"DIALOGUE_SPEAKER_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_SPEECH_NT, I"DIALOGUE_SPEECH_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_SELECTION_NT, I"DIALOGUE_SELECTION_NT", 0, INFTY, L2_NCAT, 0);
NodeType::new(DIALOGUE_CLAUSE_NT, I"DIALOGUE_CLAUSE_NT", 0, INFTY, L2_NCAT, 0);
#ifdef NODE_METADATA_SETUP_SYNTAX_CALLBACK
NODE_METADATA_SETUP_SYNTAX_CALLBACK();
@ -271,6 +275,9 @@ int NodeType::parentage_allowed(node_type_t t_parent, node_type_t t_child) {
return TRUE;
if ((t_parent == DIALOGUE_CUE_NT) && (t_child == DIALOGUE_CLAUSE_NT))
return TRUE;
if ((t_parent == DIALOGUE_CHOICE_NT) &&
((t_child == DIALOGUE_CLAUSE_NT) || (t_child == DIALOGUE_SELECTION_NT)))
return TRUE;
#ifdef PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK
if (PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK(t_parent, cat_parent, t_child, cat_child))
return TRUE;

View file

@ -710,6 +710,8 @@ order to catch improbable unmatched-bracket errors with tidy error messages.
if ((Lexer::word(Wordings::first_wn(W)) == OPENBRACKET_V) &&
(Lexer::word(Wordings::last_wn(W)) == CLOSEBRACKET_V))
@<This is a dialogue cue@>;
if (Lexer::word(Wordings::first_wn(W)) == DOUBLEDASH_V)
@<This is a dialogue choice@>;
@<Otherwise this has to be a dialogue line@>;
@ Here we are trying to match |(Cue notes.)|.
@ -724,6 +726,36 @@ order to catch improbable unmatched-bracket errors with tidy error messages.
Sentences::add_dialogue_clauses(CW, T, new);
return;
@<This is a dialogue choice@> =
int clauses_from = Wordings::first_wn(W) + 1, clauses_to = clauses_from - 1;
int speech_from = clauses_from, speech_to = Wordings::last_wn(W);
if (Lexer::word(speech_from) == OPENBRACKET_V) {
for (int bl = 0, i=Wordings::first_wn(W); i<=Wordings::last_wn(W); i++) {
if (Lexer::word(i) == OPENBRACKET_V) bl++;
if (Lexer::word(i) == CLOSEBRACKET_V) {
bl--;
if (bl == 0) { clauses_to = i; speech_from = i+1; break; }
}
}
}
wording CW = Wordings::new(clauses_from+1, clauses_to-1);
wording TW = Wordings::new(speech_from, speech_to);
new = Node::new(DIALOGUE_CHOICE_NT);
Node::set_text(new, W);
Annotations::write_int(new, dialogue_level_ANNOT,
Lexer::indentation_level(Wordings::first_wn(W)));
SyntaxTree::graft_sentence(T, new);
if (Wordings::nonempty(TW)) {
parse_node *selection = Node::new(DIALOGUE_SELECTION_NT);
Node::set_text(selection, TW);
SyntaxTree::graft(T, selection, new);
}
if (Wordings::nonempty(CW))
Sentences::add_dialogue_clauses(CW, T, new);
return;
@ Here we are trying to match |Speaker (notes): "Speech."|.
@<Otherwise this has to be a dialogue line@> =

View file

@ -1,4 +1,4 @@
Read 79 words
Read 111 words
ROOT_NT
HEADING_NT'elsinore is a room' {heading 0}
SENTENCE_NT'elsinore is a room'
@ -14,9 +14,19 @@ ROOT_NT
DIALOGUE_SPEAKER_NT'bernardo'
DIALOGUE_SPEECH_NT'"I have seen naught but [list of things in the Battlements].'
DIALOGUE_CLAUSE_NT'after looking'
DIALOGUE_CHOICE_NT'--' {level 0}
DIALOGUE_CHOICE_NT'-- ( one thing ; another thing )' {level 0}
DIALOGUE_CLAUSE_NT'one thing'
DIALOGUE_CLAUSE_NT'another thing'
DIALOGUE_CHOICE_NT'-- "Try this!"' {level 0}
DIALOGUE_SELECTION_NT'"Try this!"'
DIALOGUE_CHOICE_NT'-- instead of examining something' {level 0}
DIALOGUE_SELECTION_NT'instead of examining something'
DIALOGUE_CHOICE_NT'-- ( frank ) "Try something else!"' {level 0}
DIALOGUE_SELECTION_NT'"Try something else!"'
DIALOGUE_CLAUSE_NT'frank'
DIALOGUE_CUE_NT'( about horatio , about battlements . ( about fantasy ) . ( ' {level 0}
DIALOGUE_CLAUSE_NT'about horatio'
DIALOGUE_CLAUSE_NT'about battlements'
DIALOGUE_CLAUSE_NT'about horatio , about battlements'
DIALOGUE_CLAUSE_NT'about fantasy'
DIALOGUE_CLAUSE_NT'about gravedigging'
DIALOGUE_LINE_NT'marcellus : "Horatio says 'tis but our fantasy."' {level 0}
@ -25,6 +35,10 @@ ROOT_NT
DIALOGUE_LINE_NT'hamlet : "I'm here too!"' {level 1}
DIALOGUE_SPEAKER_NT'hamlet'
DIALOGUE_SPEECH_NT'"I'm here too!"'
DIALOGUE_CHOICE_NT'-- "Me too!"' {level 1}
DIALOGUE_SELECTION_NT'"Me too!"'
DIALOGUE_CHOICE_NT'-- "Not me."' {level 1}
DIALOGUE_SELECTION_NT'"Not me."'
DIALOGUE_LINE_NT'horatio : "So you are."' {level 1}
DIALOGUE_SPEAKER_NT'horatio'
DIALOGUE_SPEECH_NT'"So you are."'

View file

@ -10,12 +10,26 @@ Marcellus: "What, has this thing appear'd again to-night?"
Bernardo (after looking): "I have seen naught but [list of things in the Battlements]."
--
-- (one thing; another thing)
-- "Try this!"
-- instead of examining something
-- (frank) "Try something else!"
(About Horatio, about battlements. (About fantasy). (About gravedigging.))
Marcellus: "Horatio says 'tis but our fantasy."
Hamlet: "I'm here too!"
-- "Me too!"
-- "Not me."
Horatio: "So you are."
Osric: "Palpably."