Index: MUSHclient.cpp =================================================================== RCS file: /cvs/mushclient/MUSHclient.cpp,v retrieving revision 1.88 retrieving revision 1.90 diff -c -r1.88 -r1.90 *** MUSHclient.cpp 19 Jun 2008 08:33:24 -0000 1.88 --- MUSHclient.cpp 23 Jun 2008 23:32:17 -0000 1.90 *************** *** 633,642 **** if (firsttime) { CWelcomeDlg dlg; ! dlg.m_strMessage.Format ("I notice that this is the first time you have used" ! " MUSHclient on this PC."); dlg.DoModal (); --- 633,681 ---- if (firsttime) { + + // fix up tool bars + Frame.RecalcLayout(TRUE); + CRect rectBar; + CToolBar * pToolBar; + + // main toolbar + pToolBar = &Frame.m_wndToolBar; + if (pToolBar) // assuming we can find it + { + pToolBar->GetWindowRect(&rectBar); + CRect rect (0, 0, rectBar.right - rectBar.left, rectBar.bottom - rectBar.top); + Frame.ClientToScreen (rect); + Frame.DockControlBar (pToolBar, AFX_IDW_DOCKBAR_TOP, rect); + + // put game toolbar next to it + Frame.ScreenToClient (rect); + OffsetRect (rect, 265, 0); + + pToolBar = &Frame.m_wndGameToolBar; + + if (pToolBar) // assuming we can find it + { + pToolBar->GetWindowRect(&rectBar); + Frame.ClientToScreen (rect); + Frame.DockControlBar (pToolBar, AFX_IDW_DOCKBAR_TOP, rect); + } // toolbar found + + // float the activity bar + pToolBar = &Frame.m_wndActivityToolBar; + if (pToolBar) // assuming we can find it + { + pToolBar->GetWindowRect(&rectBar); + CPoint point (500, 70); + Frame.ClientToScreen (&point); + Frame.FloatControlBar (pToolBar, point, CBRS_ALIGN_LEFT); + } // toolbar found + } // toolbar found + CWelcomeDlg dlg; ! dlg.m_strMessage.Format (Translate ("I notice that this is the first time you have used" ! " MUSHclient on this PC.")); dlg.DoModal (); *************** *** 655,662 **** CWelcome1Dlg dlg; // Welcome to this version dialog ! dlg.m_strMessage1.Format ("Welcome to MUSHclient, version %s", MUSHCLIENT_VERSION); ! dlg.m_strMessage2.Format ("Thank you for upgrading MUSHclient to version %s", MUSHCLIENT_VERSION); dlg.DoModal (); --- 694,701 ---- CWelcome1Dlg dlg; // Welcome to this version dialog ! dlg.m_strMessage1 = TFormat ("Welcome to MUSHclient, version %s", MUSHCLIENT_VERSION); ! dlg.m_strMessage2 = TFormat ("Thank you for upgrading MUSHclient to version %s", MUSHCLIENT_VERSION); dlg.DoModal (); Index: MUSHclient.rc =================================================================== RCS file: /cvs/mushclient/MUSHclient.rc,v retrieving revision 1.219 diff -c -r1.219 MUSHclient.rc *** MUSHclient.rc 19 Jun 2008 07:15:55 -0000 1.219 --- MUSHclient.rc 23 Jun 2008 23:35:09 -0000 *************** *** 75,82 **** // VS_VERSION_INFO VERSIONINFO ! FILEVERSION 4,0,28,0 ! PRODUCTVERSION 4,0,28,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L --- 75,82 ---- // VS_VERSION_INFO VERSIONINFO ! FILEVERSION 4,0,29,0 ! PRODUCTVERSION 4,0,29,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L *************** *** 94,107 **** VALUE "Comments", "MUSHclient - a client program for playing MUD games\0" VALUE "CompanyName", "Gammon Software Solutions\0" VALUE "FileDescription", "MUSHclient\0" ! VALUE "FileVersion", "4.28\0" VALUE "InternalName", "MUSHCLIENT\0" VALUE "LegalCopyright", "Copyright © 2008 Gammon Software Solutions\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "MUSHCLIENT.EXE\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "MUSHclient\0" ! VALUE "ProductVersion", "4.28\0" VALUE "SpecialBuild", "\0" END END --- 94,107 ---- VALUE "Comments", "MUSHclient - a client program for playing MUD games\0" VALUE "CompanyName", "Gammon Software Solutions\0" VALUE "FileDescription", "MUSHclient\0" ! VALUE "FileVersion", "4.29\0" VALUE "InternalName", "MUSHCLIENT\0" VALUE "LegalCopyright", "Copyright © 2008 Gammon Software Solutions\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "MUSHCLIENT.EXE\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "MUSHclient\0" ! VALUE "ProductVersion", "4.29\0" VALUE "SpecialBuild", "\0" END END Index: childfrm.cpp =================================================================== RCS file: /cvs/mushclient/childfrm.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** childfrm.cpp 9 Aug 2007 01:20:55 -0000 1.12 --- childfrm.cpp 22 Jun 2008 04:59:25 -0000 1.13 *************** *** 154,165 **** int iDefaultHeight = (15 * 2) + 9; if (m_pDoc) ! iDefaultHeight = (m_pDoc->m_InputFontHeight * 2) + 9; // 2 pixels plus 7 for add, below int iMinimumHeight = 15 + 9; if (m_pDoc) ! iMinimumHeight = m_pDoc->m_InputFontHeight + 9; // 2 pixels plus 7 for add, below CRect rectInside; m_wndSplitter.GetClientRect(rectInside); --- 154,165 ---- int iDefaultHeight = (15 * 2) + 9; if (m_pDoc) ! iDefaultHeight = (m_pDoc->m_InputFontHeight * 2) + 9; // 2 lines plus 7 pixels for add, below int iMinimumHeight = 15 + 9; if (m_pDoc) ! iMinimumHeight = m_pDoc->m_InputFontHeight + 9; // 2 lines plus 7 pixels for add, below CRect rectInside; m_wndSplitter.GetClientRect(rectInside); Index: doc.cpp =================================================================== RCS file: /cvs/mushclient/doc.cpp,v retrieving revision 1.228 retrieving revision 1.230 diff -c -r1.228 -r1.230 *** doc.cpp 21 Jun 2008 04:43:53 -0000 1.228 --- doc.cpp 23 Jun 2008 06:27:54 -0000 1.230 *************** *** 507,512 **** --- 507,513 ---- DISP_FUNCTION(CMUSHclientDoc, "GetSoundStatus", GetSoundStatus, VT_I4, VTS_I2) DISP_FUNCTION(CMUSHclientDoc, "PlaySound", PlaySound, VT_I4, VTS_I2 VTS_BSTR VTS_BOOL VTS_R8 VTS_R8) DISP_FUNCTION(CMUSHclientDoc, "SetCommandWindowHeight", SetCommandWindowHeight, VT_I4, VTS_I2) + DISP_FUNCTION(CMUSHclientDoc, "SetToolBarPosition", SetToolBarPosition, VT_I4, VTS_I2 VTS_BOOL VTS_I2 VTS_I4 VTS_I4) DISP_PROPERTY_PARAM(CMUSHclientDoc, "NormalColour", GetNormalColour, SetNormalColour, VT_I4, VTS_I2) DISP_PROPERTY_PARAM(CMUSHclientDoc, "BoldColour", GetBoldColour, SetBoldColour, VT_I4, VTS_I2) DISP_PROPERTY_PARAM(CMUSHclientDoc, "CustomColourText", GetCustomColourText, SetCustomColourText, VT_I4, VTS_I2) *************** *** 3135,3140 **** --- 3136,3142 ---- (WPARAM) m_input_font->m_hObject, MAKELPARAM (TRUE, 0)); + pmyView->AdjustCommandWindowSize (); } // end of being a CSendView } *************** *** 5747,5761 **** * ph; int i; CString strTitle = "Packet debug - "; strTitle += m_mush_name; AppendToTheNotepad (strTitle, ! TFormat ("%s%s packet: %I64d (%i bytes)%s%s", ENDLINE, sCaption, iNumber, size, ENDLINE, ENDLINE), false, // append --- 5749,5768 ---- * ph; int i; + COleDateTime tNow = COleDateTime::GetCurrentTime(); + + CString strTime = tNow.Format (TranslateTime ("%A, %B %d, %Y, %#I:%M:%S %p")); + CString strTitle = "Packet debug - "; strTitle += m_mush_name; AppendToTheNotepad (strTitle, ! TFormat ("%s%s packet: %I64d (%i bytes) at %s%s%s", ENDLINE, sCaption, iNumber, size, + (LPCTSTR) strTime, ENDLINE, ENDLINE), false, // append *************** *** 7826,7830 **** putontoclipboard (QuoteForumCodes (strContents)); } - --- 7833,7836 ---- Index: doc.h =================================================================== RCS file: /cvs/mushclient/doc.h,v retrieving revision 1.242 retrieving revision 1.244 diff -c -r1.242 -r1.244 *** doc.h 21 Jun 2008 04:43:53 -0000 1.242 --- doc.h 23 Jun 2008 06:27:54 -0000 1.244 *************** *** 21,28 **** // New versions - things to change ! #define THISVERSION 428 // Step 1. ! const CString MUSHCLIENT_VERSION = "4.28"; // Step 2. // Step 3. Don't forget VERSION resource in Resources tab // Step 4. Remember: README.TXT --- 21,28 ---- // New versions - things to change ! #define THISVERSION 429 // Step 1. ! const CString MUSHCLIENT_VERSION = "4.29"; // Step 2. // Step 3. Don't forget VERSION resource in Resources tab // Step 4. Remember: README.TXT *************** *** 816,821 **** --- 816,823 ---- unsigned short m_bScriptErrorsToOutputWindow; // write script errors in window + unsigned short m_bAutoResizeCommandWindow; // change command window height automatically + // end of stuff saved to disk ************************************************************** // stuff from pre version 11, read from disk but not saved *************** *** 2419,2424 **** --- 2421,2427 ---- afx_msg long GetSoundStatus(short Buffer); afx_msg long PlaySound(short Buffer, LPCTSTR FileName, BOOL Loop, double Volume, double Pan); afx_msg long SetCommandWindowHeight(short Height); + afx_msg long SetToolBarPosition(short Which, BOOL Float, short Side, long Top, long Left); afx_msg long GetNormalColour(short WhichColour); afx_msg void SetNormalColour(short WhichColour, long nNewValue); afx_msg long GetBoldColour(short WhichColour); Index: doc_construct.cpp =================================================================== RCS file: /cvs/mushclient/doc_construct.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -c -r1.27 -r1.28 *** doc_construct.cpp 19 Jun 2008 08:33:24 -0000 1.27 --- doc_construct.cpp 22 Jun 2008 04:59:25 -0000 1.28 *************** *** 93,98 **** --- 93,99 ---- m_bAlwaysRecordCommandHistory = false; m_bDoNotShowOutstandingLines = false; m_bDoNotTranslateIACtoIACIAC = false; + m_bAutoResizeCommandWindow = false; m_bCopySelectionToClipboard = false; m_bCarriageReturnClearsLine = false; m_bConvertGAtoNewline = false; Index: functionlist.cpp =================================================================== RCS file: /cvs/mushclient/functionlist.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -c -r1.32 -r1.33 *** functionlist.cpp 21 Jun 2008 04:43:53 -0000 1.32 --- functionlist.cpp 23 Jun 2008 06:27:54 -0000 1.33 *************** *** 105,111 **** "DoAfter", "DoAfterNote", "DoAfterSpecial", ! "DoAfterSpeedWalk", "DoCommand", "EchoInput", "EditDistance", --- 105,111 ---- "DoAfter", "DoAfterNote", "DoAfterSpecial", ! "DoAfterSpeedWalk", "DoCommand", "EchoInput", "EditDistance", *************** *** 310,316 **** "SetOption", "SetOutputFont", "SetStatus", ! "SetTimerOption", "SetTriggerOption", "SetVariable", "SetWorldWindowStatus", --- 310,317 ---- "SetOption", "SetOutputFont", "SetStatus", ! "SetTimerOption", ! "SetToolBarPosition", "SetTriggerOption", "SetVariable", "SetWorldWindowStatus", Index: globaloptions.cpp =================================================================== RCS file: /cvs/mushclient/globaloptions.cpp,v retrieving revision 1.29 retrieving revision 1.30 diff -c -r1.29 -r1.30 *** globaloptions.cpp 19 Jun 2008 07:15:55 -0000 1.29 --- globaloptions.cpp 23 Jun 2008 06:27:54 -0000 1.30 *************** *** 22,28 **** { "activity_window_refresh_interval", 15, O(m_nActivityWindowRefreshInterval), 1, 300}, { "activity_window_refresh_type", CMUSHclientApp::eRefreshBoth, O(m_nActivityWindowRefreshType), 0, 2}, ! { "all_typing_to_command_window", false, O(m_bAllTypingToCommandWindow)}, { "allow_loading_dlls", false, O(m_bEnablePackageLibrary)}, { "always_on_top", false, O(m_bAlwaysOnTop)}, { "append_to_log_files", false, O(m_bAppendToLogFiles)}, --- 22,28 ---- { "activity_window_refresh_interval", 15, O(m_nActivityWindowRefreshInterval), 1, 300}, { "activity_window_refresh_type", CMUSHclientApp::eRefreshBoth, O(m_nActivityWindowRefreshType), 0, 2}, ! { "all_typing_to_command_window", true, O(m_bAllTypingToCommandWindow)}, { "allow_loading_dlls", false, O(m_bEnablePackageLibrary)}, { "always_on_top", false, O(m_bAlwaysOnTop)}, { "append_to_log_files", false, O(m_bAppendToLogFiles)}, *************** *** 66,72 **** { "printer_lines_per_page", 60, O(m_nPrinterLinesPerPage), 10, 500}, { "printer_top_margin", 15, O(m_nPrinterTopMargin), 0, 100}, { "reconnect_on_link_failure", false, O(m_bReconnectOnLinkFailure)}, ! { "regexp_match_empty", false, O(m_bRegexpMatchEmpty)}, { "show_grid_lines_in_list_views", true, O(m_bShowGridLinesInListViews)}, { "check_before_removing", true, O(m_bTriggerRemoveCheck)}, { "f1_is_macro", false, O(m_bF1macro)}, --- 66,72 ---- { "printer_lines_per_page", 60, O(m_nPrinterLinesPerPage), 10, 500}, { "printer_top_margin", 15, O(m_nPrinterTopMargin), 0, 100}, { "reconnect_on_link_failure", false, O(m_bReconnectOnLinkFailure)}, ! { "regexp_match_empty", true, O(m_bRegexpMatchEmpty)}, { "show_grid_lines_in_list_views", true, O(m_bShowGridLinesInListViews)}, { "check_before_removing", true, O(m_bTriggerRemoveCheck)}, { "f1_is_macro", false, O(m_bF1macro)}, *************** *** 832,844 **** m_bColourGradient = GetProfileInt ("Global prefs", "ColourGradientConfig", 1); m_bBleedBackground = GetProfileInt ("Global prefs", "BleedBackground", 0); m_bFixedFontForEditing = GetProfileInt ("Global prefs", "FixedFontForEditing", 1); ! m_bRegexpMatchEmpty = GetProfileInt ("Global prefs", "RegexpMatchEmpty", 0); m_bSmootherScrolling = GetProfileInt ("Global prefs", "SmootherScrolling", 0); m_bSmoothScrolling = GetProfileInt ("Global prefs", "SmoothScrolling", 0); m_bShowGridLinesInListViews = GetProfileInt ("Global prefs", "ShowGridLinesInListViews", 1); m_bTriggerRemoveCheck = GetProfileInt ("Global prefs", "TriggerRemoveCheck", 1); m_bF1macro = GetProfileInt ("Global prefs", "F1macro", 1); ! m_bAllTypingToCommandWindow = GetProfileInt ("Global prefs", "AllTypingToCommandWindow", 0); m_strLocale = GetProfileString ("Global prefs", "Locale", localeBuf); m_strFixedPitchFont = GetProfileString ("Global prefs", "FixedPitchFont", "FixedSys"); m_iFixedPitchFontSize = GetProfileInt ("Global prefs", "FixedPitchFontSize", 9); --- 832,844 ---- m_bColourGradient = GetProfileInt ("Global prefs", "ColourGradientConfig", 1); m_bBleedBackground = GetProfileInt ("Global prefs", "BleedBackground", 0); m_bFixedFontForEditing = GetProfileInt ("Global prefs", "FixedFontForEditing", 1); ! m_bRegexpMatchEmpty = GetProfileInt ("Global prefs", "RegexpMatchEmpty", 1); m_bSmootherScrolling = GetProfileInt ("Global prefs", "SmootherScrolling", 0); m_bSmoothScrolling = GetProfileInt ("Global prefs", "SmoothScrolling", 0); m_bShowGridLinesInListViews = GetProfileInt ("Global prefs", "ShowGridLinesInListViews", 1); m_bTriggerRemoveCheck = GetProfileInt ("Global prefs", "TriggerRemoveCheck", 1); m_bF1macro = GetProfileInt ("Global prefs", "F1macro", 1); ! m_bAllTypingToCommandWindow = GetProfileInt ("Global prefs", "AllTypingToCommandWindow", 1); m_strLocale = GetProfileString ("Global prefs", "Locale", localeBuf); m_strFixedPitchFont = GetProfileString ("Global prefs", "FixedPitchFont", "FixedSys"); m_iFixedPitchFontSize = GetProfileInt ("Global prefs", "FixedPitchFontSize", 9); Index: globalregistryoptions.cpp =================================================================== RCS file: /cvs/mushclient/globalregistryoptions.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -c -r1.18 -r1.19 *** globalregistryoptions.cpp 19 Jun 2008 07:15:55 -0000 1.18 --- globalregistryoptions.cpp 23 Jun 2008 06:27:54 -0000 1.19 *************** *** 14,20 **** static tGlobalConfigurationNumericOption GlobalOptionsTable [] = { // option in MUSHclient.h name in registry default ! { GLB_OPT (m_bAllTypingToCommandWindow ), "AllTypingToCommandWindow", 0 }, { GLB_OPT (m_bAlwaysOnTop ), "AlwaysOnTop", 0 }, { GLB_OPT (m_bAppendToLogFiles ), "AppendToLogFiles", 0 }, { GLB_OPT (m_bAutoConnectWorlds ), "AutoConnectWorlds", 1 }, --- 14,20 ---- static tGlobalConfigurationNumericOption GlobalOptionsTable [] = { // option in MUSHclient.h name in registry default ! { GLB_OPT (m_bAllTypingToCommandWindow ), "AllTypingToCommandWindow", 1 }, { GLB_OPT (m_bAlwaysOnTop ), "AlwaysOnTop", 0 }, { GLB_OPT (m_bAppendToLogFiles ), "AppendToLogFiles", 0 }, { GLB_OPT (m_bAutoConnectWorlds ), "AutoConnectWorlds", 1 }, *************** *** 40,46 **** { GLB_OPT (m_bOpenWorldsMaximised ), "OpenWorldsMaximised", 0 }, { GLB_OPT (m_iWindowTabsStyle ), "WindowTabsStyle", 0 }, { GLB_OPT (m_bReconnectOnLinkFailure ), "ReconnectOnLinkFailure", 0 }, ! { GLB_OPT (m_bRegexpMatchEmpty ), "RegexpMatchEmpty", 0 }, { GLB_OPT (m_bShowGridLinesInListViews ), "ShowGridLinesInListViews", 1 }, { GLB_OPT (m_bSmoothScrolling ), "SmoothScrolling", 0 }, { GLB_OPT (m_bSmootherScrolling ), "SmootherScrolling", 0 }, --- 40,46 ---- { GLB_OPT (m_bOpenWorldsMaximised ), "OpenWorldsMaximised", 0 }, { GLB_OPT (m_iWindowTabsStyle ), "WindowTabsStyle", 0 }, { GLB_OPT (m_bReconnectOnLinkFailure ), "ReconnectOnLinkFailure", 0 }, ! { GLB_OPT (m_bRegexpMatchEmpty ), "RegexpMatchEmpty", 1 }, { GLB_OPT (m_bShowGridLinesInListViews ), "ShowGridLinesInListViews", 1 }, { GLB_OPT (m_bSmoothScrolling ), "SmoothScrolling", 0 }, { GLB_OPT (m_bSmootherScrolling ), "SmootherScrolling", 0 }, Index: lua_methods.cpp =================================================================== RCS file: /cvs/mushclient/lua_methods.cpp,v retrieving revision 1.87 retrieving revision 1.88 diff -c -r1.87 -r1.88 *** lua_methods.cpp 21 Jun 2008 04:43:53 -0000 1.87 --- lua_methods.cpp 23 Jun 2008 06:27:54 -0000 1.88 *************** *** 4548,4553 **** --- 4548,4568 ---- return 1; // number of result fields } // end of L_SetTimerOption + //---------------------------------------- + // world.SetToolBarPosition + //---------------------------------------- + static int L_SetToolBarPosition (lua_State *L) + { + CMUSHclientDoc *pDoc = doc (L); + lua_pushnumber (L, pDoc->SetToolBarPosition ( + my_checknumber (L, 1), // Which + optboolean (L, 2, 0), // Float + my_checknumber (L, 3), // Side + my_checknumber (L, 4), // Top + my_checknumber (L, 5) // Left + )); + return 1; // number of result fields + } // end of L_SetToolBarPosition //---------------------------------------- // world.SetTriggerOption *************** *** 5195,5200 **** --- 5210,5216 ---- {"SetOutputFont", L_SetOutputFont}, {"SetStatus", L_SetStatus}, {"SetTimerOption", L_SetTimerOption}, + {"SetToolBarPosition", L_SetToolBarPosition}, {"SetTriggerOption", L_SetTriggerOption}, {"SetVariable", L_SetVariable}, {"SetWorldWindowStatus", L_SetWorldWindowStatus}, Index: mainfrm.h =================================================================== RCS file: /cvs/mushclient/mainfrm.h,v retrieving revision 1.32 retrieving revision 1.33 diff -c -r1.32 -r1.33 *** mainfrm.h 30 Jul 2007 00:06:52 -0000 1.32 --- mainfrm.h 23 Jun 2008 06:27:54 -0000 1.33 *************** *** 71,76 **** --- 71,79 ---- void DoFileOpen (void); void DoFixMenus(CCmdUI* pCmdUI); + void DockControlBarNextTo(CControlBar* pBar, + CControlBar* pTargetBar); + // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMainFrame) Index: methods.cpp =================================================================== RCS file: /cvs/mushclient/methods.cpp,v retrieving revision 1.214 retrieving revision 1.217 diff -c -r1.214 -r1.217 *** methods.cpp 21 Jun 2008 04:43:53 -0000 1.214 --- methods.cpp 23 Jun 2008 23:32:17 -0000 1.217 *************** *** 4131,4136 **** --- 4131,4137 ---- { 71, "Fixed Pitch Font" }, { 72, "MUSHclient version" }, { 73, "MUSHclient compilation date/time" }, + { 74, "Sounds directory" }, // (booleans - calculated at runtime) *************** *** 4338,4343 **** --- 4339,4345 ---- case 71: SetUpVariantString (vaResult, App.m_strFixedPitchFont); break; case 72: SetUpVariantString (vaResult, MUSHCLIENT_VERSION); break; case 73: SetUpVariantString (vaResult, __DATE__ " " __TIME__); break; + case 74: SetUpVariantString (vaResult, ExtractDirectory (App.m_strMUSHclientFileName) + "sounds\\"); break; case 101: SetUpVariantBool (vaResult, m_bNoEcho); break; case 102: SetUpVariantBool (vaResult, m_bDebugIncomingPackets); break; *************** *** 6701,6707 **** CString strFixedCommand = Command; ! ASSERT (m_CurrentPlugin == NULL); // look for scripting prefix if (!m_strScriptPrefix.IsEmpty () && // and we *have* a script prefix --- 6703,6711 ---- CString strFixedCommand = Command; ! // huh? ASSERT (m_CurrentPlugin == NULL); ! ! m_CurrentPlugin = NULL; // look for scripting prefix if (!m_strScriptPrefix.IsEmpty () && // and we *have* a script prefix *************** *** 11570,11576 **** // If not a fully-qualified path, prepend mushclient.exe directory followed by "sounds\" // Loop when finished if Loop is true // Play at volume 'Volume' (percent) - 0 is full volume, -100 is -100 db ! // (3 db each time halves the volume, so 97 would be half volume, and 94 would be quarter volume) // Pan at Pan -100 to +100 percent where -100 is fully left and +100 is fully right (and zero is centered) // If Buffer is nonzero, and FileName is "" then adjust the volume, pan and loop flag for an existing, playing, sound, if possible // If Buffer zero then try to take an unused buffer. If that fails, take a non-playing buffer. If that fails, take buffer 1 --- 11574,11580 ---- // If not a fully-qualified path, prepend mushclient.exe directory followed by "sounds\" // Loop when finished if Loop is true // Play at volume 'Volume' (percent) - 0 is full volume, -100 is -100 db ! // (3 db each time halves the volume, so -3 would be half volume, and -6 would be quarter volume) // Pan at Pan -100 to +100 percent where -100 is fully left and +100 is fully right (and zero is centered) // If Buffer is nonzero, and FileName is "" then adjust the volume, pan and loop flag for an existing, playing, sound, if possible // If Buffer zero then try to take an unused buffer. If that fails, take a non-playing buffer. If that fails, take buffer 1 *************** *** 11582,11592 **** --- 11586,11612 ---- long CMUSHclientDoc::PlaySound(short Buffer, LPCTSTR FileName, BOOL Loop, double Volume, double Pan) { + int i; // no sound object? can't do it if (!App.m_pDirectSoundObject || !App.m_pDirectSoundPrimaryBuffer) return eCannotPlaySound ; + // first release sound buffers for sounds that are not playing or are lost + for (i = 0; i < MAX_SOUND_BUFFERS; i++) + if (m_pDirectSoundSecondaryBuffer [i]) + { + DWORD iStatus; + if (SUCCEEDED (m_pDirectSoundSecondaryBuffer [i]->GetStatus (&iStatus)) && + (((iStatus & (DSBSTATUS_PLAYING | DSBSTATUS_LOOPING)) == 0) || + (iStatus & DSBSTATUS_BUFFERLOST ) ) ) + { + m_pDirectSoundSecondaryBuffer [i]->Release (); + m_pDirectSoundSecondaryBuffer [i] = NULL; + } + } + + // -------------------------- convert volume from percent into db * 100 ---------------------------- // Force volume into range *************** *** 11642,11649 **** if (Buffer == 0) { ! int i; ! for (i = 0; i < MAX_SOUND_BUFFERS; i++) if (m_pDirectSoundSecondaryBuffer [i] == NULL) { Buffer = i + 1; --- 11662,11668 ---- if (Buffer == 0) { ! for (i = 0; i < (MAX_SOUND_BUFFERS / 2); i++) if (m_pDirectSoundSecondaryBuffer [i] == NULL) { Buffer = i + 1; *************** *** 11651,11674 **** } // end of found an unused slot } // end of no buffer specifed - - // no free buffers, but is there one that is not playing right now? - if (Buffer == 0) - { - int i; - for (i = 0; i < MAX_SOUND_BUFFERS; i++) - if (m_pDirectSoundSecondaryBuffer [i]) - { - DWORD iStatus; - if (SUCCEEDED (m_pDirectSoundSecondaryBuffer [i]->GetStatus (&iStatus)) && - (iStatus & DSBSTATUS_PLAYING) == 0) - { - Buffer = i + 1; // this one will do - break; - } - } // end of found a used slot - } // end of no buffer specifed - // no free buffers? re-use buffer #1 if (Buffer == 0) Buffer = 1; --- 11670,11675 ---- *************** *** 11773,11779 **** DWORD dwWriteBytes2 ; DSBUFFERDESC bd ; ! // At this point we have succedded in finding the data for the WAV file so // we need to create a DirectSoundBuffer // Set up bd structure for a static secondary buffer. bd.dwSize = sizeof( bd ) ; --- 11774,11780 ---- DWORD dwWriteBytes2 ; DSBUFFERDESC bd ; ! // At this point we have succeeded in finding the data for the WAV file so // we need to create a DirectSoundBuffer // Set up bd structure for a static secondary buffer. bd.dwSize = sizeof( bd ) ; *************** *** 11866,11873 **** if (Buffer == 0) { // stop sounds playing, release sound buffers ! int i; ! for (i = 0; i < MAX_SOUND_BUFFERS; i++) if (m_pDirectSoundSecondaryBuffer [i]) { DWORD iStatus; --- 11867,11873 ---- if (Buffer == 0) { // stop sounds playing, release sound buffers ! for (int i = 0; i < MAX_SOUND_BUFFERS; i++) if (m_pDirectSoundSecondaryBuffer [i]) { DWORD iStatus; *************** *** 11937,11943 **** if (iStatus & DSBSTATUS_PLAYING) return 1; ! if (iStatus & DSBSTATUS_LOOPING ) return 2; return 0; // not playing --- 11937,11943 ---- if (iStatus & DSBSTATUS_PLAYING) return 1; ! if (iStatus & DSBSTATUS_LOOPING) return 2; return 0; // not playing *************** *** 11949,11960 **** if (Height < 0) return eBadParameter; ! CChildFrame * pFrame; ! if (m_pActiveCommandView) ! pFrame = m_pActiveCommandView->m_owner_frame; ! else ! pFrame = m_pActiveOutputView->m_owner_frame; CRect rectInside; pFrame->m_wndSplitter.GetClientRect(rectInside); --- 11949,11973 ---- if (Height < 0) return eBadParameter; ! CChildFrame * pFrame = NULL; ! // find the child frame ! for(POSITION pos=GetFirstViewPosition();pos!=NULL;) ! { ! CView* pView = GetNextView(pos); ! ! if (pView->IsKindOf(RUNTIME_CLASS(CSendView))) ! { ! CSendView* pmyView = (CSendView*)pView; ! ! pFrame = pmyView->m_owner_frame; ! break; ! } // end of being a CSendView ! } ! ! // fail if we can't find one ! if (pFrame == NULL) ! return eBadParameter; CRect rectInside; pFrame->m_wndSplitter.GetClientRect(rectInside); *************** *** 11987,11993 **** --- 12000,12060 ---- return eOK; } + long CMUSHclientDoc::SetToolBarPosition(short Which, BOOL Float, short Side, long Top, long Left) + { + CToolBar * pToolBar = NULL; + + Frame.RecalcLayout(TRUE); + + switch (Which) + { + case 1: pToolBar = &Frame.m_wndToolBar; break; // main toolbar + case 2: pToolBar = &Frame.m_wndGameToolBar; break; // world toolbar + case 3: pToolBar = &Frame.m_wndActivityToolBar; break; // activity toolbar + case 4: pToolBar = (CToolBar *) &Frame.m_wndInfoBar; break; // info toolbar + default: return eBadParameter; + } // end of switch + + if (!pToolBar || !pToolBar->m_hWnd) + return eBadParameter; // oops - no window + + CRect rectBar; + pToolBar->GetWindowRect(&rectBar); + if (Float) + { + DWORD dwStyle; + CPoint point (Left, Top); + Frame.ClientToScreen (&point); + switch (Side) + { + case 1: dwStyle = CBRS_ALIGN_TOP ; break; + case 3: dwStyle = CBRS_ALIGN_LEFT; break; + default: return eBadParameter; + } + Frame.FloatControlBar (pToolBar, point, dwStyle); + } + else + { + UINT nDockBarID; + CRect rect (Left, Top, Left + rectBar.right - rectBar.left, Top + rectBar.bottom - rectBar.top); + Frame.ClientToScreen (rect); + switch (Side) + { + case 0: break; // zero is OK + case 1: nDockBarID = AFX_IDW_DOCKBAR_TOP; break; + case 2: nDockBarID = AFX_IDW_DOCKBAR_BOTTOM; break; + case 3: nDockBarID = AFX_IDW_DOCKBAR_LEFT; break; + case 4: nDockBarID = AFX_IDW_DOCKBAR_RIGHT; break; + default: return eBadParameter; + } + Frame.DockControlBar (pToolBar, nDockBarID, rect); + } + + return eOK; + } + + /* ====================================================================== Index: mushclient.clw =================================================================== RCS file: /cvs/mushclient/mushclient.clw,v retrieving revision 1.340 retrieving revision 1.342 diff -c -r1.340 -r1.342 Index: mushclient.cnt =================================================================== RCS file: /cvs/mushclient/mushclient.cnt,v retrieving revision 1.34 retrieving revision 1.35 diff -c -r1.34 -r1.35 *** mushclient.cnt 21 Jun 2008 04:43:53 -0000 1.34 --- mushclient.cnt 23 Jun 2008 06:27:54 -0000 1.35 *************** *** 251,256 **** --- 251,257 ---- 3 DoAfterNote=FNC_DoAfterNote 3 DoAfterSpecial=FNC_DoAfterSpecial 3 DoAfterSpeedWalk=FNC_DoAfterSpeedWalk + 3 DockToolBarNextTo=FNC_DockToolBarNextTo 3 DoCommand=FNC_DoCommand 3 EchoInput=FNC_EchoInput 3 EditDistance=FNC_EditDistance *************** *** 456,461 **** --- 457,463 ---- 3 SetOutputFont=FNC_SetOutputFont 3 SetStatus=FNC_SetStatus 3 SetTimerOption=FNC_SetTimerOption + 3 SetToolBarPosition=FNC_SetToolBarPosition 3 SetTriggerOption=FNC_SetTriggerOption 3 SetVariable=FNC_SetVariable 3 SetWorldWindowStatus=FNC_SetWorldWindowStatus Index: mushclient.hlp =================================================================== RCS file: /cvs/mushclient/mushclient.hlp,v retrieving revision 1.94 retrieving revision 1.95 diff -c -r1.94 -r1.95 Binary files /tmp/cvsyvXQtf and /tmp/cvs8hH6P8 differ Index: mushclient.odl =================================================================== RCS file: /cvs/mushclient/mushclient.odl,v retrieving revision 1.113 retrieving revision 1.114 diff -c -r1.113 -r1.114 *** mushclient.odl 21 Jun 2008 04:44:03 -0000 1.113 --- mushclient.odl 23 Jun 2008 06:27:54 -0000 1.114 *************** *** 70,83 **** [id(44)] long SetCommand(BSTR Message); [id(45)] BSTR GetNotes(); [id(46)] void SetNotes(BSTR Message); ! [id(323), propget] long NormalColour(short WhichColour); ! [id(323), propput] void NormalColour(short WhichColour, long nNewValue); ! [id(324), propget] long BoldColour(short WhichColour); ! [id(324), propput] void BoldColour(short WhichColour, long nNewValue); ! [id(325), propget] long CustomColourText(short WhichColour); ! [id(325), propput] void CustomColourText(short WhichColour, long nNewValue); ! [id(326), propget] long CustomColourBackground(short WhichColour); ! [id(326), propput] void CustomColourBackground(short WhichColour, long nNewValue); [id(47)] void Redraw(); [id(48)] long ResetTimer(BSTR TimerName); [id(49)] void SetOutputFont(BSTR FontName, short PointSize); --- 70,83 ---- [id(44)] long SetCommand(BSTR Message); [id(45)] BSTR GetNotes(); [id(46)] void SetNotes(BSTR Message); ! [id(324), propget] long NormalColour(short WhichColour); ! [id(324), propput] void NormalColour(short WhichColour, long nNewValue); ! [id(325), propget] long BoldColour(short WhichColour); ! [id(325), propput] void BoldColour(short WhichColour, long nNewValue); ! [id(326), propget] long CustomColourText(short WhichColour); ! [id(326), propput] void CustomColourText(short WhichColour, long nNewValue); ! [id(327), propget] long CustomColourBackground(short WhichColour); ! [id(327), propput] void CustomColourBackground(short WhichColour, long nNewValue); [id(47)] void Redraw(); [id(48)] long ResetTimer(BSTR TimerName); [id(49)] void SetOutputFont(BSTR FontName, short PointSize); *************** *** 354,359 **** --- 354,360 ---- [id(320)] long GetSoundStatus(short Buffer); [id(321)] long PlaySound(short Buffer, BSTR FileName, BOOL Loop, double Volume, double Pan); [id(322)] long SetCommandWindowHeight(short Height); + [id(323)] long SetToolBarPosition(short Which, BOOL Float, short Side, long Top, long Left); //}}AFX_ODL_METHOD }; Index: mushview.cpp =================================================================== RCS file: /cvs/mushclient/mushview.cpp,v retrieving revision 1.90 retrieving revision 1.91 diff -c -r1.90 -r1.91 *** mushview.cpp 19 Jun 2008 07:15:55 -0000 1.90 --- mushview.cpp 23 Jun 2008 23:32:29 -0000 1.91 *************** *** 1892,1898 **** return; ! } int CMUSHView::mouse_still_down (void) --- 1892,1898 ---- return; ! } // end CMUSHView::OnMouseMove int CMUSHView::mouse_still_down (void) Index: prefspropertypages.cpp =================================================================== RCS file: /cvs/mushclient/prefspropertypages.cpp,v retrieving revision 1.107 retrieving revision 1.108 diff -c -r1.107 -r1.108 *** prefspropertypages.cpp 21 Jun 2008 04:44:03 -0000 1.107 --- prefspropertypages.cpp 22 Jun 2008 04:59:25 -0000 1.108 *************** *** 6274,6283 **** Replace (timer_item->strContents, ENDLINE, "\\n", true)); m_ctlTimerList.SetItemText (nItem, eColumnLabel, timer_item->strLabel); m_ctlTimerList.SetItemText (nItem, eColumnGroup, timer_item->strGroup); ! m_ctlTimerList.SetItemText (nItem, eColumnNext, CFormat ("%02i:%02i:%02i", ! timer_item->tFireTime.GetHour (), ! timer_item->tFireTime.GetMinute (), ! timer_item->tFireTime.GetSecond ())); return nItem; --- 6274,6303 ---- Replace (timer_item->strContents, ENDLINE, "\\n", true)); m_ctlTimerList.SetItemText (nItem, eColumnLabel, timer_item->strLabel); m_ctlTimerList.SetItemText (nItem, eColumnGroup, timer_item->strGroup); ! ! ! CString strDuration; ! CmcDateTime tDue = CmcDateTime (timer_item->tFireTime.GetTime ()); ! CmcDateTime tNow = CmcDateTime::GetTimeNow (); ! CmcDateTimeSpan ts = tDue - tNow; ! ! if (tDue < tNow) ! strDuration = "-"; ! else ! { ! if (floor (ts.GetTotalDays ()) > 0) ! strDuration = CFormat ("%.f d", floor (ts.GetTotalDays ())); ! else ! if (floor (ts.GetTotalHours ()) > 0) ! strDuration = CFormat ("%.f h", floor (ts.GetTotalHours ())); ! else ! if (floor (ts.GetTotalMinutes ()) > 0) ! strDuration = CFormat ("%.f m", floor (ts.GetTotalMinutes ())); ! else ! strDuration = CFormat ("%.f s", floor (ts.GetTotalSeconds ())); ! } // not time passed ! ! m_ctlTimerList.SetItemText (nItem, eColumnNext, strDuration); return nItem; Index: resource.h =================================================================== RCS file: /cvs/mushclient/resource.h,v retrieving revision 1.129 retrieving revision 1.130 diff -c -r1.129 -r1.130 *** resource.h 11 Jun 2008 01:13:04 -0000 1.129 --- resource.h 23 Jun 2008 06:27:54 -0000 1.130 *************** *** 1562,1568 **** #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 ! #define _APS_NEXT_RESOURCE_VALUE 350 #define _APS_NEXT_COMMAND_VALUE 33054 #define _APS_NEXT_CONTROL_VALUE 2897 #define _APS_NEXT_SYMED_VALUE 312 --- 1562,1568 ---- #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 ! #define _APS_NEXT_RESOURCE_VALUE 351 #define _APS_NEXT_COMMAND_VALUE 33054 #define _APS_NEXT_CONTROL_VALUE 2897 #define _APS_NEXT_SYMED_VALUE 312 Index: scriptingoptions.cpp =================================================================== RCS file: /cvs/mushclient/scriptingoptions.cpp,v retrieving revision 1.53 retrieving revision 1.54 diff -c -r1.53 -r1.54 *** scriptingoptions.cpp 11 Jun 2008 01:13:04 -0000 1.53 --- scriptingoptions.cpp 22 Jun 2008 04:59:25 -0000 1.54 *************** *** 52,58 **** {"auto_allow_snooping", false, O(m_bAutoAllowSnooping)}, {"auto_copy_to_clipboard_in_html", false, O(m_bAutoCopyInHTML)}, {"auto_pause", true, O(m_bAutoFreeze)}, ! {"auto_repeat", false, O(m_bAutoRepeat)}, {"auto_wrap_window_width", false, O(m_bAutoWrapWindowWidth)}, {"carriage_return_clears_line", false, O(m_bCarriageReturnClearsLine)}, {"chat_foreground_colour", RGB (255, 0, 0), O(m_cChatForegroundColour), 0, 0xFFFFFF, OPT_RGB_COLOUR }, --- 52,59 ---- {"auto_allow_snooping", false, O(m_bAutoAllowSnooping)}, {"auto_copy_to_clipboard_in_html", false, O(m_bAutoCopyInHTML)}, {"auto_pause", true, O(m_bAutoFreeze)}, ! {"auto_repeat", false, O(m_bAutoRepeat)}, ! {"auto_resize_command_window", false, O(m_bAutoResizeCommandWindow)}, {"auto_wrap_window_width", false, O(m_bAutoWrapWindowWidth)}, {"carriage_return_clears_line", false, O(m_bCarriageReturnClearsLine)}, {"chat_foreground_colour", RGB (255, 0, 0), O(m_cChatForegroundColour), 0, 0xFFFFFF, OPT_RGB_COLOUR }, Index: sendvw.cpp =================================================================== RCS file: /cvs/mushclient/sendvw.cpp,v retrieving revision 1.84 retrieving revision 1.85 diff -c -r1.84 -r1.85 *** sendvw.cpp 19 Jun 2008 07:15:55 -0000 1.84 --- sendvw.cpp 22 Jun 2008 04:59:25 -0000 1.85 *************** *** 378,387 **** pDoc->ShowStatusLine (); pDoc->m_iCurrentActionSource = eUnknownActionSource; } // end of return key ! else ! CEditView::OnChar(nChar, nRepCnt, nFlags); } --- 378,389 ---- pDoc->ShowStatusLine (); pDoc->m_iCurrentActionSource = eUnknownActionSource; + return; } // end of return key ! ! ! CEditView::OnChar(nChar, nRepCnt, nFlags); } *************** *** 580,591 **** --- 582,596 ---- void CSendView::SetCommand (LPCTSTR str) { + // TRACE1 ("SetCommand = %s\n", str); GetEditCtrl().SetWindowText (str); int len = GetWindowTextLength (); GetEditCtrl().SetSel (len, len); m_bChanged = FALSE; + AdjustCommandWindowSize (); + } void CSendView::SendCommand (const CString strOriginalCommand, *************** *** 1208,1213 **** --- 1213,1219 ---- void CSendView::OnChange() { m_bChanged = true; + AdjustCommandWindowSize (); } void CSendView::OnInitialUpdate() *************** *** 1230,1235 **** --- 1236,1243 ---- m_backbr = new CBrush (pDoc->m_input_background_colour); m_backcolour = pDoc->m_input_background_colour; + // if they want auto-command size, put back to 1 + AdjustCommandWindowSize (); } void CSendView::OnContextMenu(CWnd*, CPoint point) *************** *** 1773,1779 **** } // end of WM_KEYDOWN && m_bF1macro ! return CEditView::PreTranslateMessage(pMsg); } void CSendView::OnRepeatLastCommand() --- 1781,1788 ---- } // end of WM_KEYDOWN && m_bF1macro ! return CEditView::PreTranslateMessage(pMsg); ! } void CSendView::OnRepeatLastCommand() *************** *** 2026,2033 **** if (pDoc->m_bLowerCaseTabCompletion) sReplacement.MakeLower (); - sReplacement += " "; // add a space - CPlugin * pSavedPlugin = pDoc->m_CurrentPlugin; // tell each plugin what we are doing --- 2035,2040 ---- *************** *** 2079,2084 **** --- 2086,2094 ---- int nEndChar; CString strCurrent; + //save old config + bool old_bTabCompletionSpace = pDoc->m_bTabCompletionSpace; + // find where cursor is GetEditCtrl().GetSel(nStartChar, nEndChar); *************** *** 2103,2115 **** { unsigned char c = strCurrent [nEndChar]; // what is the next character? if (!isspace (c) && strchr (App.m_strWordDelimiters, c) == NULL) ! return; } // ignore if at start of line if (nEndChar <= 0) return; // search backwards for another delimiter for (nStartChar = nEndChar - 1; nStartChar >= 0; nStartChar--) --- 2113,2128 ---- { unsigned char c = strCurrent [nEndChar]; // what is the next character? if (!isspace (c) && strchr (App.m_strWordDelimiters, c) == NULL) ! pDoc->m_bTabCompletionSpace = true; } // ignore if at start of line if (nEndChar <= 0) + { + pDoc->m_bTabCompletionSpace = old_bTabCompletionSpace; return; + } // search backwards for another delimiter for (nStartChar = nEndChar - 1; nStartChar >= 0; nStartChar--) *************** *** 2126,2132 **** --- 2139,2148 ---- // ignore if left of cursor is a delimiter too if (nStartChar == nEndChar) + { + pDoc->m_bTabCompletionSpace = old_bTabCompletionSpace; return; + } CString sWord = strCurrent.Mid (nStartChar, nEndChar - nStartChar); *************** *** 2138,2144 **** --- 2154,2164 ---- if (TabCompleteOneLine (pDoc, nStartChar, nEndChar, sWord, pDoc->m_strTabCompletionDefaults)) + { + pDoc->m_bTabCompletionSpace = old_bTabCompletionSpace; return; // found it - ignore output buffer + } + // search for that word in the output buffer *************** *** 2152,2160 **** if (++iCount > pDoc->m_iTabCompletionLines) break; // hit line limit if (TabCompleteOneLine (pDoc, nStartChar, nEndChar, sWord, strLine)) ! return; // stop when we succeed } // end of scanning each line } --- 2172,2185 ---- if (++iCount > pDoc->m_iTabCompletionLines) break; // hit line limit if (TabCompleteOneLine (pDoc, nStartChar, nEndChar, sWord, strLine)) ! { ! pDoc->m_bTabCompletionSpace = old_bTabCompletionSpace; ! return; // stop when we succeed ! } } // end of scanning each line + pDoc->m_bTabCompletionSpace = old_bTabCompletionSpace; + return; } *************** *** 2787,2789 **** --- 2812,2837 ---- } else CEditView::OnSysCommand(nID, lParam); } + + + void CSendView::AdjustCommandWindowSize (void) + { + CMUSHclientDoc* pDoc = GetDocument(); + ASSERT_VALID(pDoc); + + // do nothing if not wanted + if (!pDoc->m_bAutoResizeCommandWindow) + return; + + // find how many lines in command window + int iLines = GetEditCtrl().GetLineCount (); + + // if very large, let them manage it + if (iLines > 20) + return; + + // resize - seem to need an extra 4 pixels or things go a bit strange + pDoc->SetCommandWindowHeight (pDoc->m_InputFontHeight * iLines + 4); + + } + Index: sendvw.h =================================================================== RCS file: /cvs/mushclient/sendvw.h,v retrieving revision 1.30 retrieving revision 1.31 diff -c -r1.30 -r1.31 *** sendvw.h 24 Dec 2007 01:18:05 -0000 1.30 --- sendvw.h 22 Jun 2008 04:59:25 -0000 1.31 *************** *** 75,80 **** --- 75,82 ---- void AddToCommandHistory (const CString & strCommand); + void AdjustCommandWindowSize (void); + // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSendView) Index: install/readme.txt =================================================================== RCS file: /cvs/mushclient/install/readme.txt,v retrieving revision 1.168 retrieving revision 1.170 diff -c -r1.168 -r1.170 *** install/readme.txt 21 Jun 2008 04:44:03 -0000 1.168 --- install/readme.txt 23 Jun 2008 23:32:29 -0000 1.170 *************** *** 1,7 **** ! MUSHclient version 4.28 ======================= ! Saturday, 21st June 2008 Author: Nick Gammon Web support: http://www.gammon.com.au/forum/ --- 1,7 ---- ! MUSHclient version 4.29 ======================= ! Tuesday, 24th June 2008 Author: Nick Gammon Web support: http://www.gammon.com.au/forum/