Update of /cvsroot/netrek/client/netrekxp/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2251/src

Modified Files:
	bccnetrek.rc check.c cowmain.c data.c death.c defaults.c 
	defwin.c distress.c dmessage.c docwin.c feature.c findslot.c 
	getname.c helpwin.c hintwin.c input.c local.c main.c makefile 
	map.c mswindow.c newwin.c option.c parsemeta.c ping.c 
	playback.c playerlist.c redraw.c reserved.c senddist.c short.c 
	smessage.c socket.c sound.c stampver.inf udpopt.c winmain.c 
	winsndlib.c 
Log Message:
This large patch brings the client up to Stas's version 4.4.0.4.  The visible changes to the user are:
- added "allowWheelActions: (on)/off" to be able to disable wheel in non-scrolling windows
- added new window "player2" that behaves exactly as player list window, but allows to
  select alternate custom layout and could be toggled with 'A' key
- added "playerList2: (string)" option that allows to select different player list layout
  for alternate player list window, by default it will be "n T R N l M K W L r O D d "
- fixed bug that caused main thread to continue in case player died while scrolling
  message window using scrollbar (which forced him close client window and reconnect)
- fixed incorrect behavior of 'windowMove: off' feature. Previously window would snap
  back to wrong place if the main window top-left corner was not (0,0) coordinates
- long lines are now wrapped by words instead of by chars. Maximum message length was
  reduced to 4 full message lines (4 * 69 characters)
- message input window will now show Sender->Recipient even when the input line is longer
  than 69 characters
- changed 'Forum' URL on metaserver window to open Google's r.g.n location

There are also several internal changes, such as a new format for error messages.

Index: findslot.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/findslot.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- findslot.c	21 Jan 2003 21:28:41 -0000	1.1.1.1
+++ findslot.c	21 Apr 2006 12:00:06 -0000	1.2
@@ -99,9 +99,6 @@
 findslot (void)
 {
     int oldcount = -1;
-    W_Window waitWin, qwin, countWin, motdButtonWin;
-
-    W_Window motdWin;
     extern int MaxMotdLine;
     int WaitMotdLine = 0;
     int showMotd = booleanDefault ("showMotd", 1);
@@ -119,7 +116,7 @@
             Exit_Sound ();
 #endif
 
-            printf ("Shit!  Ghostbusted!\n");
+            LineToConsole ("Shit!  Ghostbusted!\n");
             terminate (0);
         }
         readFromServer (NULL);
@@ -165,7 +162,7 @@
             Exit_Sound ();
 #endif
 
-            printf ("Damn, We've been ghostbusted!\n");
+            LineToConsole ("Damn, We've been ghostbusted!\n");
             terminate (0);
         }
         while (W_EventsPending ())
@@ -224,7 +221,7 @@
                     Exit_Sound ();
 #endif
 
-                    printf ("OK, bye!\n");
+                    LineToConsole ("OK, bye!\n");
                     terminate (0);
                 }
                 break;

Index: smessage.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/smessage.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- smessage.c	12 Apr 2006 04:20:04 -0000	1.2
+++ smessage.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -22,16 +22,17 @@
 
 static int lcount;
 static int HUDoffset;
-static char buf[1024];
+static char buf[MAX_MLENGTH];
 static char cursor = '_';
 static char mbuf[80];
 
+
 /* Routines to handle multi-window messaging */
 void
 DisplayMessage ()
 {
     int length;
-    int offset = 0;
+    char tmp[1024];
 
     length = strlen (outmessage);
 
@@ -42,21 +43,22 @@
 
     if (length > 80)
     {
-        offset = length - 80;
+        strncpy (tmp, outmessage, 10);
+        tmp[10] = '\0';         // have to null terminate, because strncpy doesn't
+        strncat (tmp, outmessage + length - 70, 80);
         length = 80;
     }
+    else
+        strcpy (tmp, outmessage);
 
 #ifdef XTRA_MESSAGE_UI
     if (HUDoffset)
-        W_WriteText (w, 5, HUDoffset, textColor,
-                     outmessage + offset, length, W_RegularFont);
+        W_WriteText (w, 5, HUDoffset, textColor, tmp, length, W_RegularFont);
 #endif
-    W_WriteText (messagew, 5, 5, textColor,
-                 outmessage + offset, length, W_RegularFont);
-
-    printf ("length: %d, offset %d\n", length, offset);
+    W_WriteText (messagew, 5, 5, textColor, tmp, length, W_RegularFont);
 }
 
+
 void
 AddChar (char *twochar)
 {
@@ -74,6 +76,7 @@
                  twochar, 2, W_RegularFont);
 }
 
+
 void
 BlankChar (int HUDoffsetcol,
            int len)
@@ -90,6 +93,7 @@
                  W_Textwidth * (len), W_Textheight);
 }
 
+
 void
 DrawCursor (int col)
 {
@@ -202,7 +206,7 @@
         mdisplayed = 0;
         messpend = 0;
         message_off ();
-        for (i = 0; i < 1024; i++)
+        for (i = 0; i < MAX_MLENGTH; i++)
         {
             outmessage[i] = '\0';
         }
@@ -224,7 +228,7 @@
         if (strlen (clipString) == 0)
             break;
 
-        if (lcount + strlen (clipString) >= 1024)
+        if (lcount + strlen (clipString) >= MAX_MLENGTH)
         {
             W_Beep ();
             warning ("Clipboard text is too long to fit");
@@ -254,7 +258,7 @@
     case '\r':                 /* send message */
         buf[lcount - ADDRLEN] = '\0';
         messpend = 0;
-        for (i = 0; i < 1024; i++)
+        for (i = 0; i < MAX_MLENGTH; i++)
         {
             outmessage[i] = '\0';
         }
@@ -347,7 +351,7 @@
         break;
 
     default:                   /* add character */
-        if (lcount >= 1024)
+        if (lcount >= MAX_MLENGTH)
         {
             W_Beep ();
             break;
@@ -364,55 +368,112 @@
     }
 }
 
-// SRS - should look at using proper variable types here
+
+void
+send_pmessage (char *str,
+               short recip,
+               short group)
+{
+    char newbuf[100];
+    char * cstr;
+
+    /* message length failsafe and last message saving - jn 6/17/93 */
+    lastMessage[0] = '\0';
+    strncat (lastMessage, str, 69);
+    cstr = lastMessage;
+
+    switch (group)
+    {
+
+#ifdef TOOLS
+    case MTOOLS:
+        sendTools (cstr);
+        break;
+#endif
+
+    case MMOO:
+        strcpy (defaultsFile, cstr);
+        sprintf (mbuf, "changing defaultsFile to %s", cstr);
+        warning (mbuf);
+        break;
+    default:
+        sendMessage (cstr, group, recip);
+    }
+
+    if ((group == MTEAM && recip != me->p_team) ||
+        (group == MINDIV && recip != me->p_no))
+    {
+        sprintf (newbuf, "%s  %s", getaddr2 (group, recip), cstr);
+        newbuf[79] = 0;
+        dmessage (newbuf, (unsigned char) group, (unsigned char) me->p_no,
+                 (unsigned char) recip);
+    }
+}
+
+
+void
 pmessage (char *str,
           short recip,
           short group)
 {
-    char newbuf[100];
-    char * cstr;
-    int length;
+    char * str1;    /* temporary string 1 */
+    char * str2;    /* temporary string 2 */
+    char buf[100];  /* temporary buffer */
     int i = 0;
 
-    length = strlen (str);
+    str1 = str;     /* save original string pointer */
 
-    do
+    while (strlen (str1) > 0)
     {
-        /* message length failsafe and last message saving - jn 6/17/93 */
-        lastMessage[0] = '\0';
-        strncat (lastMessage, str + i, 69);
-        cstr = lastMessage;
-
-        switch (group)
+        if (strlen (str1) > 69)
         {
+            if (str1[69] == ' ')
+            {
+                /* We're lucky to fall on space as next character */
+                strncpy (buf, str1, 69);
+                buf[69] = 0;
+                send_pmessage (buf, recip, group);
+                str1 += 69 + 1; /* skip the space */
+            }
+            else
+            {
+                /* Have to search for first occurence of ' ' from the end
+                   of the string */
 
-#ifdef TOOLS
-        case MTOOLS:
-            sendTools (cstr);
-            break;
-#endif
+                str2 = str1 + 69;
 
-        case MMOO:
-            strcpy (defaultsFile, cstr);
-            sprintf (mbuf, "changing defaultsFile to %s", cstr);
-            warning (mbuf);
-            break;
-        default:
-            sendMessage (cstr, group, recip);
-        }
+                while (str2[0] != ' ' && str2 != str1)
+                    str2--;
 
-        if ((group == MTEAM && recip != me->p_team) ||
-            (group == MINDIV && recip != me->p_no))
+                if (str2 == str1)
+                {
+                    /* Well, we should send the whole string because
+                       we have no spaces here */
+                    strncpy (buf, str1, 69);
+                    buf[69] = 0;
+                    send_pmessage (buf, recip, group);
+                    str1 += 69;
+                }
+                else
+                {
+                    /* Let's send just the part until space */
+                    strncpy (buf, str1, str2 - str1);
+                    buf[str2 - str1] = 0;
+                    send_pmessage (buf, recip, group);
+                    str1 += (str2 - str1) + 1;  /* skip space */
+                }
+            }
+        }
+        else
         {
-            sprintf (newbuf, "%s  %s", getaddr2 (group, recip), cstr);
-            newbuf[79] = 0;
-            dmessage (newbuf, (unsigned char) group, (unsigned char) me->p_no,
-                     (unsigned char) recip);
+            /* Just output everything as is */
+            strcpy (buf, str1);
+            buf[strlen (str1)] = 0;
+            send_pmessage (buf, recip, group);
+            str1 += strlen (str1);
         }
 
-        i += 69;
-
-    } while (i < length);
+    }
 
     message_off ();
 }
@@ -530,7 +591,7 @@
         }
         else
         {
-            /* printf("smessage:getaddr2 recip=%d\n",recip); */
+            /* LineToConsole ("smessage:getaddr2 recip=%d\n",recip); */
             (void) sprintf (&addrmesg[5], "%c%c ",
                             teamlet[players[recip].p_team], shipnos[recip]);
         }
@@ -553,6 +614,8 @@
     return (addrmesg);
 }
 
+
+void
 message_on (void)
 {
     messageon = 1;
@@ -565,6 +628,8 @@
 #endif
 }
 
+
+void
 message_off (void)
 {
     messageon = 0;
@@ -572,7 +637,9 @@
     W_DefineMapcursor (mapw);
 }
 
+
 #ifdef XTRA_MESSAGE_UI
+void
 message_hold (void)
 {
     //char twochar[2] = { '#', ' ' };
@@ -581,6 +648,7 @@
 }
 #endif
 
+
 /* Used in NEWMACRO, useful elsewhere also */
 int
 getgroup (char addr,
@@ -685,6 +753,7 @@
 }
 
 
+void
 pnbtmacro (int c)
 {
     switch (macro[c].who)

Index: bccnetrek.rc
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/bccnetrek.rc,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- bccnetrek.rc	20 Apr 2006 06:13:50 -0000	1.3
+++ bccnetrek.rc	21 Apr 2006 12:00:06 -0000	1.4
@@ -1,8 +1,8 @@
 #include "resource.h"
 
 1 VERSIONINFO
-FILEVERSION 4, 4, 0, 1
-PRODUCTVERSION 4, 4, 0, 1
+FILEVERSION 4, 4, 0, 4
+PRODUCTVERSION 4, 4, 0, 4
 FILEOS VOS_DOS_WINDOWS32
 FILETYPE VFT_APP
 { BLOCK "StringFileInfo" 

Index: hintwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/hintwin.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- hintwin.c	14 Apr 2006 12:24:00 -0000	1.2
+++ hintwin.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -1,15 +1,10 @@
 /******************************************************************************/
 /***  File:  hintwin.c                                                      ***/
 /***                                                                        ***/
-/***  Function:                                                             ***/
-/***  hintwin.c copyright 2003 Stas Pirogov Free to use, hack, etc. Just keep
-/***  these credits here. Use of this code may be dangerous to your health
-/***  and/or system. Its use is at your own risk. I assume no responsibility for
-/***  damages, real, potential, or imagined, resulting  from the use of it.
-/***  
+/***  Function: set of hint window manipulation functions                   ***/
+/***                                                                        ***/
 /******************************************************************************/
 
-
 #include <stdio.h>
 #include <signal.h>
 #include <sys/types.h>

Index: winmain.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/winmain.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- winmain.c	12 Apr 2006 04:20:04 -0000	1.2
+++ winmain.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -152,13 +152,12 @@
     //Kick winsock into gear
     if (WSAStartup (MAKEWORD (1, 1), &data) != 0)
     {
-        fprintf (stderr,
-                 "Could not find WINSOCK.DLL / WINSOCK initializtion failed\n");
+        LineToConsole ("Could not find WINSOCK.DLL / WINSOCK initializtion failed\n");
         return -1;
     }
     if (data.wVersion < MAKEWORD (1, 1))
     {
-        fprintf (stderr, "Bad WINSOCK.DLL version (need at least v1.1).\n");
+        LineToConsole ("Bad WINSOCK.DLL version (need at least v1.1).\n");
         WSACleanup ();
         return -1;
     }
@@ -264,7 +263,7 @@
 void
 perror (const char *str)
 {
-    printf ("%s: errno = %d, WSALast = %d\n", str, errno, WSAGetLastError ());
+    LineToConsole ("%s: errno = %d, WSALast = %d\n", str, errno, WSAGetLastError ());
 }
 
 
@@ -289,27 +288,27 @@
     if (timeout)
     {
         ms = (timeout->tv_sec << 10) + (timeout->tv_usec >> 10);
-        printf ("sec = %d, usec = %d\n", timeout->tv_sec, timeout->tv_usec);
+        LineToConsole ("sec = %d, usec = %d\n", timeout->tv_sec, timeout->tv_usec);
     }
     else
         ms = INFINITE;
 
-    printf ("ms=%d, ", ms);
+    LineToConsole ("ms=%d, ", ms);
 
     /* Scan through the array, copying and looking for W_Socket */
     for (i = j = 0; i < readfds->fd_count; i++)
     {
         if (readfds->fd_array[i] != W_SOCKET)
         {
-            printf ("handle %d, sock=%d\n", readfds->fd_array[i], sock);
+            LineToConsole ("handle %d, sock=%d\n", readfds->fd_array[i], sock);
             handles[j++] = readfds->fd_array[i];
         }
         else
             wsocket_present = 1;
     }
 
-    printf ("handles=%d, handle[0]=%d, wsocket=%d\n", j, handles[0],
-            wsocket_present);
+    LineToConsole ("handles=%d, handle[0]=%d, wsocket=%d\n", j, handles[0],
+                    wsocket_present);
 
     readfds->fd_count = 1;
 
@@ -335,7 +334,7 @@
 
     if (got == WAIT_TIMEOUT)
     {
-        printf ("Timeout\n");
+        LineToConsole ("Timeout\n");
         readfds->fd_count = 0;  // clear
         return 0;
     }
@@ -343,7 +342,7 @@
     readfds->fd_array[0] = handles[got - WAIT_OBJECT_0];
     return 1;
 
-    printf ("Success! Returned %d\n", got);
+    LineToConsole ("Success! Returned %d\n", got);
 }
 #endif
 

Index: defaults.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/defaults.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- defaults.c	19 Apr 2006 15:18:27 -0000	1.6
+++ defaults.c	21 Apr 2006 12:00:06 -0000	1.7
@@ -54,6 +54,12 @@
             NULL
         }
     },
+    {"allowWheelActions", &allowWheelActions, RC_BOOL,
+        {
+            "allow mouse wheel to produce action in non-scrollable windows",
+            NULL
+        }
+    },
     {"autoQuit", &autoQuit, RC_INT,
         {
             "Autoquit timer (default 60)",
@@ -74,7 +80,7 @@
     },
     {"colorClient", &colorClient, RC_INT,
         {
-            "What type of ship bitmaps to load",
+            "What type of ship bitmaps to use",
             "0 - mono",
             "1 - new color bitmaps (default)",
             "2 - old color bitmaps",
@@ -723,7 +729,7 @@
     DefaultsLoaded = 1;
 
 #ifdef DEBUG
-    printf ("Initdefaults\n");
+    LineToConsole ("Initdefaults\n");
 #endif
 
     /* Clear defaults if they exist */
@@ -750,7 +756,8 @@
     fp = fopen (deffile, "r");
     if (!fp)
         return;
-    printf ("Reading defaults file %s\n", deffile);
+
+    LineToConsole ("Reading defaults file %s\n", deffile);
 
 #ifdef NBT
     macrocnt = 0;               /* reset macros */
@@ -784,15 +791,16 @@
         {
             if (macrocnt == MAX_MACRO)
             {
-                fprintf (stderr, "Maximum number of macros is %d\n",
-                         MAX_MACRO);
+                LineToConsole ("Maximum number of macros is %d\n", MAX_MACRO);
             }
             else
             {
                 str = file + 6;
                 c = getctrlkey ((unsigned char **) &str);
                 if (c == '?')
-                    fprintf (stderr, "Cannot use '?' for a macro\n");
+                {
+                    LineToConsole ("Cannot use '?' for a macro\n");
+                }
                 else
                 {
                     macro[macrocnt].type = NBTM;
@@ -824,15 +832,16 @@
         {
             if (macrocnt == MAX_MACRO)
             {
-                fprintf (stderr, "Maximum number of macros is %d\n",
-                         MAX_MACRO);
+                LineToConsole ("Maximum number of macros is %d\n", MAX_MACRO);
             }
             else
             {
                 str = file + 4;
                 c = getctrlkey ((unsigned char **) &str);
                 if (c == '?')
-                    fprintf (stderr, "Cannot use '?' for a macro\n");
+                {
+                    LineToConsole ("Cannot use '?' for a macro\n");
+                }
                 else
                 {
                     macro[macrocnt].key = c;
@@ -879,12 +888,9 @@
 #ifdef MULTILINE_MACROS
                         if (keysused[macro[macrocnt].key])
                         {
-                            printf
-                                ("Multiline macros of nonstandard types are not recommended.\n");
-                            printf
-                                ("You might experience strange behaviour of macros.\n");
-                            printf ("Type: unspecified macro, key: %c.\n",
-                                    macro[macrocnt].key);
+                            LineToConsole ("Multiline macros of nonstandard types are not recommended.\n");
+                            LineToConsole ("You might experience strange behaviour of macros.\n");
+                            LineToConsole ("Type: unspecified macro, key: %c.\n", macro[macrocnt].key);
                         }
 #endif /* MULTILINE_MACROS */
                     }
@@ -989,8 +995,7 @@
 
             if ((keycnt = strlen (keys)) == MAX_KEY - 1)
             {
-                fprintf (stderr, "Maximum number of keys is %d\n",
-                         MAX_KEY - 1);
+                LineToConsole ("Maximum number of keys is %d\n", MAX_KEY - 1);
             }
             else
             {
@@ -1342,6 +1347,8 @@
     if (timerType < T_NONE || timerType >= T_TOTAL)
         timerType = T_SHIP;
 
+    allowWheelActions = booleanDefault ("allowWheelActions", allowWheelActions);
+
     tpDotDist = intDefault ("tpDotDist", tpDotDist);
     omitTeamLetter = booleanDefault ("omitTeamLetter", omitTeamLetter);
 	beepOnPrivateMessage = booleanDefault ("beepOnPrivateMessage", beepOnPrivateMessage);
@@ -1598,7 +1605,6 @@
 
 	updateWindowsGeometry (qwin);
 	updateWindowsGeometry (statwin);
-	updateWindowsGeometry (scanwin);
 	updateWindowsGeometry (war);
 */
 }
@@ -1628,7 +1634,7 @@
 
 #ifdef DEBUG
 #define CHECK_FILE \
-      printf("Checking for file %s...\n", found); \
+      LineToConsole ("Checking for file %s...\n", found); \
       accessible = access(found, R_OK); \
       if (accessible == 0)\
         return 1;
@@ -1650,7 +1656,7 @@
 
     /* check current directory first */
 #ifdef DEBUG
-    printf ("Checking for file %s\n", fname);
+    LineToConsole ("Checking for file %s\n", fname);
 #endif
     accessible = access (fname, R_OK);
     if (accessible == 0)

Index: data.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/data.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- data.c	19 Apr 2006 15:18:27 -0000	1.6
+++ data.c	21 Apr 2006 12:00:06 -0000	1.7
@@ -46,7 +46,7 @@
 int shrinkPhaserOnMiss = 0;
 
 int colorClient = 1;            /* Use new colorized bitmaps SRS 11/12/99 */
-int dynamicBitmaps = 1;		/* in game switching of ship bitmaps, default to on */
+int dynamicBitmaps = 1;         /* in game switching of ship bitmaps, default to on */
 int newDashboard = 2;           /* use new graphic
                                  * dashboard, 6/2/93 LAB */
 int old_db = 0;                 /* should be same as
@@ -90,7 +90,7 @@
 int infomapped = 0;
 int mustexit = 0;
 int messtime = 5;
-int keepPeace = 0;
+int keepPeace = 1;
 
 #ifdef GATEWAY
 unsigned LONG netaddr = 0;      /* for blessing */
@@ -98,7 +98,6 @@
 #endif
 
 int msgBeep = 1;                /* ATM - msg beep */
-int scanmapped = 0;             /* ATM - scanners */
 
 int planetBitmap = 0;
 
@@ -216,12 +215,10 @@
 int updatesPerSec = 10;
 
 #ifdef META
-char *metaServer = "metaserver.netrek.org";      /* Default Metaserver */
-char *metaServer1 = "metaserver.us.netrek.org";  /* First Metaserver */
-char *metaServer2 = "metaserver2.us.netrek.org"; /* Second Metaserver */
-char *metaServer3 = "metaserver.eu.netrek.org";  /* Third Metaserver */
-int metaPort = 3521;            /* HAVE to use nicely
-                                 * formated version */
+/* Metaservers list */
+char *metaServer[] = {"metaserver.us.netrek.org",
+                      "metaserever2.us.netrek.org"};
+int metaPort = 3521;
 #ifdef METAPING
 int metaPing = 1;				/*  ICMP ping the metaserverlist */
 #endif
@@ -335,8 +332,9 @@
 
 W_Window messagew, w, mapw, statwin, baseWin = 0, infow, tstatw, war,
     warnw, helpWin, teamWin[4], qwin, messwa, messwt, messwi, messwk,
-    playerw, planetw, rankw, optionWin = 0, reviewWin;
-W_Window scanw, scanwin, udpWin, phaserwin, hintWin;
+    playerw, playerw2, planetw, rankw, optionWin = 0, reviewWin;
+W_Window udpWin, phaserwin, hintWin;
+W_Window waitWin, qwin, countWin, motdButtonWin, motdWin;
 
 #ifdef SHORT_PACKETS
 W_Window spWin = NULL;
@@ -360,7 +358,7 @@
 W_Window pStats = NULL;
 
 char deathmessage[80];
-char outmessage[1024];          /* maximum message length */
+char outmessage[MAX_MLENGTH];          /* maximum message length */
 
 char *xdisplay_name = NULL;
 
@@ -505,7 +503,7 @@
 struct dmacro_list rcm_msg[] = {
     {'0', "none", "Unknown RCM message"},
     {'1', "kill", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) was kill %?%d>0%{%k%!(NO CREDIT)%} for %u (%r%p) %?%w>0%{%W%!%}"},
-    {'2', "planet", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%} killed by %l (%z) %?%w>0%{%W%!%}"},
+    {'2', "planet", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) killed by %l (%z) %?%w>0%{%W%!%}"},
     {'3', "bomb", "%N->%Z We are being attacked by %i (%T%c) who is %d%% damaged."},
     {'4', "destroy", "%N->%Z %N destroyed by %i (%T%c)"},
     {'5', "take", "%N->%O %N taken by %i (%T%c)"},
@@ -654,7 +652,8 @@
 char *ind_ship_bmp_M;
 
 // Added to fix thread creation issue
-HANDLE ThreadCreated = NULL;
+HANDLE MainThread = NULL;
+HANDLE InputThread = NULL;
 
 // missing variables
 int forceDisplay = 0;
@@ -711,3 +710,14 @@
 SDBUFFER * mapSDB = NULL;
 
 int disableWinkey = 1;  /* disable WinKey + ContextKey by default */
+
+int exitFlag = 0;       /* no exit by default */
+
+struct cons_buffer * consHead = NULL;    // head of the linked list for console buffer
+struct cons_buffer * consTail = NULL;    // tail of the linked list for console buffer
+
+int allowWheelActions = 1;   /* allow wheel actions */
+
+WNDPROC lpfnDefRichEditWndProc;     /* default window proc */
+
+int richText = 0;   /* temporary variable to select rich text message windows */
\ No newline at end of file

Index: defwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/defwin.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- defwin.c	12 Apr 2006 04:20:03 -0000	1.2
+++ defwin.c	21 Apr 2006 12:00:06 -0000	1.3
@@ -18,6 +18,25 @@
  * the use of it.)
  * 
  * $Log$
+ * Revision 1.3  2006/04/21 12:00:06  modemhero
+ * This large patch brings the client up to Stas's version 4.4.0.4.  The visible changes to the user are:
+ * - added "allowWheelActions: (on)/off" to be able to disable wheel in non-scrolling windows
+ * - added new window "player2" that behaves exactly as player list window, but allows to
+ *   select alternate custom layout and could be toggled with 'A' key
+ * - added "playerList2: (string)" option that allows to select different player list layout
+ *   for alternate player list window, by default it will be "n T R N l M K W L r O D d "
+ * - fixed bug that caused main thread to continue in case player died while scrolling
+ *   message window using scrollbar (which forced him close client window and reconnect)
+ * - fixed incorrect behavior of 'windowMove: off' feature. Previously window would snap
+ *   back to wrong place if the main window top-left corner was not (0,0) coordinates
+ * - long lines are now wrapped by words instead of by chars. Maximum message length was
+ *   reduced to 4 full message lines (4 * 69 characters)
+ * - message input window will now show Sender->Recipient even when the input line is longer
+ *   than 69 characters
+ * - changed 'Forum' URL on metaserver window to open Google's r.g.n location
+ *
+ * There are also several internal changes, such as a new format for error messages.
+ *
  * Revision 1.2  2006/04/12 04:20:03  modemhero
  * Update to version 4.4.0.3
  *
@@ -504,7 +523,7 @@
                     x = xo + INDENT;
                     break;
                 default:
-                    fprintf (stderr, "Unknown type.\n");
+                    LineToConsole ("Unknown type.\n");
                     break;
                 }
             }

Index: feature.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/feature.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- feature.c	18 Apr 2006 13:41:48 -0000	1.2
+++ feature.c	21 Apr 2006 12:00:06 -0000	1.3
@@ -112,7 +112,7 @@
                          (char) (f->arg2 ? *f->arg2 : 0));
 
 #ifdef DEBUG
-        printf ("(C->S) %s (%c): %d\n", f->name, f->feature_type, f->value);
+        LineToConsole ("(C->S) %s (%c): %d\n", f->name, f->feature_type, f->value);
 #endif
     }
 }
@@ -131,7 +131,7 @@
 #ifdef DEBUG
     if (packet->type != SP_FEATURE)
     {
-        printf ("Packet type %d sent to checkFeature!\n", packet->type);
+        LineToConsole ("Packet type %d sent to checkFeature!\n", packet->type);
         return;
     }
 #endif
@@ -142,7 +142,7 @@
 #ifdef TOOLS
     W_WriteText (toolsWin, 0, 0, textColor, buf, strlen (buf), W_RegularFont);
 #else
-    printf ("%s\n", buf);
+    LineToConsole ("%s\n", buf);
 #endif
 
     for (i = 0; features[i].name != 0; i++)
@@ -163,7 +163,7 @@
     }
     if (features[i].name == 0)
     {
-        printf ("Feature %s from server unknown to client!\n", packet->name);
+        LineToConsole ("Feature %s from server unknown to client!\n", packet->name);
     }
     /* special cases: */
     if (strcmpi (packet->name, "FEATURE_PACKETS") == 0)

Index: parsemeta.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/parsemeta.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- parsemeta.c	15 Apr 2006 09:58:25 -0000	1.3
+++ parsemeta.c	21 Apr 2006 12:00:07 -0000	1.4
@@ -140,7 +140,9 @@
         if ((hp = gethostbyname (host)) == NULL)
         {
             if (verbose)
-                fprintf (stderr, "unknown host '%s'\n", host);
+            {
+                LineToConsole ("unknown host '%s'\n", host);
+            }
             return (-1);
         }
         else
@@ -182,7 +184,7 @@
 #endif
 
 #ifdef DEBUG
-    printf ("In parseInput\n");
+    LineToConsole ("In parseInput\n");
 #endif
 
     /* Create some space to hold the entries that will be read.  More space can
@@ -302,13 +304,13 @@
         {
 
 #ifdef DEBUG
-            printf ("HOST:%-30s PORT:%-6d %12s %-5d %d %c\n",
-                    serverlist[num_servers].address,
-                    serverlist[num_servers].port,
-                    statusStrings[serverlist[num_servers].status],
-                    serverlist[num_servers].players,
-                    serverlist[num_servers].RSA_client,
-                    serverlist[num_servers].typeflag);
+            LineToConsole ("HOST:%-30s PORT:%-6d %12s %-5d %d %c\n",
+                            serverlist[num_servers].address,
+                            serverlist[num_servers].port,
+                            statusStrings[serverlist[num_servers].status],
+                            serverlist[num_servers].players,
+                            serverlist[num_servers].RSA_client,
+                            serverlist[num_servers].typeflag);
 #endif
 
             ++num_servers;
@@ -328,37 +330,34 @@
     char *sockbuf, *buf;
     int bufleft = BUF - 1;
     int len;
-    int sock;
+    int sock = 0;
+    int i = 0;
 
-    if ((stringDefault ("metaServer")) != NULL)
-        metaServer = stringDefault ("metaServer");
+    if (stringDefault ("metaServer") != NULL)
+        metaServer[0] = stringDefault ("metaServer");
 
     metaPort = intDefault ("metaPort", metaPort);
 
-    if ((sock = open_port (metaServer, metaPort, 1)) <= 0)
+    /* Attempt connecting to all servers one by one */
+    do
     {
-        fprintf (stderr, "Cannot connect to MetaServer (%s , %d)\n",
-                 metaServer, metaPort);
+        LineToConsole ("Calling %s on port %d\n", metaServer[i], metaPort);
 
-        /* Okie, let's just try default servers */
-        if ((sock = open_port (metaServer1, metaPort, 1)) <= 0)
+        sock = open_port (metaServer[i], metaPort, 0);
+
+        if (sock <= 0)
         {
-            fprintf (stderr, "Cannot connect to MetaServer (%s , %d)\n",
-                             metaServer1, metaPort);
-            if ((sock = open_port (metaServer2, metaPort, 1)) <= 0)
-            {
-                fprintf (stderr, "Cannot connect to MetaServer (%s , %d)\n",
-                                    metaServer2, metaPort);
-                if ((sock = open_port (metaServer3, metaPort, 1)) <= 0)
-                {
-                    fprintf (stderr, "Cannot connect to MetaServer (%s , %d)\n",
-                                        metaServer3, metaPort);
-                    return 0;
-                }
-            }
+            LineToConsole ("Cannot connect to MetaServer (%s port %d)\n",
+                            metaServer[i], metaPort);
         }
-    }
 
+        i++;
+
+    } while (sock <= 0 && i <= 1);  /* i shouldn't be bigger than number of servers */
+
+    /* Still no connection -> return */
+    if (sock <= 0)
+        return 0;
 
     /* Allocate a buffer and read until full */
     buf = sockbuf = (char *) malloc (BUF);
@@ -367,7 +366,7 @@
         bufleft -= len;
         buf += len;
 #ifdef DEBUG
-        printf ("Read %d bytes from Metaserver\n", len);
+        LineToConsole ("Read %d bytes from Metaserver\n", len);
 #endif
     }
     closesocket (sock);
