MUSHclient 2.16 release notes

Version 2.16.14

Released on 20 Jul 2000

1. Fixed a bug where the script functions NormalColour, BoldColour, CustomColourText and CustomColourBackground would return an RGB value that was one higher than the correct value. eg. for black it should have been 0, but these functions returned 1.

2. Added new script property: LogOutput. This indicates whether output is logged or not.

3. Added new script method: Replace. This replaces one substring with another.

4. Added new script method: FixupEscapeSequences. This is a script interface to the MUSHclient routine that interprets codes like "\n" as a newline.

5. Added new script method: Trim. This removes leading and trailing spaces from a string.

See the web page http://www.mushclient.com/mushclient/functions.htm for more details.

6. Improved some of the JScript examples.

Version 2.16.13

Released on 17 Jul 2000

1. Fixed a problem where, when you first used the spell checker, the user dictionary was not enabled.

2. Changed the installer to ask before overwriting the files exampscript.vbs and exampscript.jvs (in case you have updated them).

3. Added a button to Global Preferences -> General for editing the spell check dictionaries. Previously there was no way to check what your "user-defined" words were, short of causing a spelling error and then reviewing them.

4. Changed the uninstaller to remove references in the Registry under HKEY_CLASSES_ROOT for the various document types that MUSHclient has registered (eg. .MCL files).

5. Changed the installer so that, when doing a custom install, the spell checker and documentation files are offered as an option to install.

6. Changed the icon for "uninstall MUSHclient" to be different from the icon for "run MUSHclient".

7. The installer no longer puts a shortcut to MUSHclient on your desktop.

8. When doing a "spell check on send", if you cancel the spell check (eg. press <esc>) then the send is cancelled, so you can fix up the spelling errors manually.

9. When using "Global Preferences -> Worlds" to add worlds to the list, after pressing the "Add" button the suggested directory for worlds is the directory specified as the "default world files directory".

10. Fixed a few problems with missing MUSHclient icons during the registration process and the initial delay screen.

11. Added a couple of example Java scripts to the exampscript.jvs file. These show more complex calculations that can be done in an alias script.

12. Added new menu item "Open worlds in startup list" (Ctrl+Alt+O). This lets you open all the worlds listed in the Global Preferences list when *you* want to open them, with one keystroke.

13. Added command-line option "/noauto". This stops MUSHclient auto-opening the worlds in the Global Preferences list. Use this in conjunction with [12] above to have a list of favourite worlds, but open them when desired, not necessarily when MUSHclient starts.

14. Added a menu item "Windows Socket Info", which tells you which version of Windows sockets you are using. This is intended to help debug connection problems.

15. Fixed a problem where you could resize the command area down to zero height. Now, if you drag the splitter bar to change the command/output window height ratio, it will force the command area to be at least large enough to hold one line of text.

16. Added a "search" button to my web page(s), so you can now search my web site for keywords. To try it, go to this link: http://www.gammon.com.au/excite/

17. Added various things to support writing out a log file directly in HTML...

a) You can now specify a log file line *postamble* as well as a preamble.
eg. You might set up a preamble: "<p>" and a postamble of "</p>"

b) Triggers can optionally send the trigger text to the log file

c) You can check "HTML" in the log file configuration.
This will translate "<", ">" and "&" to the HTML equivalents (eg. &lt; ), otherwise a line like this: "go <north>" would not log correctly as HTML.

d) You can now specify whether or not you want MUD output to be logged.
This allows you to "opt in" to logging, by unchecking this box then nothing is logged by default, unless you set up a trigger to log certain types of lines. This should be more natural (specifying what to log) than the previous technique, which meant you had to set up a trigger to specify what *not* to log.

e) New script routine: world.FixupHTML (texttofix) can be used inside a script to translate HTML strings (as in [c] above).
eg. /world.note world.FixupHTML ("I will go <north> here")
This displays: I will go &lt;north&gt; here

18. Fixed a bug where if you created a new world, but based it on an existing world, then the defaults fonts/triggers/etc. were used, even if the existing world did *not* use the defaults.

19. Added a "replace" flags for script routines AddTrigger and AddAlias, so that you can replace a trigger/alias of the same name. This is particularly useful in scripts that automatically generate triggers or aliases. This flag has the value 1024.

20. Fixed a bug where if you changed a script file after getting a scripting error message, but before closing the error message dialog, MUSHclient would crash.

Version 2.16.12

Released on 03 Jul 2000

1. The splash screen (MUSHclient initial screen) should now display better if you only have 256 colours set for your display (ie. the palette will be fixed up).

2. Fixed bug in parenthesis-matching, where if you were scanning backwards, an even number of "escape" characters would erroneously cause a parenthesis to be ignored. eg. this sequence used to work incorrectly: (aaa \\(bbb)

3. Amended parenthesis-matching to beep if you are trying to start matching on a brace preceded by an odd number of escape characters. eg. \|( ) would not be a valid sequence to match on, if the cursor started at the "|" character.

4. Added a new feature "flip to notepad" (Ctrl+Alt+Space). This lets you switch quickly between your world window and your (first) notepad window for this world.
* If you have a world window open and you select "flip to notepad" then the focus changes to its first related notepad. If there isn't one, it is created.
* If you have a notepad window open and you select "flip to notepad" then the focus changes to its related world window (command area).

5. Changed behaviour on "File Open" to suggest list of world files (MCL files) as well as text files (TXT files).

6. Fixed bug where Ctrl+O could not be used to open a file if no windows were open.

7. Fixed bug where Shift+Ctrl+C could not be used to do a "quick connect" if no windows were open.

8. There is now provision for a "default directory for world files" in Global Preferences -> Worlds configuration screen. This means you can set up a directory for loading or saving world files. The initial default is the directory that MUSHclient executes in.

9. When doing command stacking, you can now temporarily defeat the command stacking by repeating the command stack character. eg.

@dig Waterfall = West;;W, East;;E

In this example, assuming that ";" is the command-stack character, and command stacking is enabled, the use of ";;" will temporarily stop the command stacking, and send a single ";" character.

10. If you edit a script file with the internal notepad (ie. Shift+Ctrl+H) more than once, then the program will now activate the previous window with the script in it, rather than keep opening multiple windows for editing the same script file.

11. If you edit a script file with the internal notepad (ie. Shift+Ctrl+H), then it is now "related" to its originating world, so you can switch back and forth to the script from the world using Ctrl+Alt+Space (as described in [4] above).

12. When using the Notepad, pressing Alt+Enter is now another way of showing the document size (count of characters, words and lines).

13. Changed slightly the way the worlds are closed in an attempt to fix occasional problems with proxy servers and other bugs related to closing and re-opening worlds.

14. Changed the uninstaller to optionally remove all items in the Registry under "HKEY_CURRENT_USER\Software\Gammon Software Solutions\MUSHclient" when doing an uninstall. This will clean up the registry to remove your registration information, global preferences, and information about the screen location of all worlds you have opened.

Version 2.16.11

Released on 22 Jun 2000

1. Updated help file to reflect new changes, such as notepad window.

2. Fixed bug where if you opened a file with an obscure extension (ie. not MCL or TXT) when a world was active, it would attempt to process it as a world file, not a text file. Now, all extensions other than .MCL are assumed to be text files.

3. The parenthesis-balancing code has been enhanced after discussions with MUSHcode experts. There are now options on the Global Preferences -> Notepad screen, to control how the balancing works. This is because, for instance, in MUSH code quotes have no particular significance, and also you can have "percent-escapes", like this:

think ansi(c, Nick %) Gammon)

In this example, the "%" cancels the effect of the RH bracket.

Under certain obscure circumstances you will get different results when starting on the right-hand side, compared to starting on the left-hand side. In these cases, the results given by starting on the left-hand side should be considered more accurate (because this is the same direction that the MUSH-code scanner will be working).

4. Fixed bug in parenthesis-balancing code where it would incorrectly process quoted strings when scanning backwards.

5. The "choose existing notepad" dialog has been enhanced so you can double-click on a notepad name to select it.

6. New command in the notepad - "send to command window". This lets you send the selection (or whole window) to the *command window* of the related world, and activates that world. This lets you make a last-minute check that what you have typed is OK, and then press <enter> to send it on. The advantage of this is that the command is retained in the world's command history buffer.

7. When sending or pasting to the world, you can now specify the "line delay" per a line count. eg. Wait 2 seconds after every 50 lines. This is for servers that have anti-spam provisions that cannot accept bulk uploads.

8. If you close an *empty* notepad window, you are not prompted to save it, even if you have changed it.

