mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
437 lines
39 KiB
HTML
437 lines
39 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/zt</title>
|
|
<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="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html">compiler</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html"><b>extensions and kits</b></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="../BasicInformKit/index.html">BasicInformKit</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 'S/prg' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>Paragraphing</b></li></ul><p class="purpose">To manage the line skips which space paragraphs out.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Paragraph Control</a></li><li><a href="#SP2">§2. State</a></li><li><a href="#SP3">§3. Say Number</a></li><li><a href="#SP4">§4. Print English Number</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Paragraph Control. </b>Ah, yes: the paragraph breaking algorithm. In TeX: The Program,
|
|
Donald Knuth writes at \S 768: "It's sort of a miracle whenever <code class="display"><span class="extract">\halign</span></code>
|
|
and <code class="display"><span class="extract">\valign</span></code> 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" — those
|
|
where a spurious extra skipped line appears in a paragraph break, or
|
|
where, conversely, no line is skipped at all — have been the least
|
|
welcome in the Inform bugs database.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The basic method is to set <code class="display"><span class="extract">say__p</span></code>, the paragraph flag, when we print any
|
|
matter; every so often we reach a "divide paragraph" point — for instance
|
|
when one rule has finished and before another is about to start — and at
|
|
those positions we look for <code class="display"><span class="extract">say__p</span></code>, and print a skipped line (and clear
|
|
<code class="display"><span class="extract">say__p</span></code> again) if we find it. Thus:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">> WAIT</span>
|
|
<span class="plain">The clock ticks ominously.</span>
|
|
...first rule <span class="plain"> </span>
|
|
...skipped line printed at a Divide Paragraph point <span class="plain">Mme Tourmalet rises from her chair and slips out.</span>
|
|
second rule <span class="plain"> </span>
|
|
...skipped line printed at a Divide Paragraph point <span class="plain">> </span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">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="inwebparagraph">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>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">> EXAMINE DOG</span>
|
|
<span class="plain">Mme Tourmalet's borzoi looks as if it means fashion, not business.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">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>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">> SOUTH</span>
|
|
<span class="plain"> </span>
|
|
...the "going look break" <span class="plain">Rocky Beach</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">(Note that this is not inherent in the looking action:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">> LOOK</span>
|
|
<span class="plain">Rocky Beach</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">...which obeys the standard paragraphing conventions.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">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="inwebparagraph">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>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">(first unlocking the oak door)</span>
|
|
...now a command clarification break <span class="plain">You open the oak door.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">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>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">> TAKE ALL</span>
|
|
<span class="plain">marmot: Taken.</span>
|
|
...we run paragraph on here <span class="plain">weasel: Taken.</span>
|
|
...and also here <span class="plain"> </span>
|
|
...despite which the final skip does occur <span class="plain">> </span>
|
|
...before the next prompt</pre>
|
|
|
|
<p class="inwebparagraph">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>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Villa Christiane</span>
|
|
...a special look spacing break <span class="plain">The walled garden of a villa in Cap d'Agde.</span>
|
|
<span class="plain"> </span>
|
|
...a Divide Paragraph break <span class="plain">Mme Tourmalet's borzoi lazes in the long grass.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">But sometimes it is followed directly by a subsequent paragraph, and again
|
|
we want no skip:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Villa Christiane</span>
|
|
...a special look spacing break <span class="plain">Mme Tourmalet's borzoi lazes in the long grass.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">And sometimes it is the only content of the room description and is followed
|
|
only by the prompt:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Villa Christiane</span>
|
|
...a special look spacing break <span class="plain"> </span>
|
|
...a break inserted before the prompt <span class="plain">> </span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">To recap, we have five kinds of paragraph break:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></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="inwebparagraph">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="inwebparagraph"><a id="SP2"></a><b>§2. State. </b>The current state is stored in a combination of two global variables:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(1) <code class="display"><span class="extract">say__p</span></code>, the "say paragraph" flag, which is set if a paragraph break
|
|
needs to be printed before the next text can begin;
|
|
</li><li>(2) <code class="display"><span class="extract">say__pc</span></code>, originally named as the "paragraph completed" flag, but
|
|
which is now a bitmap:
|
|
<ul class="items"><li>(2a) <code class="display"><span class="extract">PARA_COMPLETED</span></code> is set if a standard paragraph break has been made
|
|
since the last time the flag was cleared;
|
|
</li><li>(2b) <code class="display"><span class="extract">PARA_PROMPTSKIP</span></code> 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) <code class="display"><span class="extract">PARA_SUPPRESSPROMPTSKIP</span></code> is set to indicate that, despite <code class="display"><span class="extract">PARA_PROMPTSKIP</span></code>
|
|
being set, no skipped line is needed before the prompt after all;
|
|
</li><li>(2d) <code class="display"><span class="extract">PARA_NORULEBOOKBREAKS</span></code> 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) <code class="display"><span class="extract">PARA_CONTENTEXPECTED</span></code> is set after a paragraph division as a signal
|
|
that if any contents looks likely to be printed soon then <code class="display"><span class="extract">say__p</span></code> needs
|
|
to be set, because a successor paragraph will then have started. This
|
|
is checked by calling <code class="display"><span class="extract">ParaContent()</span></code> — 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="inwebparagraph">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 <code class="display"><span class="extract">say__p</span></code> and
|
|
<code class="display"><span class="extract">say__pc</span></code> variables onto the VM stack and call <code class="display"><span class="extract">ClearParagraphing()</span></code> 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="inwebparagraph">In no other case should any code alter <code class="display"><span class="extract">say__pc</span></code> except via the routines
|
|
below.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="comment">!Constant TRACE_I7_SPACING;</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ClearParagraphing</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">say__pc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">DivideParagraphPoint</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">TRACE_I7_SPACING</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[DPP"</span><span class="plain">, </span><span class="identifier">say__p</span><span class="plain">, </span><span class="identifier">say__pc</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__p</span><span class="plain">) {</span>
|
|
<span class="reserved">new_line</span><span class="plain">; </span><span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_COMPLETED</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc_save</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_PROMPTSKIP</span><span class="plain">) </span><span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">PARA_PROMPTSKIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_SUPPRESSPROMPTSKIP</span><span class="plain">) </span><span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">PARA_SUPPRESSPROMPTSKIP</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">TRACE_I7_SPACING</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[-->"</span><span class="plain">, </span><span class="identifier">say__p</span><span class="plain">, </span><span class="identifier">say__pc</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_CONTENTEXPECTED</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc_save</span><span class="plain"> = (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_COMPLETED</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">AdjustParagraphPoint</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">TRACE_I7_SPACING</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[APP "</span><span class="plain">, </span><span class="identifier">say__p</span><span class="plain">, </span><span class="string">" "</span><span class="plain">, </span><span class="identifier">say__pc</span><span class="plain">, </span><span class="string">" "</span><span class="plain">, </span><span class="identifier">say__pc_save</span><span class="plain">, </span><span class="string">"]^"</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__pc_save</span><span class="plain">) </span><span class="identifier">say__pc</span><span class="plain"> = (</span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_COMPLETED</span><span class="plain">);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">ParaContent</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_CONTENTEXPECTED</span><span class="plain">) {</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">PARA_CONTENTEXPECTED</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">GoingLookBreak</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_COMPLETED</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="identifier">ClearParagraphing</span><span class="plain">(10);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">CommandClarificationBreak</span><span class="plain">;</span>
|
|
<span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="identifier">ClearParagraphing</span><span class="plain">(11);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RunParagraphOn</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">TRACE_I7_SPACING</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[RPO"</span><span class="plain">, </span><span class="identifier">say__p</span><span class="plain">, </span><span class="identifier">say__pc</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_PROMPTSKIP</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_SUPPRESSPROMPTSKIP</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">SpecialLookSpacingBreak</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">TRACE_I7_SPACING</span><span class="plain">; </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"[SLS"</span><span class="plain">, </span><span class="identifier">say__p</span><span class="plain">, </span><span class="identifier">say__pc</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">; #</span><span class="identifier">endif</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_PROMPTSKIP</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">EnsureBreakBeforePrompt</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">say__p</span><span class="plain">) ||</span>
|
|
<span class="plain">((</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_PROMPTSKIP</span><span class="plain">) && ((</span><span class="identifier">say__pc</span><span class="plain"> & </span><span class="identifier">PARA_SUPPRESSPROMPTSKIP</span><span class="plain">)==0)))</span>
|
|
<span class="reserved">new_line</span><span class="plain">;</span>
|
|
<span class="identifier">ClearParagraphing</span><span class="plain">(12);</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">PrintSingleParagraph</span><span class="plain"> </span><span class="identifier">matter</span><span class="plain">;</span>
|
|
<span class="identifier">say__p</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="identifier">say__pc</span><span class="plain"> | </span><span class="identifier">PARA_NORULEBOOKBREAKS</span><span class="plain">;</span>
|
|
<span class="identifier">TEXT_TY_Say</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">DivideParagraphPoint</span><span class="plain">(13);</span>
|
|
<span class="identifier">say__pc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Say Number. </b>The global variable <code class="display"><span class="extract">say__n</span></code> 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="display">
|
|
<span class="plain">[ </span><span class="identifier">STextSubstitution</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">say__n</span><span class="plain"> ~= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"s"</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§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="display">
|
|
<span class="plain">[ </span><span class="identifier">EnglishNumber</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">LanguageNumber</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">); ];</span>
|
|
|
|
|
|
<span class="plain">[ </span><span class="identifier">LanguageNumber</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"zero"</span><span class="plain">; </span><span class="reserved">rfalse</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"minus "</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">-</span><span class="identifier">n</span><span class="plain">; }</span>
|
|
<span class="plain">#</span><span class="identifier">Iftrue</span><span class="plain"> (</span><span class="identifier">WORDSIZE</span><span class="plain"> == </span><span class="constant">4</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">1000000000</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">LanguageNumber</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">/1000000000, </span><span class="string">" billion"</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">%1000000000; </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">1000000</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">LanguageNumber</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">/1000000, </span><span class="string">" million"</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">%1000000; </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">1000</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">LanguageNumber</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">/1000, </span><span class="string">" thousand"</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">%1000; </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">100</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">", "</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="identifier">LanguageNumber</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">/100, </span><span class="string">" hundred"</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">%100; </span><span class="identifier">f</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEMPLATE_CONFIGURATION_BITMAP</span><span class="plain"> & </span><span class="identifier">DIALECT_US_TCBIT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">" and "</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">20</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain"><100)) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">/10) {</span>
|
|
<span class="constant">2</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"twenty"</span><span class="plain">;</span>
|
|
<span class="constant">3</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"thirty"</span><span class="plain">;</span>
|
|
<span class="constant">4</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"forty"</span><span class="plain">;</span>
|
|
<span class="constant">5</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"fifty"</span><span class="plain">;</span>
|
|
<span class="constant">6</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"sixty"</span><span class="plain">;</span>
|
|
<span class="constant">7</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"seventy"</span><span class="plain">;</span>
|
|
<span class="constant">8</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"eighty"</span><span class="plain">;</span>
|
|
<span class="constant">9</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"ninety"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">%10 ~= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"-"</span><span class="plain">, (</span><span class="identifier">LanguageNumber</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">%10;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="constant">1</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"one"</span><span class="plain">;</span>
|
|
<span class="constant">2</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"two"</span><span class="plain">;</span>
|
|
<span class="constant">3</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"three"</span><span class="plain">;</span>
|
|
<span class="constant">4</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"four"</span><span class="plain">;</span>
|
|
<span class="constant">5</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"five"</span><span class="plain">;</span>
|
|
<span class="constant">6</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"six"</span><span class="plain">;</span>
|
|
<span class="constant">7</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"seven"</span><span class="plain">;</span>
|
|
<span class="constant">8</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"eight"</span><span class="plain">;</span>
|
|
<span class="constant">9</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"nine"</span><span class="plain">;</span>
|
|
<span class="constant">10</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"ten"</span><span class="plain">;</span>
|
|
<span class="constant">11</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"eleven"</span><span class="plain">;</span>
|
|
<span class="constant">12</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"twelve"</span><span class="plain">;</span>
|
|
<span class="constant">13</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"thirteen"</span><span class="plain">;</span>
|
|
<span class="constant">14</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"fourteen"</span><span class="plain">;</span>
|
|
<span class="constant">15</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"fifteen"</span><span class="plain">;</span>
|
|
<span class="constant">16</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"sixteen"</span><span class="plain">;</span>
|
|
<span class="constant">17</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"seventeen"</span><span class="plain">;</span>
|
|
<span class="constant">18</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"eighteen"</span><span class="plain">;</span>
|
|
<span class="constant">19</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"nineteen"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-zt.html">Back to 'ZMachine Template'</a></li><li><a href="S-mt.html">Continue with 'Mathematics Template'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|