@@ -401,10 +400,10 @@
 
         if (out == NULL)
         {
-            fprintf (stderr,
+            LineToConsole (
                      "Can not write to the metaCache temporary file `%s'.\n",
                      tmpFileName);
-            fprintf (stderr, "Meta-server read will not be cached.\n");
+            LineToConsole ("Meta-server read will not be cached.\n");
         }
     }
     else
@@ -451,15 +450,14 @@
 
     if (!cacheName)
     {
-        fprintf (stderr,
-                 "You must define the .xtrekrc variable `metaCache' in\n");
-        fprintf (stderr, "order to use the `show known servers' option.\n");
+        LineToConsole ("You must define the .xtrekrc variable `metaCache' in\n");
+        LineToConsole ("order to use the `show known servers' option.\n");
         return 0;
     }
     else if (!findfile (cacheName, cacheFileName)
              || !(in = fopen (cacheFileName, "r")))
     {
-        fprintf (stderr,
+        LineToConsole (
                  "The metaCache file `%s' is empty or not accessable.\n",
                  cacheName);
         return 0;
@@ -476,7 +474,7 @@
         bufleft -= len;
         buf += len;
 #ifdef DEBUG
-        printf ("Read %d bytes from Metaserver cache file\n", len);
+        LineToConsole ("Read %d bytes from Metaserver cache file\n", len);
 #endif
     }
     *buf = 0;                   /* End of buffer marker */
@@ -701,7 +699,7 @@
 
 	/* Additional Help Options */
 	W_WriteText (metaWin, 0, num_servers + 1, W_Yellow, 
-		        "        Netrek Homepage | Newbie Manual | FAQ | Dogfight Manual", 63, 0);
+		        "    Netrek Homepage | Newbie Manual | Forum | FAQ | Dogfight Manual", 67, 0);
 
     /* Map window */
     W_MapWindow (metaWin);
@@ -742,7 +740,7 @@
 	int x;
 
 #ifdef DEBUG
-    printf ("Got meta window action, y=%d\n", data->y);
+    LineToConsole ("Got meta window action, y=%d\n", data->y);
 #endif
     if ((data->y >= 0) && (data->y < num_servers))
     {
@@ -751,7 +749,7 @@
         if (data->key == W_RBUTTON)     /* Guess at an observer port */
         {
             xtrekPort++;
-            printf ("Attempting to observe on port %d...\n", xtrekPort);
+            LineToConsole ("Attempting to observe on port %d...\n", xtrekPort);
         }
         serverName = strdup (slist->address);
 		serverType = metaGetServerType (slist->typeflag);
@@ -762,6 +760,8 @@
 		slist->status = statusConnecting;
         metarefresh (data->y);
 
+        LineToConsole ("Checking %s on port %d\n", serverName, xtrekPort);
+
         if ((sock = open_port (serverName, xtrekPort, 0)) <= 0)
         {
             slist->status = statusCantConnect;
@@ -784,13 +784,15 @@
 	else if (data->y == num_servers + 1) /* Help Line */
 	{
 		x = data->x / W_Textwidth;
-		if (x >= 0 && x <= 23)			/* Netrek Home Page */
+		if (x >= 0 && x <= 19)			/* Netrek Home Page */
 			ShellExecute (NULL, "open", "http://www.netrek.org", NULL, NULL, SW_SHOWNORMAL);
-		else if (x >= 25 && x <= 39)	/* Newbie Manual */
+		else if (x >= 21 && x <= 35)	/* Newbie Manual */
 			ShellExecute (NULL, "open", "http://www.netrek.org/cow/current/newbie.html", NULL, NULL, SW_SHOWNORMAL);
-		else if (x >= 41 && x <= 45)	/* FAQ */
+		else if (x >= 37 && x <= 43)	/* Forums */
+			ShellExecute (NULL, "open", "http://groups-beta.google.com/group/rec.games.netrek", NULL, NULL, SW_SHOWNORMAL);
+		else if (x >= 45 && x <= 49)	/* FAQ */
 			ShellExecute (NULL, "open", "http://www.inl.org/netrek/netrekFAQ.html", NULL, NULL, SW_SHOWNORMAL);
-		else if (x >= 47 && x <= 63)	/* Dogfight Manual */
+		else if (x >= 51 && x <= 67)	/* Dogfight Manual */
 			ShellExecute (NULL, "open", "http://cha.rlie.nl/dfmanual/", NULL, NULL, SW_SHOWNORMAL);
 	}
 }
@@ -825,7 +827,8 @@
 			&IDThread);							// returns thread identifier 
  
 		// Check the return value for success. 
-		if (hThread == NULL) printf("CreateThread error\n");
+		if (hThread == NULL)
+            LineToConsole ("CreateThread error\n");
 	}
 #endif
 
@@ -912,8 +915,7 @@
 // What happened?
 void metaPing_ReportError(char *pWhere)
 {
-	fprintf(stderr,"\n%s error: %d\n", pWhere,
-		WSAGetLastError());
+	LineToConsole ("\n%s error: %d\n", pWhere, WSAGetLastError());
 }
 
 

Index: helpwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/helpwin.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- helpwin.c	12 Apr 2006 04:20:03 -0000	1.2
+++ helpwin.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -127,6 +127,7 @@
     "U     Show rankings window",
     "m     Message Window Zoom",
     "/     Toggle sorted player list",
+    "A     Toggle alternate player list",
     ":     Toggle message logging",
     "+     Show UDP options window",
     "=     Update all",

Index: dmessage.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/dmessage.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- dmessage.c	18 Apr 2006 13:41:48 -0000	1.3
+++ dmessage.c	21 Apr 2006 12:00:06 -0000	1.4
@@ -102,12 +102,10 @@
 
     buf[79] = '\0';
 
-    /* printf("%s\n", buf); */
-
 #ifdef TOOLS
     W_WriteText (toolsWin, 0, 0, textColor, buf, strlen (buf), W_RegularFont);
 #else
-    W_MessageAllowedWindows (WAM_INDIV, 0, 0, W_White, buf, stlen (buf), 0);
+    W_MessageAllowedWindows (WAM_INDIV, 0, 0, W_White, buf, strlen (buf), 0);
 #endif
 }
 
@@ -178,19 +176,17 @@
             }
             else
             {
-                printf ("%s: %s\n", timebuf, message);
+                LineToConsole ("%s: %s\n", timebuf, message);
             }
         }
         if (!(logging && logFile == NULL) && flags == conq)
         {
             /* output conquer stuff to stdout in addition to message window */
-            fprintf (stdout, "%s\n", message);
+            LineToConsole ("%s\n", message);
             if (instr (message, "kill"))
             {
-                fprintf (stdout,
-                         "NOTE: The server here does not properly set message flags\n");
-                fprintf (stdout,
-                         "You should probably pester the server god to update....\n");
+                LineToConsole ("NOTE: The server here does not properly set message flags\n");
+                LineToConsole ("You should probably pester the server god to update....\n");
             }
         }
         if (flags == (MCONFIG + MINDIV + MVALID))
@@ -205,7 +201,7 @@
             if ((flags == team) &&
                 !strncmp (message + 10, "     ", 5) && (message[15] == 0))
             {
-                printf ("dmessage:flags==team PIG call from=%d\n", from);
+                LineToConsole ("dmessage:flags==team PIG call from=%d\n", from);
                 pmessage (pigcall, from, MINDIV);
             }
         }
@@ -226,13 +222,13 @@
             W_MessageAllowedWindows (WAM_INDIV, 0, 0, color, message, len, 0);
             if (!strncmp (message + 10, "     ", 5) && (message[15] == 0))
             {
-                printf ("dmessage:MINDIV PIG call from=%d\n", from);
+                LineToConsole ("dmessage:MINDIV PIG call from=%d\n", from);
                 pmessage (pigcall, from, MINDIV);
             }
 #ifdef CLUECHECKBORG
             if (from == 255)
             {
-                printf ("dmessage: Message from God %s\n", message);
+                LineToConsole ("dmessage: Message from God %s\n", message);
                 ClueRespond (message);
             }
 #endif
@@ -275,8 +271,8 @@
                 }
                 else
                 {
-                    printf ("%s ", message);
-                    printf ("%s\n", timebuf);
+                    LineToConsole ("%s ", message);
+                    LineToConsole ("%s\n", timebuf);
                 }
             }
             return;
@@ -299,8 +295,8 @@
                 }
                 else
                 {
-                    printf ("%s ", message);
-                    printf ("%s\n", timebuf);
+                    LineToConsole ("%s ", message);
+                    LineToConsole ("%s\n", timebuf);
                 }
             }
             break;
@@ -326,8 +322,8 @@
                 }
                 else
                 {
-                    printf ("%s ", message);
-                    printf ("%s\n", timebuf);
+                    LineToConsole ("%s ", message);
+                    LineToConsole ("%s\n", timebuf);
                 }
             }
             break;
@@ -347,8 +343,8 @@
                 }
                 else
                 {
-                    printf ("%s", message);
-                    printf ("%s\n", timebuf);
+                    LineToConsole ("%s", message);
+                    LineToConsole ("%s\n", timebuf);
                 }
             }
             break;

Index: udpopt.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/udpopt.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- udpopt.c	21 Jan 2003 21:28:43 -0000	1.1.1.1
+++ udpopt.c	21 Apr 2006 12:00:07 -0000	1.2
@@ -61,8 +61,8 @@
             strcat (buf, "Verifying UDP connection");
             break;
         default:
-            fprintf (stderr, "netrek: UDP error: bad commStatus (%d)\n",
-                     commStatus);
+            LineToConsole ("netrek: UDP error: bad commStatus (%d)\n",
+                             commStatus);
         }
         break;
     case UDP_DROPPED:
@@ -145,7 +145,7 @@
         strcpy (buf, "Done");
         break;
     default:
-        fprintf (stderr, "netrek: UDP error: bad udprefresh(%d) call\n", i);
+        LineToConsole ("netrek: UDP error: bad udprefresh(%d) call\n", i);
     }
 
     W_WriteText (udpWin, 0, i, textColor, buf, strlen (buf), 0);

Index: input.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/input.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- input.c	15 Apr 2006 09:58:25 -0000	1.3
+++ input.c	21 Apr 2006 12:00:07 -0000	1.4
@@ -632,7 +632,7 @@
 #endif /* SHIFTED_MOUSE */
                 
             default:
-                fprintf (stderr, "%c ignored in buttonmap\n", *(str - 1));
+                LineToConsole ("%c ignored in buttonmap\n", *(str - 1));
                 break;
             }
         }
@@ -673,9 +673,12 @@
        event detection and handling into the select() mechanism.
        It probably also increases performance */
     // Close HANDLE from previously created thread.
-    if (ThreadCreated != NULL)
-        CloseHandle (ThreadCreated);
-    THREAD (input2);
+    if (InputThread != NULL)
+    {
+        WaitForSingleObject (InputThread, INFINITE);
+        CloseHandle (InputThread);
+    }
+    InputThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) input2, 0, 0, &InputThreadID);
 
     while (1)
     {
@@ -684,6 +687,9 @@
         process_event ();
     }
 
+    /* clear exitFlag */
+    exitFlag = 0;
+
     while (W_EventsPending ())
         W_NextEvent (&event);
 
@@ -745,8 +751,8 @@
 
                 if (isServerDead ())
                 {
-                    printf ("Whoops!  We've been ghostbusted!\n");
-                    printf ("Pray for a miracle!\n");
+                    LineToConsole ("Whoops!  We've been ghostbusted!\n");
+                    LineToConsole ("Pray for a miracle!\n");
                     /* UDP fail-safe */
                     commMode = commModeReq = COMM_TCP;
                     commSwitchTimeout = 0;
@@ -758,7 +764,7 @@
                         udprefresh (UDP_STATUS);
                     }
                     connectToServer (nextSocket);
-                    printf ("Yea!  We've been resurrected!\n");
+                    LineToConsole ("Yea!  We've been resurrected!\n");
                 }
             }
 
@@ -968,8 +974,8 @@
                 intrupt ();
                 if (isServerDead ())
                 {
-                    printf ("Shit, We've been ghostbusted\n");
-                    printf ("hope you're not in a base\n");
+                    LineToConsole ("Shit, We've been ghostbusted\n");
+                    LineToConsole ("hope you're not in a base\n");
                     /* UDP fail-safe */
                     commMode = commModeReq = COMM_TCP;
                     commSwitchTimeout = 0;
@@ -981,7 +987,7 @@
                         udprefresh (UDP_STATUS);
                     }
                     connectToServer (nextSocket);
-                    printf ("We've been resurrected!\n");
+                    LineToConsole ("We've been resurrected!\n");
                     map ();
                 }
             }
@@ -1010,7 +1016,7 @@
         case W_EV_KEY:
 
 #ifdef DEBUG
-            printf ("W_EV_KEY\n");
+            LineToConsole ("W_EV_KEY\n");
 #endif
 
             if ((handler = W_GetWindowKeyDownHandler (data.Window)) != NULL)
@@ -1109,7 +1115,7 @@
         case W_EV_KEY_OFF:
 
 #ifdef DEBUG
-            printf ("W_EV_KEY_OFF\n");
+            LineToConsole ("W_EV_KEY_OFF\n");
 #endif
 
             if ((handler = W_GetWindowKeyUpHandler (data.Window)) != NULL)
@@ -1122,7 +1128,7 @@
         case W_EV_BUTTON:
 
 #ifdef DEBUG
-            printf ("W_EV_BUTTON\n");
+            LineToConsole ("W_EV_BUTTON\n");
 #endif
 
             if ((handler = W_GetWindowButtonHandler (data.Window)) != NULL)
@@ -1134,7 +1140,7 @@
         case W_EV_EXPOSE:
 
 #ifdef DEBUG
-            printf ("W_EV_EXPOSE\n");
+            LineToConsole ("W_EV_EXPOSE\n");
 #endif
 
             if ((handler = W_GetWindowExposeHandler (data.Window)) != NULL)
@@ -1178,7 +1184,7 @@
                                  * fastquit! */
 
     if (data->Window != mapw && data->Window != w && data->Window != infow
-        && data->Window != scanw && data->Window != playerw)
+        && data->Window != playerw)
         return;
 
     key = data->key;
@@ -1481,7 +1487,7 @@
 
 
     if (data->Window != w && data->Window != mapw
-        && data->Window != infow && data->Window != scanwin
+        && data->Window != infow
 		&& data->Window != playerw)
         return;
 
@@ -1489,9 +1495,9 @@
 	{
 		int x, y;
 
-        	if (findMouseInWin (&x, &y, playerw))
-	   	{
-		    	data->Window = playerw;
+        if (findMouseInWin (&x, &y, playerw))
+	    {
+		    data->Window = playerw;
 			data->x = x;
 			data->y = y;
 		}
@@ -1819,15 +1825,6 @@
                                        / 3.14159 * 128.) + 0.5));
 }
 
-/******************************************************************************/
-/***  scan.c  - Why do you have a func that does nothing?                   ***/
-/******************************************************************************/
-void
-scan (W_Window w,
-      int x,
-      int y)
-{
-}
 
 /******************************************************************************/
 /***  detmine()                                                             ***/