9. Because I personally find that the ANSI colours can be a bit "dark", I have added buttons to the ANSI colour screen, that let you quickly change all 8 colours (normal) and 8 colours (bold) to be slightly lighter or slightly darker, with one button click. There are also buttons for changing all 16 colours at once. Of course, you can press the button multiple times to increase the effect.

10. Along similar lines, there are now buttons to add or reduce the colour of all the ANSI colours. Technically, this is increasing or decreasing the colour saturation. The intention of this is that you can change the "atmosphere" by globally reducing colour (ie. making everything tend to grey), or increasing colour (ie. making all of the colours richer). Note that most the default ANSI colours are already fully saturated (exceptions being grey and black), so that increasing the colour will not make any noticeable difference. However if you have already decreased the colour saturation (or have your own colour set) then increasing the saturation should make a difference.

11. Fixed bug where if you were in full-screen mode, and switched to a notepad/recall window, or the activity window, the menu bar would reappear.

12. Fixed mildly annoying bug where the "(no change)" entry in the "custom colour" combo-boxes would tend to get a partly-dotted border around it as the mouse moved over it.

13. Added a "smoother scrolling" option to the Global Preferences. With this checked the screen is redrawn immediately that it scrolls, thus eliminating the slightly disconcerting gaps (or duplicated lines) left, for a short time, when the screen scrolls quickly. However with "smoother scrolling" checked the screen updating *will* be slower. If you have a fast PC you will probably not notice the slowdown in speed, and may prefer the way the screen is redrawn more quickly. If you have a mouse-wheel mouse the difference is quite noticeable. With smooth scrolling on then scrolling is definitely slower, however the effect of the same line appearing to be duplicated many times (until the redraw catches up a moment later) is eliminated.

14. Also added a "very smooth" scrolling option, which gives a very smooth scrolling action (one pixel at a time). This would not be suitable for MUDs where lots of text arrives quickly, as it is definitely slower than normal scrolling, but if you are playing a MUD where small amounts of text arrive at once, you have a fast PC, and you like the smooth feel, then give it a try. Very smooth scrolling only applies to "line-based" scrolls, not "page-based". Thus, pressing PageUp or PageDown will still scroll in the normal way, but when new text arrives, or you scroll up or down a line at a time, then it will scroll smoothly. Smooth scrolling is also disabled when using the mouse wheel, as it is possible to "queue up" a lot of line-based scrolls, that then seem to hang the PC while it laboriously scrolls its way through the document.

15. In response to complaints that if the "focus" is in the upper window some typing is discarded (eg. Shift+Home, or Right-arrow), there is a new global option "all typing goes to the command window". There is no easy way of selectively sending some keystrokes to the command window and others to the output window, so this new option is a compromise. When activated, any keystroke action will immediately change the focus to the command window, thus you can always "just start typing" without worrying whether you had left the focus on the output window. *However* you can no longer use Ctrl+C to copy (with this option enabled). Thus you would need to use the *mouse* to perform this action. One way would be to RH-mouse-click and select "copy". Another way would be to use the main "Edit" menu. Even with this option unchecked simple keystrokes (eg. "A", "B") always switch the focus to the command window. Some keystrokes always affected the output window even if the focus was in the command window (eg. PageUp, PageDown) and these will continue to work normally.

16. Fixed bug where if the log file preamble/postamble exceeded 128 characters (after expanding any date/time fields) the entire preamble/postamble would be discarded.

17. Added new button to "command history" window - "send to notepad". This is so you can recall a previous command and send it directly to a notepad window.

18. When starting logging, and choosing to log retrospectively, it now logs your commands (or world.notes) according to the *current* setting of the "log my input" or "log my notes" flags, not according to how they were set when the lines were produced. Without this change it was impossible to retrospectively log your input, if you had not checked "log my input" when you typed the lines.

Version 2.16.10

Released on 14 Jun 2000

1. Removed undocumented and confusing feature that pressing Ctrl+M when the notepad was active would *maximize* the window, whereas when a world window was active Ctrl+M would *minimize* MUSHclient.

2. Changed problem in triggers where if you had escape sequences in the *matching text* then they would also be converted. Eg, if you matched on a line with \n\n in it, the \n 's would be converted to linefeeds. Now, the conversion only takes place on what is in the trigger "send" box, not the *contents* of any %0, %1, %2 and so on.

3. New trigger option: Append to Notepad. This allows trigger contents to be *appended* to an existing notepad window of the same title. The title of the window will be:

Trigger: <trigger label>

If the window does not exist it will be created. Triggers with no label will append to the window titled "Trigger: ".

This allows you to do things like gather MOO editing commands into one window. Also, you an use it as an ersatz logging facility (eg. logging to multiple files at once). You can also use it to implement a frequently-requested feature, namely the ability to redirect some lines to different windows. (eg. OOC pages could be sent to a different window, by using "append to notepad" in conjunction with "omit from output").

Note however, the notepad windows are just simple Windows "edit" controls. They are not like the MUSHclient main output window, which can hold hundreds of thousands of lines of text with little or no performance degredation. The notepad windows will slow down if they get very large. As a guideline, the notepad can comfortably hold around 32K of data, which translates to about 400 X 80-character lines.

4. New script routines:

world.SendToNotepad title, contents
world.AppendToNotepad title, contents
world.ActivateNotepad title
world.Activate

These are for creating/appending to notepad windows from a script.

eg. /world.SendToNotepad "Nick's window", "Hello, world"

The contents are copied "as is" without a trailing newline. If you want a newline you will need to add it yourself. The built-in constant "vbcrlf" can be used for this purpose, eg.

eg. /world.AppendToNotepad "Nick's window", "More stuff" + vbcrlf

The function "AppendToNotepad" does not activate (bring to the front) the notepad window. However the function "ActivateNotepad" can be used to do that.

You can use world.activate to activate the world itself (eg. you might want to do that after creating a notepad window).

5. New menu item on the Window Menu: Close all notepad windows

This is for when you get into a mess with your triggers or scripts and find hundreds of notepad windows open. You can use this to close all of them. You will be asked to save any changes, where applicable.

6. New option in the scripting configuration - edit scripts with the inbuilt editor. As we now have an editor, we may as well have the option to use it for editing our script files.

7. Sort-of fixed the problem with full-screen mode, when you have the world windows maximized. Previously, after leaving full-screen mode you would get extra "system" menus (and maximize/minimize/close buttons), one set for every time you went in and out of full-screen mode. Now there is a slight flicker while the program "works around" the problem by temporarily un-maximizing the window, going into full-screen mode, and then re-maximizing it. If anyone has a better solution (ie. C++ code) please let me know.

8. As interim documentation, there is now a file in the download, "accelerators.txt" which summarises the keyboard equivalents of various commands.

9. For scripting gurus, who have been asking for access to other worlds, there are two new script functions:

world.GetWorldList
world.GetWorld (name)

GetWorldList returns a variant array which is a list of all open worlds.
GetWorld returns an object which can be used to refer to another world.

eg.

' --------------------------------------------
' Example showing iterating through all worlds
' --------------------------------------------
sub ShowWorlds

dim mylist
dim i

mylist = world.GetWorldList

if not IsEmpty (mylist) then
for i = lbound (mylist) to ubound (mylist)
world.note mylist (i)
next
End If

end sub

' --------------------------------------------------
' Example showing sending a message to another world
' --------------------------------------------------

sub SendToWorld (name, message)
dim otherworld

set otherworld = world.getworld (name)

if otherworld is nothing then
world.note "World " + name + " is not open"
exit sub
end if

otherworld.send message

end sub


A simpler example, if you already know the world name, is:

/set otherworld = world.getworld ("test world")
/otherworld.note "hi there"

You should be very cautious about storing the object reference of the world in a global variable, because if the world is closed then that reference becomes invalid, which will very likely lead to an access violation. You are better off using "world.getworld (name)" every time you need to get a reference to the world, and checking if it "is nothing" as in the example above.

You could use a small variation on the examples above to write your own "send to all worlds" or something similar.

The example files "exampscript.vbs" (VBscript) and "exampscript.jvs" (JScript) have been updated with these examples.

Version 2.16.09

Released on 13 Jun 2000

1. If you have "bleed background colour to edge" enabled, and a non-zero "offset text from window edge" amount specified, then the bleeding now goes to the *left* as well as to the right.

2. Fixed bug where if you had the MUSHclient window maximized, then went into "full screen mode" and out again, it would remember that the window was maximized and not restore it to a non-maximized state.

