1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00
inform7/docs/BasicInformKit/S-prg.html
2020-05-03 01:20:55 +01:00

391 lines
48 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Paragraphing</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">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Extensions</h2><ul>
<li><a href="../basic_inform/index.html">basic_inform</a></li>
<li><a href="../standard_rules/index.html">standard_rules</a></li>
</ul><h2>Kits</h2><ul>
<li><a href="index.html"><span class="selectedlink">BasicInformKit</span></a></li>
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Paragraphing' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Paragraphing</b></li></ul></div>
<p class="purpose">To manage the line skips which space paragraphs out.</p>
<ul class="toc"><li><a href="S-prg.html#SP1">&#167;1. Paragraph Control</a></li><li><a href="S-prg.html#SP2">&#167;2. State</a></li><li><a href="S-prg.html#SP3">&#167;3. Say Number</a></li><li><a href="S-prg.html#SP4">&#167;4. Print English Number</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Paragraph Control. </b>Ah, yes: the paragraph breaking algorithm. In {\it \TeX: The Program},
Donald Knuth writes at section 768: "It's sort of a miracle whenever <span class="extract"><span class="extract-syntax">\halign</span></span>
and <span class="extract"><span class="extract-syntax">\valign</span></span> work, because they cut across so many of the control structures
of \TeX." It's sort of a miracle whenever Inform 7's paragraph breaking
system works, too. Most users probably imagine that it's implemented by
having I7 look at where the cursor currently is (at the start of a line or
not) and whether a line has just been skipped. In fact, the virtual machines
simply do not offer facilities like that, and so we have to use our own
book-keeping. Given the huge number of ways in which text can be printed,
this is a delicate business. For some years now, "spacing bugs" &mdash; those
where a spurious extra skipped line appears in a paragraph break, or
where, conversely, no line is skipped at all &mdash; have been the least
welcome in the Inform bugs database.
</p>
<p class="commentary">The basic method is to set <span class="extract"><span class="extract-syntax">say__p</span></span>, the paragraph flag, when we print any
matter; every so often we reach a "divide paragraph" point &mdash; for instance
when one rule has finished and before another is about to start &mdash; and at
those positions we look for <span class="extract"><span class="extract-syntax">say__p</span></span>, and print a skipped line (and clear
<span class="extract"><span class="extract-syntax">say__p</span></span> again) if we find it. Thus:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> &gt; WAIT</span>
<span class="plain-syntax"> The clock ticks ominously. ...first rule</span>
<span class="plain-syntax"> ...skipped line printed at a Divide Paragraph point</span>
<span class="plain-syntax"> Mme Tourmalet rises from her chair and slips out. ...second rule</span>
<span class="plain-syntax"> ...skipped line printed at a Divide Paragraph point</span>
<span class="plain-syntax"> &gt;</span>
</pre>
<p class="commentary">A divide paragraph point occurs between any two rules in an action rulebook,
but not an activity rulebook: many activities exist to print text, such as
the names of objects, and there would be wild spacing accidents if paragraphs
were divided there. Inform places DPPs elsewhere, too: and the text substitution
"[conditional paragraph break]" allows the user to place one anywhere.
</p>
<p class="commentary">A traditional layout convention handed down from Infocom makes an exception
of the first paragraph to appear after the prompt, but only in one situation.
Ordinarily, the first paragraph of any turn appears straight after the prompt:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> &gt; EXAMINE DOG</span>
<span class="plain-syntax"> Mme Tourmalet's borzoi looks as if it means fashion, not business.</span>
</pre>
<p class="commentary">The command is echoed on screen as the player types, but this doesn't set the
paragraph flag, which is still clear when the text "Mme Tourmalet's..."
begins to be printed. The single exception occurs when the command calls for
the player to go to a new location, when a skipped line is printed before the
room description for the new room. Thus:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> &gt; SOUTH</span>
<span class="plain-syntax"> ...the "going look break" here</span>
<span class="plain-syntax"> Rocky Beach</span>
</pre>
<p class="commentary">(Note that this is not inherent in the looking action:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> &gt; LOOK</span>
<span class="plain-syntax"> Rocky Beach</span>
</pre>
<p class="commentary">...which obeys the standard paragraphing conventions.)
</p>
<p class="commentary">So much for automatic paragraph breaks. However, we need a variety of different
ways explicitly to control paragraphs, in order to accommodate traditional
layout conventions handed down from Infocom.
</p>
<p class="commentary">The simplest exceptional kind of paragraph break is a "command
clarification break", in which a single new-line is printed but there is
no skipped line: as the name implies, it's traditionally used when a
command such as OPEN DOOR is clarified. For example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> (first unlocking the oak door) ...now a command clarification break</span>
<span class="plain-syntax"> You open the oak door.</span>
</pre>
<p class="commentary">This is not quite the same thing as a "run paragraph on" break, in which
we also deliberately suppress the skipped line, but make an exception for
the skipped line which ought to appear last before the prompt: the idea is
to merge two or more paragraphs together.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> &gt; TAKE ALL</span>
<span class="plain-syntax"> marmot: Taken. ...we run paragraph on here</span>
<span class="plain-syntax"> weasel: Taken. ...and also here</span>
<span class="plain-syntax"> ...despite which the final skip does occur</span>
<span class="plain-syntax"> &gt; ...before the next prompt</span>
</pre>
<p class="commentary">A more complicated case is "special look spacing", used for the break which
occurs after the (boldface) short name of a room description is printed. This
is tricky because it is sometimes followed directly by a long description, and
we don't want a skipped line:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> Villa Christiane ...a special look spacing break</span>
<span class="plain-syntax"> The walled garden of a villa in Cap d'Agde.</span>
<span class="plain-syntax"> ...a Divide Paragraph break</span>
<span class="plain-syntax"> Mme Tourmalet's borzoi lazes in the long grass.</span>
</pre>
<p class="commentary">But sometimes it is followed directly by a subsequent paragraph, and again
we want no skip:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> Villa Christiane ...a special look spacing break</span>
<span class="plain-syntax"> Mme Tourmalet's borzoi lazes in the long grass.</span>
</pre>
<p class="commentary">And sometimes it is the only content of the room description and is followed
only by the prompt:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> Villa Christiane ...a special look spacing break</span>
<span class="plain-syntax"> ...a break inserted before the prompt</span>
<span class="plain-syntax"> &gt;</span>
</pre>
<p class="commentary">To recap, we have five kinds of paragraph break:
</p>
<ul class="items"><li>(a) Standard breaks at "divide paragraph points", used between rules.
</li><li>(b) The "going look break", used before the room description after going to
a new room.
</li><li>(c) A "command clarification break", used after text clarifying a command.
</li><li>(d) A "run paragraph on" break, used to merge multiple paragraphs into a
single block of text.
</li><li>(e) The "special look spacing" break, used after the boldface headline of
a room description.
</li></ul>
<p class="commentary">We now have to implement all of these behaviours. The code, while very simple,
is highly prone to behaving unexpectedly if changes are made, simply because
of the huge number of circumstances in which paragraphs are printed: so change
nothing without very careful testing.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. State. </b>The current state is stored in a combination of two global variables:
</p>
<ul class="items"><li>(1) <span class="extract"><span class="extract-syntax">say__p</span></span>, the "say paragraph" flag, which is set if a paragraph break
needs to be printed before the next text can begin;
</li><li>(2) <span class="extract"><span class="extract-syntax">say__pc</span></span>, originally named as the "paragraph completed" flag, but
which is now a bitmap:
<ul class="items"><li>(2a) <span class="extract"><span class="extract-syntax">PARA_COMPLETED</span></span> is set if a standard paragraph break has been made
since the last time the flag was cleared;
</li><li>(2b) <span class="extract"><span class="extract-syntax">PARA_PROMPTSKIP</span></span> is set to indicate that the current printing position
does not follow a skipped line, and that further material is expected which
will run on from the previous paragraph, but that if no further material turns
up then a skipped line would be needed before the next prompt;
</li><li>(2c) <span class="extract"><span class="extract-syntax">PARA_SUPPRESSPROMPTSKIP</span></span> is set to indicate that, despite <span class="extract"><span class="extract-syntax">PARA_PROMPTSKIP</span></span>
being set, no skipped line is needed before the prompt after all;
</li><li>(2d) <span class="extract"><span class="extract-syntax">PARA_NORULEBOOKBREAKS</span></span> suppresses divide paragraph points in between
rules in rulebooks; it treats all rulebooks, and in particular action rulebooks,
the way activity rulebooks are treated. (The flag is used for short periods
only and never across turn boundaries, prompts and so on.)
</li><li>(2e) <span class="extract"><span class="extract-syntax">PARA_CONTENTEXPECTED</span></span> is set after a paragraph division as a signal
that if any contents looks likely to be printed soon then <span class="extract"><span class="extract-syntax">say__p</span></span> needs
to be set, because a successor paragraph will then have started. This
is checked by calling <span class="extract"><span class="extract-syntax">ParaContent()</span></span> &mdash; while it's slow to have to call
this routine so often, that's better than compiling inline code with the
same effect, because minimising compiled code size is more important, and
speed is never a big deal when printing.
</li></ul>
</li></ul>
<p class="commentary">Not all printing is to the screen: sometimes the output is to a file, or to
memory, and in that case we want to start the switched output at a clear
paragraphing state and then go back to the screen afterwards without any
sign of change. The correct way to do this is to push the <span class="extract"><span class="extract-syntax">say__p</span></span> and
<span class="extract"><span class="extract-syntax">say__pc</span></span> variables onto the VM stack and call <span class="extract"><span class="extract-syntax">ClearParagraphing()</span></span> before
starting to print to the new stream, and then pull the variables back again
before resuming printing to the old stream.
</p>
<p class="commentary">In no other case should any code alter <span class="extract"><span class="extract-syntax">say__pc</span></span> except via the routines
below.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="comment-syntax">onstant TRACE_I7_SPACING;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">ClearParagraphing</span><span class="plain-syntax"> </span><span class="identifier-syntax">r</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">DivideParagraphPoint</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">TRACE_I7_SPACING</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"[DPP"</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__p</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax">, </span><span class="string-syntax">"]"</span><span class="plain-syntax">; #</span><span class="identifier-syntax">endif</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">say__p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">; </span><span class="identifier-syntax">say__p</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_COMPLETED</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc_save</span><span class="plain-syntax"> = </span><span class="reserved-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">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_PROMPTSKIP</span><span class="plain-syntax">) </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> - </span><span class="identifier-syntax">PARA_PROMPTSKIP</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">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_SUPPRESSPROMPTSKIP</span><span class="plain-syntax">) </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> - </span><span class="identifier-syntax">PARA_SUPPRESSPROMPTSKIP</span><span class="plain-syntax">;</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">TRACE_I7_SPACING</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"[--&gt;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__p</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax">, </span><span class="string-syntax">"]"</span><span class="plain-syntax">; #</span><span class="identifier-syntax">endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_CONTENTEXPECTED</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc_save</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_COMPLETED</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">AdjustParagraphPoint</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">TRACE_I7_SPACING</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"[APP "</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__p</span><span class="plain-syntax">, </span><span class="string-syntax">" "</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax">, </span><span class="string-syntax">" "</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc_save</span><span class="plain-syntax">, </span><span class="string-syntax">"]^"</span><span class="plain-syntax">; #</span><span class="identifier-syntax">endif</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">say__pc_save</span><span class="plain-syntax">) </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_COMPLETED</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">ParaContent</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">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_CONTENTEXPECTED</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> - </span><span class="identifier-syntax">PARA_CONTENTEXPECTED</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</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">GoingLookBreak</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">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_COMPLETED</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ClearParagraphing</span><span class="plain-syntax">(10);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">CommandClarificationBreak</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ClearParagraphing</span><span class="plain-syntax">(11);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">RunParagraphOn</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">TRACE_I7_SPACING</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"[RPO"</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__p</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax">, </span><span class="string-syntax">"]"</span><span class="plain-syntax">; #</span><span class="identifier-syntax">endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</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">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_PROMPTSKIP</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_SUPPRESSPROMPTSKIP</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">SpecialLookSpacingBreak</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">TRACE_I7_SPACING</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"[SLS"</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__p</span><span class="plain-syntax">, </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax">, </span><span class="string-syntax">"]"</span><span class="plain-syntax">; #</span><span class="identifier-syntax">endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</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">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_PROMPTSKIP</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">EnsureBreakBeforePrompt</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">say__p</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_PROMPTSKIP</span><span class="plain-syntax">) &amp;&amp; ((</span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">PARA_SUPPRESSPROMPTSKIP</span><span class="plain-syntax">)==0)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">new_line</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ClearParagraphing</span><span class="plain-syntax">(12);</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">PrintSingleParagraph</span><span class="plain-syntax"> </span><span class="identifier-syntax">matter</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__p</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">say__pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> | </span><span class="identifier-syntax">PARA_NORULEBOOKBREAKS</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEXT_TY_Say</span><span class="plain-syntax">(</span><span class="identifier-syntax">matter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DivideParagraphPoint</span><span class="plain-syntax">(13);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">say__pc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Say Number. </b>The global variable <span class="extract"><span class="extract-syntax">say__n</span></span> is set to the numerical value of any quantity
printed, and this is used for the text substitution "[s]", so that
"You have been awake for [turn count] turn[s]." will expand correctly.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">STextSubstitution</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">say__n</span><span class="plain-syntax"> ~= </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"s"</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. Print English Number. </b>Another traditional name, this: in fact it prints the number as text in
whatever is the current language of play.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">EnglishNumber</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="identifier-syntax">LanguageNumber</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">LanguageNumber</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> </span><span class="identifier-syntax">f</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">n</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"zero"</span><span class="plain-syntax">; </span><span class="reserved-syntax">rfalse</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">n</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"minus "</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</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">Iftrue</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax"> == </span><span class="constant-syntax">4</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">1000000000</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">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">", "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LanguageNumber</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">/1000000000, </span><span class="string-syntax">" billion"</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">%1000000000; </span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">1000000</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">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">", "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LanguageNumber</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">/1000000, </span><span class="string-syntax">" million"</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">%1000000; </span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">Endif</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">1000</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">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">", "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LanguageNumber</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">/1000, </span><span class="string-syntax">" thousand"</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">%1000; </span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">100</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">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">", "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LanguageNumber</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">/100, </span><span class="string-syntax">" hundred"</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">%100; </span><span class="identifier-syntax">f</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</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">n</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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">TEMPLATE_CONFIGURATION_BITMAP</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">DIALECT_US_TCBIT</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">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" "</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">f</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" and "</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">20</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">n</span><span class="plain-syntax">&lt;100)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax">/10) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"twenty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"thirty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"forty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"fifty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"sixty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"seventy"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"eighty"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"ninety"</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">n</span><span class="plain-syntax">%10 ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"-"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">LanguageNumber</span><span class="plain-syntax">) </span><span class="identifier-syntax">n</span><span class="plain-syntax">%10;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"one"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"two"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"three"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"four"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"five"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"six"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"seven"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"eight"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"nine"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">10</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"ten"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">11</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"eleven"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">12</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"twelve"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">13</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"thirteen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">14</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"fourteen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">15</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"fifteen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">16</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"sixteen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">17</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"seventeen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">18</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"eighteen"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">19</span><span class="plain-syntax">: </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"nineteen"</span><span class="plain-syntax">;</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="S-zmc.html">&#10094;</a></li><li class="progresssection"><a href="S-dfn.html">dfn</a></li><li class="progresssection"><a href="S-utl.html">utl</a></li><li class="progresssection"><a href="S-gll.html">gll</a></li><li class="progresssection"><a href="S-zmc.html">zmc</a></li><li class="progresscurrent">prg</li><li class="progresssection"><a href="S-mth.html">mth</a></li><li class="progresssection"><a href="S-fl.html">fl</a></li><li class="progresssection"><a href="S-srt.html">srt</a></li><li class="progresssection"><a href="S-tbl.html">tbl</a></li><li class="progresssection"><a href="S-mst.html">mst</a></li><li class="progresssection"><a href="S-rlb.html">rlb</a></li><li class="progresssection"><a href="S-flx.html">flx</a></li><li class="progresssection"><a href="S-blc.html">blc</a></li><li class="progresssection"><a href="S-txt.html">txt</a></li><li class="progresssection"><a href="S-unc.html">unc</a></li><li class="progresssection"><a href="S-chr.html">chr</a></li><li class="progresssection"><a href="S-rgx.html">rgx</a></li><li class="progresssection"><a href="S-lst.html">lst</a></li><li class="progresssection"><a href="S-cmb.html">cmb</a></li><li class="progresssection"><a href="S-rlt.html">rlt</a></li><li class="progresssection"><a href="S-rlt2.html">rlt2</a></li><li class="progresssection"><a href="S-rtp.html">rtp</a></li><li class="progressnext"><a href="S-mth.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>