@@ -1915,8 +1912,9 @@
         if (MacroNum > -1)
         {                       /* macro identified, who to? */
             if (MacroNum >= MAX_MACRO)
-                fprintf (stderr,
-                         "Unknown Macro Num!  There is a macro bug!!\n");
+            {
+                LineToConsole ("Unknown Macro Num!  There is a macro bug!!\n");
+            }
 
             if (!pmacro (MacroNum, data->key, data))
                 W_Beep ();
@@ -2050,7 +2048,7 @@
 
 
             default:
-                fprintf (stderr, "Unknown Macro Type!  Jeff's a twink!!\n");
+                LineToConsole ("Unknown Macro Type!  Jeff's a twink!!\n");
                 warning ("Unknown macro type (eg There is a macro bug)");
                 return;
                 break;
@@ -2095,6 +2093,7 @@
     if (infomapped)
         destroyInfo ();
     W_UnmapWindow (helpWin);
+    W_UnmapWindow (playerw2);
 
 #ifdef NBT
     W_UnmapWindow (macroWin);
@@ -2108,11 +2107,7 @@
     W_UnmapWindow (war);
     if (optionWin)
         optiondone ();
-    if (scanmapped)
-    {
-        W_UnmapWindow (scanwin);
-        scanmapped = 0;
-    }
+
     if (udpWin)
         udpdone ();
 
@@ -2488,8 +2483,10 @@
 void
 Key65 (W_Event * data)
 {
-    /*  W_ShowBitmaps(); */
-    emptyKey ();
+    if (W_IsMapped (playerw2))
+        W_UnmapWindow (playerw2);
+    else
+        W_MapWindow (playerw2);
 }
 
 /******************************************************************************/
@@ -2919,16 +2916,7 @@
 void
 Key97 (W_Event * data)
 {
-    if (!W_IsMapped (scanwin))
-    {
-        scan (data->Window, data->x, data->y);
-    }
-    else
-    {
-        if (scanmapped)
-            W_UnmapWindow (scanwin);
-        scanmapped = 0;
-    }
+    emptyKey ();
 }
 
 /******************************************************************************/

Index: makefile
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/makefile,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- makefile	18 Apr 2006 13:41:48 -0000	1.4
+++ makefile	21 Apr 2006 12:00:07 -0000	1.5
@@ -88,7 +88,7 @@
 DEBUGDEFS = -DDEBUG
 !endif
 
-ROBJ            = beeplite.obj check.obj colors.obj data.obj death.obj defaults.obj dmessage.obj\
+ROBJ            = beeplite.obj check.obj colors.obj console.obj data.obj death.obj defaults.obj dmessage.obj\
                   enter.obj findslot.obj getname.obj getship.obj helpwin.obj hintwin.obj inform.obj\
                   interface.obj newwin.obj option.obj planetlist.obj macrowin.obj\
                   map.obj playerlist.obj ranklist.obj reserved.obj sintab.obj\
@@ -99,7 +99,7 @@
                   docwin.obj feature.obj\
                   string_util.obj local.obj cowmain.obj playback.obj
 
-RSRC            = beeplite.c check.c colors.c data.c death.c defaults.c dmessage.c\
+RSRC            = beeplite.c check.c colors.c console.c data.c death.c defaults.c dmessage.c\
                   enter.c findslot.c getname.c getship.c helpwin.c hintwin.c inform.c\
                   input.c interface.c newwin.c option.c planetlist.c\
                   macrowin.c map.c playerlist.c ranklist.c redraw.c\

Index: distress.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/distress.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- distress.c	21 Jan 2003 21:28:40 -0000	1.1.1.1
+++ distress.c	21 Apr 2006 12:00:06 -0000	1.2
@@ -137,14 +137,12 @@
     if (bufa[*inda])
         (*inda)--;
 
-    if (!operation)             /* incomplete is truth, just
-                                 * ask Godel */
+    if (!operation)             /* incomplete is truth, just ask Godel */
         return (1);
 
     switch (operation)
     {
-    case '=':                  /* character by character
-                                 * equality */
+    case '=':                  /* character by character equality */
         if (indc != indh)
             return (0);
         for (i = 0; i < indc; i++)
@@ -171,11 +169,9 @@
 
     default:
         warning ("Bad operation in Macro!");
-        printf
-            ("Unrecognizable operation in macro pass3: %c  Trying to continue.\n",
-             operation);
-        return (1);             /* don't know what happened,
-                                 * pretend we do */
+        LineToConsole ("Unrecognizable operation in macro pass3: %c  Trying to continue.\n",
+                        operation);
+        return (1);             /* don't know what happened, pretend we do */
         break;
     }
 }
@@ -219,14 +215,12 @@
                         bufb[(*indb)++] = bufa[(*inda)++];
                 }
                 else
-                    return;     /* we are full, so we are
-                                 * done */
+                    return;     /* we are full, so we are done */
                 state = 0;
                 continue;
                 break;
 
-            case '?':          /* the dreaded conditional,
-                                 * evaluate it */
+            case '?':          /* the dreaded conditional, evaluate it */
                 bufb[*indb] = '0' + solvetest (bufa, inda);
                 (*indb)++;
                 state = 0;
@@ -235,10 +229,10 @@
 
             default:
                 warning ("Bad character in Macro!");
-                printf
-                    ("Unrecognizable special character in macro pass2: %c  Trying to continue.\n",
+                LineToConsole (
+                    "Unrecognizable special character in macro pass2: %c  Trying to continue.\n",
                      bufa[(*inda) - 1]);
-                fprintf (stderr, "macro: %s\n", bufa);
+                LineToConsole ("macro: %s\n", bufa);
                 state = 0;
                 continue;
                 break;
@@ -302,8 +296,8 @@
                 break;
             default:
                 warning ("Bad character in Macro!");
-                printf
-                    ("Unrecognizable special character in macro pass5: %c  Trying to continue.\n",
+                LineToConsole (
+                    "Unrecognizable special character in macro pass5: %c  Trying to continue.\n",
                      buf[index - 1]);
             }
         }
@@ -347,31 +341,28 @@
         {
             switch (bufa[(*inda)++])
             {
-            case '}':          /* done with this
-                                 * conditional, return */
+            case '}':          /* done with this conditional, return */
                 return (0);
                 break;
 
             case '{':          /* handle new conditional */
-                if (*indb > 0)
+                if ((bufa[*inda - 3] == '0') && ((*inda - 3) >= 0))
                 {
-                    (*indb)--;
-                    if (bufb[*indb] == '0')
-                        newflag = 0;
-                    else
-                        newflag = 1;
+                    if (*indb > 0 && include)
+                        (*indb)--;
+                    newflag = 0;
                 }
-                else            /* moron starting with cond,
-                                 * assume true */
+                else
+                {
+                    if (*indb > 0 && include)
+                        (*indb)--;
                     newflag = 1;
+                }
 
                 if (include)
                     condmacro (bufa, bufb, inda, indb, newflag);
                 else
-                {
-                    (*indb)++;
                     *inda = skipmacro (bufa, *inda);
-                }
 
                 state = 0;
                 continue;
@@ -427,8 +418,8 @@
 
             default:
                 warning ("Bad character in Macro!");
-                printf
-                    ("Unrecognizable special character in macro pass4: %c  Trying to continue.\n",
+                LineToConsole (
+                    "Unrecognizable special character in macro pass4: %c  Trying to continue.\n",
                      bufa[(*inda) - 1]);
             }
         }
@@ -480,7 +471,7 @@
     *t = 0;
     if (buf[255])
     {
-        fprintf (stderr, "ERROR: String constant overwritten\n");
+        LineToConsole ("ERROR: String constant overwritten\n");
         return NULL;
     }
     return buf;
@@ -629,10 +620,8 @@
     char *strcap (char *s);
 
 #ifndef SERVER
-    extern int ping_tloss_sc;   /* total % loss 0--100,
-                                 * server to client */
-    extern int ping_tloss_cs;   /* total % loss 0--100,
-                                 * client to server */
+    extern int ping_tloss_sc;   /* total % loss 0--100, server to client */
+    extern int ping_tloss_cs;   /* total % loss 0--100, client to server */
     extern int ping_av;         /* average rt */
     extern int ping_sd;         /* standard deviation */
 
@@ -666,11 +655,9 @@
             case ' ':
                 *pbuf1++ = ' ';
                 break;
-            case 'O':          /* push a 3 character team
-                                 * name into buf */
+            case 'O':          /* push a 3 character team name into buf */
                 cap = 1;
-            case 'o':          /* push a 3 character team
-                                 * name into buf */
+            case 'o':          /* push a 3 character team name into buf */
                 APPEND_CAP (pbuf1, cap, teamshort[sender->p_team]);
                 cap = 0;
                 break;
@@ -694,16 +681,12 @@
                 break;
 
             case 'P':          /* push player id into buf */
-            case 'G':          /* push friendly player id
-                                 * into buf */
-            case 'H':          /* push enemy target player
-                                 * id into buf */
+            case 'G':          /* push friendly player id into buf */
+            case 'H':          /* push enemy target player id into buf */
 
             case 'p':          /* push player id into buf */
-            case 'g':          /* push friendly player id
-                                 * into buf */
-            case 'h':          /* push enemy target player
-                                 * id into buf */
+            case 'g':          /* push friendly player id into buf */
+            case 'h':          /* push enemy target player id into buf */
 
                 switch (c)
                 {
@@ -729,8 +712,7 @@
                 *pbuf1++ = j->p_mapchars[1];
                 break;
 
-            case 'n':          /* push planet armies into
-                                 * buf */
+            case 'n':          /* push planet armies into buf */
                 l = &planets[dist->tclose_pl];
                 APPEND_INT (pbuf1,
                             ((l->pl_info & sender->p_team) ? l->
@@ -762,17 +744,14 @@
                 l = &planets[dist->tclose_pl];
                 APPEND (pbuf1, l->pl_name);
                 break;
-            case 'Z':          /* push a 3 character team
-                                 * name into buf */
+            case 'Z':          /* push a 3 character team name into buf */
                 cap = 1;
-            case 'z':          /* push a 3 character team
-                                 * name into buf */
+            case 'z':          /* push a 3 character team name into buf */
                 l = &planets[dist->tclose_pl];
                 APPEND_CAP (pbuf1, cap, teamshort[l->pl_owner]);
                 cap = 0;
                 break;
-            case 't':          /* push a team character
-                                 * into buf */
+            case 't':          /* push a team character into buf */
                 l = &planets[dist->tclose_pl];
                 *pbuf1++ = teamlet[l->pl_owner];
                 break;
@@ -861,26 +840,22 @@
                 break;
 
 #ifdef SERVER
-            case 'v':          /* push average ping round
-                                 * trip time into buf */
+            case 'v':          /* push average ping round trip time into buf */
             case 'V':          /* push ping stdev into buf */
             case 'y':          /* push packet loss into buf */
                 *pbuf1++ = '0';
-            case 'M':          /* push capitalized
-                                 * lastMessage into buf */
+            case 'M':          /* push capitalized lastMessage into buf */
             case 'm':          /* push lastMessage into buf */
                 break;
 #else
-            case 'M':          /* push capitalized
-                                 * lastMessage into buf */
+            case 'M':          /* push capitalized lastMessage into buf */
                 cap = 1;
             case 'm':          /* push lastMessage into buf */
                 APPEND_CAP (pbuf1, cap, lastMessage);
                 cap = 0;
                 break;
 
-            case 'v':          /* push average ping round
-                                 * trip time into buf */
+            case 'v':          /* push average ping round trip time into buf */
                 APPEND_INT (pbuf1, ping_av);
                 break;
 
@@ -921,7 +896,7 @@
                  * message will be parsed without whatever %. has occurred. -
                  * jn */
                 warning ("Bad Macro character in distress!");
-                fprintf (stderr,
+                LineToConsole (
                          "Unrecognizable special character in distress pass 1: %c\n",
                          *(pm - 1));
                 break;

Index: short.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/short.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- short.c	15 Apr 2006 11:55:14 -0000	1.3
+++ short.c	21 Apr 2006 12:00:07 -0000	1.4
@@ -861,8 +861,10 @@
     char addrbuf[9];
 
     if (debug)
-        printf ("Length of Message is: %d  total Size %d \n",
-                strlen (&packet->mesg), (int) packet->length);
+    {
+        LineToConsole ("Length of Message is: %d  total Size %d \n",
+                        strlen (&packet->mesg), (int) packet->length);
+    }
     if (packet->m_from >= MAXPLAYER)
         packet->m_from = 255;
 
@@ -905,7 +907,7 @@
         /* S_P2 */
         if (shortversion == SHORTVERSION && recv_short == 0)
         {                       /* retry for S_P 1 */
-            printf ("Using Short Packet Version 1.\n");
+            LineToConsole ("Using Short Packet Version 1.\n");
             shortversion = OLDSHORTVERSION;
             sendShortReq (SPK_VON);
         }
@@ -927,7 +929,7 @@
         sprefresh (SPK_VFIELD);
         spwinside = ntohs (packet->winside);
         spgwidth = ntohl (packet->gwidth);
-        printf ("Receiving Short Packet Version %d\n", shortversion);
+        LineToConsole ("Receiving Short Packet Version %d\n", shortversion);
         /*
          * Get a `-' style update to fix the kills shown on the playerlist
          * when you first enter and to fix other loss if short packets
@@ -965,8 +967,8 @@
     case SPK_THRESHOLD:
         break;
     default:
-        fprintf (stderr, "%s: unknown response packet value short-req: %d\n",
-                 "netrek", packet->repl);
+        LineToConsole ("%s: unknown response packet value short-req: %d\n",
+                        "netrek", packet->repl);
     }
 }
 
@@ -1253,12 +1255,29 @@
 }
 
 char *whydeadmess[] =
-    { "", "[quit]", "[photon]", "[phaser]", "[planet]", "[explosion]",
-    "[daemon]", "[winner]", "[ghostbust]", "[genocide]", "[hacker]",
-    "[plasma]",
-    "[tournend]", "[gameover]", "[gamestart]", "[bad binary]",
-    "[detted photon]", "[chain explosion]",
-    "[zapped plasma]", "", "[team det]", "[team explosion]"
+{ 
+    "", 
+    "[quit]",               /* KQUIT        */
+    "[photon]",             /* KTORP        */
+    "[phaser]",             /* KPHASER      */
+    "[planet]",             /* KPLANET      */
+    "[explosion]",          /* KSHIP        */
+    "[daemon]",             /* KDAEMON      */
+    "[winner]",             /* KWINNER      */
+    "[ghostbust]",          /* KGHOST       */
+    "[genocide]",           /* KGENOCIDE    */
+    "[hacker]",             /* KPROVIDENCE  */
+    "[plasma]",             /* KPLASMA      */
+    "[tournend]",           /* TOURNEND     */
+    "[gameover]",           /* KOVER        */
+    "[gamestart]",          /* TOURNSTART   */
+    "[bad binary]",         /* KBADBIN      */
+    "[detted photon]",      /* KTORP2       */
+    "[chain explosion]",    /* KSHIP2       */
+    "[zapped plasma]",      /* KPLASMA2     */
+    "",
+    "[team det]",
+    "[team explosion]"
 };
 
 void
@@ -1913,7 +1932,7 @@
 #ifdef CORRUPTED_PACKETS
         if (pnum < 0 || pnum >= MAXPLAYER)
         {
-            fprintf (stderr, "handleKills: bad index %d\n", pnum);
+            LineToConsole ("handleKills: bad index %d\n", pnum);
             return;
         }
 #endif
@@ -2002,7 +2021,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum < 0 || packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleStats: bad index %d\n", packet->pnum);
+        LineToConsole ("handleStats: bad index %d\n", packet->pnum);
         return;
     }
 #endif

Index: getname.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/getname.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- getname.c	12 Apr 2006 04:20:03 -0000	1.2
+++ getname.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -120,13 +120,13 @@
             readFromServer (NULL);
             if (isServerDead ())
             {
-                printf ("Server is dead!\n");
+                LineToConsole ("Server is dead!\n");
                 exit (0);
             }
         }
         if (loginAccept == 0)
         {
-            printf ("Hmmm... The SOB server won't let me log in as guest!\n");
+            LineToConsole ("Hmmm... The SOB server won't let me log in as guest!\n");
             exit (0);
         }
         return;
@@ -140,7 +140,7 @@
         readFromServer (NULL);
         if (isServerDead ())
         {
-            printf ("Server is dead!\n");
+            LineToConsole ("Server is dead!\n");
             exit (0);
         }
     }
@@ -174,7 +174,7 @@
         readFromServer (NULL);
         if (isServerDead ())
         {
-            printf ("Server is dead!\n");
+            LineToConsole ("Server is dead!\n");
             exit (0);
         }
     }
@@ -474,7 +474,7 @@
                 if (secondsLeft == 0)
                 {
                     me->p_status = PFREE;
-                    printf ("Auto-Quit\n");
+                    LineToConsole ("Auto-Quit\n");
                     exit (0);
                 }
             }
@@ -485,7 +485,7 @@
 
                 if (isServerDead ())
                 {
-                    printf ("Ack!  We've been ghostbusted!\n");
+                    LineToConsole ("Ack!  We've been ghostbusted!\n");
                     exit (0);
                 }
             }
@@ -593,8 +593,7 @@
 void
 noserver (void)
 {
-    printf ("No server name was given. Please put a default server in\n");
-    printf
-        ("your .xtrekrc file or specify the server in the command line.\n");
+    LineToConsole ("No server name was given. Please put a default server in\n");
+    LineToConsole ("your netrekrc.txt file or specify the server in the command line.\n");
     terminate (1);
 }

Index: playback.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/playback.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- playback.c	17 Apr 2006 09:49:45 -0000	1.7
+++ playback.c	21 Apr 2006 12:00:07 -0000	1.8
@@ -512,7 +512,9 @@
     if (size > count)
         count += fread (buf + count, 1, size - count, recordFile);
     if (debug)
-        printf ("Reading packet %d\n", buf[0]);
+    {
+        LineToConsole ("Reading packet %d\n", buf[0]);
+    }
     if (count < size)
     {
         return 1;
@@ -977,7 +979,7 @@
         break;
 #ifdef nodef
     default:
-        printf ("packet type %d", *(unsigned char *) packet);
+        LineToConsole ("packet type %d", *(unsigned char *) packet);
 #endif
     }
 }

Index: option.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/option.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- option.c	18 Apr 2006 13:41:48 -0000	1.5
+++ option.c	21 Apr 2006 12:00:07 -0000	1.6
@@ -288,6 +288,7 @@
     {1, "use continuous mouse", &continuousMouse, 0, 0, 0, NULL, NULL},
     {1, "fix continuous mouse", &continuousMouseFix, 0, 0, 0, NULL, NULL},
 #endif
+    {1, "allow wheel actions", &allowWheelActions, 0, 0, 0, NULL, NULL},
     {1, "new keymap entries: %s", 0, 0, newkeys, 13, NULL, NULL},
     {1, "ignore the capslock key", &ignoreCaps, 0, 0, 0, NULL, NULL},
     {1, "%d updates per second", &updatesPerSec, 0, 0, 0, 0, &updates_range},
@@ -312,6 +313,7 @@
     {1, "show \"total\" message window", 0, &reviewWin, 0, 0, NULL, NULL},
     {1, "show phaser log window", 0, &phaserwin, 0, 0, NULL},
     {1, "show statistic window", 0, &statwin, 0, 0, NULL, NULL},
+    {1, "show alternate player list", 0, &playerw2, 0, 0, NULL, NULL},
     {1, "show help window", 0, &helpWin, 0, 0, NULL, NULL},
     {1, "show hints window", &showHints, &hintWin, 0, 0, NULL, NULL},
 #ifdef XTREKRC_HELP
@@ -330,7 +332,7 @@
     {1, "show UDP control window", 0, &udpWin, 0, 0, NULL, NULL},
     {1, "show ping stats window", 0, &pStats, 0, 0, NULL},
 #ifdef SHORT_PACKETS
-    {1, "show Short Packets window", 0, &spWin, 0, 0, NULL, NULL},
+    {1, "show short packets window", 0, &spWin, 0, 0, NULL, NULL},
 #endif
     {1, "done", &notdone, 0, 0, 0, NULL, NULL},
     {-1, NULL, 0, 0, 0, 0, NULL, NULL}
@@ -407,7 +409,7 @@
         MaxOptions = InitOptionMenus ();
         if (MaxOptions < 0)
         {
-            fprintf (stderr, "InitOptionMenus() error %s!\n", MaxOptions);
+            LineToConsole ("InitOptionMenus() error %s!\n", MaxOptions);
             notdone = 0;
             return;
         }
@@ -677,12 +679,12 @@
             if (plistCustomLayout == 0 && playerListStyle == 0)
                 playerListStyle = (data->key == W_LBUTTON) ? PLISTLASTSTYLE : 1;
 
-            if (W_IsMapped (playerw))
+            if (W_IsMapped (playerw) || W_IsMapped (playerw2))
                 RedrawPlayerList ();
         }
         else if (op->op_option == &playerListObserver)
         {
-            if (W_IsMapped (playerw))
+            if (W_IsMapped (playerw) || W_IsMapped (playerw2))
                 RedrawPlayerList ();
         }
         /* Let's see if this is our option changed */
@@ -838,6 +840,12 @@
             if (showHockeyLinesLocal && !hockey_mode ())
                 showHockeyLinesLocal = 0;
         }
+        else if (op->op_option == &showHockeyScore)
+        {
+            // same as above
+            if (showHockeyScore && !hockey_mode ())
+                showHockeyScore = 0;
+        }
 #endif
         else if (op->op_option == &partitionPlist)
             RedrawPlayerList ();

Index: mswindow.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/mswindow.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- mswindow.c	19 Apr 2006 13:02:33 -0000	1.6
+++ mswindow.c	21 Apr 2006 12:00:07 -0000	1.7
@@ -26,7 +26,7 @@
 #include <stdio.h>
 #include <limits.h>
 #include <string.h>
-
+#include <richedit.h>
 
 #include "copyright2.h"
 #include "config.h"
@@ -79,12 +79,13 @@
 #define WIN_TEXT        2
 #define WIN_MENU        3
 #define WIN_SCROLL      4
+#define WIN_RICHTEXT    5
 
 #define MoveTo(dc, x, y) MoveToEx(dc, x, y, NULL);
 
 // Custom window messages, used for communicating between threads
-#define WM_TERMINATE_WAIT WM_USER
-#define WM_CROSS_THREAD_DESTROY (WM_USER+1)
+#define WM_TERMINATE_WAIT 0x8000
+#define WM_CROSS_THREAD_DESTROY 0x8001
 
 #ifdef DEBUG
 #define MAX_SCROLLWINDOW_LINES 300
@@ -159,7 +160,6 @@
 char FontFileName[] = "\\ntfonts2.fon";
 extern int DefaultsLoaded;
 HWND AnyWindow;
-DWORD MainThreadID;
 
 int W_FastClear = 0;
 W_Font W_BigFont, W_RegularFont;
@@ -525,6 +525,16 @@
         pfnFastCallKill(0);
         FreeLibrary(hWinkeyLibrary);
     }
+
+    /* empty console buffer */
+    while (consHead)
+    {
+        struct cons_buffer * tmp;
+        tmp = consHead->next;
+        free (consHead->string);
+        free (consHead);
+        consHead = tmp;
+    }
 }
 
 #define MakeTeamCursor(upper, team) \
@@ -553,7 +563,8 @@
     char FileName[100];
     WNDCLASSEX wc;
     static int InitDone = 0;
-    HINSTANCE hCursorLibrary;
+    HMODULE hCursorLibrary;
+    HMODULE hRichTextLibrary;
 
     GetColors ();
 
@@ -562,7 +573,7 @@
     InitDone = -1;
 
 #ifdef DEBUG
-    printf ("Initializing windowing system\n");
+    LineToConsole ("Initializing windowing system\n");
 #endif
 
     //Register our class
@@ -582,7 +593,13 @@
     RegisterClassEx (&wc);
     if ((hCursorLibrary = LoadLibrary ("bitmaps/CURSLIB.DLL")) == NULL)
     {
-        fprintf (stderr, "Could not open curslib.dll\n");
+        LineToConsole ("Could not load curslib.dll\n");
+        exit (1);
+    }
+
+    if ((hRichTextLibrary = LoadLibrary ("riched20.dll")) == NULL)
+    {
+        LineToConsole ("Could not load riched20.dll\n");
         exit (1);
     }
 
@@ -613,7 +630,7 @@
                    32, 32, LR_MONOCHROME);
 
     if (RomCursor == NULL)
-        printf ("Whhops, there it is!\n");
+        LineToConsole ("Whoops, there it is!\n");
 
     FreeLibrary (hCursorLibrary);
 
@@ -708,6 +725,7 @@
     VKShiftMap[VK_ESCAPE] = 27; // Map shift+escape-> escape
 
     MainThreadID = GetCurrentThreadId ();       // Save main thread ID so we can tell
+    MainThread = GetCurrentThread;              // Also save main thread handle
     // which thread we're in later
 
     // Get the current system colors