3. When a trigger matches you now have a 5th option for where to send the trigger response - namely to a notepad window. Thus, you can make a trigger that matches on a MUSH/MUCK/MOO attribute, and have it automatically be sent to the notepad for editing.

4. You can now change the command and output fonts from a script. The *entire* window font changes, you cannot change individual lines or words.

Syntax: World.SetOutputFont fontname, pointsize
eg. World.SetOutputFont "Lucida Console", 9

Syntax: World.SetInputFont fontname, pointsize, weight, italic
eg. World.SetInputFont "Lucida Console", 15, 400, 0

In the case of the input font, the weight can be one of:

(Don't Care) 0
Thin 100
Extralight 200
Light 300
Normal 400
Medium 500
Semibold 600
Bold 700
Extrabold 800
Heavy 900

Italic can be true or false.


5. Fixed a bug where changing the font size resulted in the scroll bars showing incorrect sizes until more output arrived from the MUD.

6. There is now a button on the "main" toolbar to invoke the notepad.

7. When creating a notepad window that is related to a world window, its window title is now initially: Notepad: <world name>

8. When creating a notepad window for a world, which already has one or more notepad windows open, you are offered a list of the open windows to switch to, and the option to create a new one. This avoids the problem of unknowingly creating lots of notepads for one world.

9. If you have the focus in the command window, and you have text selected, and you then create a notepad window, only the *selected text* is copied to the notepad.

10. Fixed bug where, under Windows 98, the notepad window did not have text copied into it, nor could you type into the window (eg. on a recall, or starting it up with selected text).

11. If you have a notepad open, that is related to a world, and you create a new notepad, then it is also related to the same world.

12. If you have modified a notepad window, and then sent *all* of it to its related world, it is marked as "no longer modified". The assumption here is that sending everything back to the MUD counts as "saving" it.

13. In the notepad window, if you have a selection and convert it in some way (eg, convert to upper case) after the conversion the converted text is still selected.

14. Fixed various problems with the "recall" command, including an access violation (crash) if you used regular expressions.

15. If you highlight (select) text in the output window, and then select "recall" (Ctrl+U) the selected text is automatically searched for (with no dialog box), providing the selected text does not span a paragraph boundary.

16. Fixed bug where, in full screen mode, if you switched windows, the menu bar would re-appear.

17. Fixed bug where, in full screen mode, if you switched windows, the *wrong* menu bar would re-appear when you *left* full-screen mode (eg. if you had a world window active when you went into full-screen mode, but a notepad window active when you left it).

18. The "actions" menu has been removed, with two commands from it moved to the Input menu, namely "Repeat last command", and "Quit".

Version 2.16.08

Released on 12 Jun 2000

1. When creating a new world, the default "chat channel" triggers now match on "^\<.+?\>.*$" and "^\[.+?\].*$" rather than what they did before. The addition of the "?" makes them less "greedy".

2. When the mouse hovers over the world buttons ("1" through to "10") the tooltip (yellow popup window) now shows the world name, rather than "Activates world #1" (etc.)

3. The "notepad" and "recall" windows have been re-implemented in a completely different way. :) Technically-speaking they have changed from being modeless dialog boxes, to MDI child windows. The notepad windows now offer a whole lot of extra features, described in more detail below, such as: load/save files, refresh "recall" data, case conversion, various other conversions, insert date/time, word count, parenthesis-matching, send to world, spell-check, find and replace.


NOTEPAD WINDOW
--------------

Because of various comments about the way the current notepad windows worked, they have been completely re-done to be more consistent with the rest of the user-interface. By reimplementing them as MDI child windows you should notice the following changes:

* You can now switch to a notepad/recall window with Ctrl+Tab
* The windows are listed in the "Window" menu item
* The windows are no longer "always on top"
* The windows can no longer be moved outside the "main" MUSHclient frame.
* The menu bar changes when a notepad window is active to reflect the different operations you can do with them (and some keyboard equivalents do different things).

It is possible that during the reworking of the notepad windows bugs have crept in, so I would appreciate any comments you have to make about them.

New features of the notepad windows are:

* Go to line number (useful when a script reports an error in a particular line)
* Insert date/time
* Select all
* Spell check
* Word/line/paragraph count
* Parenthesis-matching (see below for more details)
* Send to world (selection or entire window)
* Refresh 'recall' (ie. repeat previous recall with new window contents)
* Find
* Find and replace
* Convert Unix to DOS
* Convert DOS to Unix
* Convert Mac to DOS
* Convert DOS to Mac
* Wrap lines (discard linefeeds)
* Quote lines (put > in front of each one)
* Upper case conversion
* Lower case conversion
* Remove extra blanks
* Open new text file
* Save
* Save As
* Print Setup
* Print Preview
* Print
* You can choose whether or not paragraphs wrap at the screen edge


Related world
-------------

Notepad windows *may* be related to a world. A window is related to a world if it was created when a world was currently active. If a notepad window is created when a world is not active (eg. when a notepad window is itself active) then it is "unrelated" to a world.

If there is a related world the world name is shown on the status bar in the usual position.

If a notepad window has a related world, then you can send the contents of that window (or the selection) to that world by pressing Shift+Ctrl+S, thus allowing you to use the notepad to prepare lengthy descriptions etc., and then sending them with a single keystroke.

The exact configuration for sending the notepad window to the world is controlled by that world's configuration "Paste to World". For example, you might specify that the window is commented softcode.


Automatic sending of text to notepad
------------------------------------

If a world is active, and the focus is in the command window (ie, the cursor is flashing there) then when you create a notepad window the contents of the command window are copied to the notepad window.

If the focus is in the output pane (the upper one) *and* text is selected (ie. shown in inverse) then the selected text is copied to the notepad window.

Otherwise, the notepad window starts as a blank (empty) window.


Parenthesis-matching
--------------------

This was added for MUSH/MUCK/MOO soft-coders. Basically you position the cursor to the left of a bracket and press Ctrl+E, and the cursor will move to the *left* of the corresponding bracket. A bracket can be "[", "(", "{", "}", ")" or "]".

For example, with a line like this:

[iter(lnum(%q8),%q7[ifelse(eq(#@,%q8),,%ch%cb%b|)])]

You can put the cursor next to any of the brackets and find the corresponding one. If you start with a "left" bracket the cursor will move forwards, if you start with a "right" bracket the cursor will move backwards.

You can also *select* the appropriate range by using Shift+Ctrl+E. In this case both brackets (and their contents) are selected.

At present the matching code basically follows the C syntax rules (excepting comments), which means it allows for:

* Escaped brackets, eg. (aaaa\)bbbb)
In this example the \) is *not* taken as closing the group

* Quoted strings, eg. (aaaa ")" bbbb)
In this case the ")" is *not* taken as closing the group

* Quotes within quotes, eg. (aaaa "xxxx \" yyyy )" bbbb)
In this case, the \" inside the quotes is *not* taken as closing the quoted string.

* Ditto for single quotes, eg. (aaaa ')' bbbb)
In this case the ')' is *not* taken as closing the group

If anyone finds this does not work for their own softcode please write and explain in what way it doesn't work *with an example or two*. It may be necessary to make some of the rules optional (eg. does \" inside a quoted string terminate the string or not?).

At present, commented softcode is not allowed for, so if you have brackets in the comments it probably won't work properly (unless they match). This is planned for a future version.


Fonts
-----

At present, if you do a "recall" the notepad window takes the fonts and colours from the output window area. If you start a new notepad window it takes the fonts and colours from the command window area, or if no world is active, the font is taken from the "default input font" and the colours are black on white.

Version 2.16.07

Released on 08 Jun 2000

1. When creating a new world, the default "chat channel" triggers now match on "^\<.+\>.*$" and "^\[.+\].*$" rather than "^\<\w*\>.*$" and "^\[\w*\].*$". This gives a better match on chat channels which have spaces in the channel name. Is this desirable I wonder? Do chat channels normally have non-alphabetic characters in them?

2. Corrected a bug where the log file preamble and postamble were not written out when you opened a log file automatically.

3. Date/time substitution for log files can now include "%n" for "new line", especially useful in the line preambles, in case you want to put a blank line before certain types of lines (eg. your input).

4. Fixed bug where log files would record a blank line after lines you had typed (command lines).

5. Fixed bug where if you typed a command of more than 500 characters, and then used the Command History window (Ctrl+H) to "Do" or "Recall" the command, then the command would be truncated to the first 500 characters, followed by "...". This was a side-effect of fixing an earlier bug.

6. Triggers can now match on an incoming *colour* or *style* as well as text. This is very handy in some MUDs where, for example, room descriptions might be in a different colour. This lets you match on when you have entered a new room. The match is done on the *first character* of the text matched by the trigger. In the case of regular expressions this is not necessarily the first character on the line.

7. To assist in matching triggers on incoming colours, there is now a function to establish the colour of incoming text. This is Display -> Text Attributes (Ctrl+Alt+A). By using this you can see the foreground and background colour, and then use that information to set up a suitable trigger. Because incoming lines may be coloured by triggers, you are warned if the colour shown is not the original colour. You may want to turn off all triggers if this is the case, while you are establishing the colour of the original line.

8. Added some beta-testing credits I had accidentally omitted in the previous version.

9. The trigger list now shows the trigger *label* instead of the sound name. My view is that it is more useful to see the labels "at-a-glance", especially as you may want to label the triggers to indicate what they do. For instance, a trigger "^\[\.+\].*$" is pretty cryptic. If you can label it "Chat_Channel" then it is more obvious what it is for. You may need to resize the label column (drag the dividing bar across) so that you can see it without having to scroll horizontally.

10. I have had a report that on some MUDs the ANSI colour handling doesn't "work properly" because the background colour stops where the text stops, rather than bleeding to the edge of the window, so-to-speak. There is now an option under File -> Global Preferences -> General, called "bleed background colour to edge" (defaulting to on) which controls whether or not this is done. The difference is most obvious if you set up a trigger which colours the line with a different background colour than the normal one. With the option checked, the line with the trigger will be drawn with the background colour right over to the right-hand edge of the window. With the option unchecked, the background colour stops when the text stops. I'm not absolutely sure I like the bleeding effect, which is why there is an option to turn it on and off.

11. Added script method "ResetTimer" - you can use this to reset an individual timer.

12. On the page where you set up default colours, triggers, fonts etc. it now shows the point size, and style, of your selected default fonts. Ditto for the input and output font on the appropriate world configuration screens.

13. Fixed minor memory leak when using Recall window.

14. Because I find it hard to read some of the triggers when they are in the default system font there is now an option for the edit trigger/edit alias dialogs to show the match and replacement strings in FixedSys instead. This makes distinguishing betweeen "." and ",", or "(" and "[" a lot easier. This option is in File -> Global Preferences -> General.

15. New trigger option - "send to status line". This is handy for triggers that match on (say) the room name, room exits, or your current stats. When you find them, you can place them in the status line for perusing, even after they have scrolled off the screen.

eg.
Trigger: Exits: *
Send: %0
Send to: Status

16. Changed keyboard accelerator for "send to all worlds" to Ctrl+Alt+S which is more mnemonic than Shift+Ctrl+Z.

17. Added "full screen mode" option to the View menu. This for MUSHclient users who have limited screen space (eg. a laptop). Full screen mode removes the title bar and menu bar. If you want to get rid of the status bars as well then you can close them yourself, or make them floating by detaching them. The keyboard equivalent is Ctrl+Alt+F.

18. When commencing manual logging, you can now choose whether to log notes or your input.

19. Worlds listed in File -> Global Preferences are now opened in the order listed (ie. the first will become world 1, and so on). There are now buttons to move worlds up or down the list.

20. There is now a "notepad" you can open for working on long pieces of text (eg. building) while you are doing other things. This is on the Edit Menu -> Notes workarea (Ctrl+Alt+W).

21. You can now save and load your variables, for sharing between worlds. Variables are saved as a straight text file, like this:

name <tab> contents

22. When creating a trigger, alias or timer you can now send special characters to the MUD by using an "escape sequence", similar to the convention in C. See below for the equivalents. In particular, the "\x" sequence can be used to send any character whatsoever.

Sequence Represents
\a Bell (alert)
\b Backspace
\f Formfeed
\n New line
\r Carriage return
\t Horizontal tab
\v Vertical tab
\' Single quotation mark
\" Double quotation mark
\\ Backslash
\? Literal question mark
\xhh ASCII character in hexadecimal notation

When processing triggers/aliases/timers from earlier versions, any backslashes are automatically converted to double-backslashes to avoid being confused with the new escape sequences.

For example, to send three "bell" characters, you could do this:

Send: say Warning! \a\a\a

Alternatively, in hex: say Warning! \x07\x07\x07

Warning - the sequence \x0 (null character) will terminate a string, so sending something like this:

Send: Hello \x0 my old friend.

This would only send "Hello " because the \x0 terminates the string.

Note 1 - it is not really necessary to use backslash with quotes (eg. \" and " will be equivalent) however they have been left there for consistency with the C language.
Note 2 - the hex form (eg. \x05) is limited to two hex characters, as that is the most you need to represent one byte. Thus, \x071 will be the same as \x07\x31 not \x71.

23. When you get a script error there is now a more informative error message, and also an option to make a copy of the message onto the clipboard. This is for scripters who get error reports from others. I know how annoying it is to get an email that "there was an error message", so you can now ask for the exact error message to be pasted into the email.

24. You can now turn "trace" on, which logs a note to the output window when one of the following occurs:
* Trigger match
* Alias match
* Timer fires
* Script routine called

This is to help debugging scripts or complex sequences of triggers. You can see, for example, in what order triggers are evaluated, and whether they match or not.

25. When doing a "recall" you can now specify whether you want to recall MUD output, your commands, or world.notes (or a combination). For example, by only checking "commands" and matching on a regular expression of ".*" you could get a listing of all commands you entered in a session.

26. You now have the option to process "escape sequences" as described in (22) above, when sending ordinary commands. eg. you could type: say \a warning \a

27. There is a new scripting property - world.trace. This is the value of the trace flag. Thus, you can turn tracing on and off from a script.

28. Renamed the headings on the list boxes for triggers/aliases/timers from "Contents" to "Send" which is a bit more self-explanatory.

Version 2.16.06

Released on 05 Jun 2000

1. On the trigger list page, if the triggers are sorted into sequence order (the default) then the secondary sort sequence is now the trigger match string. In other words, triggers which have the same sequence number will be sorted by what they match on.

2. Fixed problem where, under certain circumstances, changing the font in the output configuration (and probably the input one as well) would not take effect until you closed and re-opened the world.

3. Recoded the example VBscript routines in Jscript (Java Script) as an example of scripting MUSHclient in Java. Some things are not intuitively obvious in Jscript, particularly handling of arrays passed from MUSHclient. If you want to experiment with Jscript, see the file exampscript.jvs.

4. Added option "reload defaults" to the File menu, so if your world uses the new default colours/triggers/aliases (etc.) you can reprocess them without having to close and re-open the world.

5. If you are using default colours ("Override with default colours" set on ANSI colour configuration screen) then on the custom colour configuration screen you also cannot change colours (default colours applies to all colours).

6. Added keyboard accelerator for Global Preferences (CTRL+ALT+G).

7. Tab-completion now works on a word in the middle of a command. eg. "Ste| Hello" where "|" is the cursor position. Now pressing <tab> will change "Ste" to "Steve" (if it can).

8. Tab-completion now searches backwards using the delimiter characters specified in global preferences, rather than just looking for a space. For instance, if you typed "(Ste" and pressed <tab> it will now correctly change "(Ste" to "(Steve" (if it can) whereas previous versions would have looked for "(Steve" in the output window.

9. The "generate character name" function now has a "copy" and "send to world" button to facilitate using the generated name.

10. The "generate character name" function now has a keyboard accelerator, SHIFT+ALT+N.

11. Added code to try to stop timers from occasionally firing much more rapidly than they are supposed to (eg. if you change the system clock).

12. When migrating the old "highlighting" strings into triggers the "keep evaluating" option is set, as some people already had triggers set up to match on similar things, and the migrated triggers stopped the original triggers from being evaluated.

13. Trigger matching has been changed to fix a problem with slow trigger evaluation when very long paragraphs arrive from the MUD (eg. over 4,000 characters). Although such paragraphs would be rare, it appears MUSHclient used to process them very slowly. Now, all triggers are *internally* converted to regular expressions which execute much faster. It is possible that some triggers may evaluate differently after conversion to regular expressions, if that happens to you please send me an example of the trigger match string (eg. *test*) and what you were matching on (ie. the output from the MUD).

There is a subtle difference between a wildcard (ie. "*") in the old MUSHclient, and a regular expression wildcard (ie. ".*"). The regular expression wildcard is more "greedy" so-to-speak, so that given something like this:

Match on: I saw .* sitting there

If you send the text: "I saw a dog sitting there and a cat sitting there"

A regular expression will return "a dog sitting there and a cat" whereas the old-fashioned wildcard will return "a dog". However the greediness can be cancelled by putting a question mark next to the asterisk, like this: I saw .*? sitting there

This is what MUSHclient does when converting ordinary triggers to regular expressions internally, however it is possible there are *other* subtleties that are still different.

14. Fixed a bug with "Alt+Arrow keys recalls partial command" where if you were recalling commands, and then typed a different command and pressed Alt+Up it would continue to recall the old command.

15. Fixed a bug with retrospective logging where the "log line preamble" would appear at the start of every *line* of the retrospective part of the log file rather than the start of every paragraph.

16. Because there is some doubt about the performance of regular expression evaluation, triggers now time themselves, you can see the time shown for individual triggers when you view them, and the total time taken to evaluate all triggers in the "info" configuration screen. If one trigger seems particularly higher than the others, then that may be of concern.

17. Enhanced help file is now included in the download. I would appreciate hearing about any problems in help screens.

Version 2.16.05

Released on 01 Jun 2000

1. Custom colour drop-down combo boxes now display the custom colour names left-justified, much the same as normal combo boxes. :)

2. Removed "apply" button from configuration screens, as it didn't do anything.

3. Log files can now have a postamble (ie. something that is written at the *end* of the logging session) as well as a preamble.

4. Fixed bug where auto-log did not do date/time substitution on the log file preamble.

5. You can now define "default" (or machine-wide) settings for the following, which can override (replace) those set up in individual world files. The purpose of this is to allow you to easily set up preferred colours/triggers/aliases etc. and only have to amend them in one place to affect multiple worlds.

The settings that can be made default are:
* Colours
* Triggers
* Aliases
* Macros
* Timers
* Command window font
* Output window font

See below for more details about how to do this.

6. If you press Alt+Up-Arrow or Alt+Down-Arrow when the focus is in the output window, the focus moves to the command window, and the arrow-action is processed.

7. As not everyone likes the red-to-yellow gradient in the configuration screens, there is now an option in File -> Preferences -> General to turn it off.

8. Fixed a bug where after loading ANSI colours, custom colours were not loaded. In other words, you can now save/load your custom colours by using the "save" or "load" buttons on the ANSI colour configuration screen.

9. By right-clicking on a colour swatch, you can now copy or paste a colour, without having to enter its RGB values.

10. To help you set up your custom colours, a copy of the ANSI colours is reproduced at the bottom of the custom colour page (small swatches).

11. Custom colours (for a new world) now default to a nice selection of colours, rather than just white on black.

12. When creating a new world, MUSH default triggers are automatically added (8 of them) which simulate the previous behaviour of MUSHclient using the old Highlighting configuration screens (and which are also examples of how to set up simple triggers).

13. Fixed a problem, described in detail in bug #319, where inverse highlighted text would incorrectly highlight the background rather than the text colour. To try this out on a MUSH, type: "think ansi(bhYi,Nick)" and compare the results in this version to previous versions.

14. Beta-tester names are now in Help -> About -> Credits. There is still time for other names to be added before the official "version 3" release. :)


Setting up default triggers/colours etc.
----------------------------------------

To set up defaults to be shared across multiple worlds:

a) Open your favourite world, and then save as individual files your:
* Colours
* Triggers
* Aliases
* Macros
* Timers
(there is a "save" button on each configuration screen to do this)

