#charset "us-ascii"
/*
* Time Passess Module 1.0
* -----------------------
*
* Makes the default "Time passess..." message aware of the textual context.
* This allows exchanges like this:
* > z
*. Time passes...
*.
*. > z
*. The phone starts ringing.
*.
*. >
*
* Or:
* > z
* You hesitate.
*
* ---
*
* To use this module, prefix any such "Time passes..." substitute texts
* with <.time>.
* One or more tags may come before <.time>, but no actual text.
*
* These two outputs would suppress the "Time passes..." message:
*. <.p><.time>The phone starts ringing.
*. <.time>BOOM!
*
* This would not suppress the message, because of the quotation marks:
*. "<.time>Hello," Bob says.
*
* But this would:
* <.time>Hello,
Bob says.
*
* ---
*
* Please note that you should not #include this file. Instead, you should
* add it to the build by adding this line to your makefile (.t3m):
* -source TimePasses.t
*
* Or, if you use Workbench, simply select Project|Add file, and
* select TimePasses.t in the directory you've put it in.
*
* Send comments, questions, suggestions and bug-reports to kwi@it.dk.
*
* -- Soren J. Lovborg
*/
/* ------------------------------------------------------------------------ */
/*
* Include the library header, define our Module ID.
*/
#include "adv3.h"
moduleTimePasses: ModuleID
name = 'Time Passes module'
byline = 'by S\u00F8ren J.\ L\u00F8vborg'
htmlByline =
'by S\u00F8ren J.\ L\u00F8vborg'
version = '1.0'
/* This isn't a big module, so we'll display our version last */
listingOrder = 150
;
/* ------------------------------------------------------------------------ */
/*
* Modify WaitAction so we just print the special <.wait> tag.
*/
modify WaitAction
replace execAction()
{
"<.wait>";
}
;
/* ------------------------------------------------------------------------ */
/*
* Our output filter (this is where the real work is done.)
*/
transient waitFilter: OutputFilter, PreinitObject
/*
* Install the waitFilter between the senseContext filter and the
* commandSequencer filter. We need to do this after those two
* have been installed, i.e. after adv3LibPreinit have run.
*/
execBeforeMe = [adv3LibPreinit]
execute()
{
mainOutputStream.addOutputFilterBelow(self, commandSequencer);
}
/*
* The filter has two states: normal and waiting. In the normal
* state, a <.wait> tag puts the filter into waiting mode;
* otherwise, all text is passed through unchanged, except that
* the two tags are removed. In the waiting state, the <.time>
* tag puts the filter into normal mode; any other text triggers
* the insertion of the default message "Time passes...<.p>",
* and puts the filter in normal mode.
*/
waitingMode = nil
patOurTags = static new RexPattern(
'(wait|time)')
patAnyTag = static new RexPattern(
'(<^rangle>|".*")*')
/*
* A tag doesn't cause "Time passes..." to be inserted, only
* actual text. Hence, we keep tags until we know whether
* to display Time passes... or not.
*/
tagText = ''
filterText(ostr, txt)
{
local ret = '';
local match;
while ((match = rexMatch(patAnyTag, txt)) != nil && rexMatch(patOurTags, txt) == nil)
{
/*
* As long as there's tags at the beginning of the line,
* move them from txt to tagText.
* (With the exception of <.wait> and <.time>.)
*/
tagText += txt.substr(1, match);
txt = txt.substr(match + 1);
}
/* scan for tags */
while (txt != '')
{
local textToAdd;
if ((match = rexSearch(patOurTags, txt)) != nil)
{
/*
* Add the text up to <.wait> / <.time> to our result
* variable, then delete the text up to and including
* the tag, from txt.
*/
textToAdd = txt.substr(1, match[1] - 1);
txt = txt.substr(match[1] + match[2]);
}
else
{
textToAdd = txt;
txt = '';
}
if (waitingMode && textToAdd != '')
{
/*
* There's text to add, but also a waiting
* "Time passes..." messsage.
*/
ret += playerActionMessages.timePasses + '<.p>';
waitingMode = nil;
}
if (match)
{
/*
* We can't change the waitingMode flag until now,
* because it shouldn't affect how we add the
* preceding text.
*/
if (rexGroup(1)[3] == 'wait') waitingMode = true;
else waitingMode = nil;
}
/* Add any waiting tags to our result variable. */
if (tagText != '')
{
ret += tagText;
tagText = '';
}
/* Add the text to our result variable. */
ret += textToAdd;
}
return ret;
}
;