@@ -724,7 +742,7 @@
         if (hWinkeyLibrary < (HINSTANCE) 32)
         {
             //Just continue if there is a problem
-            fprintf (stderr, "Unable to load __fastcall DLL");
+            LineToConsole ("Unable to load __fastcall DLL");
         }
         else 
         {
@@ -733,7 +751,7 @@
             if (!pfnFastCallKill)
             {
                 //Just continue if there is a problem
-                fprintf (stderr, "Unable to initialize __fastcall");
+                LineToConsole ("Unable to initialize __fastcall");
             }
             else
             {
@@ -784,7 +802,7 @@
                 i = GetDeviceCaps (hdc, BITSPIXEL) * GetDeviceCaps (hdc,
                                                                     PLANES);
 #ifdef DEBUG
-                printf ("Bits per pixel detected: %d\n", i);
+                LineToConsole ("Bits per pixel detected: %d\n", i);
 #endif
 
                 if ((i <= 4)
@@ -833,7 +851,9 @@
                         colortable[i].rgb =
                             RGB (xclrs[j].r, xclrs[j].g, xclrs[j].b);
                     else
-                        fprintf (stderr, "Color '%s' unknown\n", def);
+                    {
+                        LineToConsole ("Color '%s' unknown\n", def);
+                    }
                 }
         }
 
@@ -841,7 +861,7 @@
         {
         case 1:
 #ifdef DEBUG
-            printf ("16 color display detected.\n");
+            LineToConsole ("16 color display detected.\n");
 #endif
             break;
 
@@ -868,7 +888,7 @@
                 NetrekPalette = CreatePalette (pal);
 
 #ifdef DEBUG
-                printf ("Paletted color display detected.\n");
+                LineToConsole ("Paletted color display detected.\n");
 #endif
             }
             break;
@@ -934,7 +954,7 @@
 
     /* find the window with the name specified */
     if (found = FindWindow (ClassName, adefault))
-        *parent = (W_Window) GetWindowLong (found, 0);  //Return struct ptr
+        *parent = (W_Window) GetWindowLongPtr (found, GWLP_USERDATA);  //Return struct ptr
 
     return;
 }
@@ -963,7 +983,7 @@
 
     if (!(window = (Window *) malloc (sizeof (Window))))
     {
-        printf ("Not enough memory to create a new window.");
+        LineToConsole ("Not enough memory to create a new window.");
         return 0;
     }
     memset (window, 0, sizeof (Window));
@@ -1053,17 +1073,28 @@
 
     //Actually create the window
     //Hacked to allow negative create locations -SAC
-    window->hwnd = CreateWindow (ClassName, s, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | SpecialStyle, 
-                                x + parentwin->border, y + parentwin->border, width + border * 2, 
-                                height + border * 2 + 
-                                ((SpecialStyle & WS_CAPTION) ? GetSystemMetrics (SM_CYCAPTION) : 0), 
-                                parentwin->hwnd, NULL, MyInstance, (void *) window);      
-                                //Pass Window struct * as user param
-
+    if (window->type == WIN_RICHTEXT)
+    {
+        window->hwnd = CreateWindowEx (0, RICHEDIT_CLASS, "",
+                                       WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CHILD |
+                                       WS_VSCROLL | WS_BORDER | ES_READONLY | ES_MULTILINE,
+                                       x + parentwin->border, y + parentwin->border,
+                                       width + border * 2, height + border * 2,
+                                       parentwin->hwnd, NULL, MyInstance, (void *) window);
+    }
+    else
+    {
+        window->hwnd = CreateWindow (ClassName, s, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | SpecialStyle, 
+                                    x + parentwin->border, y + parentwin->border, 
+                                    width + border * 2, height + border * 2 + 
+                                    ((SpecialStyle & WS_CAPTION) ? GetSystemMetrics (SM_CYCAPTION) : 0), 
+                                    parentwin->hwnd, NULL, MyInstance, (void *) window);      
+                                    //Pass Window struct * as user param
+    }
 
     if (!window->hwnd)
     {
-        printf ("CreateWindow() for %s failed...", name);
+        LineToConsole ("CreateWindow() for %s failed...", name);
         return (0);
     }
 
@@ -1221,8 +1252,8 @@
 	newwin->orig_height = orig_height;
 
     //Give it a scroll bar, and set the range (to zero, initially)
-    SetWindowLong (newwin->hwnd, GWL_STYLE,
-                   GetWindowLong (newwin->hwnd, GWL_STYLE) | WS_VSCROLL);
+    SetWindowLongPtr (newwin->hwnd, GWL_STYLE,
+                      GetWindowLongPtr (newwin->hwnd, GWL_STYLE) | WS_VSCROLL);
     SetScrollRange (newwin->hwnd, SB_VERT, 0, 0, FALSE);
 
     //Map (show) the window if the user spec'd it
@@ -1272,7 +1303,7 @@
     if (!
         (items =
          (struct menuItem *) malloc (height * sizeof (struct menuItem))))
-        fprintf (stderr, "Could not allocate storage for menu window");
+        LineToConsole ("Could not allocate storage for menu window");
     else
         for (i = 0; i < height; i++)
         {
@@ -1581,7 +1612,7 @@
 }
 
 // Wait for an event to become available; it returns zero if it recieves a
-// WM_TERMAINTE_WAIT (defined as WM_USER) message,
+// WM_TERMINATE_WAIT (defined as 0x8000) message,
 // which we use to reset the game (it's issued by another thread)
 int
 W_WaitForEvent ()
@@ -1590,9 +1621,8 @@
 
     while (EventHead == EventTail)      // Get an event
     {
-
         GetMessage (&msg, NULL, 0, 0);
-        if (msg.message == WM_TERMINATE_WAIT)   // Quit message recieved
+        if (msg.message == WM_TERMINATE_WAIT || exitFlag)   // Quit message recieved
             return 0;
 
         //TranslateMessage(&msg);          //translate keyboard messages,
@@ -1606,7 +1636,8 @@
 void
 W_TerminateWait ()
 {
-    PostMessage (AnyWindow, WM_TERMINATE_WAIT, 0, 0);
+    while (PostMessage (AnyWindow, WM_TERMINATE_WAIT, 0, 0) == 0)
+        ;
 }
 
 //Get the next event (message). Simply copies the event *, and advances the pointer
@@ -1643,7 +1674,7 @@
 //processing of the zillion other messages that go through the loop.
 
 #define GET_STRUCT_PTR\
-   win=(Window *)GetWindowLong(hwnd, 0)
+   win = (Window *) GetWindowLongPtr (hwnd, GWLP_USERDATA)
 
 #define STORE_EVENT\
    i = (EventTail + 1) % EVENT_Q_SIZE;\
@@ -1718,9 +1749,8 @@
     {
     case WM_CREATE:
         //Store our structure pointer - passed from newWindow() as final CreateWindow() param
-        SetWindowLong (hwnd, 0,
-                       (LONG) (Window *) ((CREATESTRUCT *) lParam)->
-                       lpCreateParams);
+        SetWindowLongPtr (hwnd, GWLP_USERDATA,
+                         (LONG) (Window *) ((CREATESTRUCT *) lParam)->lpCreateParams);
         return (0);
 
     case WM_SIZE:
@@ -1735,20 +1765,63 @@
 
     case WM_ENTERSIZEMOVE:
         //Disable possibility to move internal windows
+        {   // have to add bracket to be able to declare variables
+        RECT baseRect;  // baseWin rectangle
+        RECT winRect;   // current window rectangle       
+
         GET_STRUCT_PTR;
 
-        if (windowMove || (win->hwnd == ((Window *) baseWin)->hwnd))
+        /* this has to be the same as for WM_EXITSIZEMOVE */
+        if (windowMove || 
+            (win->hwnd == ((Window *) baseWin)->hwnd) ||
+            (((Window *) metaWin != NULL && win->hwnd == ((Window *) metaWin)->hwnd)) ||
+            (((Window *) waitWin != NULL && win->hwnd == ((Window *) waitWin)->hwnd)) ||
+            (((Window *) countWin != NULL && win->hwnd == ((Window *) countWin)->hwnd)) ||
+            (((Window *) motdButtonWin != NULL && win->hwnd == ((Window *) motdButtonWin)->hwnd)) ||
+            (((Window *) motdWin != NULL && win->hwnd == ((Window *) motdWin)->hwnd)))
             break;
 
-        //Save window position to RECT
-        GetWindowRect (win->hwnd, &movingr);
+        GetWindowRect (win->hwnd, &winRect);
+        GetWindowRect (((Window *) baseWin)->hwnd, &baseRect);
+
+        movingr.left = winRect.left - baseRect.left;
+        movingr.top = winRect.top - baseRect.top;
+        movingr.right = winRect.right - baseRect.left;
+        movingr.bottom = winRect.bottom - baseRect.top;
+
+        /* In case of WS_CAPTION (titlebar on) we have to subtract caption size and
+           additional borders to get screen coordinates */
+        if (GetWindowLongPtr (((Window *) baseWin)->hwnd, GWL_STYLE) & WS_CAPTION)
+        {
+            movingr.left -= GetSystemMetrics (SM_CXFIXEDFRAME);
+            movingr.top -= (GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION));
+            movingr.right -= GetSystemMetrics (SM_CXFIXEDFRAME);
+            movingr.bottom -= (GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION));
+        }
+
+        /* If our window has parent we have to subtract parent's border as well */
+        if (win->parent != (Window *) baseWin)
+        {
+            movingr.left -= win->parent->border / 2;
+            movingr.top -= win->parent->border / 2;
+            movingr.right -= win->parent->border / 2;
+            movingr.bottom -= win->parent->border / 2;
+        }
+        }
         break;
 
     case WM_EXITSIZEMOVE:
         //Disable possibility to move internal windows
         GET_STRUCT_PTR;
 
-        if (windowMove || (win->hwnd == ((Window *) baseWin)->hwnd))
+        /* this has to be the same as for WM_ENTERSIZEMOVE */
+        if (windowMove || 
+            (win->hwnd == ((Window *) baseWin)->hwnd) ||
+            (((Window *) metaWin != NULL && win->hwnd == ((Window *) metaWin)->hwnd)) ||
+            (((Window *) waitWin != NULL && win->hwnd == ((Window *) waitWin)->hwnd)) ||
+            (((Window *) countWin != NULL && win->hwnd == ((Window *) countWin)->hwnd)) ||
+            (((Window *) motdButtonWin != NULL && win->hwnd == ((Window *) motdButtonWin)->hwnd)) ||
+            (((Window *) motdWin != NULL && win->hwnd == ((Window *) motdWin)->hwnd)))
             break;
 
         //Get window position from RECT to restore original location
@@ -1791,7 +1864,7 @@
             if (i != EventHead)
                 EventTail = i;
             EventQueue[EventTail].type = W_EV_EXPOSE;
-            EventQueue[EventTail].Window = (W_Window) GetWindowLong (hwnd, 0);
+            EventQueue[EventTail].Window = (W_Window) GetWindowLongPtr (hwnd, GWLP_USERDATA);
             EventQueue[EventTail].x = ps.rcPaint.left;  //- win->border;
             EventQueue[EventTail].y = ps.rcPaint.top;   //- win->border;
 /*            EventQueue[EventTail].width = ps.rcPaint.right - ps.rcPaint.left;
@@ -1959,14 +2032,6 @@
         {
             LONG wl;
             RECT r;
-            int cx, cy;
-
-            cx = GetSystemMetrics (SM_CXEDGE);
-            if (!cx)
-                cx = GetSystemMetrics (SM_CXBORDER);
-            cy = GetSystemMetrics (SM_CYEDGE);
-            if (!cy)
-                GetSystemMetrics (SM_CYBORDER);
 
             wl = GetWindowLong (((Window *) baseWin)->hwnd, GWL_STYLE);
             GetWindowRect (((Window *) baseWin)->hwnd, &r);
@@ -1982,7 +2047,7 @@
                 r.left -= GetSystemMetrics (SM_CXBORDER);
                 r.top -= GetSystemMetrics (SM_CYBORDER);
             }
-            SetWindowLong (((Window *) baseWin)->hwnd, GWL_STYLE, wl);
+            SetWindowLongPtr (((Window *) baseWin)->hwnd, GWL_STYLE, wl);
             // Update the window since the height has changed
             MoveWindow (((Window *) baseWin)->hwnd, r.left, r.top,
                         r.right - r.left, r.bottom - r.top, TRUE);
@@ -2039,7 +2104,7 @@
         //the mouse is in.
 
         hwnd = WindowFromPoint (pos);
-        if (GetWindowLong (hwnd, GWL_WNDPROC) != (LONG) NetrekWndProc)
+        if (GetWindowLongPtr (hwnd, GWLP_WNDPROC) != (LONG) NetrekWndProc)
             return 0;           //Mouse is not in one of our windows
 
         if (!hwnd || hwnd == ((Window *) baseWin)->hwnd)
@@ -2078,6 +2143,8 @@
 
     case WM_MOUSEMOVE:
         GET_STRUCT_PTR;
+        /*if (win->hwnd != GetFocus ())
+            SetFocus (win->hwnd);*/
         SetCursor (win->cursor);
 
 #if defined(MOTION_MOUSE) || defined(XTRA_MESSAGE_UI)
@@ -2516,10 +2583,14 @@
 
         // If we're not in message windows then we'll map wheel up and
 		// wheel down events as regular mouse events
-        if (win->type != WIN_SCROLL)
+        if (win->type == WIN_GRAPH || win->type == WIN_TEXT || win->type == WIN_MENU)
 		{
 	        //BringWindowToTop (hwnd);
-			GET_STRUCT_PTR;
+			//GET_STRUCT_PTR;
+
+            /* Let's see whether we should process wheel messages */
+            if (!allowWheelActions)
+                return (1);
 
 			STORE_EVENT_MOUSE;
 			LastPressHwnd = hwnd;
@@ -2536,25 +2607,62 @@
 			}
             return (0);
 		}
-
-        i = GetScrollPos (hwnd, SB_VERT);
-        
-        switch (wheel)
+        else if (win->type == WIN_SCROLL)
         {
-        case -1:
-            i += 1;
-            break;
-        case 1:
-            i -= 1;
-            break;
-        default:
+            i = GetScrollPos (hwnd, SB_VERT);
+        
+            switch (wheel)
+            {
+            case -1:
+                i += 1;
+                break;
+            case 1:
+                i -= 1;
+                break;
+            default:
+                return (0);
+            }
+
+            SetScrollPos (hwnd, SB_VERT, i, TRUE);  //Move scroll
+            InvalidateRect (hwnd, &win->ClipRect, TRUE);    //Redraw text in window
+            UpdateWindow (hwnd);
             return (0);
         }
+        else if (win->type == WIN_RICHTEXT)
+        {
+            POINT p;
+            RECT r;
+            int lines, visline, maxscroll;
 
-        SetScrollPos (hwnd, SB_VERT, i, TRUE);  //Move scroll
-        InvalidateRect (hwnd, &win->ClipRect, TRUE);    //Redraw text in window
-        UpdateWindow (hwnd);
-        return (0);
+            SendMessage (win->hwnd, EM_GETSCROLLPOS, 0, (LPARAM) &p);
+            SendMessage (win->hwnd, EM_GETRECT, 0, (LPARAM) &r);
+            visline = SendMessage (win->hwnd, EM_GETFIRSTVISIBLELINE, 0, 0);
+            lines = SendMessage (win->hwnd, EM_GETLINECOUNT, 0, 0);
+
+            maxscroll = ((lines - visline) - (r.bottom / W_Textheight)) * W_Textheight;
+
+            switch (wheel)
+            {
+            case -1:
+                p.y += W_Textheight;
+                break;
+            case 1:
+                p.y -= W_Textheight;
+                break;
+            default:
+                return (0);
+            }
+
+            if (p.y > maxscroll)
+                return (0);
+
+            SendMessage (win->hwnd, EM_SETSCROLLPOS, 0, (LPARAM) &p);
+            //InvalidateRect (hwnd, &win->ClipRect, TRUE);    //Redraw text in window
+            //UpdateWindow (hwnd);
+            return (0);
+        }
+        else
+            return (1);
 
         //Trap WM_ERASEBKGRND, to handle windows with tiled backgrounds
     case WM_ERASEBKGND:
@@ -2610,6 +2718,14 @@
         else
             return i;
 
+        // When PostMessage sends us WM_TERMINATE_WAIT it isn't always reaching the right
+        // thread (somehow ;), so to fix the die while scrolling bug I had to add this stupid
+        // flag
+    case WM_TERMINATE_WAIT:
+        exitFlag = 1;
+        WaitForSingleObject (InputThread, INFINITE);
+        return 0;
+
         //This message sent from another thread to indicate a window should be destroyed,
         // which only the main thread can do
     case WM_CROSS_THREAD_DESTROY:
@@ -2667,6 +2783,25 @@
         }
         break;
 
+    case WM_NOTIFY:
+        if (((NMHDR *) lParam)->code == EN_LINK)
+        {
+            ENLINK *link = (ENLINK *) lParam;
+            CHARRANGE cr;
+            char str[250];
+            HWND hwndFrom = link->nmhdr.hwndFrom;
+
+            if (link->msg == WM_LBUTTONDOWN || link->msg == WM_LBUTTONDBLCLK)
+            {
+                SendMessage (hwndFrom, EM_EXGETSEL, 0, (LPARAM) &cr);
+                SendMessage (hwndFrom, EM_EXSETSEL, (WPARAM) 0, (LPARAM) &(link->chrg));
+                SendMessage (hwndFrom, EM_GETSELTEXT, 0, (LPARAM) str);
+                SendMessage (hwndFrom, EM_EXSETSEL, 0, (LPARAM) &cr);
+                ShellExecute (NULL, "open", str, NULL, NULL, SW_SHOWNORMAL);
+            }
+        }
+        break;
+
     }
 
     return DefWindowProc (hwnd, msg, wParam, lParam);
@@ -3097,13 +3232,18 @@
         AddToScrolling (win, color, str, len);
         break;
 
+    case WIN_RICHTEXT:
+//         str[len]=0;
+        AddToRichText (win, color, str, len);
+        break;
+
     case WIN_MENU:
 //         str[len]=0;
         ChangeMenuItem (win, y, str, len, color);
         break;
 
     default:
-        printf ("Unknown window type in W_WriteText");
+        LineToConsole ("Unknown window type in W_WriteText");
     }
 }
 
@@ -3149,13 +3289,18 @@
         AddToScrolling (win, color, str, len);
         break;
 
+    case WIN_RICHTEXT:
+        str[len]=0;
+        AddToRichText (win, color, str, len);
+        break;
+
     case WIN_MENU:
         str[len] = 0;
         ChangeMenuItem (win, y, str, len, color);
         break;
 
     default:
-        printf ("Unknown window type in W_WriteText");
+        LineToConsole ("Unknown window type in W_WriteText");
     }
 }
 
@@ -3170,7 +3315,7 @@
     HDC hdc;
     int t;
 
-    printf ("pBM: %p\nbmlCount: %d", pBM, bmlCount);
+    LineToConsole ("pBM: %p\nbmlCount: %d", pBM, bmlCount);
 
     if (!pBM)
     {
@@ -3189,7 +3334,8 @@
 
     if (pBM && tmp)
     {
-        printf ("tmp: %p\n", tmp);
+        LineToConsole ("tmp: %p\n", tmp);
+
         if (!SelectObject (GlobalMemDC, pBM->bm))
             goto fail;
         if (!(hdc = GetDC (((Window *) tmp)->hwnd)))
@@ -3270,7 +3416,7 @@
         if (!(temp2 = CreateBitmap (width, height, 1, 1, NULL)))
             goto memfail;
 
-        printf (".");
+        LineToConsole (".");
         bmlCount++;
 
         //Mirror bitmap
@@ -3291,7 +3437,7 @@
         }
         else
         {
-            printf
+            LineToConsole
                 ("Got impossible internal error in W_StoreBitmap(). Please report to author.\n");
             exit (-1);
         }
@@ -3350,9 +3496,9 @@
 
         //Copy the bits to their new location, mirroring as we go
         if (!SelectObject (GlobalMemDC, temp))
-            printf ("SelectObject(DC, temp) bombed");
+            LineToConsole ("SelectObject(DC, temp) bombed");
         if (!SelectObject (GlobalMemDC2, CurrentBitmap->bm))
-            printf ("SelectObject(DC2,CurrentBitmap->tm) bombed");
+            LineToConsole ("SelectObject(DC2,CurrentBitmap->tm) bombed");
 
         StretchBlt (GlobalMemDC2, CurX, CurY, width, height, GlobalMemDC,
                     newwidth - 1, 0, -width, height, SRCCOPY);
@@ -3373,7 +3519,7 @@
     return (W_Icon) bitmap;
 
   memfail:
-    printf ("Memory allocation or CreateBitmap() failure in StoreBitmap\n");
+    LineToConsole ("Memory allocation or CreateBitmap() failure in StoreBitmap\n");
     if (bits2)
         free (bits2);
     if (bitmap)
@@ -3439,9 +3585,9 @@
     return (W_Icon) bitmap;
 
   memfail:
-    printf
-        ("Memory allocation or CreateBitmap() failure in StoreBitmap2()\n");
-    printf ("Id: %d %d %d\n", height, width, bits);
+    LineToConsole ("Memory allocation or CreateBitmap() failure in StoreBitmap2()\n");
+    LineToConsole ("Id: %d %d %d\n", height, width, bits);
+
     if (bitmap)
         free (bitmap);
     if (temp)
@@ -3497,9 +3643,9 @@
     return (W_Icon) bitmap;
 
   memfail:
-    printf
-        ("Memory allocation or CreateBitmap() failure in StoreBitmap3()\n");
-    printf ("Id: %d %d %s\n", height, width, BMPfile);
+    LineToConsole ("Memory allocation or CreateBitmap() failure in StoreBitmap3()\n");
+    LineToConsole ("Id: %d %d %s\n", height, width, BMPfile);
+
     if (bitmap)
         free (bitmap);
     if (temp)
@@ -3534,8 +3680,9 @@
     return (W_Icon) bitmap;
 
   memfail:
-    printf ("Memory allocation or malloc() failure in PointBitmap2()\n");
-    printf ("Id: %d %d %d %d \n", col, row, height, width);
+    LineToConsole ("Memory allocation or malloc() failure in PointBitmap2()\n");
+    LineToConsole ("Id: %d %d %d %d \n", col, row, height, width);
+
     if (bitmap)
         free (bitmap);
     return NULL;
@@ -3866,8 +4013,7 @@
         p2 = (struct stringList *) malloc (sizeof (struct stringList));
         if (!p2)
         {
-            fprintf (stderr,
-                     "Not enough memory to allocate a new listbox string.\n");
+            LineToConsole ("Not enough memory to allocate a new listbox string.\n");
             return;
         }
 
@@ -3891,7 +4037,7 @@
     p->string = (char *) malloc (win->TextWidth + 1);
     if (!p->string)
     {
-        printf ("Not enough memory to allocate a new listbox string.");
+        LineToConsole ("Not enough memory to allocate a new listbox string.");
         return;
     }
 
@@ -3912,6 +4058,7 @@
     win->AddedStrings++;
 }
 
+
 //Redraw a scrolling window
 void
 RedrawScrolling (Window * win,
@@ -4283,7 +4430,7 @@
 
     GetCursorPos (&p);
     hwnd = ChildWindowFromPoint (((Window *) baseWin)->hwnd, p);
-    if (!hwnd || (W_Window) GetWindowLong (hwnd, 0) != window)
+    if (!hwnd || (W_Window) GetWindowLongPtr (hwnd, GWLP_USERDATA) != window)
     {
         *x = 0;
         *y = 0;
@@ -4330,8 +4477,7 @@
 {
     if (width > 32 || height > 32)
     {
-        fprintf (stderr,
-                 "Attempt to define cursor > 32x32. Cursor will be garbled!");
+        LineToConsole ("Attempt to define cursor > 32x32. Cursor will be garbled!");
         width = min (32, width);
         height = min (32, height);
     }
@@ -5422,7 +5568,7 @@
         break;
 
     default:
-        printf ("Unknown window type in W_WriteText");
+        LineToConsole ("Unknown window type in W_WriteText");
     }
 }
 
@@ -5454,7 +5600,7 @@
         break;
 
     default:
-        printf ("Unknown window type in W_WriteText");
+        LineToConsole ("Unknown window type in W_WriteText");
     }
 }
 
@@ -5612,3 +5758,205 @@
     BitBlt (sdb->mem_dc, x, y,          //Copy the bitmap
             width, height, GlobalMemDC, srcx, srcy, SRCPAINT);  // <-- using OR mode
 }