You do not need to do them all. For instance, if you only want to share colours, then only save the colours.

b) Use File -> Preferences -> Defaults to select the files you saved in the above step

c) Also select your preferred input and output font.

d) For all worlds that are to share these saved files, open that world, and then using the appropriate configuration screen (eg. colours, triggers) check the box "override with default".

From then on, the *next* time you open that world, it will load the world, and then load (and thus overwrite) the settings you have checked as "override with default".

Also, any new worlds will use the default settings, thus new worlds will quickly take on your default characteristics.

Note that the defaults, when loaded, *overwrite* your existing settings, so that the existing triggers, colours etc. are *lost*. If you really want to keep the existing settings, then you should save the world file under a different name (thus preserving the original).

Version 2.16.04

Released on 30 May 2000

1. Fixed problem where Microsoft mouse wheel scrolling would not scroll the number of lines you had set in the Control Panel.

2. Fixed bug where if you changed the font name or size, and then clicked on the "adjust width to window size" button the window width would be calculated based on the old font, not the newly selected one.

3. Fixed bug where when starting a log file, with a user-defined log-file preamble with multiple lines, you would get two carriage returns per one linefeed.

4. When logging you can now specify a "line preamble", that is, something that is written at the start of each log line. The preamble can be different for input, output and "world.note". The preamble can have date/time-substitution strings. For example:

Output: %H:%M >
Input: %H:%M $
Note: %H:%M !!!

... might give ...

12:41 > Huh? (Type "help" for help.)
12:42 $ /world.note "Hello"
12:42 !!! Hello

5. Log file preamble can now contain date/time substitution strings.

6. Fixed bug where if you turned on logging, including retrospective logging, that any lines which spanned multiple screen lines (ie. multi-line paragaraphs) would only have the last line of the paragraph written to the log file.

7. Fixed bug where if you turned on logging, including retrospective logging, that any lines which were your input (ie. from the command window) were not written to the log file.

8. To save a bit of confusion, the spell check menu item (Edit -> Spell Check) is greyed-out if spell checking is disabled in Global Preferences. Likewise, you cannot select Configuration -> Commands -> Spell Check On Send, if spell checking is disabled.

9. To save a bit more confusion, the options "bold", "italic" and "underline" on the "edit trigger" dialog are greyed-out if showing bold/italic/underline (as applicable) are not selected in the Configuration -> Output screen.

10. Added a "spell check options" button to the Configuration -> Commands screen.

11. On a lighter note, added a "character name generator". See section "Name generator" following (in this document) for more details about it. You might use it when needing a character name on a MUD, to save having to dream up a suitable name. You could also use it to randomly generate words that could be used as passwords. This is available from the Edit menu when a world is open.

12. For advanced scripters - there is now a scripting callback for "getting the focus" and "losing the focus". You can use those to write a script that might take different action if something happens when the world does not have the focus (eg. play a sound). This is not necessarily symmetrical - it appears that bringing up the Configuration screen and closing results in getting the focus, but not losing it.

13. Added "move up" and "move down" buttons to the trigger configuration screen. This lets you resequence triggers at the click of a button. You can only resequence when the list is sorted into ascending sequence order. Resequencing is based on the idea of "groups of sequence numbers". If the trigger is already in a group (eg. 10 triggers all with sequence 100) then resequencing will add or subtract one to its sequence (thus, leaving that group). If the trigger is *not* in a group (ie. it has a unique sequence number) then resequencing will make it join the next trigger group upwards or downwards as the case may be.

14. Fixed a bug where if you pasted a large amount of text into the command window (say, 5000 lines), then pressed <enter>, and then pressed Ctrl+H to view the Command History, MUSHclient would crash.

15. Amended menu item "Display" to read "Game" when the activity window is open. This is to stop the rather disconcerting flickering between the words "game" and "display" if you closed the activity window when no worlds were open.

16. Fixed bug where if you typed in the wrong port number for a MUD (and tried to connect to it), and then corrected it, the old port number would be re-used until you closed the world and re-opened it.

17. When setting up an auto-log file name, clicking on the Browse button will default to the log file directory specified in File -> Preferences -> Logging.

18. Added an option to "send to world" and "paste to world" about whether or not you want the lines send/pasted to be echoed to the output window.

19. The colour-picker dialog box now opens in "full" mode automatically, so you can create colours that are not in the default boxes more easily.

20. Fixed problem where if you had a word in italic (not the whole line) then the right-hand end of the word would be chopped off in a vertical line.

21. The ANSI and custom colours are now configured on separate configuration pages, to make things less cluttered.

22. You can now *name* the 16 custom colours, eg. you could call "Custom1" "Incoming pages".


Name generator
--------------

The character name generation function relies upon a text file with the three name parts in it. The file is read in once and then names randomly chosen from the three parts. The file should contain lines with "[start]", "[middle]", "[end]" and "[stop]" in it (see below for example). Using the example file below, a generated name might be Wicorebwyn (Wic - ore - bwyn). By setting up different files you can generate names with a different "feel" to them.
By leaving some blank lines in a section that part might be empty (eg. by leaving a blank in the [middle] section below, you might get the name Adand (Ad - and)).

Once a suggested name is displayed you can press "try again" if you don't like the name, and a different one will be generated. Then, when you are happy with the name, press <tab> until the name is highlighted, press Ctrl+C to copy it to the clipboard, and paste it wherever you want it. An example name generation file, "names.txt", is included with the download.