+
+
+// Make a WIN_SCROLL type window.
+// We use a scrollbar so we can look through the text, something the X version
+// didn't have. Nyah, nyah.
+W_Window
+W_MakeScrollingRichTextWindow (char *name,
+                               int x,
+                               int y,
+                               int width,
+                               int height,
+                               W_Window parent,
+                               int border)
+{
+    Window *newwin;
+	int orig_x, orig_y, orig_width, orig_height;
+
+    orig_x = x;
+	orig_y = y;
+	orig_width = width;
+	orig_height = height;
+
+    //Get the default position, etc.
+    checkGeometry (name, &x, &y, &width, &height);
+
+    //Get the default parent..
+    checkParent (name, &parent);
+
+    if (!(newwin = newWindow (name, x, y,
+                              width * W_Textwidth + WIN_EDGE * 2 +
+                              GetSystemMetrics (SM_CXVSCROLL),
+                              height * W_Textheight + MENU_PAD * 2, parent,
+                              border, W_White, WIN_RICHTEXT)))
+        return (0);
+
+    SetWindowLongPtr (newwin->hwnd, GWLP_USERDATA, (LONG_PTR) newwin);
+    lpfnDefRichEditWndProc = (WNDPROC) SetWindowLongPtr (newwin->hwnd, GWLP_WNDPROC, 
+                                                        (DWORD) RichTextWndProc);
+    SendMessage (newwin->hwnd, EM_AUTOURLDETECT, TRUE, 0);
+    SendMessage (newwin->hwnd, EM_SETEVENTMASK, 0, ENM_LINK);
+    SendMessage (newwin->hwnd, EM_SETBKGNDCOLOR, 0, W_Black);
+    SendMessage (newwin->hwnd, WM_SETFONT, (WPARAM) W_RegularFont, TRUE);
+
+    //Store the original textheight, width
+    newwin->TextHeight = height;
+    newwin->TextWidth = width;
+
+	/* Set original coordinates, so we will be able to restore to them */
+	newwin->orig_x = orig_x;
+	newwin->orig_y = orig_y;
+	newwin->orig_width = orig_width;
+	newwin->orig_height = orig_height;
+
+    //Map (show) the window if the user spec'd it
+    if (checkMapped (name))
+        W_MapWindow ((W_Window) newwin);
+
+    return (W_Window) newwin;
+}
+
+
+void
+AddToRichText (Window * win,
+               W_Color color,
+               char *str,
+               int len)
+{
+    struct stringList *p = win->strings;
+    struct stringList *end, *p2;
+    int NumStrings = win->NumItems;
+    char str1[256];
+    CHARFORMAT2 cf;
+    POINT point;
+    RECT rect;
+    HWND hwnd;
+    CHARRANGE cr;
+    int numLines, visibleLines;
+
+    //Find the end of the linked-list of strings...
+    if (p)                      // ...if the list has been created
+    {
+        end = p;
+        while (end->next)
+            end = end->next;
+    }
+    else
+    {
+        end = 0;
+        NumStrings = 0;
+    }
+
+    if (NumStrings < MAX_SCROLLWINDOW_LINES)    //Create a new stringList item
+    {
+        p2 = (struct stringList *) malloc (sizeof (struct stringList));
+        if (!p2)
+        {
+            LineToConsole ("Not enough memory to allocate a new listbox string.\n");
+            return;
+        }
+
+        if (!p)
+            win->strings = p2;  //Store the new start of list
+
+        p = p2;                 //Point p to the new string
+
+        win->NumItems = ++NumStrings;   //Inc the string number
+    }
+    else                        //Re-use the first string, place it at the end of the list
+    {
+        if (p->string)
+            free (p->string);
+        win->strings = p->next; //Store the new start of list
+    }
+
+    if (str[len - 1] == '\n')   //Remove trailing newlines
+        str[--len] = 0;
+
+    p->string = (char *) malloc (win->TextWidth + 1);
+    if (!p->string)
+    {
+        LineToConsole ("Not enough memory to allocate a new listbox string.");
+        return;
+    }
+
+    p->color = color;
+    strncpy (p->string, str, win->TextWidth);
+
+    /* we pad out the string with spaces so we don't have to clear
+       the window */
+    if (len < win->TextWidth - 1)
+        memset (p->string + len, ' ', win->TextWidth - len - 1);
+    p->string[win->TextWidth - 1] = 0;
+
+    if (end)
+        end->next = p;
+    p->next = 0;
+
+    //Mark as out of date...
+    win->AddedStrings++;
+
+    hwnd = GetFocus ();
+    SendMessage (win->hwnd, EM_EXGETSEL, 0, (LPARAM) &cr);
+    //SendMessage (win->hwnd, EM_HIDESELECTION, TRUE, 0);
+
+    cf.cbSize = sizeof (CHARFORMAT2);
+    cf.dwEffects = 0;
+    cf.dwMask = CFM_COLOR;
+    cf.crTextColor = colortable[color].rgb;
+
+    strcpy (str1, str);
+    strcat (str1, "\n");
+
+    SendMessage (win->hwnd, EM_GETSCROLLPOS, 0, (LPARAM) &point);
+    numLines = SendMessage (win->hwnd, EM_GETLINECOUNT, 0, 0);
+    SendMessage (win->hwnd, EM_GETRECT, 0, (LPARAM) &rect);
+    visibleLines = rect.bottom / W_Textheight;
+    SendMessage (win->hwnd, EM_SETSEL, -1, -1);
+    SendMessage (win->hwnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf);
+    SendMessage (win->hwnd, EM_REPLACESEL, FALSE, (LPARAM) str1);
+    if (numLines - point.y / W_Textheight > visibleLines + 1)
+    {
+        SendMessage (win->hwnd, EM_SETSCROLLPOS, 0, (LPARAM) &point);
+    }
+    else if (numLines - point.y / W_Textheight == visibleLines + 1)
+    {
+        point.y += W_Textheight;
+        SendMessage (win->hwnd, EM_SETSCROLLPOS, 0, (LPARAM) &point);
+    }
+    //SendMessage (win->hwnd, EM_HIDESELECTION, FALSE, 0);
+    SendMessage (win->hwnd, EM_SCROLLCARET, 0, 0);
+
+    if (cr.cpMin != cr.cpMax)
+        SendMessage (win->hwnd, EM_SETSEL, 0, (LPARAM) &cr);
+
+    if (hwnd)
+        SetFocus (hwnd);
+}
+
+
+LRESULT CALLBACK RichTextWndProc (HWND hwnd,
+                                  UINT msg,
+                                  WPARAM wParam,
+                                  LPARAM lParam)
+{
+//    Window * win;
+
+    switch (msg)
+    {
+/*    case WM_PAINT:
+        GET_STRUCT_PTR;
+        W_ChangeBorder ((W_Window) win, W_White);
+        break;*/
+
+/*    case WM_KEYDOWN:
+        LineToConsole ("key down\n");
+        return (0);*/
+    case WM_LBUTTONDOWN:
+        BringWindowToTop (hwnd);
+        break;
+    }
+    return CallWindowProc (lpfnDefRichEditWndProc, hwnd, msg, wParam, lParam);
+}

Index: newwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/newwin.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- newwin.c	20 Apr 2006 06:48:20 -0000	1.8
+++ newwin.c	21 Apr 2006 12:00:07 -0000	1.9
@@ -13,7 +13,7 @@
 #include <math.h>
 #include <signal.h>
 #include <sys/types.h>
-#include <sys/stat.h>
+
 #include <time.h>
 #include <winsock.h>
 
@@ -478,10 +478,12 @@
     rankw = W_MakeTextWindow ("rank", 50, 300, 65, NUMRANKS + 9, w, 2);
     W_SetWindowExposeHandler (rankw, ranklist);
 
-    playerw = W_MakeTextWindow ("player", 0, WINSIDE + 50,
-                                PlistMaxWidth (), 21, baseWin, 2);
+    playerw = W_MakeTextWindow ("player", 0, WINSIDE + 50, PlistMaxWidth (), 21, baseWin, 2);
     W_SetWindowExposeHandler (playerw, RedrawPlayerList);
 
+    playerw2 = W_MakeTextWindow ("player2", 140, 100, PlistMaxWidth2 (), 32, baseWin, 2);
+    W_SetWindowExposeHandler (playerw2, RedrawPlayerList);
+
 #ifdef RECORDGAME
     if (playback)
         helpWin = W_MakeTextWindow ("help", 286,
@@ -509,29 +511,58 @@
 #endif
 
     /* Message windows */
-    messwa = W_MakeScrollingWindow ("review_all", 506, 668, 81, 5, baseWin, BORDER);
-    wam_windows[0] = messwa;
-    W_SetWindowKeyDownHandler (messwa, handleMessageWindowKeyDown);
+    if (richText)
+    {
+        messwa = W_MakeScrollingRichTextWindow ("review_all", 506, 668, 81, 5, baseWin, BORDER);
+        wam_windows[0] = messwa;
+        W_SetWindowKeyDownHandler (messwa, handleMessageWindowKeyDown);
 
-    messwt = W_MakeScrollingWindow ("review_team", 506, 579, 81, 8, baseWin, BORDER);
-    wam_windows[1] = messwt;
-    W_SetWindowKeyDownHandler (messwt, handleMessageWindowKeyDown);
+        messwt = W_MakeScrollingRichTextWindow ("review_team", 506, 579, 81, 8, baseWin, BORDER);
+        wam_windows[1] = messwt;
+        W_SetWindowKeyDownHandler (messwt, handleMessageWindowKeyDown);
    
-    messwi = W_MakeScrollingWindow ("review_your", 506, 540, 81, 3, baseWin, BORDER);
-    wam_windows[2] = messwi;
-    W_SetWindowKeyDownHandler (messwi, handleMessageWindowKeyDown);
+        messwi = W_MakeScrollingRichTextWindow ("review_your", 506, 540, 81, 3, baseWin, BORDER);
+        wam_windows[2] = messwi;
+        W_SetWindowKeyDownHandler (messwi, handleMessageWindowKeyDown);
     
-    messwk = W_MakeScrollingWindow ("review_kill", 506, 727, 81, 3, baseWin, BORDER);
-    wam_windows[3] = messwk;
+        messwk = W_MakeScrollingRichTextWindow ("review_kill", 506, 727, 81, 3, baseWin, BORDER);
+        wam_windows[3] = messwk;
 
-    phaserwin = W_MakeScrollingWindow ("review_phaser", WINSIDE + BORDER + 6, YOFF + 
-                                        WINSIDE + 3 * BORDER + 2 * MESSAGESIZE +
-                                        15 * W_Textheight + 16, 80, 4, baseWin, BORDER);
-    wam_windows[4] = phaserwin;
+        phaserwin = W_MakeScrollingRichTextWindow ("review_phaser", WINSIDE + BORDER + 6, YOFF + 
+                                                    WINSIDE + 3 * BORDER + 2 * MESSAGESIZE +
+                                                    15 * W_Textheight + 16, 80, 4, baseWin, BORDER);
+        wam_windows[4] = phaserwin;
 
-    reviewWin = W_MakeScrollingWindow ("review", 506, 540, 81, 22, baseWin, BORDER);
-    wam_windows[5] = reviewWin;
-    W_SetWindowKeyDownHandler (reviewWin, handleMessageWindowKeyDown);
+        reviewWin = W_MakeScrollingRichTextWindow ("review", 506, 540, 81, 22, baseWin, BORDER);
+        wam_windows[5] = reviewWin;
+        W_SetWindowKeyDownHandler (reviewWin, handleMessageWindowKeyDown);
+    }
+    else
+    {
+        messwa = W_MakeScrollingWindow ("review_all", 506, 668, 81, 5, baseWin, BORDER);
+        wam_windows[0] = messwa;
+        W_SetWindowKeyDownHandler (messwa, handleMessageWindowKeyDown);
+
+        messwt = W_MakeScrollingWindow ("review_team", 506, 579, 81, 8, baseWin, BORDER);
+        wam_windows[1] = messwt;
+        W_SetWindowKeyDownHandler (messwt, handleMessageWindowKeyDown);
+   
+        messwi = W_MakeScrollingWindow ("review_your", 506, 540, 81, 3, baseWin, BORDER);
+        wam_windows[2] = messwi;
+        W_SetWindowKeyDownHandler (messwi, handleMessageWindowKeyDown);
+    
+        messwk = W_MakeScrollingWindow ("review_kill", 506, 727, 81, 3, baseWin, BORDER);
+        wam_windows[3] = messwk;
+
+        phaserwin = W_MakeScrollingWindow ("review_phaser", WINSIDE + BORDER + 6, YOFF + 
+                                           WINSIDE + 3 * BORDER + 2 * MESSAGESIZE +
+                                           15 * W_Textheight + 16, 80, 4, baseWin, BORDER);
+        wam_windows[4] = phaserwin;
+
+        reviewWin = W_MakeScrollingWindow ("review", 506, 540, 81, 22, baseWin, BORDER);
+        wam_windows[5] = reviewWin;
+        W_SetWindowKeyDownHandler (reviewWin, handleMessageWindowKeyDown);
+    }
     /* End of Message windows */
 
     pStats = W_MakeWindow ("pingStats", 500, 4, pStatsWidth (), pStatsHeight (),
@@ -580,31 +611,30 @@
     statwin = W_MakeWindow ("stats", 405, 506, 100, 80, baseWin, BORDER, foreColor);
     W_SetWindowExposeHandler (statwin, redrawStats);
 
-    scanwin = W_MakeWindow ("scanner", 422, 13, 160, 120, baseWin, 5, foreColor);
-
     W_DefineTrekCursor (baseWin);
     W_DefineLocalcursor (w);
     W_DefineMapcursor (mapw);
     W_DefineTrekCursor (pStats);
     W_DefineTextCursor (warnw);
+    W_DefineTextCursor (messagew);
+    W_DefineTrekCursor (messwa);
     W_DefineTrekCursor (messwt);
     W_DefineTrekCursor (messwi);
+    W_DefineTrekCursor (messwk);
+    W_DefineTrekCursor (reviewWin);
+    W_DefineTrekCursor (phaserwin);
     W_DefineTrekCursor (helpWin);
 
 #ifdef META
     W_DefineArrowCursor (metaWin);
 #endif
 
-    W_DefineTrekCursor (reviewWin);
-    W_DefineTrekCursor (messwk);
-    W_DefineTrekCursor (phaserwin);
     W_DefineTrekCursor (playerw);
+    W_DefineTrekCursor (playerw2);
     W_DefineTrekCursor (rankw);
     W_DefineTrekCursor (statwin);
-    W_DefineTextCursor (messagew);
     W_DefineTrekCursor (tstatw);
     W_DefineWarningCursor (qwin);
-    W_DefineTrekCursor (scanwin);
     W_DefineArrowCursor (udpWin);
 
 #ifdef SHORT_PACKETS
@@ -677,6 +707,8 @@
         W_MapWindow (phaserwin);
         phaserWindow = 1;
     }
+    if (checkMapped ("player2"))
+        W_MapWindow (playerw2);
     if (checkMappedPref ("player", 1))
         W_MapWindow (playerw);
     if (checkMappedPref ("review", 1))
@@ -1049,7 +1081,7 @@
             elapsed = time (0) - startTime;
             if (elapsed > autoQuit)
             {
-                printf ("Auto-Quit.\n");
+                LineToConsole ("Auto-Quit.\n");
                 *team = 4;
                 break;
             }
@@ -1249,7 +1281,9 @@
                 redrawQuit ();
             }
             else if (event.Window == tstatw)
+            {
                 redrawTstats ();
+            }
             else if (event.Window == w)
             {
                 showMotdWin (w, line);
@@ -1319,8 +1353,8 @@
         readFromServer (NULL);
         if (isServerDead ())
         {
-            printf ("Oh SHIT,  We've been ghostbusted!\n");
-            printf ("hope you weren't in a base\n");
+            LineToConsole ("Oh SHIT,  We've been ghostbusted!\n");
+            LineToConsole ("hope you weren't in a base\n");
             /* UDP fail-safe */
             commMode = commModeReq = COMM_TCP;
             commSwitchTimeout = 0;
@@ -1332,7 +1366,7 @@
                 udprefresh (UDP_STATUS);
             }
             connectToServer (nextSocket);
-            printf (" We've been resurrected!\n");
+            LineToConsole (" We've been resurrected!\n");
             pickOk = 0;
             break;
         }
@@ -1594,7 +1628,7 @@
     if ((*temp) == NULL)
     {                           /* malloc error checking --
                                  * 10/30/92 EM */
-        printf ("Warning:  Couldn't malloc space for a new motd line!");
+        LineToConsole ("Warning:  Couldn't malloc space for a new motd line!");
         return;
     }
     /* Motd clearing code */

Index: ping.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/ping.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- ping.c	21 Jan 2003 21:28:42 -0000	1.1.1.1
+++ ping.c	21 Apr 2006 12:00:07 -0000	1.2
@@ -45,7 +45,7 @@
 {
     ping = 1;                   /* we got a ping */
 
-    /* printf("ping received at %d (lag: %d)\n", msetime(), (int)packet->lag); */
+    /* LineToConsole ("ping received at %d (lag: %d)\n", msetime(), (int)packet->lag); */
     sendServerPingResponse ((int) packet->number);
     ping_lag = ntohs (packet->lag);
     ping_iloss_sc = (int) packet->iloss_sc;
@@ -70,7 +70,7 @@
     if (gwrite (sock, (char *) &packet, sizeof (struct ping_cpacket)) !=
         sizeof (struct ping_cpacket))
     {
-        printf ("gwrite failed.\n");
+        LineToConsole ("gwrite failed.\n");
         serverDead = 1;
     }
 }
@@ -86,7 +86,7 @@
     if (gwrite (sock, (char *) &packet, sizeof (struct ping_cpacket)) !=
         sizeof (struct ping_cpacket))
     {
-        printf ("gwrite failed.\n");
+        LineToConsole ("gwrite failed.\n");
         serverDead = 1;
     }
 }
@@ -113,12 +113,12 @@
     packet.cp_sent = htonl (packets_sent);
     packet.cp_recv = htonl (packets_received);
 
-    /* printf("ping response sent at %d\n", msetime()); */
+    /* LineToConsole ("ping response sent at %d\n", msetime()); */
 
     if (gwrite (s, (char *) &packet, sizeof (struct ping_cpacket)) !=
         sizeof (struct ping_cpacket))
     {
-        printf ("gwrite failed.\n");
+        LineToConsole ("gwrite failed.\n");
         serverDead = 1;
     }
 }

Index: stampver.inf
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/stampver.inf,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- stampver.inf	12 Apr 2006 04:20:04 -0000	1.2
+++ stampver.inf	21 Apr 2006 12:00:07 -0000	1.3
@@ -1,5 +1,5 @@
 ;StampVer information file
-FileVersion=4.4.0.3
-ProductVersion=4.4.0.3
+FileVersion=4.4.0.4
+ProductVersion=4.4.0.4
 ;FileFormat=%a.%b.%c Build %04d (%td %tb %tY)
 ;ProductFormat=%a.%b.%c Build %04d

Index: check.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/check.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- check.c	12 Apr 2006 04:20:03 -0000	1.2
+++ check.c	21 Apr 2006 12:00:06 -0000	1.3
@@ -58,7 +58,7 @@
     {
         if ((hp = gethostbyname (serverName)) == NULL)
         {
-            fprintf (stderr, "unknown host '%s'\n", serverName);
+            LineToConsole ("unknown host '%s'\n", serverName);
             terminate (0);
         }
         else
@@ -73,7 +73,7 @@
         perror ("socket");
         terminate (0);
     }
-    printf ("checking %s on port %d\n", serverName, xtrekPort);
+    LineToConsole ("checking %s on port %d\n", serverName, xtrekPort);
     if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) < 0)
     {
         perror ("connect");
@@ -81,7 +81,7 @@
         terminate (0);
     }
 
-    while ((cc = read (sock, buf, BUF_SIZE)) > 0)
+    while ((cc = recv (sock, buf, BUF_SIZE, 0)) > 0)
     {
         fwrite (buf, cc, 1, stdout);
     }

Index: main.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/main.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- main.c	12 Apr 2006 04:20:03 -0000	1.2
+++ main.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -20,6 +20,7 @@
 #include "Wlib.h"
 #include "struct.h"
 #include "proto.h"
+#include "data.h"
 
 char *servertmp = NULL;
 
@@ -30,48 +31,48 @@
 static void
 printUsage (char *prog)
 {
-    printf ("%s %s\n", version, mvers);
-    printf ("Usage: %s [options] [display-name]\n", prog);
-    printf ("Options:\n");
-    printf (" [-h servername]     Specify a server\n");
-    printf (" [-p port number]     Specify a port to connect to\n");
-    printf (" [-r defaultsfile]   Specify defaults file\n");
-    printf
-        (" [-s socketnum]      Specify listen socket port for manual start\n");
-    printf (" [-u]   show usage\n");
-    printf (" [-A]   character password\n");
-    printf (" [-C]   character name\n");
+    LineToConsole ("%s %s\n", version, mvers);
+    LineToConsole ("Usage: %s [options] [display-name]\n", prog);
 
-#ifdef GATEWAY
-    printf (" [-H]   specify host (via gateway)\n");
+    LineToConsole ("Options:\n");
+    LineToConsole (" [-h servername]     specify a server\n");
+    LineToConsole (" [-p port number]    specify a port to connect to\n");
+    LineToConsole (" [-r defaultsfile]   specify defaults file\n");
+    LineToConsole (" [-s socketnum]      specify listen socket port for manual start\n");
+    LineToConsole (" [-U udp_port]       specify client UDP port (useful for some firewalls)\n");
+#ifdef RECORDGAME
+    LineToConsole (" [-F filename]       view recorded game from 'filename'\n");
+    LineToConsole (" [-f filename]       record game into 'filename'\n");
 #endif
+    LineToConsole (" [-l filename]       record messages into 'filename'\n");
 
-    printf
-        (" [-U udp_port]       Specify client UDP port (useful for some firewalls)\n");
+    LineToConsole (" [-A]   character password\n");
+    LineToConsole (" [-C]   character name\n");
+
+#ifdef GATEWAY
+    LineToConsole (" [-H]   specify host (via gateway)\n");
+#endif
 
 #ifdef RSA
-    printf (" [-o]   use old-style binary verification)\n");
-    printf (" [-R]   use RSA binary verification\n");
+    LineToConsole (" [-o]   use old style binary verification\n");
+    LineToConsole (" [-R]   use RSA binary verification\n");
 #endif
 
 #ifdef PACKET_LOG
-    printf (" [-P]   Log server packets, repeat for increased information\n");
+    LineToConsole (" [-P]   log server packets, repeat for increased information\n");
 #endif
 
-    printf (" [-c]   to just do ck_players on the server\n");
-#ifdef RECORDGAME
-    printf (" [-F filename]   View recorded game from 'filename'\n");
-    printf (" [-f filename]   Record game into 'filename'\n");
-#endif
-    printf (" [-l filename]   Record messages into 'filename'\n");
+    LineToConsole (" [-c]   run players check on the server\n");
 
 #ifdef META
-    printf (" [-m]   check metaserver for active servers\n");
-    printf (" [-k]   display known servers\n");
+    LineToConsole (" [-m]   check metaserver for active servers\n");
+    LineToConsole (" [-k]   display known servers\n");
 #endif
 
-	printf (" [-n]   show console window\n");
-    printf (" [-v]   display client version info\n");
+    LineToConsole (" [-D]   output debug info\n");
+    LineToConsole (" [-n]   show console window\n");
+    LineToConsole (" [-u]   show usage\n");
+    LineToConsole (" [-v]   display client version info\n");
 
 }
 
@@ -97,8 +98,6 @@
     int xtrekPort = -1;
 
     name = argv[0];
-//  if ((ptr = RINDEX(name, "/")) != NULL)
-//    name = ptr + 1;
 
 #ifdef GATEWAY
     netaddr = 0;
@@ -143,13 +142,15 @@
 
             case 'u':           /* program usage */
                 usage++;
+                hideConsole = 0;
                 break;
 
             case 'c':           /* run ck_players */
                 checking = 1;
+                hideConsole = 0;
                 break;
 
-            case 's':
+            case 's':           /* listen socket number */
                 if (i < argc)
                 {
                     xtrekPort = atoi (argv[i + 1]);
@@ -160,11 +161,11 @@
                     usage++;
                 break;
 #ifdef RECORDGAME
-            case 'F':
+            case 'F':           /* playback recorded cambot */
                 inplayback = 1;
                 /* No break */
 
-            case 'f':
+            case 'f':           /* record to cambot file */
                 if (i < argc)
                 {
                     recordFileName = argv[i + 1];
@@ -174,7 +175,7 @@
                     usage++;
                 break;
 #endif
-            case 'l':
+            case 'l':           /* log to file */
                 if (i < argc)
                 {
                     logFileName = argv[i + 1];
@@ -184,7 +185,7 @@
                     usage++;
                 break;
 
-            case 'p':
+            case 'p':           /* port to connect to */
                 if (i < argc)
                 {
                     xtrekPort = atoi (argv[i + 1]);
@@ -193,6 +194,7 @@
                 else
                     usage++;
                 break;
+
             case 'd':
                 if (i < argc)
                 {
@@ -204,17 +206,17 @@
                 break;
 
 #ifdef META
-            case 'm':
+            case 'm':           /* show metaserver window */
                 if (usemeta && usemeta != 1)
                 {
-                    fputs ("The options -k and -m are mutuall exclusive\n",
+                    fputs ("The options -k and -m are mutually exclusive\n",
                            stderr);
                     err++;
                 }
                 usemeta = 1;
                 break;
 
-            case 'k':
+            case 'k':           /* show metacache window */
                 if (usemeta && usemeta != 2)
                 {
                     fputs ("The options -k and -m are mutually exclusive\n",
@@ -226,31 +228,31 @@
 #endif
 
 #ifdef RSA
-            case 'o':
+            case 'o':               /* try old binary verification */
                 useRsa = -1;        /* will be reset leter, set
-                                         * negative here * to flag
-                                         * that it should override
-                                         * xtrekrc */
-                printf ("Using standard binary verification\n");
+                                     * negative here * to flag
+                                     * that it should override
+                                     * xtrekrc */
+                LineToConsole ("Using standard binary verification\n");
                 break;
 
-            case 'R':
+            case 'R':               /* try RSA verification */
                 useRsa = -2;        /* will be reset leter, set
-                                         * negative here * to flag
-                                         * that it should override
-                                         * xtrekrc */
-                printf ("Using RSA verification\n");
+                                     * negative here * to flag
+                                     * that it should override
+                                     * xtrekrc */
+                LineToConsole ("Using RSA verification\n");
                 break;
 #else
             case 'R':
-                printf ("This client does not support RSA verification\n");
+                LineToConsole ("This client does not support RSA verification\n");
 
             case 'o':
-                printf ("Using standard binary verification\n");
+                LineToConsole ("Using standard binary verification\n");
                 break;
 #endif
 
-            case 'h':
+            case 'h':           /* server to connect to */
                 if (i < argc)
                 {
                     servertmp = argv[i + 1];
@@ -267,7 +269,7 @@
                 break;
 
 #ifdef GATEWAY
-            case 'H':
+            case 'H':           /* gateway to connect through */
                 hset++;
                 if (i < argc)
                 {
@@ -278,12 +280,12 @@
                     usage++;
                 break;
 #endif
-            case 'U':
+            case 'U':           /* local UDP port */
                 if (i < argc)
                 {
                     if ((baseUdpLocalPort = atoi (argv[i + 1])) == 0)
                     {
-                        fprintf (stderr, "Error: -U requires a port number\n");
+                        LineToConsole ("Error: -U requires a port number\n");
                         exit (1);
                     }
                     i++;
@@ -293,23 +295,23 @@
                 break;
 
 #ifdef PACKET_LOG
-            case 'P':
+            case 'P':           /* log packets */
                 log_packets++;
                 break;
 #endif
-            case 'G':
+            case 'G':           /* try restarting previous session */
                 if (i < argc)
                 {
                     ghoststart++;
                     ghost_pno = atoi (argv[i + 1]);
-                    printf ("Emergency restart being attempted...\n");
+                    LineToConsole ("Emergency restart being attempted...\n");
                     i++;
                 }
                 else
                     usage++;
                 break;
             
-            case 't':
+            case 't':           /* window title */
                 if (i < argc)
                 {
                     title = argv[i + 1];
@@ -319,7 +321,7 @@
                     usage++;
                 break;
             
-            case 'r':
+            case 'r':           /* defaults file */
                 if (i < argc)
                 {
                     deffile = argv[i + 1];
@@ -329,29 +331,31 @@
                     usage++;
                 break;
             
-            case 'D':
+            case 'D':           /* add debug info */
                 debug++;
+                hideConsole = 0;
                 break;
             
-			case 'n':
-				hideConsole = 0;
-				break;
+            case 'n':           /* don't hide console window */
+		hideConsole = 0;
+		break;
 
-            case 'v':
-				printf ("%s %s\n", version, mvers);
-				printf ("%s\n", CBUGS);
+            case 'v':           /* output version info */
+                hideConsole = 0;
+		LineToConsole ("%s %s\n", version, mvers);
+		LineToConsole ("%s\n", CBUGS);
 #ifdef RSA
-                printf ("RSA key installed: %s --- Created by: %s\n", key_name, client_creator);
-                printf ("Client type: %s\n", client_type);
-                printf ("Client arch: %s\n", client_arch);
-                printf ("Key permutation date: %s\n", client_key_date);
-                printf ("Comments: %s\n", client_comments);
+                LineToConsole ("RSA key installed: %s --- Created by: %s\n", key_name, client_creator);
+                LineToConsole ("Client type: %s\n", client_type);
+                LineToConsole ("Client arch: %s\n", client_arch);
+                LineToConsole ("Key permutation date: %s\n", client_key_date);
+                LineToConsole ("Comments: %s\n", client_comments);
 #endif
                 exit (0);
                 break;
             
             default:
-                fprintf (stderr, "%s: unknown option '%c'\n", name, *ptr);
+                LineToConsole ("%s: unknown option '%c'\n", name, *ptr);
                 err++; 
                 break;
             }   /* end switch */
@@ -360,21 +364,25 @@
         }       /* end while */
     }           /* end for */
 
+    if (!usemeta && !servertmp)  /* no meta type was selected, pick metaserver */
+        usemeta = 1;
+
+	if (hideConsole)
+		FreeConsole ();
+
     if (usage || err)
     {
         printUsage (name);
         exit (err);
     }
 
-	if (hideConsole)
-		FreeConsole ();
-
 #ifdef GATEWAY
-    if (!hset) use_trekhopd = 0;        /* allow use via normal
-                                         * connections */
+    if (!hset) use_trekhopd = 0;        /* allow use via normal connections */
     if (netaddr == 0)
-        fprintf (stderr, "netrek: no remote address set (-H).  
+    {
+        LineToConsole ("netrek: no remote address set (-H).  
                           Restricted server will not work.\n");
+    }
 #endif
 
 #ifdef RECORDGAME

Index: map.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/map.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- map.c	18 Apr 2006 13:41:48 -0000	1.3
+++ map.c	21 Apr 2006 12:00:07 -0000	1.4
@@ -364,7 +364,7 @@
 	}
 #endif
 
-        if (l->pl_flags & PLAGRI)
+        if ((l->pl_flags & PLAGRI) && (l->pl_info & me->p_team))
         {
             if (agriCAPS)
             {
@@ -466,6 +466,8 @@
 	int ori_light = FED;
 	char kli_score_line[5];
 	char ori_score_line[5];
+    int ori_offset, kli_offset;
+
 	int i;
 
 	/* Let's check KLI scores */
@@ -493,21 +495,33 @@
 			break;
 
 	/* Now we have scores, so let's draw them */
-	sprintf (kli_score_line, "%-2d", kli_score);
 	sprintf (ori_score_line, "%2d", ori_score);
+	sprintf (kli_score_line, "%-2d", kli_score);
 
-	W_WriteText (mapw, 3 * W_Textwidth, 1 * W_Textheight, W_Kli, 
-				kli_score_line, strlen (kli_score_line), W_RegularFont);
-	/*W_WriteTextDB (mapSDB, 3 * W_Textwidth, 1 * W_Textheight, W_Kli, 
-				   kli_score_line, strlen (kli_score_line), W_RegularFont);*/
+    /* If we rotate galaxy 180 degrees the scoreboard flips */
+    if (rotate == 2)
+    {
+        ori_offset = 8;
+        kli_offset = 3;
+    }
+    else
+    {
+        ori_offset = 3;
+        kli_offset = 8;
+    }
+
+	W_WriteText (mapw, ori_offset * W_Textwidth, 1 * W_Textheight, W_Ori, 
+				ori_score_line, strlen (ori_score_line), W_RegularFont);
+	/*W_WriteTextDB (mapSDB, ori_offset * W_Textwidth, 1 * W_Textheight, W_Ori, 
+				   ori_score_line, strlen (ori_score_line), W_RegularFont);*/
 	W_WriteText (mapw, 6 * W_Textwidth, 1 * W_Textheight, W_White, 
 				":", 1, W_RegularFont);
 	/*W_WriteTextDB (mapSDB, 6 * W_Textwidth, 1 * W_Textheight, W_White, 
 				   ":", 1, W_RegularFont);*/
-	W_WriteText (mapw, 8 * W_Textwidth, 1 * W_Textheight, W_Ori, 
-				ori_score_line, strlen (ori_score_line), W_RegularFont);
-	/*W_WriteTextDB (mapSDB, 8 * W_Textwidth, 1 * W_Textheight, W_Ori, 
-				   ori_score_line, strlen (ori_score_line), W_RegularFont);*/
+	W_WriteText (mapw, kli_offset * W_Textwidth, 1 * W_Textheight, W_Kli, 
+				kli_score_line, strlen (kli_score_line), W_RegularFont);
+	/*W_WriteTextDB (mapSDB, kli_offset * W_Textwidth, 1 * W_Textheight, W_Kli, 
+				   kli_score_line, strlen (kli_score_line), W_RegularFont);*/
 
 }
 #endif /* HOCKEY_LINES */
@@ -744,20 +758,28 @@
 
         if (j->p_flags & PFCLOAK)
         {
-            W_WriteText (mapw, dx - W_Textwidth,
-                         dy - W_Textheight / 2, unColor, cloakChars,
-                         (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont);
-            /*W_WriteTextDB (mapSDB, dx - W_Textwidth,
-                           dy - W_Textheight / 2, unColor, cloakChars,
-                           (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont);*/
+            if (omitTeamLetter)
+                W_WriteText (mapw, dx - (W_Textwidth / 2),
+                             dy - W_Textheight / 2, unColor, cloakChars,
+                             1, W_RegularFont);
+                /*W_WriteTextDB (mapSDB, dx - (W_Textwidth / 2),
+                               dy - W_Textheight / 2, unColor, cloakChars,
+                               (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont);*/
+            else
+                W_WriteText (mapw, dx - W_Textwidth,
+                             dy - W_Textheight / 2, unColor, cloakChars,
+                             (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont);
+                /*W_WriteTextDB (mapSDB, dx - W_Textwidth,
+                               dy - W_Textheight / 2, unColor, cloakChars,
+                               (cloakChars[1] == '\0' ? 1 : 2), W_RegularFont);*/
         }
         else
         {
             if (omitTeamLetter)
-                W_WriteText (mapw, dx - W_Textwidth,
+                W_WriteText (mapw, dx - (W_Textwidth / 2),
                              dy - W_Textheight / 2, playerColor (j),
                              (j->p_mapchars)+1, 1, shipFont (j));
-                /*W_WriteTextDB (mapSDB, dx - W_Textwidth,
+                /*W_WriteTextDB (mapSDB, dx - (W_Textwidth / 2),
                                dy - W_Textheight / 2, playerColor (j),
                                (j->p_mapchars)+1, 1, shipFont (j));*/
             else
@@ -816,10 +838,7 @@
 
         if (j->p_status == PALIVE && !(j->p_flags & PFCLOAK))
         {
-            if (omitTeamLetter) /* we want to draw triangle in the middle */
-                dx = j->p_x * WINSIDE / GWIDTH - (W_Textwidth / 2);
-            else
-                dx = j->p_x * WINSIDE / GWIDTH;
+            dx = j->p_x * WINSIDE / GWIDTH;
             dy = j->p_y * WINSIDE / GWIDTH;
             W_WriteTriangle (mapw, dx, dy + 6, 4, 1, foreColor);
             //W_WriteTriangleDB (mapSDB, dx, dy + 6, 4, 1, foreColor);

Index: redraw.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/redraw.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- redraw.c	19 Apr 2006 13:02:33 -0000	1.4
+++ redraw.c	21 Apr 2006 12:00:07 -0000	1.5
@@ -67,12 +67,15 @@
 
         updateMaxStats (0);     /* Update the max stats
                                  * <isae> */
-        W_FlushScrollingWindow (messwa);
-        W_FlushScrollingWindow (messwt);
-        W_FlushScrollingWindow (messwi);
-        W_FlushScrollingWindow (messwk);
-        W_FlushScrollingWindow (reviewWin);
-        W_FlushScrollingWindow (phaserwin);
+        if (!richText)
+        {
+            W_FlushScrollingWindow (messwa);
+            W_FlushScrollingWindow (messwt);
+            W_FlushScrollingWindow (messwi);
+            W_FlushScrollingWindow (messwk);
+            W_FlushScrollingWindow (reviewWin);
+            W_FlushScrollingWindow (phaserwin);
+        }
 
         UpdatePlayerList ();
     }

Index: sound.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/sound.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- sound.c	21 Jan 2003 21:28:42 -0000	1.1.1.1
+++ sound.c	21 Apr 2006 12:00:07 -0000	1.2
@@ -88,7 +88,7 @@
     char buf[PATH_MAX];
 
 #ifdef DEBUG
-    printf ("Init_Sound\n");
+    LineToConsole ("Init_Sound\n");
 #endif
     if (sound_init)
     {
@@ -260,7 +260,7 @@
     }
     else
     {
-        fprintf (stderr, "Uh oh, bogus refresh number in soundrefresh\n");
+        LineToConsole ("Uh oh, bogus refresh number in soundrefresh\n");
     }
 
     W_WriteText (soundWin, 0, i, textColor, buf, strlen (buf), 0);

Index: cowmain.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/cowmain.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- cowmain.c	17 Apr 2006 09:44:08 -0000	1.6
+++ cowmain.c	21 Apr 2006 12:00:06 -0000	1.7
@@ -74,10 +74,8 @@
 unsigned LONG mkaddr ();
 
 
-unsigned LONG netaddr;          /* used for blessedness
-                                 * checking */
-int serv_port;                  /* used for blessedness
-                                 * checking */
+unsigned LONG netaddr;          /* used for blessedness checking */
+int serv_port;                  /* used for blessedness checking */
 
 static char *gateway = DEFAULT_GATEWAY;
 
@@ -123,7 +121,7 @@
 
     if (!server_count)
     {
-        fprintf (stderr, "No server list, cannot resolve id\n");
+        LineToConsole ("No server list, cannot resolve id\n");
         return (-1);
     }
 
@@ -132,8 +130,8 @@
     {
         if (!strcmp (str, slp->id))
         {
-            printf ("%s is %s(%d) (%s)\n", slp->id, slp->full_name,
-                    slp->remote_port, slp->comment);
+            LineToConsole ("%s is %s(%d) (%s)\n", slp->id, slp->full_name,
+                            slp->remote_port, slp->comment);
             xtrekPort = slp->gw_port;
             str = slp->inet_addr;
             break;
@@ -141,7 +139,7 @@
     }
     if (i == server_count)
     {
-        fprintf (stderr, "Specified server not found.\n");
+        LineToConsole ("Specified server not found.\n");
         return (-1);
     }
 
@@ -162,18 +160,18 @@
     /* do things slightly different */
     if (slp->id == NULL)
     {
-        fprintf (stderr, "ERROR: host ID '%s' unknown\n", str);
+        LineToConsole ("ERROR: host ID '%s' unknown\n", str);
         return (-1);
     }
     xtrekPort = trekhopd_port;  /* ought to have an arg to
                                  * specify this */
     port_req = slp->remote_port;
     host_req = slp->full_name;
-    printf ("Connecting to %s (%d) via trekhopd (%s %d)\n", host_req,
-            port_req, serverName, xtrekPort);
+    LineToConsole ("Connecting to %s (%d) via trekhopd (%s %d)\n", host_req,
+                    port_req, serverName, xtrekPort);
 #else
-    printf ("Connecting to %s through %s port %d\n", str, serverName,
-            xtrekPort);
+    LineToConsole ("Connecting to %s through %s port %d\n", str, serverName,
+                    xtrekPort);
 #endif
 
     return (answer);
@@ -226,7 +224,7 @@
             return;
         }
     }
-    printf ("unable to get ports for your uid\n");      /* debug */
+    LineToConsole ("unable to get ports for your uid\n");      /* debug */
 
     gw_p = getenv ("GW_PORT");
     gw_sp = getenv ("GW_SPORT");
@@ -237,8 +235,7 @@
         gw_port = strtol (gw_p, &err, 10);
         if (err == gw_p)
         {
-            fprintf (stderr, "netrek: malformed integer for GW_PORT: %s\n",
-                     gw_p);
+            LineToConsole ("netrek: malformed integer for GW_PORT: %s\n", gw_p);
             /* let something else complain about port 0 */
         }
     }
@@ -249,8 +246,7 @@
         gw_serv_port = strtol (gw_sp, &err, 10);
         if (err == gw_sp)
         {
-            fprintf (stderr, "netrek: malformed integer for GW_SPORT: %s\n",
-                     gw_sp);
+            LineToConsole ("netrek: malformed integer for GW_SPORT: %s\n", gw_sp);
             /* let something else complain about port 0 */
         }
     }
@@ -262,8 +258,7 @@
         gw_local_port = strtol (gw_lp, &err, 10);
         if (err == gw_lp)
         {
-            fprintf (stderr, "netrek: malformed integer for GW_LPORT: %s\n",
-                     gw_lp);
+            LineToConsole ("netrek: malformed integer for GW_LPORT: %s\n", gw_lp);
             /* let something else complain about port 0 */
         }
     }
@@ -293,7 +288,7 @@
         ad.s_addr = inet_addr (m);
         if (ad.s_addr == -1)
         {
-            fprintf (stderr, "netrek: unknown host \'%s\'\n", m);
+            LineToConsole ("netrek: unknown host \'%s\'\n", m);
             terminate (1);
         }
     }
@@ -343,8 +338,8 @@
     {
         /* failed, give up */
         perror ("warning: Unable to open server list");
-        fprintf (stderr, "Tried to open '%s', '%s', and './%s'\n",
-                 homedot, buf, SERVER_FILE);
+        LineToConsole ("Tried to open '%s', '%s', and './%s'\n",
+                        homedot, buf, SERVER_FILE);
         return;
     }
 
@@ -393,8 +388,7 @@
             }
             if (map_count >= MAX_UDPMAP)
             {
-                fprintf (stderr, "UDP map too large; max is %d entries\n",
-                         MAX_UDPMAP);
+                LineToConsole ("UDP map too large; max is %d entries\n", MAX_UDPMAP);
                 break;
             }
             ump = &udpmap[map_count];
@@ -409,8 +403,8 @@
             ump->local_port = atoi (cp);
 
 #ifdef DEBUG
-            printf ("%2d: %-8d %-8d %-8d %-8d\n", map_count,
-                    ump->uid, ump->serv_port, ump->port, ump->local_port);
+            LineToConsole ("%2d: %-8d %-8d %-8d %-8d\n", map_count,
+                            ump->uid, ump->serv_port, ump->port, ump->local_port);
 #endif
 
             map_count++;
@@ -424,8 +418,7 @@
             }
             if (server_count >= MAX_SERVER)
             {
-                fprintf (stderr, "server list too large; max is %d entries\n",
-                         MAX_SERVER);
+                LineToConsole ("server list too large; max is %d entries\n", MAX_SERVER);
                 break;
             }
             slp = &servers[server_count];
@@ -443,9 +436,9 @@
             STRNCPY (slp->comment, cp, sizeof (slp->comment));
 
 #ifdef DEBUG
-            printf ("%2d: %-9s %-15s %-5d %-5d %-25s \"%s\"\n", server_count,
-                    slp->id, slp->inet_addr, slp->remote_port, slp->gw_port,
-                    slp->full_name, slp->comment);
+            LineToConsole ("%2d: %-9s %-15s %-5d %-5d %-25s \"%s\"\n", server_count,
+                            slp->id, slp->inet_addr, slp->remote_port, slp->gw_port,
+                            slp->full_name, slp->comment);
 #endif
 
             server_count++;
@@ -453,7 +446,7 @@
         case 5:                /* all done! */
             break;
         default:
-            fprintf (stderr, "Whoops!\n");
+            LineToConsole ("Whoops!\n");
             terminate (2);
         }
     }
@@ -472,8 +465,7 @@
 static RETSIGTYPE
 handle_exception (int _dummy)
 {
-    printf
-        ("floating point exception error detected; attempting to continue\n");
+    LineToConsole ("floating point exception error detected; attempting to continue\n");
     /* Under Watcom C++, after a signal handler is called the signal reverts
        to SIG_DFL so has to be reset... is this standard? */
     (void) SIGNAL (SIGFPE, handle_exception);
@@ -501,7 +493,7 @@
 int checking = 0;
 
 #ifdef META
-int usemeta = 1;
+int usemeta = 0;
 #endif
 
 /******************************************************************************/
@@ -541,17 +533,16 @@
         {
             if ((hp = gethostbyname (myname)) == NULL)
             {
-                fprintf (stderr, "unable to get addr for local host\n");
+                LineToConsole ("unable to get addr for local host\n");
                 return (1);
             }
             myaddr = *(LONG *) hp->h_addr;
         }
 
-        /* printf("myname = '%s', myaddr = 0x%.8lx\n", myname, myaddr); */
+        /* LineToConsole ("myname = '%s', myaddr = 0x%.8lx\n", myname, myaddr); */
         if ((myaddr & MYADDR_MASK) != MYADDR)
         {
-            fprintf (stderr,
-                     "Sorry, you may not run this client on this host\n");
+            LineToConsole ("Sorry, you may not run this client on this host\n");
             return (1);
         }
     }
@@ -966,7 +957,7 @@
         sleep (1);
         if (logFile != NULL)
             fclose (logFile);
-        printf ("OK, bye!\n");
+        LineToConsole ("OK, bye!\n");
 
 #ifdef PACKET_LOG
         if (log_packets)

Index: local.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/local.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- local.c	18 Apr 2006 13:41:48 -0000	1.5
+++ local.c	21 Apr 2006 12:00:07 -0000	1.6
@@ -1037,7 +1037,7 @@
                             if (highlightFriendlyPhasers)
                             	W_CacheLine (w, px, py, tx, ty, foreColor);
                             else
-	                    {
+                            {
 	                        if ((php->ph_fuse % 2) == 1)
 	                            W_CacheLine (w, px, py, tx, ty, foreColor);
 	                        else
@@ -1895,7 +1895,6 @@
                     tri_y = dy + 20;    /* below ship */
                     facing = 1;
                 }
-                /* printf("Drawing local triangle at %d %d\n", tri_x, tri_y); */
             }
         }
         else if (me->p_flags & PFPLLOCK)
@@ -1913,7 +1912,6 @@
                 tri_y = dy - 20;        /* below planet */
                 facing = 0;
             }
-            /* printf("Drawing local triangle at %d %d\n", tri_x, tri_y); */
         }
         if (tri_x != -1)
         {

Index: death.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/death.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- death.c	12 Apr 2006 04:20:03 -0000	1.2
+++ death.c	21 Apr 2006 12:00:06 -0000	1.3
@@ -94,6 +94,10 @@
 
     deathFont = W_RegularFont;
 
+#ifdef DEBUG
+    LineToConsole ("Death cause: %d\n", me->p_whydead);
+#endif
+
     switch (me->p_whydead)
     {
     case KQUIT:
@@ -106,13 +110,6 @@
                  teamlet[players[me->p_whodead].p_team],
                  shipnos[me->p_whodead]);
         break;
-    case KPLASMA:
-        sprintf (deathmessage,
-                 "You were SMACKed by a plasma torpedo from %s (%c%c) ",
-                 players[me->p_whodead].p_name,
-                 teamlet[players[me->p_whodead].p_team],
-                 shipnos[me->p_whodead]);
-        break;
     case KPHASER:
         sprintf (deathmessage,
                  "You were phasered to death by %s (%c%c)",
@@ -159,22 +156,36 @@
     case KPROVIDENCE:
         strcpy (deathmessage, "You were nuked by GOD.");
         break;
+    case KPLASMA:
+        sprintf (deathmessage,
+                 "You were SMACKed by a plasma torpedo from %s (%c%c) ",
+                 players[me->p_whodead].p_name,
+                 teamlet[players[me->p_whodead].p_team],
+                 shipnos[me->p_whodead]);
+        break;
+    case TOURNEND:
+        strcpy (deathmessage, "The tournament game has ended.");
+        break;
     case KOVER:
-        strcpy (deathmessage, "The game is  over!");
+        strcpy (deathmessage, "The game is over!");
         break;
     case TOURNSTART:
         strcpy (deathmessage, "The tournament game has begun!");
         break;
-    case TOURNEND:
-        strcpy (deathmessage, "The tournament game has ended.");
-        break;
     case KBADBIN:
-        strcpy (deathmessage,
-                "Your netrek executable didn't verify correctly.");
+        strcpy (deathmessage, "Your netrek executable didn't verify correctly.");
+        break;
+    case KTORP2:
+        strcpy (deathmessage, "You were killed by detonated torpedo");
+        break;
+    case KSHIP2:
+        strcpy (deathmessage, "You were killed by chain reaction explosion");
+        break;
+    case KPLASMA2:
+        strcpy (deathmessage, "You were killed by zapped plasma");
         break;
     default:
-        strcpy (deathmessage,
-                "You were killed by something unknown to this game?");
+        strcpy (deathmessage, "You were killed by something unknown to this game?");
         break;
     }
 
@@ -201,7 +212,7 @@
     if (!playback)
     {                           /* If we are not playing back a recorded game, do this */
         W_TerminateWait ();
-        ENDTHREAD;
+        ExitThread(0);
     }
     else
     {                           /* Otherwise we aren't within a thread, so... */

Index: playerlist.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/playerlist.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- playerlist.c	12 Apr 2006 04:20:04 -0000	1.2
+++ playerlist.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -77,6 +77,7 @@
 
 int partitionPlist = FALSE;
 char *plistCustomLayout;
+char *plist2CustomLayout;
 int plistReorder = FALSE;
 int playerListStyle = 0;
 int playerListObserver = 0;
@@ -101,16 +102,20 @@
 */
 
 char *plistLayout = "";
+char *plist2Layout = "";
 static int plistPos[MAXPLAYER];
 static int plistWidth = 0;
+static int plist2Width = 0;
 static char *my_classes[NUM_TYPES] =
     { "SC", "DD", "CA", "BB", "AS", "SB", "GA", "??" };
 
 /* Local Functions */
 
-static int PlistHeader (char *layout,
+static int PlistHeader (W_Window win,
+                        char *layout,
                         int doWrite);
-static void PlistLine (struct player *j,
+static void PlistLine (W_Window win,
+                       struct player *j,
                        int pos);
 static void WriteSortedPlist (void);
 static void WriteUnsortedPlist (void);
@@ -125,9 +130,8 @@
 {
     /* Find the default style number for the player list. */
 
-    plistCustomLayout = stringDefault ("playerlist");
-
-
+    plistCustomLayout = stringDefault ("playerList");
+    plist2CustomLayout = stringDefault ("playerList2");
 
     /* Select a style number base on the information in the defaults
      * (.xtrekrc) file. */
@@ -208,7 +212,7 @@
     plistCustomLayout = stringDefault ("playerlist");
 
     if (IsNotEmpty (plistCustomLayout))
-        plistWidth = PlistHeader (plistCustomLayout, FALSE);
+        plistWidth = PlistHeader (playerw, plistCustomLayout, FALSE);
     else
         plistWidth = 0;
 
@@ -219,6 +223,22 @@
 }
 
 
+int
+PlistMaxWidth2 ()
+/* Calculate the maximum width of all the defined player lists so that the
+ * width of the player list window can be defined. */
+{
+    plist2CustomLayout = stringDefault ("playerList2");
+
+    if (IsNotEmpty (plist2CustomLayout))
+        plist2Width = PlistHeader (playerw2, plist2CustomLayout, FALSE);
+    else
+        plist2Width = PlistHeader (playerw2, "n T R N l M K W L r O D d ", FALSE);
+
+    return plist2Width;
+}
+
+
 void
 RedrawPlayerList ()
 /* Completly redraw the player list, rather than incrementally updating the
@@ -231,7 +251,7 @@
 {
     int i;
 
-    if (IsEmpty (me) || !W_IsMapped (playerw))
+    if (IsEmpty (me))
         return;
 
 
@@ -263,7 +283,7 @@
         break;
 
     default:
-        fprintf (stderr, "Unknown playerListStyle in ChangedPlistStyle().\n");
+        LineToConsole ("Unknown playerListStyle\n");
         break;
     }
 
@@ -272,10 +292,18 @@
     if (playerListObserver == 2)
         plistLayout = "n N l M";
 
+    if (IsEmpty (plist2CustomLayout))
+        plist2Layout = "n T R N l M K W L r O D d ";
+    else
+        plist2Layout = plist2CustomLayout;
+
     /* Redraw the player list. */
 
     W_ClearWindow (playerw);
-    (void) PlistHeader (plistLayout, TRUE);
+    PlistHeader (playerw, plistLayout, TRUE);
+
+    W_ClearWindow (playerw2);
+    PlistHeader (playerw2, plist2Layout, TRUE);
 
     plistReorder = TRUE;
     plistUpdated = TRUE;
@@ -303,7 +331,7 @@
 
     plistUpdated = FALSE;
 
-    if (!W_IsMapped (playerw))
+    if (!W_IsMapped (playerw) && !W_IsMapped (playerw2))
         return;
 
     if (!plistReorder)
@@ -339,13 +367,22 @@
                 if (players[count].p_status != PFREE)
                 {
                     if (playerListObserver == 0)
-                        PlistLine (players + count, plistPos[count]);
+                    {
+                        PlistLine (playerw, players + count, plistPos[count]);
+                        PlistLine (playerw2, players + count, plistPos[count]);
+                    }
                     else if (playerListObserver == 1 &&
                              players[count].p_mapchars[1] <= 'f')
-                        PlistLine (players + count, plistPos[count]);
+                    {
+                        PlistLine (playerw, players + count, plistPos[count]);
+                        PlistLine (playerw2, players + count, plistPos[count]);
+                    }
                     else if (playerListObserver == 2 &&
                             !(players[count].p_mapchars[1] <= 'f'))
-                        PlistLine (players + count, plistPos[count]);
+                    {
+                        PlistLine (playerw, players + count, plistPos[count]);
+                        PlistLine (playerw2, players + count, plistPos[count]);
+                    }
                 }
             }
             else
@@ -356,7 +393,10 @@
                     !(players[count].p_flags & PFOBSERV)) ||
                     ((playerListObserver == 2) &&
                     (players[count].p_flags & PFOBSERV))))
-                    PlistLine (players + count, plistPos[count]);
+                {
+                    PlistLine (playerw, players + count, plistPos[count]);
+                    PlistLine (playerw2, players + count, plistPos[count]);
+                }
             }
         }
     }
@@ -458,6 +498,7 @@
             {
                 blankLine = last;
                 W_ClearArea (playerw, 0, last, plistWidth, 1);
+                W_ClearArea (playerw2, 0, last, plist2Width, 1);
             }
 
             ++last;
@@ -481,6 +522,7 @@
             {
                 blankLine = last;
                 W_ClearArea (playerw, 0, last, plistWidth, 1);
+                W_ClearArea (playerw2, 0, last, plist2Width, 1);
             }
 
             ++last;
@@ -500,6 +542,7 @@
             {
                 blankLine2 = last;
                 W_ClearArea (playerw, 0, last, plistWidth, 1);
+                W_ClearArea (playerw2, 0, last, plist2Width, 1);
             }
 
             ++last;
@@ -513,7 +556,10 @@
     /* Clear some lines if people have left. */
 
     for (row = last; row < plistLastRow; ++row)
+    {
         W_ClearArea (playerw, 0, row, plistWidth, 1);
+        W_ClearArea (playerw2, 0, row, plist2Width, 1);
+    }
 
     plistLastRow = last;
 
@@ -541,7 +587,8 @@
                 plistPos[i] = row;
                 updatePlayer[i] = FALSE;
 
-                PlistLine (current, row);
+                PlistLine (playerw, current, row);
+                PlistLine (playerw2, current, row);
             }
             else if (playerListObserver == 1 &&
                      current->p_mapchars[1] <= 'f')