[start]
A
Ab
Ac
Ad
W
Wic
[middle]
a
ae
ore
u
y

[end]
a
and
b
bwyn
baen
bard
[stop]

Version 2.16.03

Released on 26 May 2000

1. There are now *two* sets of word delimiters in File -> Preferences -> General. One for double-clicking, one for tab-completion. :)

2. The "logging" configuration screen now has provision for an "auto-log" file name. If there is a (valid) log file name there, then every time you open this world, the log will be appended to it. You can also specify whether you want the world name written (and enter a preamble that is to appear in the log file). Also see (9) below.

3. Attempts to use the zlib.dll are now deferred until you connect to a world that uses compression.

4. The recall window now recalls :) where it was last put on the screen, and reappears in that position.

5. Clarification: You can leave the recall window open, and thus have as many of them as you feel comfortable with. The title bar tells you what each particular screen recalled.

6. Since there was not agreement about whether the configuration screens looked better, or not, with the tree view automatically expanded, there is now an option in File -> Preferences -> General to let you choose.

7. New feature - "send to all worlds". This was in response to a suggestion that someone would want to send a message to all worlds currently open, simultaneously. eg. "going AFK". You are presented with a list of all open (connected) worlds, from which you can select/deselect to narrow down the list. Then type in your message and press OK. Next time, the selected worlds will be remembered. Aliases and other fancy things are not supported, as aliases are specific to a world, not a batch of worlds.

8. During a spell check the status line now reads "Spell check ..." and then returns to what it previously had (usually "Ready") when finished. This is a visual cue that a) a spell check is in progress, and b) that it is over.

9. Autolog file name can automatically include the date/time. This lets you start a new log every day, month, week or whatever. Do this by manually typing in the codes from the list below into the appropriate part of the file name.

For example: myworld-%a-%d-%b-%Y.txt

might open the file: myworld-Fri-26-May-2000.txt

%a - Abbreviated weekday name (eg. Mon, Tue, Wed)
%A - Full weekday name (eg. Monday, Tuesday, Wednesday)
%b - Abbreviated month name (eg. Jan, Feb, Mar)
%B - Full month name (eg. January, February, March)
%d - Day of month as decimal number (01 to 31)
%H - Hour in 24-hour format (00 to 23)
%I - Hour in 12-hour format (01 to 12)
%j - Day of year as decimal number (001 to 366)
%m - Month as decimal number (01 to 12)
%M - Minute as decimal number (00 to 59)
%p - Current locale’s A.M./P.M. indicator for 12-hour clock
%S - Second as decimal number (00 to 59)
%U - Week of year as decimal number, with Sunday as first day of week (00 to 53)
%w - Weekday as decimal number (0 to 6; Sunday is 0)
%W - Week of year as decimal number, with Monday as first day of week (00 to 53)
%X - Time representation for current locale
%y - Year without century, as decimal number (00 to 99)
%Y - Year with century, as decimal number
%z, %Z - Time-zone name or abbreviation; no characters if time zone is unknown
%% - Percent sign

The # flag may prefix any formatting code. In that case, the meaning of the format code is changed as follows.

Format Code Meaning
%#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% - # flag is ignored.

%#x - Long date representation, appropriate to current locale.
For example: Tuesday, March 14, 1995.

%#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y - Remove leading zeros (if any).

10. Fixed a bug with trigger evaluation, where omitting from output would also omit world.note from output.

11. If you open a log file (File -> Log Session) and an auto log file name has been specified, then that name will be suggested as the log file name (including any imbedded date/time) instead of simply the world name with "log.txt" at the end. This is in case you close a log file and want to re-open it.

Version 2.16.02

Released on 25 May 2000

1. Changed example VBscript file to not close a log file if it was not open.

2. Configuration tree view now automatically opens with all nodes expanded, so you can quickly find a particular configuration item. Is this a good idea?

3. On a trigger you can now set bold, italic or underline to apply in addition, or as well as, a colour change. For instance, with a cunningly-crafted regular expression, you could probably get a URL to appear underlined in blue. :)

4. Fixed a problem when, on creating a new world, you were immediately warned that you hadn't entered a world name, before you had the chance to do so.

5. Fixed a problem where if a trigger was set "omit from output" any "world.note" done from within a script would not appear.

6. Triggers now have a new option "send to output". What this means is that when you match a trigger, you now have three (or four, I suppose) things you can do with it:

a) Send nothing (ie. just colour the line, play a sound or call a script)
b) Send a response to the *world* (ie. the MUD) to be processed by it
c) Send a response to the *command* window (eg. for editing a /grab)
d) Send a response to the *output* window (eg. for sending yourself a note)

The new feature is (d).

The response that is sent is in the "send" box. If you want to do fancier things then you need to call a script and let it do a combination of the above.

7. On the scripting configuration page, the combo box for selecting the note colour is now a "colourised" combo box, like on the triggers setup page.

8. Trigger processing has been enhanced with a view to making it more robust if you happen to delete or add a trigger, from within a script, that is called by a trigger. Previously if you had such a trigger, and "keep evaluating" was checked, then the program might have "lost its place" in the list of triggers it was trying to evaluate.

9. Added support for the mouse wheel on Microsoft mice. I don't have one to test, so I would be pleased to hear if it works. :)

10. Fixed a crash where if you created a new world, *and* loaded defaults from an existing world, *and* that world had scripting enabled, *and* the script did a world.note, you would get an access violation.

11. Added a trigger option, that the trigger sound would be played *conditionally* if the world was *not active*. In other words, you can set up a trigger to match your name, and then minimize (or put somewhere else) your MUSHclient session. If someone pages *you* then the trigger fires and plays a sound. If the world is active (ie. you are chatting) then the sound is not played.

Version 2.16.01

Released on 24 May 2000

1. Fixed a bug where you would get an exception when you closed a world, if zlib.dll was not present.

2. It seems that the definition of a "word" for the purposes of double-clicking and tab-completion is a bit of a problem.

eg. is "pig-pen" one word or two?
is "Tel'aran'rhiod" one word or three?
is "Nick_Gammon" one word or two?

To allow for individual preference, you can now adjust File -> Preferences -> Word delimiter to indicate what characters are *not* in a word. For instance, "." "," "-".

Just enter a list of characters that are to be considered the *end* of a word. The default is: .,()[]"'

We can probably all agree that a space ends a word, so a space (or tab) will be considered the end of a word, regardless of what you put in this field.

3. The second tab of the File -> Preferences has been renamed "General".

4. The colour-selection combo boxes in the trigger dialog box, and the "user input" dialog boxes now show the actual colours for each menu item in the combo box, so you can see what the results will be immediately. I'm not sure I like this, comments are welcome.

5. Fixed a bug where if you created a new world, the program crashed.

6. Fixed a bug where if you changed custom colours and then immediately edited a trigger, the old custom colours would still be shown in the trigger dialog box.

7. The icon in the "recall" window is now the MUSHclient icon, not the Windows icon.

8. The "recall" window is now drawn in the colours of the main output window.

9. The "recall" window now uses the font of the main output window.

10. The "line information" (yellow popup window) now displays the time to the nearest second.

11. Fixed a bug where if you changed a colour on the colour configuration dialog, and then clicked "swap" the *old* colours would be swapped, not the new ones.

12. Fixed minor problem where the layout of the "send file" and "paste to world" configuration dialogs were similar but not identical, so they seemed to flicker.

13. You can now control-double-click in the output window to select a *paragraph*.

14. The "spell check on request" (CTRL+J) now spell checks the selection only (if text is selected).

15. After a spell check, the original selection is restored.

16. The spell check command now appears if you right-mouse-click in the command window.

17. Clarification - bug 331 exists however is not uploaded to the web page yet. It relates to the request for enhanced regular expressions.

18. You can now sequence triggers - a sequence number can be assigned to each trigger. The lower the number the earlier it is in the sequence, much like counting from 1 to 10. :) If two triggers have the same sequence number the order of execution is undefined (except that they will be executed after triggers with a lower sequence, and before triggers with a higher sequence). The default sequence is 100, including that for triggers from earlier versions. This means that if you want a new trigger to execute before the existing bunch, give it a sequence less than 100, and if you want it after, give it a sequence higher than 100. Sequence numbers are in the range 0 to 10000. You may want to resize the column assigned to the sequence number in the trigger list. If you do, MUSHclient will remember the new column width.

19. I have had a suggestion about naming custom colours, which will be probably implemented in a future version. :)

20. The spell.zip file accidentally included the British dictionaries. If you have already downloaded it, you will not need to download british_dict.zip. If not, you will.