@@ -553,7 +600,8 @@
                 plistPos[i] = row;
                 updatePlayer[i] = FALSE;
 
-                PlistLine (current, row);
+                PlistLine (playerw, current, row);
+                PlistLine (playerw2, current, row);
             }
             else if (playerListObserver == 2 &&
                     !(current->p_mapchars[1] <= 'f'))
@@ -565,7 +613,8 @@
                 plistPos[i] = row;
                 updatePlayer[i] = FALSE;
 
-                PlistLine (current, row);
+                PlistLine (playerw, current, row);
+                PlistLine (playerw2, current, row);
             }
         }            
         else
@@ -581,7 +630,8 @@
                 plistPos[i] = row;
                 updatePlayer[i] = FALSE;
 
-                PlistLine (current, row);
+                PlistLine (playerw, current, row);
+                PlistLine (playerw2, current, row);
             }
         }
     }
@@ -645,16 +695,23 @@
         plistPos[count] = pos;
 
         if (players[count].p_status != PFREE)
-            PlistLine (players + count, pos);
+        {
+            PlistLine (playerw, players + count, pos);
+            PlistLine (playerw2, players + count, pos);
+        }
         else
+        {
             W_ClearArea (playerw, 0, pos, plistWidth, 1);
+            W_ClearArea (playerw2, 0, pos, plistWidth, 1);
+        }
     }
 }
 
 
 
 static int
-PlistHeader (char *layout,
+PlistHeader (W_Window win,
+             char *layout,
              int doWrite)
 /* Analyse the heading (field names) for a player list, and set the
  * plistHasSpeed and plistHasHostile flags.
@@ -682,7 +739,7 @@
              * code will dump core here because of an attempt to write over a
              * constant string. */
 
-            fprintf (stderr, "Playerlist truncated to fit buffer.\n");
+            LineToConsole ("Playerlist truncated to fit buffer.\n");
             layout = '\0';
             break;
         }
@@ -911,8 +968,7 @@
 #endif
 
         default:
-            fprintf (stderr,
-                     "%c is not an option for the playerlist\n", *layout);
+            LineToConsole ("%c is not an option for the playerlist\n", *layout);
             break;
         }
     }
@@ -920,25 +976,31 @@
     header[num] = '\0';
 
     if (doWrite)
-        W_WriteText (playerw, 0, 0, textColor, header, num, W_RegularFont);
+        if (W_IsMapped (win))
+            W_WriteText (win, 0, 0, textColor, header, num, W_RegularFont);
 
     return num;
 }
 
 
 static void
-PlistLine (struct player *j,
+PlistLine (W_Window win,
+           struct player *j,
            int pos)
 /* Write the player list entry for player `j' on line `pos'. */
 {
     char buf[BUFSIZ];
     char *ptr;
     char *buffPoint;
+    char *tmpLayout;
     int kills, losses, my_ticks;
     float pRating, oRating, dRating, bRating, Ratings;
     float KillsPerHour, LossesPerHour;  /* Added 12/27/93 ATH */
     double ratio, max_kills;
 
+    if (!W_IsMapped (win))
+        return;
+
     /* Fill pl_row to get right player placement in the list */
     pl_row[j->p_no] = pos;
 
@@ -999,7 +1061,12 @@
 
     buffPoint = buf;
 
-    for (ptr = plistLayout; IsNotZero (*ptr); ++ptr)
+    if (win == playerw)
+        tmpLayout = plistLayout;
+    else
+        tmpLayout = plist2Layout;
+
+    for (ptr = tmpLayout; IsNotZero (*ptr); ++ptr)
     {
         *(buffPoint++) = ' ';
 
@@ -1289,7 +1356,7 @@
     *buffPoint = '\0';
     // Don't draw the line if pos has been set to -1
     if (pos > -1)
-        W_WriteText (playerw, 0, pos, playerColor (j),
+        W_WriteText (win, 0, pos, playerColor (j),
                      buf, buffPoint - buf, shipFont (j));
 }
 

Index: winsndlib.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/winsndlib.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- winsndlib.c	12 Apr 2006 04:20:04 -0000	1.2
+++ winsndlib.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -82,17 +82,17 @@
     in = fopen (fname, "rb");
     if (!in)
     {
-        fprintf (stderr, "Could not open wave file %s\n", fname);
+        LineToConsole ("Could not open wave file %s\n", fname);
         return 0;
     }
 
     fread (chunk, 8, 1, in);    /* read signature, and file length  (which we discard) */
 #ifdef DEBUG
-    printf ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2], chunk[3]);
+    LineToConsole ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2], chunk[3]);
 #endif
     if (strncmp (chunk, "RIFF", 4))
     {
-        fprintf (stderr, "%s is not a valid wave file\n", fname);
+        LineToConsole ("%s is not a valid wave file\n", fname);
         return 0;
     }
 
@@ -103,7 +103,7 @@
         if (feof (in))
             goto NoGood;
 #ifdef DEBUG
-        printf ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2], chunk[3]);
+        LineToConsole ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2], chunk[3]);
 #endif
         if (!strncmp (chunk, "WAVE", 4))
             do
@@ -113,8 +113,8 @@
                 if (feof (in))
                     goto NoGood;
 #ifdef DEBUG
-                printf ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2],
-                        chunk[3]);
+                LineToConsole ("Chunk: %c%c%c%c\n", chunk[0], chunk[1], chunk[2],
+                                chunk[3]);
 #endif
                 if (!strncmp (chunk, "fmt ", 4))        /* found fmt chunk, read header */
                 {
@@ -124,7 +124,7 @@
                         != 1)
                         goto NoGood;
 #ifdef DEBUG
-                    printf ("Yup gosh read the header\n");
+                    LineToConsole ("Yup gosh read the header\n");
 #endif
                     chunksread++;
                 }
@@ -135,7 +135,7 @@
                     if (fread (*data, len, 1, in) != 1)
                         goto NoGood;
 #ifdef DEBUG
-                    printf ("Read %d bytes of data\n", *datalen);
+                    LineToConsole ("Read %d bytes of data\n", *datalen);
 #endif
                     chunksread++;
                 }
@@ -150,7 +150,7 @@
     return 1;
 
   NoGood:
-    fprintf (stderr, "%s is not a valid wave file\n", fname);
+    LineToConsole ("%s is not a valid wave file\n", fname);
     fclose (in);
     return 0;
 }
@@ -166,7 +166,7 @@
     struct sound *itr = newest, *newsnd;
 
 #ifdef DEBUG
-    printf ("Searching for sound %s in cache\n", name);
+    LineToConsole ("Searching for sound %s in cache\n", name);
 #endif
 
     while (itr)
@@ -174,17 +174,17 @@
 #ifdef DEBUG
         if (loopcount > 0 && itr == newest)
         {
-            printf ("Sound list is circular with %d items!\n", loopcount);
+            LineToConsole ("Sound list is circular with %d items!\n", loopcount);
             return 0;
         }
 
         if (loopcount++ > 100)
         {
-            printf ("Stuck in GetSound loop!\n");
+            LineToConsole ("Stuck in GetSound loop!\n");
             return 0;
         }
 
-        printf ("Found %s in cache\n", itr->name);
+        LineToConsole ("Found %s in cache\n", itr->name);
 #endif
 
         if (!strcmp (name, itr->name))
@@ -212,7 +212,7 @@
 
     /* Sound not in cache, must load */
 #ifdef DEBUG
-    printf ("Sound %s not in cache, loading\n", name);
+    LineToConsole ("Sound %s not in cache, loading\n", name);
 #endif
 
     newsnd = (struct sound *) malloc (sizeof (struct sound));
@@ -231,8 +231,8 @@
             struct sound *next = itr->newer;
             bytesused -= itr->hdr.dwBufferLength;
 #ifdef DEBUG
-            printf ("Trimming sound cache, file %s, %d bytes\n", itr->name,
-                    itr->hdr.dwBufferLength);
+            LineToConsole ("Trimming sound cache, file %s, %d bytes\n", itr->name,
+                            itr->hdr.dwBufferLength);
 #endif
             if (next)           /* Remove from list, simple as always at end */
             {
@@ -301,7 +301,7 @@
     if (SoundPlaying ())
     {
 #ifdef DEBUG
-        printf ("Interuppting sound\n");
+        LineToConsole ("Interuppting sound\n");
 #endif
         waveOutReset (hw);
         waveOutUnprepareHeader (hw, &current->hdr, sizeof (WAVEHDR));
@@ -318,7 +318,7 @@
     WAVEOUTCAPS caps;
 
 #ifdef DEBUG
-    printf ("Request to play sound %s\n", name);
+    LineToConsole ("Request to play sound %s\n", name);
 #endif
     StopSound ();
 
@@ -329,33 +329,34 @@
         if (!hw)
         {
 #ifdef DEBUG
-            printf ("Initial open of wave device\n");
+            LineToConsole ("Initial open of wave device\n");
 #endif
             if (err =
                 waveOutOpen (&hw, WAVE_MAPPER, (LPWAVEFORMATEX) & snd->fmt, 0,
                              0, 0))
-                fprintf (stderr, "Could not open wave device, error %d\n",
-                         err);
+            {
+                LineToConsole ("Could not open wave device, error %d\n", err);
+            }
             memcpy (&lastfmt, &snd->fmt, sizeof (PCMWAVEFORMAT));
         }
         else if (memcmp (&snd->fmt, &lastfmt, sizeof (PCMWAVEFORMAT)))
             /* Re-use the currently open sound handle of the formats are the same */
         {
 #ifdef DEBUG
-            printf ("Re-open of wave device\n");
+            LineToConsole ("Re-open of wave device\n");
 #endif
             waveOutClose (hw);
             memcpy (&lastfmt, &snd->fmt, sizeof (PCMWAVEFORMAT));
             if (err =
                 waveOutOpen (&hw, WAVE_MAPPER, (LPWAVEFORMATEX) & snd->fmt, 0,
                              0, 0))
-                fprintf (stderr, "Could not open wave device, error %d\n",
-                         err);
-
+            {
+                LineToConsole ("Could not open wave device, error %d\n", err);
+            }
         }
 #ifdef DEBUG
         else
-            printf ("Re-using open sound handle\n");
+            LineToConsole ("Re-using open sound handle\n");
 #endif
         waveOutPrepareHeader (hw, &snd->hdr, sizeof (WAVEHDR));
         waveOutWrite (hw, &snd->hdr, sizeof (WAVEHDR));
@@ -389,7 +390,7 @@
     int playing;
 
 #ifdef DEBUG
-    printf ("playing = ...");
+    LineToConsole ("playing = ...");
 #endif
     if (!hw || !current)
         return 0;
@@ -401,7 +402,7 @@
         current = NULL;
     }
 #ifdef DEBUG
-    printf ("%d\n", playing);
+    LineToConsole ("%d\n", playing);
 #endif
     return playing;
 }

Index: reserved.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/reserved.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- reserved.c	21 Jan 2003 21:28:42 -0000	1.1.1.1
+++ reserved.c	21 Apr 2006 12:00:07 -0000	1.2
@@ -80,7 +80,7 @@
         netaddr = saddr.sin_addr.s_addr;
     }
 
-    /* printf("Verifying with netaddr %x\n", netaddr); */
+    /* LineToConsole ("Verifying with netaddr %x\n", netaddr); */
     mixin1 = (unsigned char) ((netaddr >> 24) & 0xff);
     mixin2 = pno;
     mixin3 = (unsigned char) ((netaddr >> 16) & 0xff);

Index: docwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/docwin.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- docwin.c	21 Jan 2003 21:28:34 -0000	1.1.1.1
+++ docwin.c	21 Apr 2006 12:00:06 -0000	1.2
@@ -153,7 +153,7 @@
     if (temp == NULL)
     {                           /* malloc error checking --
                                  * 10/30/92 EM */
-        printf ("Warning:  Couldn't malloc space for a new doc line!");
+        LineToConsole ("Warning:  Couldn't malloc space for a new doc line!");
         return;
     }
 
@@ -202,7 +202,7 @@
         if (temp->next == NULL)
         {                       /* malloc error checking --
                                  * 10/30/92 EM */
-            printf ("Warning:  Couldn't malloc space for a new doc line!");
+            LineToConsole ("Warning:  Couldn't malloc space for a new doc line!");
             return;
         }
 
@@ -329,7 +329,7 @@
     if (temp == NULL)
     {                           /* malloc error checking --
                                  * 10/30/92 EM */
-        printf ("Warning:  Couldn't malloc space for a new doc line!");
+        LineToConsole ("Warning:  Couldn't malloc space for a new doc line!");
         return;
     }
 
@@ -361,7 +361,7 @@
         if (temp->next == NULL)
         {                       /* malloc error checking --
                                  * 10/30/92 EM */
-            printf ("Warning:  Couldn't malloc space for a new doc line!");
+            LineToConsole ("Warning:  Couldn't malloc space for a new doc line!");
             return;
         }
 

Index: senddist.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/senddist.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- senddist.c	12 Apr 2006 04:20:04 -0000	1.2
+++ senddist.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -184,7 +184,7 @@
 
     if (!group)
     {
-        printf ("Bad group! %c %d %d\n", addr, recip, group);
+        LineToConsole ("Bad group! %c %d %d\n", addr, recip, group);
         return (0);
     }
 

Index: socket.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/socket.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- socket.c	12 Apr 2006 04:20:04 -0000	1.2
+++ socket.c	21 Apr 2006 12:00:07 -0000	1.3
@@ -423,7 +423,7 @@
                          (char *) &option_value, sizeof (option_value));
     if (status < 0)
     {
-        fprintf (stderr, ("setsockopt() failed, %s\n", strerror (errno)));
+        LineToConsole ("setsockopt() failed, %s\n", strerror (errno));
         /* can still play without this, proceed */
     }
 }
@@ -447,11 +447,11 @@
         sock = -1;
     }
 
-    printf ("Waiting for connection (port %d). \n", port);
+    LineToConsole ("Waiting for connection (port %d). \n", port);
 
     if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0)
     {
-        printf ("I can't create a socket\n");
+        LineToConsole ("I can't create a socket\n");
         terminate (2);
     }
 
@@ -489,7 +489,7 @@
 
     if (select (max_fd, &readfds, NULL, NULL, &timeout) == 0)
     {
-        printf ("Well, I think the server died!\n");
+        LineToConsole ("Well, I think the server died!\n");
         terminate (0);
     }
 
@@ -503,7 +503,7 @@
     if (sock >= max_fd)
         max_fd = sock + 1;
 
-    printf ("Got connection.\n");
+    LineToConsole ("Got connection.\n");
 
     closesocket (s);
     setNoDelay (sock);
@@ -536,7 +536,7 @@
             strcpy (serverName, inet_ntoa (addr.sin_addr));
         }
     }
-    printf ("Connection from server %s (0x%x)\n", serverName, serveraddr);
+    LineToConsole ("Connection from server %s (0x%x)\n", serverName, serveraddr);
 
 }
 
@@ -550,11 +550,11 @@
 
     serverDead = 0;
 
-    printf ("Calling %s on port %d.\n", server, port);
+    LineToConsole ("Calling %s on port %d\n", server, port);
 
     if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0)
     {
-        printf ("I can't create a socket\n");
+        LineToConsole ("I can't create a socket\n");
         terminate (0);
     }
     addr.sin_family = AF_INET;
@@ -564,7 +564,7 @@
     {
         if ((hp = gethostbyname (server)) == NULL)
         {
-            printf ("Who is %s?\n", server);
+            LineToConsole ("Who is %s?\n", server);
             terminate (0);
         }
         else
@@ -576,10 +576,10 @@
 
     if (connect (s, (struct sockaddr *) &addr, sizeof (addr)) < 0)
     {
-        printf ("Server not listening!\n");
+        LineToConsole ("Server not listening!\n");
         terminate (0);
     }
-    printf ("Got connection.\n");
+    LineToConsole ("Got connection.\n");
 
     sock = s;
 
@@ -611,10 +611,10 @@
             strcpy (msg.mesg + 16, host_req);
             if (gwrite (s, &msg, sizeof (struct mesg_cpacket)) < 0)
             {
-                fprintf (stderr, "trekhopd init failure\n");
+                LineToConsole ("trekhopd init failure\n");
                 terminate (1);
             }
-            printf ("--- trekhopd request sent, awaiting reply\n");
+            LineToConsole ("--- trekhopd request sent, awaiting reply\n");
             /* now block waiting for reply */
             count = sizeof (struct mesg_spacket);
 
@@ -629,7 +629,7 @@
 
             if (reply.type != SP_MESSAGE)
             {
-                fprintf (stderr, "Got bogus reply from trekhopd (%d)\n",
+                LineToConsole ("Got bogus reply from trekhopd (%d)\n",
                          reply.type);
                 terminate (1);
             }
@@ -637,9 +637,9 @@
             gw_serv_port = ntohl (*ip++);
             gw_port = ntohl (*ip++);
             serv_port = ntohl (*ip++);
-            printf ("--- trekhopd reply received\n");
+            LineToConsole ("--- trekhopd reply received\n");
 
-            /* printf("ports = %d/%d, %d\n", gw_serv_port, gw_port, serv_port); */
+            /* LineToConsole ("ports = %d/%d, %d\n", gw_serv_port, gw_port, serv_port); */
         }
     }
 #endif /* TREKHOPD */
@@ -836,7 +836,7 @@
         size = ((unsigned char) bufptr[1] * 2) + 2;
         break;
     default:
-        fprintf (stderr, "Unknown variable packet\n");
+        LineToConsole ("Unknown variable packet\n");
         /* terminate(1); */
         return -1;
         break;
@@ -871,8 +871,10 @@
               0);
 
     if (debug)
-        printf ("read %d bytes from %s socket\n",
+    {
+        LineToConsole ("read %d bytes from %s socket\n",
                 count, asock == udpSock ? "UDP" : "TCP");
+    }
 
     if (count <= 0)
     {
@@ -916,7 +918,7 @@
             }
             return (0);
         }
-        printf ("1) Got read() of %d. Server dead\n", count);
+        LineToConsole ("1) Got read() of %d. Server dead\n", count);
         perror ("1) read()");
         serverDead = 1;
         return (0);
@@ -933,14 +935,14 @@
             int i;
 #endif
 
-            fprintf (stderr, "Unknown packet type: %d\n", *bufptr);
+            LineToConsole ("Unknown packet type: %d\n", *bufptr);
 
 #ifndef CORRUPTED_PACKETS
-            printf ("count: %d, bufptr at %d,  Content:\n", count,
-                    bufptr - buf);
+            LineToConsole ("count: %d, bufptr at %d,  Content:\n", count,
+                            bufptr - buf);
             for (i = 0; i < count; i++)
             {
-                printf ("0x%x, ", (unsigned int) buf[i]);
+                LineToConsole ("0x%x, ", (unsigned int) buf[i]);
             }
 #endif
 
@@ -954,20 +956,23 @@
             size = getvpsize (bufptr);
             if (size <= 0)
             {
-                fprintf (stderr, "Bad short-packet size value (%d)\n", size);
+                LineToConsole ("Bad short-packet size value (%d)\n", size);
                 return 0;
             }
 
             if (debug)
-                printf ("read variable packet size %d, type %d\n",
-                        size, *bufptr);
+            {
+                LineToConsole ("read variable packet size %d, type %d\n",
+                                size, *bufptr);
+            }
         }
 #endif /* SHORT_PACKETS */
 
         if (size == 0)
-            fprintf (stderr,
-                     "Variable packet has 0 length! type=%d Trying to read more!\n",
-                     *bufptr);
+        {
+            LineToConsole ("Variable packet has 0 length! type=%d Trying to read more!\n",
+                          *bufptr);
+        }
         /* read broke in the middle of a packet, wait until we get the rest */
         while (size > count + (buf - bufptr) || size == 0)
         {
@@ -981,7 +986,7 @@
             /* readfds=1<<asock; */
             if ((temp = select (max_fd, &readfds, 0, 0, &timeout)) == 0)
             {
-                printf ("Packet fragment.  Server must be dead\n");
+                LineToConsole ("Packet fragment.  Server must be dead\n");
                 serverDead = 1;
                 return (0);
             }
@@ -998,7 +1003,7 @@
             count += temp;
             if (temp <= 0)
             {
-                printf ("2) Got read() of %d.  Server is dead\n", temp);
+                LineToConsole ("2) Got read() of %d.  Server is dead\n", temp);
                 serverDead = 1;
                 return (0);
             }
@@ -1014,7 +1019,9 @@
                  || *bufptr == SP_SC_SEQUENCE))
             {
                 if (debug)
-                    printf ("read packet %d\n", *bufptr);
+                {
+                    LineToConsole ("read packet %d\n", *bufptr);
+                }
 
 #ifdef RECORDGAME
                 if (recordFile != NULL && ckRecordPacket (*bufptr))
@@ -1047,14 +1054,16 @@
                 if (debug)
                 {
                     if (drop_flag)
-                        printf ("%d bytes dropped.\n", size);
+                    {
+                        LineToConsole ("%d bytes dropped.\n", size);
+                    }
                 }
                 UDPDIAG (("Ignored type %d\n", *bufptr));
             }
         }
         else
         {
-            printf ("Handler for packet %d not installed...\n", *bufptr);
+            LineToConsole ("Handler for packet %d not installed...\n", *bufptr);
         }
 
         bufptr += size;
@@ -1071,7 +1080,7 @@
 #ifdef CORRUPTED_PACKETS
     if (ntohs (packet->tnum) >= MAXPLAYER * MAXTORP)
     {
-        fprintf (stderr, "handleTorp: bad index %d\n", ntohs (packet->tnum));
+        LineToConsole ("handleTorp: bad index %d\n", ntohs (packet->tnum));
         return;
     }
 #endif
@@ -1103,8 +1112,7 @@
 #ifdef CORRUPTED_PACKETS
     if (ntohs (packet->tnum) >= MAXPLAYER * MAXTORP)
     {
-        fprintf (stderr, "handleTorpInfo: bad index %d\n",
-                 ntohs (packet->tnum));
+        LineToConsole ("handleTorpInfo: bad index %d\n", ntohs (packet->tnum));
         return;
     }
 #endif
@@ -1116,7 +1124,7 @@
     if (packet->status == TEXPLODE && thetorp->t_status == TFREE)
     {
         /* FAT: redundant explosion; don't update p_ntorp */
-        /* printf("texplode ignored\n"); */
+        /* LineToConsole ("texplode ignored\n"); */
         return;
     }
 
@@ -1161,12 +1169,12 @@
 
     if (debug)
     {
-        printf ("SERVER STATS:\n");
-        printf ("time: %d\n", status->time / (60 * 60 * 10));
-        printf ("kills: %d\n", status->kills);
-        printf ("losses: %d\n", status->losses);
-        printf ("planets: %d\n", status->planets);
-        printf ("armsbomb: %d\n", status->armsbomb);
+        LineToConsole ("SERVER STATS:\n");
+        LineToConsole ("time: %d\n", status->time / (60 * 60 * 10));
+        LineToConsole ("kills: %d\n", status->kills);
+        LineToConsole ("losses: %d\n", status->losses);
+        LineToConsole ("planets: %d\n", status->planets);
+        LineToConsole ("armsbomb: %d\n", status->armsbomb);
     }
 }
 
@@ -1177,7 +1185,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleSelf: bad index %d\n", packet->pnum);
+        LineToConsole ("handleSelf: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1233,7 +1241,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handlePlayer: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlayer: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1382,7 +1390,7 @@
     if (packet->type < 1 || packet->type > NUM_SIZES
         || sizes[packet->type] == 0)
     {
-        printf ("Attempt to send strange packet %d!\n", packet->type);
+        LineToConsole ("Attempt to send strange packet %d!\n", packet->type);
         return;
     }
     size = sizes[packet->type];
@@ -1407,7 +1415,7 @@
         /* business as usual (or player has turned off UDP transmission) */
         if (gwrite (sock, (char *) packet, size) != size)
         {
-            printf ("gwrite failed.  Server must be dead\n");
+            LineToConsole ("gwrite failed.  Server must be dead\n");
             serverDead = 1;
         }
     }
@@ -1471,7 +1479,7 @@
             /* critical stuff, use TCP */
             if (gwrite (sock, (char *) packet, size) != size)
             {
-                printf ("gwrite failed.  Server must be dead\n");
+                LineToConsole ("gwrite failed.  Server must be dead\n");
                 serverDead = 1;
             }
         }
@@ -1489,7 +1497,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLANETS)
     {
-        fprintf (stderr, "handlePlanet: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlanet: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1543,14 +1551,13 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handlePhaser: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePhaser: bad index %d\n", packet->pnum);
         return;
     }
     if (packet->status == PHHIT &&
         (ntohl (packet->target) < 0 || ntohl (packet->target) >= MAXPLAYER))
     {
-        fprintf (stderr, "handlePhaser: bad target %d\n",
-                 ntohl (packet->target));
+        LineToConsole ("handlePhaser: bad target %d\n", ntohl (packet->target));
         return;
     }
 #endif
@@ -1587,9 +1594,10 @@
     packet->mesg[sizeof (packet->mesg) - 1] = '\0';
 #endif
 
-    /* printf("flags: 0x%x\n", packet->m_flags); printf("from: %d\n",
-     * packet->m_from); printf("recpt: %d\n", packet->m_recpt); printf("mesg:
-     * %s\n", packet->mesg); */
+    /* LineToConsole ("flags: 0x%x\n", packet->m_flags);
+     * LineToConsole ("from: %d\n", * packet->m_from);
+     * LineToConsole ("recpt: %d\n", packet->m_recpt);
+     * LineToConsole ("mesg: * %s\n", packet->mesg); */
 
 
     dmessage (packet->mesg, packet->m_flags, packet->m_from, packet->m_recpt);
@@ -1697,7 +1705,7 @@
 #ifdef CORRUPTED_PACKETS
     if (ntohs (packet->pnum) >= MAXPLAYER * MAXPLASMA)
     {
-        fprintf (stderr, "handlePlasmaInfo: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlasmaInfo: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1738,7 +1746,7 @@
 #ifdef CORRUPTED_PACKETS
     if (ntohs (packet->pnum) >= MAXPLAYER * MAXPLASMA)
     {
-        fprintf (stderr, "handlePlasma: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlasma: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1765,7 +1773,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleFlags: bad index %d\n", packet->pnum);
+        LineToConsole ("handleFlags: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1802,7 +1810,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleKills: bad index %d\n", packet->pnum);
+        LineToConsole ("handleKills: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1831,7 +1839,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handlePStatus: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePStatus: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -1954,8 +1962,8 @@
     switch (packet->why)
     {
     case 0:
-        printf ("Sorry, this is an invalid client version.\n");
-        printf ("You need a new version of the client code.\n");
+        LineToConsole ("Sorry, this is an invalid client version.\n");
+        LineToConsole ("You need a new version of the client code.\n");
         break;
     case 1:
     case 2:
@@ -1963,11 +1971,11 @@
     case 4:
     case 5:
     case 6:
-        printf ("Sorry, but you cannot play xtrek now.\n");
-        printf ("Try again later.\n");
+        LineToConsole ("Sorry, but you cannot play xtrek now.\n");
+        LineToConsole ("Try again later.\n");
         break;
     default:
-        printf ("Unknown message from handleBadVersion.\n");
+        LineToConsole ("Unknown message from handleBadVersion.\n");
         return;
     }
     terminate (1);
@@ -1985,8 +1993,7 @@
         {
             if (fd == udpSock)
             {
-                fprintf (stderr, "Tried to write %d, 0x%x, %d\n",
-                         fd, buf, bytes);
+                LineToConsole ("Tried to write %d, 0x%x, %d\n", fd, buf, bytes);
                 perror ("write");
                 printUdpInfo ();
             }
@@ -2006,7 +2013,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleHostile: bad index %d\n", packet->pnum);
+        LineToConsole ("handleHostile: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -2031,7 +2038,7 @@
 #ifdef CORRUPTED_PACKETS
     if (sock == udpSock)
     {
-        fprintf (stderr, "garbage packet discarded.\n");
+        LineToConsole ("garbage packet discarded.\n");
         return;
     }
 #endif
@@ -2039,12 +2046,12 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handlePlyrLogin: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlyrLogin: bad index %d\n", packet->pnum);
         return;
     }
     if (packet->rank >= NUMRANKS)
     {
-        fprintf (stderr, "handlePlyrLogin: bad rank %d\n", packet->rank);
+        LineToConsole ("handlePlyrLogin: bad rank %d\n", packet->rank);
         return;
     }
     packet->name[sizeof (packet->name) - 1] = '\0';
@@ -2059,7 +2066,7 @@
     strcpy (pl->p_login, packet->login);
     pl->p_stats.st_rank = packet->rank;
 
-    /* printf("read player login %s, %s, %s\n", pl->p_name, pl->p_monitor,
+    /* LineToConsole ("read player login %s, %s, %s\n", pl->p_name, pl->p_monitor,
      * pl->p_login); */
 
     if (packet->pnum == me->p_no)
@@ -2094,7 +2101,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleStats: bad index %d\n", packet->pnum);
+        LineToConsole ("handleStats: bad index %d\n", packet->pnum);
         return;
     }
 #endif
@@ -2139,12 +2146,12 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handlePlyrInfo: bad index %d\n", packet->pnum);
+        LineToConsole ("handlePlyrInfo: bad index %d\n", packet->pnum);
         return;
     }
     if (packet->team > ALLTEAM)
     {
-        fprintf (stderr, "handlePlyrInfo: bad team %d\n", packet->team);
+        LineToConsole ("handlePlyrInfo: bad team %d\n", packet->team);
         return;
     }
 #endif
@@ -2195,7 +2202,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLANETS)
     {
-        fprintf (stderr, "handlePlanetLoc: bad index\n");
+        LineToConsole ("handlePlanetLoc: bad index\n");
         return;
     }
 #endif
@@ -2207,7 +2214,7 @@
     if (pl_update[packet->pnum].plu_update != -1)
     {
         pl_update[packet->pnum].plu_update = 1;
-        /* printf("update: %s, old (%d,%d) new (%d,%d)\n", pl->pl_name,
+        /* LineToConsole ("update: %s, old (%d,%d) new (%d,%d)\n", pl->pl_name,
          * pl->pl_x, pl->pl_y, ntohl(packet->x),ntohl(packet->y)); */
     }
     else
@@ -2239,7 +2246,7 @@
 #ifdef CORRUPTED_PACKETS
     if (sock == udpSock)
     {
-        fprintf (stderr, "garbage Reserved packet discarded.\n");
+        LineToConsole ("garbage Reserved packet discarded.\n");
         return;
     }
 #endif
@@ -2263,7 +2270,7 @@
         response.type = CP_RESERVED;
 
 #ifdef DEBUG
-        printf ("Sending RSA reserved response\n");
+        LineToConsole ("Sending RSA reserved response\n");
 #endif
     }
     else
@@ -2358,7 +2365,7 @@
 
     sendServerPacket ((struct player_spacket *) &response);
     /* #ifdef DEBUG */
-    printf ("RSA verification requested.\n");
+    LineToConsole ("RSA verification requested.\n");
     /* #endif */
 }
 
@@ -2374,7 +2381,7 @@
 #ifdef CORRUPTED_PACKETS
     if (packet->pnum >= MAXPLAYER)
     {
-        fprintf (stderr, "handleScan: bad index\n");
+        LineToConsole ("handleScan: bad index\n");
         return;
     }
 #endif
@@ -2622,8 +2629,8 @@
         UDPDIAG (("Received UDP verification\n"));
         break;
     default:
-        fprintf (stderr, "netrek: Got funny reply (%d) in UDP_REPLY packet\n",
-                 packet->reply);
+        LineToConsole ("netrek: Got funny reply (%d) in UDP_REPLY packet\n",
+                         packet->reply);
         break;
     }
 }
@@ -2637,7 +2644,7 @@
 
     if (udpSock >= 0)
     {
-        fprintf (stderr, "netrek: tried to open udpSock twice\n");
+        LineToConsole ("netrek: tried to open udpSock twice\n");
         return (0);             /* pretend we succeeded
                                  * (this could be bad) */
     }
@@ -2708,7 +2715,7 @@
         {
             if ((hp = gethostbyname (serverName)) == NULL)
             {
-                printf ("Who is %s?\n", serverName);
+                LineToConsole ("Who is %s?\n", serverName);
                 terminate (0);
             }
             else
@@ -2735,7 +2742,7 @@
               udpServerPort));
     if (connect (udpSock, (const struct sockaddr *) &addr, sizeof (addr)) < 0)
     {
-        fprintf (stderr, "Error %d: ");
+        LineToConsole ("Error %d: ", WSAGetLastError ());
         perror ("netrek: unable to connect UDP socket");
         printUdpInfo ();        /* debug */
         return (-1);
@@ -2828,7 +2835,7 @@
     V_UDPDIAG (("Closing UDP socket\n"));
     if (udpSock < 0)
     {
-        fprintf (stderr, "netrek: tried to close a closed UDP socket\n");
+        LineToConsole ("netrek: tried to close a closed UDP socket\n");
         return (-1);
     }
     shutdown (udpSock, 2);
@@ -2880,7 +2887,7 @@
             udprefresh (UDP_DROPPED);
 
     newseq = (LONG) ntohs (packet->sequence);
-    /* printf("read %d - ", newseq); */
+    /* LineToConsole ("read %d - ", newseq); */
 
     if (((unsigned short) sequence) > 65000 &&
         ((unsigned short) newseq) < 1000)
@@ -2957,7 +2964,7 @@
             drop_flag = 1;
         }
     }
-    /* printf("newseq %d, sequence %d\n", newseq, sequence); */
+    /* LineToConsole ("newseq %d, sequence %d\n", newseq, sequence); */
     if (recent_count > UDP_RECENT_INTR)
     {
         /* once a minute (at 5 upd/sec), report on how many were dropped */
@@ -2999,7 +3006,7 @@
 
     if (type <= 0 && type > NUM_PACKETS)
     {
-        fprintf (stderr, "Attempted to log a bad packet? \n");
+        LineToConsole ("Attempted to log a bad packet? \n");
         return;
     }
     packet_log[type]++;
@@ -3016,8 +3023,8 @@
         lasttime = this_sec;
         if (log_packets > 1)
         {
-            fprintf (stdout, "%d %d %d\n", this_sec - Start_Time,
-                     data_this_sec, outdata_this_sec);
+            LineToConsole ("%d %d %d\n", this_sec - Start_Time,
+                          data_this_sec, outdata_this_sec);
         }
         if (Start_Time == 0)
         {
@@ -3069,19 +3076,19 @@
 
     Now = time (NULL);
 
-    printf ("Packet Logging Summary:\n");
-    printf ("Start time: %s ", ctime (&Start_Time));
-    printf (" End time: %s Elapsed play time: %3.2f min\n",
-            ctime (&Now), (float) ((Now - Start_Time) / 60));
-    printf ("Maximum CPS in during normal play: %d bytes per sec\n", Max_CPS);
-    printf ("Standard deviation in: %d\n",
-            (int) sqrt ((numpl * s2 - sumpl * sumpl) /
-                        (numpl * (numpl - 1))));
-    printf ("Maximum CPS out during normal play: %d bytes per sec\n",
-            Max_CPSout);
-    printf ("Standard deviation out: %d\n",
-            (int) sqrt ((numpl * sout2 - sumout * sumout) /
-                        (numpl * (numpl - 1))));
+    LineToConsole ("Packet Logging Summary:\n");
+    LineToConsole ("Start time: %s ", ctime (&Start_Time));
+    LineToConsole (" End time: %s Elapsed play time: %3.2f min\n",
+                    ctime (&Now), (float) ((Now - Start_Time) / 60));
+    LineToConsole ("Maximum CPS in during normal play: %d bytes per sec\n", Max_CPS);
+    LineToConsole ("Standard deviation in: %d\n",
+                    (int) sqrt ((numpl * s2 - sumpl * sumpl) /
+                    (numpl * (numpl - 1))));
+    LineToConsole ("Maximum CPS out during normal play: %d bytes per sec\n",
+                    Max_CPSout);
+    LineToConsole ("Standard deviation out: %d\n",
+                    (int) sqrt ((numpl * sout2 - sumout * sumout) /
+                    (numpl * (numpl - 1))));
 
 #ifdef SHORT_PACKETS
     /* total_bytes = ALL_BYTES; *//* Hope this works  HW */
@@ -3113,10 +3120,10 @@
 #endif
     }
 
-    printf ("Total bytes received %d, average CPS: %4.1f\n",
-            total_bytes, (float) (total_bytes / (Now - Start_Time)));
-    printf ("Server Packets Summary:\n");
-    printf ("Num #Rcvd    Size   TotlBytes   %%Total\n");
+    LineToConsole ("Total bytes received %d, average CPS: %4.1f\n",
+                    total_bytes, (float) (total_bytes / (Now - Start_Time)));
+    LineToConsole ("Server Packets Summary:\n");
+    LineToConsole ("Num #Rcvd    Size   TotlBytes   %%Total\n");
     for (i = 0; i <= NUM_PACKETS; i++)
     {
 
@@ -3126,20 +3133,20 @@
         else
             calc_temp = vari_sizes[i];
 
-        printf ("%3d %5d    %4d   %9d   %3.2f\n",
-                i, packet_log[i], handlers[i].size, calc_temp,
-                (float) (calc_temp * 100 / total_bytes));
+        LineToConsole ("%3d %5d    %4d   %9d   %3.2f\n",
+                        i, packet_log[i], handlers[i].size, calc_temp,
+                        (float) (calc_temp * 100 / total_bytes));
 #else
         calc_temp = handlers[i].size * packet_log[i];
-        printf ("%3d %5d    %4d   %9d   %3.2f\n",
-                i, packet_log[i], handlers[i].size, calc_temp,
-                (float) (calc_temp * 100 / total_bytes));
+        LineToConsole ("%3d %5d    %4d   %9d   %3.2f\n",
+                        i, packet_log[i], handlers[i].size, calc_temp,
+                        (float) (calc_temp * 100 / total_bytes));
 #endif
     }
-    printf ("Total bytes sent %d, average CPS: %4.1f\n",
-            outtotal_bytes, (float) (outtotal_bytes / (Now - Start_Time)));
-    printf ("Client Packets Summary:\n");
-    printf ("Num #Sent    Size   TotlBytes   %%Total\n");
+    LineToConsole ("Total bytes sent %d, average CPS: %4.1f\n",
+                    outtotal_bytes, (float) (outtotal_bytes / (Now - Start_Time)));
+    LineToConsole ("Client Packets Summary:\n");
+    LineToConsole ("Num #Sent    Size   TotlBytes   %%Total\n");
     for (i = 0; i <= NUM_SIZES; i++)
     {
 
@@ -3148,15 +3155,15 @@
             calc_temp = cp_msg_size;
         else
             calc_temp = sizes[i] * outpacket_log[i];
-        printf ("%3d %5d    %4d   %9d   %3.2f\n",
-                i, outpacket_log[i], sizes[i], calc_temp,
-                (float) (calc_temp * 100 / outtotal_bytes));
+        LineToConsole ("%3d %5d    %4d   %9d   %3.2f\n",
+                        i, outpacket_log[i], sizes[i], calc_temp,
+                        (float) (calc_temp * 100 / outtotal_bytes));
     }
 #else
         calc_temp = sizes[i] * outpacket_log[i];
-        printf ("%3d %5d    %4d   %9d   %3.2f\n",
-                i, outpacket_log[i], sizes[i], calc_temp,
-                (float) (calc_temp * 100 / outtotal_bytes));
+        LineToConsole ("%3d %5d    %4d   %9d   %3.2f\n",
+                        i, outpacket_log[i], sizes[i], calc_temp,
+                        (float) (calc_temp * 100 / outtotal_bytes));
     }
 #endif
 }