Version 2.16.00

Released on 23 May 2000

NEW FEATURES AT A GLANCE

Spell checker - can check on request or automatically
Custom colours - 16 extra colours for triggers, and other uses
Perl-compatible regular expressions in triggers, aliases, find screens
Improved trigger-handling - can match on multiple lines
Triggers that match on multi lines pass all lines to scripts
Triggers can now be used to colour individual words, not just the whole line
Fixed bug re command area increasing in size
Option to omit alias from output
Button to swap normal and bold colours
Double-click to send word to world
Double-clicking to select words now selects wider range of characters
Tab-completion now selects underscore and hyphens as well as alpha characters
Spin button control problems corrected (re. entering 1,000)
Recall feature recalls text into a separate window
Find now searches for paragraphs
Configuration screens layout improvements
Configuration screens "highlighting" and "strings" removed
More scripting properties
Support for PerlScript

The new features are described in detail below.

BTW - "colour" is the Australian spelling of the word "color". :)


SPELL CHECKER

MUSHclient now incorporates a spell checker supplied by Wintertree Software Inc.

You can spell-check on request (CTRL+J) or automatically every time you send a line to the MUD.

First, you must enable spell-checking in the File -> Preferences -> Connection/Spell Checker screen. Check the "enable spell check" checkbox, and click on "Spell Check Options" to set options, such as whether the checker should ignore capitalised words, or check for repeated words (like "the the").

Then, you can enable automatic spell checking from World Configuration -> Input -> Commands -> Spell Check On Send.

Alternatively, just spell-check when you want to by pressing Ctrl+J (or use Edit -> Spell Check).

Special words (MUD words) can be added to your user dictionary.

If you want British (Australian) spelling then please also download british_dict.zip which contains British dictionaries, and unzip it into the "spell" subdirectory. Then select "British English" from the Spell Check Options dialog box.

If you want to spell-check other languages then please email me and we will discuss it.

If anyone thinks a spell-checker is so useless they would prefer it to not appear in the main download, I would be interested to hear from you.


CUSTOM COLOURS

A major enhancement to this version is the addition of 16 custom colours for use in triggers (and for echoing commands). Unlike the earlier versions the custom colours are independent of the 8 normal and 8 bold ANSI colours, and *also* allow the background to be set.

In other words, you can have a trigger highlight a word in blue-on-green if you want.

The colour swatches in the colour window have been implemented differently. You now click on the colour itself to change it.

For backwards compatibility your existing *bold* colours have been migrated to the first 8 custom colours, so that triggers will initially look the same.

There is also an option to swap the bold/normal colours, as requested by a MUSHclient user.

You can change the colours from a script - see further on in this document for details.


CONFIGURATION SCREEN IMPROVEMENTS

The configuration screens are now presented as a "tree-view" on the left, with the different screens appearing as you navigate through the tree view.

Press CTRL+PAGE_DOWN or CTRL+PAGE_UP to change screens via the keyboard.

The program remembers which screen you last had open, so pressing CTRL+G (or ALT+ENTER) is a quick way of returning to the last thing you were configuring.

The previous keyboard equivalents for displaying configuration screens (eg. ALT+5 for the Output screen) still work, however they now display the full configuration view, with the appropriate screen selected.

Triggers, aliases and timers have been moved from their own (rather confusingly-named) section "triggers" into more relevant sections.

Triggers now appears under "Appearance" section.
Aliases now appears under "Input" section".
Timers now appears under "General" section.



PERL-COMPATIBLE REGULAR EXPRESSIONS

Regular expression handling has been upgraded to the "Perl-compatible" routines supplied by Philip Hazel of The University of Cambridge. These are basically more powerful than the previous routines.

Read about Perl Compatible Regular Expressions (PCRE) in the file "RegularExpressions.txt".

The idea of doing this arose from a query from a player, who wanted to congratulate other players when they rose a level, but *not* congratulate himself. There was no easy way of doing that with the earlier regular expressions (short of writing a script routine), however with PCRE you can do something like this:

^(?!Nick )(\w*) has risen to .*$

This matches on a word of any length (\w*) however it asserts that the word is not "Nick".

Thanks to Alan Schwartz for suggesting PCRE to solve this problem. :)

There are various new "special" characters in PCRE, such as:

\d any decimal digit
\D any character that is not a decimal digit
\s any whitespace character
\S any character that is not a whitespace character
\w any "word" character
\W any "non-word" character

PCRE also supports the POSIX notation for character classes, which uses names enclosed by [: and :] within the enclosing square brackets. PCRE supports this notation. For example,

[01[:alpha:]%]

matches "0", "1", any alphabetic character, or "%". The supported class names are

alnum letters and digits
alpha letters
ascii character codes 0 - 127
cntrl control characters
digit decimal digits (same as \d)
graph printing characters, excluding space
lower lower case letters
print printing characters, including space
punct printing characters, excluding letters and digits
space white space (same as \s)
upper upper case letters
word "word" characters (same as \w)
xdigit hexadecimal digits

The names "ascii" and "word" are Perl extensions. Another Perl extension is negation, which is indicated by a ^ character after the colon. For example,

[12[:^digit:]]

matches "1", "2", or any non-digit.


PCRE also supports repetition quantifiers. For example:

z{2,4}

matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special character. If the second number is omitted, but the comma is present, there is no upper limit; if the second number and the comma are both omitted, the quantifier specifies an exact number of required matches. Thus

[aeiou]{3,}

matches at least 3 successive vowels, but may match many more, while

\d{8}

matches exactly 8 digits.

There is even more, which I won't bore you with right now. Read the RegularExpressions.txt file for more details.

I have *not* attempted to convert existing regular expressions to the new format automatically. There is a possibility that some complex ones may not behave exactly as expected. Please let me know if this is a big worry.


IMPROVED TRIGGER HANDLING

The way that triggers are matched has basically been rewritten (ie. expect bugs).

If you usually connect to a MUD that sends a newline at the end of every line you may not notice much difference (eg. a Diku-style MUD), however MUDs that normally send *paragraphs* which consist of lots of lines which are wrapped by the client (eg. MUSH, MUCK) then you *should* notice a difference.

The old way was to match on the first line of a paragraph, like this:

1. AAAAAAAAAAAA <-- trigger matching done here
2. BBBBBBBBBBBB
3. CCCCCCCCCCCC
4. DDDDDDDDDDDD <newline>
5. EEEEEEEEEEEE <-- trigger matching done here
6. FFFFFFFFFFFF
7. GGGGGGGGGGGG <newline>

MUSHclient normally indents subsequent lines of a paragraph to give you a visual cue that what you are seeing is a paragraph and not individual lines.

Version 2.15 (and earlier) matched triggers when the first line arrived (eg. lines 1 and 5 in the example above).

Then, if a match was found a flag was set and subsequent lines coloured in the trigger colour, omitted from output, logged or not logged, as the case may be.

There were a number of problems with this approach...

1. The matching was only done on what was on the first line. For example, if the trigger was matching "BBBBBBBBBBBB" then it would not fire, even though "BBBBBBBBBBBB" was part of the paragraph.
2. Matching would not take part over line boundaries, For example, matching on "AA BB" would fail.
3. Only the first line was passed to a script routine (if any). Thus in this example, only "AAAAAAAAAAAA" would be passed to the script.
4. You could only colour the whole line that matched, not individual words.
5. Matching lengthy things (like "AAAAAAAAAAAA * DDDDDDDDDDDD") would fail because the whole paragraph was not tested.
6. Wildcards (%1, %2 etc.) had to be matched on the first line
7. Matching depended on the line width.


Version 2.16 now matches at the end of the paragraph, like this:

1. AAAAAAAAAAAA
2. BBBBBBBBBBBB
3. CCCCCCCCCCCC
4. DDDDDDDDDDDD <newline> <-- trigger matching done here
5. EEEEEEEEEEEE
6. FFFFFFFFFFFF
7. GGGGGGGGGGGG <newline> <-- trigger matching done here

1. This means you can now test for *anything* in the paragraph (eg. matching on "CCC" will work).
2. The whole paragraph is passed to the script routine, if any.
3. Wildcards can be anywhere in the paragraph.


TRIGGERS CAN NOW BE USED TO COLOUR INDIVIDUAL WORDS

Another enhancement is the ability to colour individual words in a trigger. For this to work, the trigger must be a *regular expression*, as the regular expression routine returns word positions. Despite the mumbo-jumbo above about regular expressions, this isn't as bad as it looks.

A simple regular expression is just one or more words, like this:

Match on: science fiction
Colour: Custom 4
Regular expression: checked
Ignore case: checked (if wanted)
Repeat on same line: checked (if wanted)

This would simply match on the words "science fiction" anywhere in the line, and colour it in custom colour 4.

A new option, "repeat on same line" allows you to colour the same word (regular expression) even it appears more than once in the paragraph.

Combine this with "keep evaluating" and you can check for multiple, different, words in a particular paragraph, and colour them different colours.

Since the "omit from output" flag will now only be processed when the whole *paragraph* has been received, you might experience a slight flicker on a slow connection, as the paragraph is drawn, then the trigger evaluated, and then the paragraph removed (undrawn).

BTW - if you want to get a little fancier, the regular expression "science|fiction" (note the vertical bar) matches on "science" *or* "fiction" and thus will colour either of those words, regardless of the order they appear in.

Q. How can I colour a whole line?
A. Either don't use regular expressions, or make the expression match the whole line.

For example, the regular expression "star trek" will just colour the words "star trek", however the expression "^.*star trek.*$" will colour the whole line (because the wildcards ".*" will "absorb" the leading and trailing characters).


Q. How do I pass wildcards into a trigger response or script, using regular expressions.
A. Put the required wildcard inside brackets.

For example, to make something like: * pages *
... using regular expressions, say: ^(.*) pages (.*)$

The brackets around the ".*" wildcard expressions tell the regular expression to "output" the results (as %1, %2, %3 and so on).


FIXED BUG RE COMMAND AREA INCREASING IN SIZE

I have had numerous reports of the "command" window gradually increasing in size. Careful measurement here seems to indicate that it did, in fact, grow by 7 pixels each time (ie. each time you saved a world and loaded it again).

The window size calculation has been adjusted to remove the 7-pixel growth, but I am not entirely happy with the solution. Conceivably someone with large fonts or some different screen configuration may still experience command area creep or shrinkage. Please let me know if this is a problem.


DOUBLE-CLICK TO SEND WORD TO WORLD

You can now optionally set a word double-click to immediately send the word, rather than put it in the command buffer. This would be helpful for clicking on directions (eg. north) and have that sent, without affecting what you are currently typing.


DOUBLE-CLICKING TO SELECT WORDS NOW SELECTS WIDER RANGE OF CHARACTERS

When double-clicking, words are now considered to *end* on:

a space
single quote
double quote
One of the following: .()[]

If this is not satisfactory please let me know.


OPTION TO OMIT ALIAS FROM OUTPUT

You can set aliases to omit from output (ie. not be echoed), if that is desirable.


TAB-COMPLETION NOW SELECTS UNDERSCORE AND HYPHENS

Pressing <tab> to complete a word now accepts "-" or "_" as part of a word.

If this is not satisfactory please let me know.


RECALL FEATURE RECALLS TEXT INTO A SEPARATE WINDOW

A much-requested feature, "recall" has been implemented.

This is sort-of like a "batch find". The keyboard equivalent CTRL+U can be used.

When you do a Display -> Recall Text (CTRL+U) you will be offered a dialog box similar to the "Find" dialog. Fill in something to search for (it can be a regular expression) and press "Find".

Provided at least once instance is found, a new window will be opened, with all *paragraphs* that match the find string (or regular expression) inserted in it.

This window is modeless, which means you can leave it open as long as you want. Press <esc> to get rid of it. You can use the "system" menu (press ALT+SPACE) to find a "save as text" menu item, which allows you to save the found text to disk as a text file.

You can also specify how many lines to go back, in case you have thousands of lines, and only want to recall over the last 200 (say).

FIND NOW SEARCHES FOR PARAGRAPHS

The "find" (in output buffer) has been amended to work similarly to "recall". In essence, the difference is that the buffer is reassembled into paragraphs, which are then tested. What this means is:

1. Phrases that span a line boundary will now be correctly located.
2. Regular expressions that test a whole paragraph will work properly.
3. It will only find the *first* word in a paragraph. In other words, a "find next" starts at the next *paragraph*, thus possibly skipping repetitions of that word in the same paragraph.
4. You can highlight a phrase that spans multiple lines in a paragraph. For example, finding the regular expression "The.*castle" would highlight a sentence beginning with "The" and ending with "castle" even if it spanned many lines.




CONFIGURATION SCREENS "HIGHLIGHTING" AND "STRINGS" REMOVED

The configuration screens "highlighting" and "strings" have been removed. Their functionality was a throw-back to early versions of MUSHclient that did not have triggers. Since the same effect can be achieved by using triggers having another way of matching on incoming text is just confusing.

If you had highlighting strings set up (eg. "pages", "whispers", "From afar,") and those strings were set to display a different colour (ie. any colour except "no change"), then they will be automatically (automagically?) migrated to triggers. You can examine these triggers in the normal way, and delete them if you don't want them.

The migration to triggers should be consistent to how these strings used to work, however you may want to change them a bit to make them more reliable.

For instance, the string "From afar," will be changed to a trigger "^.*From afar, .*$".

This is a regular expression matching on "From afar," *anywhere* on the line. However it would make more sense to match on the start of line only, like this: "^From afar, .*$"



MORE SCRIPTING PROPERTIES

New script properties:

world.notecolour - you can get or set this to change the colour (number) that the *next* world.note will be displayed in. The valid range is 0 to 16, where 0 is "no change", 1 is custom colour 1, through to 16 for custom colour 16.

eg.

world.notecolour = 15 ' set note colour to use custom colour 15
world.note "This will be in custom colour 15"

NB - if you want to change the colour itself, use world.customcolourtext or world.customcolourbackground.

world.normalcolour - you can use this property to get or set the RGB colours used for the 8 ANSI normal colours. You must specify *which* colour you want to get/set, in the range 1 to 8, as follows:

black = 1
red = 2
green = 3
yellow = 4
blue = 5
magenta = 6
cyan = 7
white = 8


If you are setting the colour you must specify an RGB value. Some pre-defined values are available, see below.

Constant Value Description
-------------------------------
vbBlack &h00 Black
vbRed &hFF Red
vbGreen &hFF00 Green
vbYellow &hFFFF Yellow
vbBlue &hFF0000 Blue
vbMagenta &hFF00FF Magenta
vbCyan &hFFFF00 Cyan
vbWhite &hFFFFFF White


eg.

world.normalcolour (3) = vbGreen ' set "green" colour to green
world.normalcolour (8) = &h303030 ' set "white" to a dark grey colour

You should be cautious doing frequent colour changes, because what happens is that you are changing the *palette* colour. What this means in practice is that if you change (say) the white colour (colour 8) then when new text appears on the screen it will be drawn in the new colour, however existing text will stay the old colour *until* it is redrawn (eg. is covered by a dialog box). This may lead to patchy bits of different colour on the screen.

You can have different colours on the screen (at the same time) by using the 16 custom colours, but only 16 different colours can be visible at once.

You can force a redraw of the whole world's window(s) by using the "Redraw" method.

eg.

world.normalcolour (3) = vbMagenta ' set "green" colour to magenta
world.redraw

world.boldcolour - you can use this property to get or set the RGB colours used for the 8 ANSI bold colours. You must specify *which* colour you want to get/set, in the range 1 to 8, as per the table above for normal colours.

eg.

world.boldcolour (4) = vbRed

world.customcolourtext - you can use this property to get or set the RGB colours used for the text (foreground) of the 16 custom colours. You must specify *which* colour you want to get/set, in the range 1 to 16.

world.customcolourbackground - you can use this property to get or set the RGB colours used for the background of the 16 custom colours. You must specify *which* colour you want to get/set, in the range 1 to 16.

eg.

world.customcolourtext (14) = vbBlue
world.customcolourbackground (14) = vbBlack


Notes

1. If you supply a colour number out of range (eg. 17) then setting the colour will do nothing, and getting the colour will return zero.
2. Changing the colour does *not* mark the world as modified. You must manually save it if you wish to retain colour changes.


Logging properties:

world.lognotes - set to 1 to log notes to the log file, 0 to not log
world.loginput - set to 1 to log your input to the log file, 0 to not log

Other properties will be added on request.


New script method:

world.redraw - forces a redraw of all windows for this world. Use this after changing colours.


SUPPORT FOR PERLSCRIPT

You can now choose "PerlScript" as your scripting language.

I downloaded Perl from:

http://www.ActiveState.com/ActivePerl/download.htm

I haven't yet successfully got a script to work in Perl, but that may well be because of my ignorance of the language. Any comments from MUSHclient Perl scripters would be welcome (including sample scripts).