diff newwin.c @ 3:5a977ccbc7a9 default tip

Empty changelog
author darius
date Sat, 06 Dec 1997 05:41:29 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/newwin.c	Sat Dec 06 05:41:29 1997 +0000
@@ -0,0 +1,1573 @@
+/* $Id: newwin.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */
+
+/*
+ * newwin.c
+ */
+#include "copyright.h"
+
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#endif
+#include <math.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <string.h>
+#ifdef hpux
+#include <time.h>
+#else				/* hpux */
+#include <sys/time.h>
+#endif				/* hpux */
+#ifdef RS6K
+#include <sys/select.h>
+#endif
+#include "Wlib.h"
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "gameconf.h"
+
+
+
+#include "oldbitmaps.h"
+#include "bitmaps_pr.h"
+#include "bitmaps3.h"
+#include "hullbitmaps.h"
+#include "planetbitmaps.h"
+#include "rabbitbitmaps.h"
+#include "starbitmaps.h"
+
+#ifdef BEEPLITE
+#include "emph_planet_seq.h"
+#include "emph_player_seq.h"
+#include "emph_player_seql.h"
+#endif
+
+#include "packets.h"
+#include "proto.h"
+
+#define NRHEADERS	4
+W_Icon  headerA, headerB, headerchanges[NRHEADERS];
+W_Icon  safepic;
+/* elapsed time in outfit window [BDyess] */
+int     elapsed;
+
+int     newMotdStuff = 0;	/* set to 1 when new motd packets arrive */
+static struct piclist *motdPics = NULL;
+/*static struct page *currpage = NULL;
+static struct page *motddata = NULL;*/
+
+#define LINESPERPAGE	38
+
+#define BOXSIDE		(WINSIDE / 5)
+#define TILESIDE	16
+#define MESSAGESIZE	20
+#define STATSIZE	(MESSAGESIZE * 2 + BORDER)
+#define YOFF		0
+
+#define stipple_width 16
+#define stipple_height 16
+static unsigned char stipple_bits[] = {
+    0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
+    0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80,
+    0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
+0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80};
+
+/* ATM: extra stuff for those who don't like my visible tractors */
+#define tract_width 5
+#define tract_height 5
+static char tract_bits[] = {
+0x1f, 0x04, 0x04, 0x04, 0x04};
+#define press_width 5
+#define press_height 5
+static char press_bits[] = {
+0x0f, 0x11, 0x0f, 0x01, 0x01};
+
+/* Prototypes */
+static void savebitmaps P((void));
+static int teamRequest P((int team, int ship));
+static int numShips P((int owner));
+static int checkBold P((char *line));
+void showMotd P((W_Window win));
+static void showPics P((W_Window win));
+void showValues P((W_Window win));
+static void getResources P((char *prog));
+static void getTiles P((void));
+static void redrawTeam P((W_Window win, int teamNo, int *lastnum));
+static void redrawQuit P((void));
+static void showTimeLeft P((int time, int max));
+
+/* from dashboard.c: */
+void light_erase P((void));
+
+extern int helpmessages;
+
+void
+newwin(hostmon, progname)
+    char   *hostmon, *progname;
+{
+    int     i;
+
+    /* W_Initialize(hostmon); */
+
+    baseWin = W_MakeWindow("netrek", 0, YOFF, WINSIDE * 2 + 1 * BORDER,
+			   WINSIDE + 2 * BORDER + 2 * MESSAGESIZE, NULL, "bomb here", BORDER, gColor);
+    iconWin = W_MakeWindow("netrek_icon", 0, 0, icon_width, icon_height, NULL,
+			   (char *) 0, BORDER, gColor);
+    W_SetIconWindow(baseWin, iconWin);
+    w = W_MakeWindow("local", -BORDER, -BORDER, WINSIDE, WINSIDE, baseWin,
+		     (char *) 0, BORDER, foreColor);
+    mapw = W_MakeWindow("map", WINSIDE, -BORDER, WINSIDE, WINSIDE, baseWin,
+			(char *) 0, BORDER, foreColor);
+    tstatw = W_MakeWindow("tstat", -BORDER, WINSIDE, WINSIDE, STATSIZE, baseWin,
+			  "xterm", BORDER, foreColor);
+    warnw = W_MakeWindow("warn", WINSIDE, WINSIDE, WINSIDE, MESSAGESIZE,
+			 baseWin, "xterm", BORDER, foreColor);
+    messagew = W_MakeWindow("message", WINSIDE, WINSIDE + BORDER + MESSAGESIZE,
+		 WINSIDE, MESSAGESIZE, baseWin, "xterm", BORDER, foreColor);
+    planetw = W_MakeTextWindow("planet", 10, 10, 75, (nplanets + 13) / 2, w, (char *) 0, 2);
+    planetw2 = W_MakeTextWindow("planet2", 10, 10, 75, (nplanets + 13) / 2, mapw, (char *) 0, 2);
+    rankw = W_MakeTextWindow("rank", 50, 100, 65, nranks2 + 8, w, (char *) 0, 2);
+    playerw = W_MakeTextWindow("player", 0, YOFF + WINSIDE + 2 * BORDER + 2 * MESSAGESIZE,
+			       83, (nplayers + 14) / 2, NULL, (char *) 0, 2);
+    helpWin = W_MakeTextWindow("help", 0, YOFF + WINSIDE + 2 * BORDER + 2 * MESSAGESIZE,
+		       160, helpmessages / 4 + 1, NULL, (char *) 0, BORDER);
+#ifdef METASERVER
+    /*
+       metaWin = W_MakeMenu ("MetaServer List", WINSIDE+10, -BORDER+10, 69,
+       num_servers + 2, NULL, 2);
+    */
+#endif				/* METASERVER */
+#if 0
+    W_SetWindowKeyDownHandler(metaWin, metaaction);
+    W_SetWindowButtonHandler(metaWin, metaaction);
+#endif				/* 0 */
+
+    initMessageWindows();
+
+    pStats = W_MakeWindow("Network Statistics", 500, 4, pStatsWidth(), pStatsHeight(),
+			  NULL, (char *) 0, 1, foreColor);
+    udpWin = W_MakeMenu("UDP", WINSIDE + 10, -BORDER + 10, 40, UDP_NUMOPTS,
+			NULL, 2);
+
+#ifdef SHORT_PACKETS
+    spWin = W_MakeMenu("network", WINSIDE + 10, -BORDER + 10, 40, SPK_NUMFIELDS,
+		       NULL, 2);
+#endif
+
+#ifdef TOOLS
+  toolsWin = W_MakeScrollingWindow("tools", WINSIDE + BORDER, BORDER,
+				   80, TOOLSWINLEN, NULL, "xterm", BORDER);
+#endif
+
+    motdWin = W_MakeWindow("Motd"
+			   ,-BORDER, -BORDER, WINSIDE, WINSIDE, NULL,
+			   (char *) 0, BORDER, foreColor);
+
+    for (i = 0; i < 4; i++) {
+	teamWin[i] = W_MakeWindow(teaminfo[i].shortname, i * BOXSIDE, 0,
+			  BOXSIDE, BOXSIDE, mapw, (char *) 0, 1, foreColor);
+    }
+    qwin = W_MakeWindow("quit", 4 * BOXSIDE, 0, BOXSIDE, BOXSIDE, mapw,
+			"pirate", 1, foreColor);
+
+/*    statwin = W_MakeWindow("stats", 422, 13, 160, 95, NULL, (char*)0,
+      5, foreColor);*/
+    statwin = W_MakeWindow("stats", 422, 13, 160, 80, NULL,
+			   (char *) 0, 5, foreColor);
+
+#define WARHEIGHT 2
+#define WARWIDTH 20
+#define WARBORDER 2
+
+    war = W_MakeMenu("war", WINSIDE + 10, -BORDER + 10, WARWIDTH, 6, baseWin,
+		     WARBORDER);
+
+
+    getResources(progname);
+    savebitmaps();
+}
+
+void
+mapAll()
+{
+    initinput();
+    W_MapWindow(mapw);
+    W_MapWindow(tstatw);
+    W_MapWindow(warnw);
+    W_MapWindow(messagew);
+    W_MapWindow(w);
+    W_MapWindow(baseWin);
+
+    /*
+       since we aren't mapping windows that have root as parent in
+       x11window.c (since that messes up the TransientFor feature) we have to
+       map them here. (If already mapped, W_MapWindow returns)
+    */
+
+    if (checkMapped("planet"))
+	W_MapWindow(planetw);
+    if (checkMapped("planet2"))
+	W_MapWindow(planetw2);
+    if (checkMapped("rank"))
+	W_MapWindow(rankw);
+    if (checkMapped("help"))
+	W_MapWindow(helpWin);
+    if (checkMapped("Motd"))
+	W_MapWindow(motdWin);
+    if (checkMapped("review_all"))
+	W_MapWindow(messWin[WALL].window);
+    if (checkMapped("review_team"))
+	W_MapWindow(messWin[WTEAM].window);
+    if (checkMapped("review_your"))
+	W_MapWindow(messWin[WINDIV].window);
+    if (checkMapped("review_kill"))
+	W_MapWindow(messWin[WKILL].window);
+    if (checkMapped("review_phaser"))
+	W_MapWindow(messWin[WPHASER].window);
+    if (booleanDefault("player.mapped", 1))
+	W_MapWindow(playerw);
+    if (booleanDefault("review.mapped", 1))
+	W_MapWindow(messWin[WREVIEW].window);
+    if (checkMapped("UDP"))
+	udpwindow();
+
+}
+
+static void
+savebitmaps()
+{
+    register int i;
+    int     tw, th, mw, mh;
+
+    /* slurp_ship_bitmaps(); */
+
+    clockpic = W_StoreBitmap(clock_width, clock_height, clock_bits,
+			     qwin);
+    safepic = W_StoreBitmap(safe_width, safe_height, safe_bits,
+			    qwin);
+
+#ifdef BEEPLITE
+    for (i = 0; i < emph_player_seq_frames; i++) {
+	emph_player_seq[emph_player_seq_frames - (i + 1)] =
+	    W_StoreBitmap(emph_player_seq_width, emph_player_seq_height,
+			  emph_player_seq_bits[i], mapw);
+    }
+
+    for (i = 0; i < emph_player_seql_frames; i++) {
+	emph_player_seql[emph_player_seql_frames - (i + 1)] =
+	    W_StoreBitmap(emph_player_seql_width, emph_player_seql_height,
+			  emph_player_seql_bits[i], w);
+    }
+
+    for (i = 0; i < emph_planet_seq_frames; i++) {
+	emph_planet_seq[emph_planet_seq_frames - (i + 1)] =
+	    W_StoreBitmap(emph_planet_seq_width, emph_planet_seq_height,
+			  emph_planet_seq_bits[i], mapw);
+    }
+#endif
+
+    load_default_teamlogos();
+
+    headerA = W_StoreBitmap(headerA_width, headerA_height,
+			    headerA_bits, motdWin);
+    headerB = W_StoreBitmap(headerB_width, headerB_height,
+			    headerB_bits, motdWin);
+    headerchanges[0] = W_StoreBitmap(header1_width, header1_height,
+				     header1_bits, motdWin);
+    headerchanges[1] = W_StoreBitmap(header2_width, header2_height,
+				     header2_bits, motdWin);
+    headerchanges[2] = W_StoreBitmap(header3_width, header3_height,
+				     header3_bits, motdWin);
+    headerchanges[3] = W_StoreBitmap(header4_width, header4_height,
+				     header4_bits, motdWin);
+    for (i = 0; i < HULL_FRAMES; i++)
+	hull[i] = W_StoreBitmap(hull_width, hull_height, hull_bits[i], w);
+
+    for (i = 0; i < 5; i++) {
+	cloud[i] = W_StoreBitmap(cloud_width, cloud_height, cloud_bits[4 - i], w);
+	plasmacloud[i] = W_StoreBitmap(plasmacloud_width,
+			    plasmacloud_height, plasmacloud_bits[4 - i], w);
+    }
+    etorp = W_StoreBitmap(etorp_width, etorp_height, etorp_bits, w);
+    mtorp = W_StoreBitmap(mtorp_width, mtorp_height, mtorp_bits, w);
+    for (i = 0; i < NDRONEVIEWS; i++) {
+	drone_bm[i] = W_StoreBitmap(drone_width, drone_height, drone_bits[i], w);
+    }
+    eplasmatorp =
+	W_StoreBitmap(eplasmatorp_width, eplasmatorp_height, eplasmatorp_bits, w);
+    mplasmatorp =
+	W_StoreBitmap(mplasmatorp_width, mplasmatorp_height, mplasmatorp_bits, w);
+    for (i = 0; i < VIEWS; i++) {
+	fighter[i] =
+	    W_StoreBitmap(fighter_width, fighter_height, fighter_bits[i], w);
+    };
+    warpbeacon = W_StoreBitmap(warpbeacon_width, warpbeacon_height, warpbeacon_bits, w);
+    wbflash = W_StoreBitmap(warpbeacon_width, warpbeacon_height, warpflash_bits, w);
+
+    tw = planet_width;
+    th = planet_height;
+    mw = mplanet_width;
+    mh = mplanet_height;
+
+    /* tactical screen planet bitmaps for team */
+
+    bplanets[0] = W_StoreBitmap(tw, th, indplanet_bits, w);
+    bplanets[1] = W_StoreBitmap(tw, th, fedplanet_bits, w);
+    bplanets[2] = W_StoreBitmap(tw, th, romplanet_bits, w);
+    bplanets[3] = W_StoreBitmap(tw, th, kliplanet_bits, w);
+    bplanets[4] = W_StoreBitmap(tw, th, oriplanet_bits, w);
+    bplanets[5] = W_StoreBitmap(tw, th, planet_bits, w);
+
+    /* galactic screen planet bitmaps for team */
+
+    mbplanets[0] = W_StoreBitmap(mw, mh, indmplanet_bits, mapw);
+    mbplanets[1] = W_StoreBitmap(mw, mh, fedmplanet_bits, mapw);
+    mbplanets[2] = W_StoreBitmap(mw, mh, rommplanet_bits, mapw);
+    mbplanets[3] = W_StoreBitmap(mw, mh, klimplanet_bits, mapw);
+    mbplanets[4] = W_StoreBitmap(mw, mh, orimplanet_bits, mapw);
+    mbplanets[5] = W_StoreBitmap(mw, mh, mplanet_bits, mapw);
+
+
+
+    /* tactical screen planet bitmaps for facilities */
+
+    bplanets2[0] = bplanets[0];
+    bplanets2[1] = W_StoreBitmap(tw, th, planet001_bits, w);
+    bplanets2[2] = W_StoreBitmap(tw, th, planet010_bits, w);
+    bplanets2[3] = W_StoreBitmap(tw, th, planet011_bits, w);
+    bplanets2[4] = W_StoreBitmap(tw, th, planet100_bits, w);
+    bplanets2[5] = W_StoreBitmap(tw, th, planet101_bits, w);
+    bplanets2[6] = W_StoreBitmap(tw, th, planet110_bits, w);
+    bplanets2[7] = W_StoreBitmap(tw, th, planet111_bits, w);
+    bplanets2[8] = W_StoreBitmap(tw, th, planet1010_bits, w);
+    bplanets2[9] = W_StoreBitmap(tw, th, planet1011_bits, w);
+    bplanets2[10] = bplanets2[8];
+    bplanets2[11] = bplanets2[9];
+    bplanets2[12] = W_StoreBitmap(tw, th, planet1110_bits, w);
+    bplanets2[13] = W_StoreBitmap(tw, th, planet1111_bits, w);
+    bplanets2[14] = bplanets2[12];
+    bplanets2[15] = bplanets2[13];
+
+    /* galactic screen planet bitmaps for facilities */
+
+    mbplanets2[0] = mbplanets[0];
+    mbplanets2[1] = W_StoreBitmap(mw, mh, mplanet001_bits, mapw);
+    mbplanets2[2] = W_StoreBitmap(mw, mh, mplanet010_bits, mapw);
+    mbplanets2[3] = W_StoreBitmap(mw, mh, mplanet011_bits, mapw);
+    mbplanets2[4] = W_StoreBitmap(mw, mh, mplanet100_bits, mapw);
+    mbplanets2[5] = W_StoreBitmap(mw, mh, mplanet101_bits, mapw);
+    mbplanets2[6] = W_StoreBitmap(mw, mh, mplanet110_bits, mapw);
+    mbplanets2[7] = W_StoreBitmap(mw, mh, mplanet111_bits, mapw);
+    mbplanets2[8] = W_StoreBitmap(mw, mh, mplanet1010_bits, mapw);
+    mbplanets2[9] = W_StoreBitmap(mw, mh, mplanet1011_bits, mapw);
+    mbplanets2[10] = mbplanets2[8];
+    mbplanets2[11] = mbplanets2[9];
+    mbplanets2[12] = W_StoreBitmap(mw, mh, mplanet1110_bits, mapw);
+    mbplanets2[13] = W_StoreBitmap(mw, mh, mplanet1111_bits, mapw);
+    mbplanets2[14] = mbplanets2[12];
+    mbplanets2[15] = mbplanets2[13];
+
+    /* tactical screen planet bitmaps for surface properties */
+
+    bplanetsr[0] = bplanets[0];
+    bplanetsr[1] = W_StoreBitmap(tw, th, planetr001_bits, w);
+    bplanetsr[2] = W_StoreBitmap(tw, th, planetr010_bits, w);
+    bplanetsr[3] = W_StoreBitmap(tw, th, planetr011_bits, w);
+    bplanetsr[4] = W_StoreBitmap(tw, th, planetr100_bits, w);
+    bplanetsr[5] = W_StoreBitmap(tw, th, planetr101_bits, w);
+    bplanetsr[6] = W_StoreBitmap(tw, th, planetr110_bits, w);
+    bplanetsr[7] = W_StoreBitmap(tw, th, planetr111_bits, w);
+
+    /* galactic screen planet bitmaps for surface properties */
+
+    mbplanetsr[0] = mbplanets[0];
+    mbplanetsr[1] = W_StoreBitmap(mw, mh, mplanetr001_bits, mapw);
+    mbplanetsr[2] = W_StoreBitmap(mw, mh, mplanetr010_bits, mapw);
+    mbplanetsr[3] = W_StoreBitmap(mw, mh, mplanetr011_bits, mapw);
+    mbplanetsr[4] = W_StoreBitmap(mw, mh, mplanetr100_bits, mapw);
+    mbplanetsr[5] = W_StoreBitmap(mw, mh, mplanetr101_bits, mapw);
+    mbplanetsr[6] = W_StoreBitmap(mw, mh, mplanetr110_bits, mapw);
+    mbplanetsr[7] = W_StoreBitmap(mw, mh, mplanetr111_bits, mapw);
+
+    /* tactical screen bitmaps for facilities, MOO-style */
+
+    bplanetsMOO[0] = W_StoreBitmap(tw, th, rmyplanet000_bits, w);
+    bplanetsMOO[1] = W_StoreBitmap(tw, th, rmyplanet001_bits, w);
+    bplanetsMOO[2] = W_StoreBitmap(tw, th, rmyplanet010_bits, w);
+    bplanetsMOO[3] = W_StoreBitmap(tw, th, rmyplanet011_bits, w);
+    bplanetsMOO[4] = W_StoreBitmap(tw, th, rmyplanet100_bits, w);
+    bplanetsMOO[5] = W_StoreBitmap(tw, th, rmyplanet101_bits, w);
+    bplanetsMOO[6] = W_StoreBitmap(tw, th, rmyplanet110_bits, w);
+    bplanetsMOO[7] = W_StoreBitmap(tw, th, rmyplanet111_bits, w);
+    bplanetsMOO[8] = W_StoreBitmap(tw, th, rmyplanet1010_bits, w);
+    bplanetsMOO[9] = W_StoreBitmap(tw, th, rmyplanet1011_bits, w);
+    bplanetsMOO[10] = bplanetsMOO[8];
+    bplanetsMOO[11] = bplanetsMOO[9];
+    bplanetsMOO[12] = W_StoreBitmap(tw, th, rmyplanet1110_bits, w);
+    bplanetsMOO[13] = W_StoreBitmap(tw, th, rmyplanet1111_bits, w);
+    bplanetsMOO[14] = bplanetsMOO[12];
+    bplanetsMOO[15] = bplanetsMOO[13];
+
+    /* galactic screen bitmaps for facilities, MOO-style */
+
+    mbplanetsMOO[0] = W_StoreBitmap(mw, mh, rmymplanet000_bits, mapw);
+    mbplanetsMOO[1] = W_StoreBitmap(mw, mh, rmymplanet001_bits, mapw);
+    mbplanetsMOO[2] = W_StoreBitmap(mw, mh, rmymplanet010_bits, mapw);
+    mbplanetsMOO[3] = W_StoreBitmap(mw, mh, rmymplanet011_bits, mapw);
+    mbplanetsMOO[4] = W_StoreBitmap(mw, mh, mplanet100_bits, mapw);
+    mbplanetsMOO[5] = W_StoreBitmap(mw, mh, mplanet101_bits, mapw);
+    mbplanetsMOO[6] = W_StoreBitmap(mw, mh, mplanet110_bits, mapw);
+    mbplanetsMOO[7] = W_StoreBitmap(mw, mh, mplanet111_bits, mapw);
+    mbplanetsMOO[8] = W_StoreBitmap(mw, mh, rmymplanet1010_bits, mapw);
+    mbplanetsMOO[9] = W_StoreBitmap(mw, mh, rmymplanet1011_bits, mapw);
+    mbplanetsMOO[10] = mbplanetsMOO[8];
+    mbplanetsMOO[11] = mbplanetsMOO[9];
+    mbplanetsMOO[12] = W_StoreBitmap(mw, mh, mplanet1110_bits, mapw);
+    mbplanetsMOO[13] = W_StoreBitmap(mw, mh, mplanet1111_bits, mapw);
+    mbplanetsMOO[14] = mbplanetsMOO[12];
+    mbplanetsMOO[15] = mbplanetsMOO[13];
+
+    for (i = 0; i < NSCOUTAGES; i++)
+	mbplanetsA[i] = W_StoreBitmap(mw, mh, age_bits[i], mapw);
+
+    /* star bitmaps */
+
+    for (i = 0; i < STARFRAMES; i++) {
+	starBM[i] = W_StoreBitmap(star_width, star_height, star_bitarray[i], w);
+    }
+    mstarBM = W_StoreBitmap(starm_width, starm_height, starm_bits, mapw);
+#ifdef VISIBLE_WORMHOLES
+    mholeBM = W_StoreBitmap(holem_width, holem_height, holem_bits, mapw);
+#endif /*VISIBLE_WORMHOLES*/
+    for (i = 0; i < WORMFRAMES; i++) {
+        wormBM[i] = W_StoreBitmap(wormhole_width, wormhole_height,
+				  wormhole_bitarray[i], w);
+     }
+
+/* set of 16 asteroid pics, and 3 asteroid fluff filler pics */
+    asteroidBM[0] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0000_bits, w);
+    asteroidBM[1] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0001_bits, w);
+    asteroidBM[2] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0010_bits, w);
+    asteroidBM[3] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0011_bits, w);
+    asteroidBM[4] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0100_bits, w);
+    asteroidBM[5] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0101_bits, w);
+    asteroidBM[6] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0110_bits, w);
+    asteroidBM[7] = W_StoreBitmap(terrain_width, terrain_height,
+				  a0111_bits, w);
+    asteroidBM[8] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1000_bits, w);
+    asteroidBM[9] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1001_bits, w);
+    asteroidBM[10] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1010_bits, w);
+    asteroidBM[11] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1011_bits, w);
+    asteroidBM[12] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1100_bits, w);
+    asteroidBM[13] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1101_bits, w);
+    asteroidBM[14] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1110_bits, w);
+    asteroidBM[15] = W_StoreBitmap(terrain_width, terrain_height,
+				  a1111_bits, w);
+    asteroidfluff[0] = W_StoreBitmap(terrain_width, terrain_height,
+				     a0_bits, w);
+    asteroidfluff[1] = W_StoreBitmap(terrain_width, terrain_height,
+				     a1_bits, w);
+    asteroidfluff[2] = W_StoreBitmap(terrain_width, terrain_height,
+				     a2_bits, w);
+    for (i = 0; i < 2; i++) {
+	basteroid2[i] = W_StoreBitmap(asteroid_width, asteroid_height, asteroid_bits, w);
+	mbasteroid2[i] = W_StoreBitmap(masteroid_width, masteroid_height, masteroid_bits, mapw);
+    }
+    for (i = 0; i < 6; i++) {
+	basteroid[i] = W_StoreBitmap(asteroid_width, asteroid_height, asteroid_bits, w);
+	mbasteroid[i] = W_StoreBitmap(masteroid_width, masteroid_height, masteroid_bits, mapw);
+    }
+
+    kitchenSink = W_StoreBitmap(sink_width, sink_height, sink_bits, w);
+
+    for (i = 0; i < EX_FRAMES; i++) {
+	expview[i] = W_StoreBitmap(ex_width, ex_height, ex_bits[i], w);
+    }
+    for (i = 0; i < SBEXPVIEWS; i++) {
+	sbexpview[i] = W_StoreBitmap(sbexp_width, sbexp_height, sbexp_bits[i], w);
+    }
+
+    cloakicon = W_StoreBitmap(cloak_width, cloak_height, cloak_bits, w);
+    icon = W_StoreBitmap(icon_width, icon_height, icon_bits, iconWin);
+    tractbits = W_StoreBitmap(tract_width, tract_height, tract_bits, w);
+    pressbits = W_StoreBitmap(press_width, press_height, press_bits, w);
+}
+
+void
+get_N_dispatch_outfit_event(team, s_type, lastplayercount)
+    int    *team;
+    int    *s_type;
+    int    *lastplayercount;
+{
+    W_Event event;
+    int     validshipletter = 0;
+    static int resetting = 0;
+    int     oldresetting;
+    int     i;
+
+    oldresetting = resetting;
+
+    W_NextEvent(&event);
+    switch ((int) event.type) {
+    case W_EV_KEY:
+	{
+	    struct shiplist *shipscan;
+	    validshipletter = 0;
+	    shipscan = shiptypes;
+	    while (shipscan) {
+		if (shipscan->ship->s_letter == event.key) {
+		    *s_type = shipscan->ship->s_type;
+		    validshipletter = 1;
+		    break;
+		}
+		shipscan = shipscan->next;
+	    }
+	}
+
+	if (me->p_status == PTQUEUE) {
+	    int     i;
+	    for (i = 0; i < WNUM; i++) {
+		if (event.Window == messWin[i].window) {
+		    messageWinEvent(&event);
+		    break;
+		}
+	    }
+	    if (i != WNUM)
+		break;
+	    if (event.Window == messagew ||
+		event.Window == tstatw ||
+		event.Window == warnw)
+		smessage(event.key);
+	}
+	if (event.Window == motdWin) {
+	    motdWinEvent(event.key);
+	    break;
+	} else if (event.Window == playerw || event.Window == infow) {
+	    /* allow 'i' 'I' and '^i' in playerw [BDyess] */
+	    playerwEvent(&event);
+	    break;
+	} else if (event.Window == w || event.Window == mapw) {
+	    switch (event.key) {
+#ifdef Q_OUTFITTING
+	    case 'q':
+		*team = number_of_teams;
+		me->p_status = PFREE;
+		break;
+#endif				/* Q_OUTFITTING */
+	    case 'R':
+		warning("Are you sure you want to reset your stats?");
+		resetting = 1;
+		break;
+	    case 'y':
+		if (resetting) {
+		    sendResetStatsReq('Y');
+		    warning("OK, your stats have been reset.");
+		    resetting = 0;
+		}
+		break;
+	    case 'n':
+		if (resetting) {
+		    warning("I didn't think so.");
+		    resetting = 0;
+		}
+		break;
+
+	    case 'f':		/* Scroll motd forward */
+		if (currpage == NULL)
+		    currpage = motddata;
+		if (currpage == NULL || currpage->next == NULL)
+		    break;
+		currpage->next->prev = currpage;
+		currpage = currpage->next;
+		showMotd(w);
+		resetting = 0;
+		break;
+	    case 'b':		/* Scroll motd backward */
+		if (currpage == NULL || currpage->prev == NULL)
+		    break;
+		currpage = currpage->prev;
+		showMotd(w);
+		resetting = 0;
+		break;
+		/* ok, let's have some info windows available on the TQ */
+
+	    default:		/* hmm, something that doesn't have to do
+				   with the MOTD, maybe it's an info window
+				   request */
+		switch (doKeymap(&event)) {
+		case 'U':	/* U = Rank list */
+		    if (W_IsMapped(rankw)) {
+			W_UnmapWindow(rankw);
+		    } else {
+			W_MapWindow(rankw);
+		    }
+		    break;
+		case 'P':	/* P = Planet list */
+		    if (W_IsMapped(planetw)) {
+			W_UnmapWindow(planetw);
+			W_UnmapWindow(planetw2);
+		    } else {
+			W_MapWindow(planetw);
+			W_MapWindow(planetw2);
+		    }
+		    break;
+		case 'h':	/* h = Map help window */
+		    if (W_IsMapped(helpWin)) {
+			W_UnmapWindow(helpWin);
+		    } else {
+			W_MapWindow(helpWin);
+		    }
+		    if (optionWin)
+			optionredrawtarget(helpWin);
+		    break;
+		case 'O':	/* O = options Window */
+		    if (optionWin != NULL && W_IsMapped(optionWin))
+			optiondone();
+		    else
+			optionwindow();
+		    break;
+		case 'w':	/* w = map war stuff */
+		    if (W_IsMapped(war))
+			W_UnmapWindow(war);
+		    else
+			warwindow();
+		    break;
+		case '&':
+		    if (defaultsFile) {
+			char    buf[150];
+			sprintf(buf, "Reading defaults from %s", defaultsFile);
+			warning(buf);
+			freeDefaults();
+			defaultsFile = initDefaults(defaultsFile);
+			resetDefaults();
+		    } else {
+			warning("No defaults file to read from!");
+		    }
+		}
+		break;
+	    }
+
+	    break;		/* switch event type */
+	}
+	if (event.Window == qwin)
+	    return;		/* normal keypresses can't make you quit */
+
+	if (event.Window == optionWin) {
+	    optionaction(&event);
+	    return;
+	}
+	if (!validshipletter)
+	    break;
+	/*
+	   it wasn't the main window, see if they hit the key in a team
+	   window to choose their ship... falling through
+	*/
+    case W_EV_BUTTON:
+
+	for (i = 0; i < number_of_teams; i++)
+	    if (event.Window == teamWin[i]) {
+		*team = i;
+		break;
+	    }
+	if (event.Window == qwin) {
+	    *team = number_of_teams;
+	    me->p_status = PFREE;
+	    break;
+	}
+	/* allow message scrollback [BDyess] */
+	for (i = 0; i < WNUM; i++) {
+	    if (event.Window == messWin[i].window) {
+		messageWinEvent(&event);
+		break;
+	    }
+	}
+	/* allow bozo selection in playerw [BDyess] */
+	if (event.Window == playerw) {
+	    playerwEvent(&event);
+	    break;
+	} else if (event.Window == war)
+	    waraction(&event);
+	else if (event.Window == optionWin)
+	    optionaction(&event);
+	if (*team != -1 && !teamRequest(*team, *s_type)) {
+	    *team = -1;
+	}
+	break;
+    case W_EV_EXPOSE:
+	for (i = 0; i < number_of_teams; i++)
+	    if (event.Window == teamWin[i]) {
+		lastplayercount[i] = -1;	/* force update */
+		redrawTeam(teamWin[i], i, &lastplayercount[i]);
+		break;
+	    }
+	if (event.Window == qwin)
+	    redrawQuit();
+	else if (event.Window == w)
+	    showMotd(w);
+	else if (event.Window == mapw) {
+#ifdef COW_HAS_IT_WHY_SHOULDNT_WE
+	    if(showMapAtMotd) {
+		map();
+		redraw_death_messages();
+	    } else
+#endif
+		showValues(mapw);
+	} else
+	    /* let the normal expose handler figure out who to redraw */
+	    dispatch_W_expose_event(&event);
+	break;
+    }
+
+    if (oldresetting && resetting) {
+	resetting = 0;
+	warning("Resetting of stats cancelled");
+    }
+}
+
+void
+new_entrywindow(team, s_type)
+    int    *team, *s_type;
+{
+    int     i;
+    int     lastplayercount[4];	/* number of players on each team */
+    int     okayMask, lastOkayMask;	/* teams you're allowed to choose */
+    char    buf[100];
+
+    /* OUTFIT timeout stuff */
+    long    startTime = -1;
+    long    lasttime = -1;
+    int     spareTime = 0;
+
+    if (fastQuit) {
+	*team = -1;
+	return;
+    }
+    lastOkayMask = okayMask = tournMask;
+
+#ifdef PACKET_LIGHTS
+    /* erase packet lights to make Bob happy [BDyess] */
+    light_erase();
+#endif				/* PACKET_LIGHTS */
+
+    /*
+       map all team selection windows, and stripe out those that are
+       unchoosable
+    */
+    for (i = 0; i < number_of_teams; i++) {
+	if (okayMask & (1 << i))
+	    W_UnTileWindow(teamWin[i]);
+	else
+	    W_TileWindow(teamWin[i], stipple);
+
+	W_MapWindow(teamWin[i]);
+	lastplayercount[i] = -1;
+    }
+    W_MapWindow(qwin);
+
+    /* no team selected yet */
+    *team = -1;
+    /*
+       set to team index (0..n-1) to choose a team. set to n if you want to
+       quit
+    */
+
+    /* I don't know why this restriction is in place - RF */
+    if (me->p_whydead != KWINNER && me->p_whydead != KGENOCIDE) {
+	showMotd(w);
+#ifdef COW_HAS_IT_WHY_SHOULDNT_WE
+	if(showMapAtMotd) {
+	    map();
+	    redraw_death_messages();
+	} else
+#endif
+	    showValues(mapw);
+    }
+    do {
+
+	/* set team to n if you want to quit */
+	while (!W_EventsPending() && (me->p_status == POUTFIT ||
+				      me->p_status == PTQUEUE)) {
+	    /* no window events, just process socket stuff */
+	    fd_set  mask;
+
+#ifdef PACKET_LIGHTS
+	    light_erase();
+#endif				/* PACKET_LIGHTS */
+
+	    readFromServer();
+
+	    if (me->p_status == POUTFIT || me->p_status == PTQUEUE) {
+		/* wait up to a half-second for input from the window system */
+		struct timeval tv;
+
+#ifndef AMIGA
+		tv.tv_sec = 0;
+		tv.tv_usec = 500000;
+
+		FD_ZERO(&mask);
+		FD_SET(W_Socket(), &mask);
+		select(W_Socket() + 1, &mask, 0, 0, &tv);
+#else
+		StartTimer(0, 500000);
+		while (1) {
+#ifdef DNET
+		    sigsPending = Wait(W_Socket() | portmask | sockMask | udpSockMask | SIGBREAKF_CTRL_C);
+#else
+/* something else.... */
+#endif
+		    if (sigsPending & SIGBREAKF_CTRL_C) {
+			printf("Ctrl-c break from entrywindow!\n");
+			StopTimer();
+			exit(0);
+		    }
+		    if ((sigsPending & (W_Socket() | sockMask | udpSockMask)) ||
+			(CheckIO(&(ior->tr_node))))
+			break;
+		}		/* timer returns false signals, wish I knew
+				   why. :-( */
+		StopTimer();
+#endif				/* AMIGA */
+	    }
+
+#ifdef COW_HAS_IT_WHY_SHOULDNT_WE
+	    if(showMapAtMotd) {
+		map();
+		redraw_death_messages();
+	    }
+#endif
+
+	    if (me->p_status == PTQUEUE)
+		startTime = -1;
+
+	    if (me->p_status == POUTFIT) {
+		/* time only elapses in OUTFIT mode */
+
+		if (startTime == -1) {	/* we were on the tqueue */
+		    /* I hate this [BDyess] */
+#if 1
+		    W_Deiconify(baseWin);	/* we changed status.  alert
+						   the user */
+#endif
+		    startTime = time(0);
+		    spareTime = 480;	/* Allow them extra time, as long */
+		    /* as they are active */
+		}
+		elapsed = time(0) - startTime;
+
+		if (elapsed > autoQuit) {
+		    printf("Auto-Quit.\n");
+		    *team = number_of_teams;
+		    break;
+		}
+	    }
+	    if (lasttime != time(0)) {
+		if (W_IsMapped(playerw))
+		    playerlist2();
+
+		if (newMotdStuff) {
+		    showMotd(w);
+#ifdef COW_HAS_IT_WHY_SHOULDNT_WE
+		    if(showMapAtMotd) {
+			map();
+			redraw_death_messages();
+		    } else
+#endif
+			showValues(mapw);
+		}
+		if (me->p_status == POUTFIT) {
+		    showTimeLeft(elapsed, autoQuit);
+		}
+		lasttime = time(0);
+	    }
+	    okayMask = tournMask;
+
+	    /* redraw those windows whose choosable status has changed */
+	    for (i = 0; i < number_of_teams; i++) {
+		if ((okayMask ^ lastOkayMask) & (1 << i)) {
+		    if (okayMask & (1 << i)) {
+			W_UnTileWindow(teamWin[i]);
+		    } else {
+			W_TileWindow(teamWin[i], stipple);
+		    }
+		    lastplayercount[i] = -1;	/* force update */
+		}
+		redrawTeam(teamWin[i], i, &lastplayercount[i]);
+	    }
+	    lastOkayMask = okayMask;
+	}
+
+#ifdef RECORDER
+	if (playback)  /* silly.  Shouldn't even be mapping team windows. */
+	    break;
+#endif
+	/* they quit or ran out of time */
+	if (*team == number_of_teams) {
+	    me->p_status = PFREE;	/* exit outer while loop */
+	    break;
+	}
+	/*
+	   this makes them eventually run out of time no matter how awake
+	   they are.  Only affects the OUTFIT screen.
+	*/
+	if (me->p_status == POUTFIT && startTime != -1) {
+	    if (time(0) - startTime <= spareTime) {
+		spareTime -= time(0) - startTime;
+		startTime = time(0);
+	    } else {
+		startTime += spareTime;
+		spareTime = 0;
+	    }
+	}
+	if (!W_EventsPending())
+	    continue;
+
+	/* ok, there's a window event pending */
+
+	/* thiswill set p_status to PFREE if they decide to quit */
+	get_N_dispatch_outfit_event(team, s_type, lastplayercount);
+
+    } while ((me->p_status == POUTFIT ||
+	      me->p_status == PTQUEUE)
+#ifdef RECORDER
+	     && (!pb_update)
+#endif
+	);
+
+    if (*team >= 0) {
+	strcpy(buf, "Welcome aboard ");
+	if (paradise)
+	    strcat(buf, ranks2[me->p_stats2.st_rank].name);
+	else
+	    strcat(buf, ranks[me->p_stats.st_rank].name);
+	sprintf(buf, "Welcome aboard %s!", get_players_rank_name(me));
+	warning(buf);
+    }
+#ifdef RECORDER
+    if (playback) {
+	extern int lastTeamReq;
+	*team = me->p_teami = lastTeamReq;
+    } else
+#endif
+	/* if they quit or ran out of time */
+    if (me->p_status == PFREE)
+	*team = -1;
+    else if (me->p_status == PALIVE ||
+	     me->p_status == POBSERVE)
+	if (*team == -1)
+	    *team = me->p_teami;
+	else
+	    me->p_teami = *team;
+
+
+    for (i = 0; i < number_of_teams; i++)
+	W_UnmapWindow(teamWin[i]);
+    W_UnmapWindow(qwin);
+}
+
+/* Attempt to pick specified team & ship */
+static int
+teamRequest(team, ship)
+    int     team, ship;
+{
+    int     lastTime;
+
+#ifdef RECORDER
+    extern int lastTeamReq;
+
+    if (!playback)
+	lastTeamReq = team;
+#endif
+#ifdef TIMELORD
+    if (!allowed_to_keep_playing()) {
+	warning("You've played enough for today.  Get back to work!");
+	return 0;
+    }
+#endif
+    pickOk = -1;
+    sendTeamReq(team, ship);
+    lastTime = time(NULL);
+    while (pickOk == -1) {
+	if (lastTime + 3 < time(NULL)) {
+	    sendTeamReq(team, ship);
+	    lastTime = time(NULL);
+	}
+	socketPause(0, 20000);
+	readFromServer();
+	if (isServerDead()) {
+	    printf("Whoops!  We've been ghostbusted!\n");
+	    printf("Pray for a miracle!\n");
+
+	    /* UDP fail-safe */
+	    commMode = commModeReq = COMM_TCP;
+	    commSwitchTimeout = 0;
+	    if (udpSock >= 0)
+		closeUdpConn();
+	    if (udpWin) {
+		udprefresh(UDP_CURRENT);
+		udprefresh(UDP_STATUS);
+	    }
+	    connectToServer(nextSocket);
+	    printf("Yea!  We've been resurrected!\n");
+	    pickOk = 0;
+	    break;
+	}
+#if 0				/* >this< is redundant ;-) */
+	if (me->p_status == PALIVE) {	/* well, something happened and we've
+					   got a ship! */
+	    pickOk = 1;
+	    break;
+	}
+#endif
+    }
+
+#if 1				/* this is not redundant? */
+    if (pickOk) {
+	me->p_status = PALIVE;	/* we got a ship.  We must be alive */
+#ifdef TIMER
+	timeBank[T_SHIP] = time(NULL);
+#endif				/* TIMER */
+    }
+#endif
+    return (pickOk);
+}
+
+static int
+numShips(owner)
+    int     owner;
+{
+    int     i, num = 0;
+    struct player *p;
+
+    for (i = 0, p = players; i < nplayers; i++, p++)
+	if ((p->p_status == PALIVE || p->p_status == PTQUEUE)
+	    && p->p_teami == owner)
+	    num++;
+    return (num);
+}
+
+#if 0
+int
+realNumShips(owner)
+    int     owner;
+{
+    int     i, num = 0;
+    struct player *p;
+
+    for (i = 0, p = players; i < MAXPLAYER; i++, p++)
+	if (p->p_status != PFREE &&
+	    p->p_team == owner)
+	    num++;
+    return (num);
+}
+#endif
+
+#if 0
+int
+deadTeam(owner)
+    int     owner;
+/* The team is dead if it has no planets and cannot coup it's home planet */
+{
+    int     i, num = 0;
+    struct planet *p;
+
+    if (planets[remap[owner] * 10 - 10].pl_couptime == 0)
+	return (0);
+    for (i = 0, p = planets; i < MAXPLANETS; i++, p++) {
+	if (p->pl_owner & owner) {
+	    num++;
+	}
+    }
+    if (num != 0)
+	return (0);
+    return (1);
+}
+#endif
+
+static int
+checkBold(line)
+/* Determine if that line should be highlighted on sign-on screen */
+/* Which is done when it is the players own score being displayed */
+    char   *line;
+{
+    char   *s, *t;
+    int     i;
+    int     end = 0;
+
+    if ((int) strlen(line) < 60)
+	return (0);
+    s = line + 4;
+    if (!me)
+	return (0);
+    t = me->p_name;
+
+    for (i = 0; i < 16; i++) {
+	if (!end) {
+	    if (*t == '\0')
+		end = 1;
+	    else if (*t != *s)
+		return (0);
+	}
+	if (end) {
+	    if (*s != ' ')
+		return (0);
+	}
+	s++;
+	t++;
+    }
+    return (1);
+}
+
+struct list {
+    char    bold;
+    struct list *next;
+    char   *data;
+};
+static struct list *sysdefptr = NULL;
+
+void
+showMotd(win)
+    W_Window win;
+{
+    FILE   *fopen();
+    int     i;
+    struct list *data;
+    int     count;
+    int     headernum;
+
+    newMotdStuff = 0;		/* clear the flag */
+
+    if (currpage == NULL)
+	currpage = motddata;
+    if (currpage == NULL)
+	return;
+    if (!W_IsMapped(win))
+	return;
+
+    headernum = currpage->page % NRHEADERS;
+    W_ClearWindow(win);
+    W_WriteWinBitmap(win, 0, 0, headerA, foreColor);
+    W_WriteWinBitmap(win, headerA_width, 0, headerB, foreColor);
+    W_WriteWinBitmap(win, headerA_width, headerB_height, headerchanges[headernum], foreColor);
+    if (headernum == 2) {	/* fill in client: */
+	/* note: font dependant */
+	W_WriteText(win, headerA_width + header3_x_hot, headerB_height + header3_y_hot
+		- 7, textColor, CLIENTVERS, strlen(CLIENTVERS), W_BoldFont);
+    } else if (headernum == 3) {/* fill in server: */
+	;
+    }
+    if (currpage->first) {
+	currpage->first = 0;
+	data = currpage->text;
+	while (data != NULL) {
+	    data->bold = checkBold(data->data);
+	    data = data->next;
+	}
+    }
+    data = currpage->text;
+    count = LINESPERPAGE;	/* Magical # of lines to display */
+    i = headerA_height / (paradise ? 10 : W_Textheight) + 1;
+    while (count > 0) {
+	if (data == NULL)
+	    break;
+
+	if (data->bold) {
+	    W_WriteText(win, 20, i * (paradise ? 10 : W_Textheight), textColor, data->data,
+			strlen(data->data), W_BoldFont);
+	} else {
+	    W_WriteText(win, 20, i * (paradise ? 10 : W_Textheight), textColor, data->data,
+			strlen(data->data), W_RegularFont);
+	}
+	data = data->next;
+	count--;
+	i++;
+    }
+    if (win == w) {
+	count = W_StringWidth(blk_refitstring, W_RegularFont) / 2;
+	W_WriteText(mapw, 250 - count, 480, textColor, blk_refitstring,
+		    strlen(blk_refitstring), W_RegularFont);
+    }
+    showPics(win);
+/*    showValues(mapw); Should be handled in event loop now RF */
+}
+
+static void
+showPics(win)
+    W_Window win;
+{
+    struct piclist *temp;
+    int     page;
+
+    page = currpage->page;
+    temp = motdPics;
+
+    while (temp != NULL) {
+	if (page == temp->page) {
+	    if (temp->thepic)
+		W_WriteWinBitmap(win, temp->x, temp->y, temp->thepic, foreColor);
+	    else {
+		W_MakeLine(win, temp->x, temp->y,
+			   temp->x + temp->width - 1, temp->y + temp->height - 1, W_Grey);
+		W_MakeLine(win, temp->x, temp->y + temp->height - 1,
+			   temp->x + temp->width - 1, temp->y, W_Grey);
+		W_MakeLine(win, temp->x, temp->y,
+			   temp->x + temp->width - 1, temp->y, W_Grey);
+		W_MakeLine(win, temp->x, temp->y,
+			   temp->x, temp->y + temp->height - 1, W_Grey);
+		W_MakeLine(win, temp->x, temp->y + temp->height - 1,
+			   temp->x + temp->width - 1, temp->y + temp->height - 1, W_Grey);
+		W_MakeLine(win, temp->x + temp->width - 1, temp->y + temp->height - 1,
+			   temp->x + temp->width - 1, temp->y, W_Grey);
+	    }
+	}
+	temp = temp->next;
+    }
+}
+
+/*
+ * ATM: show the current values of the .sysdef parameters.
+ */
+void
+showValues(win)
+    W_Window win;
+{
+    int     i;
+    struct list *data;
+
+    /* try to find the start of the info */
+    data = sysdefptr;
+
+    for (i = 12; i < 50; i++) {
+	if (data == NULL)
+	    break;
+	if (data->data[0] == '+')	/* quick boldface hack */
+	    W_WriteText(win, 20, i * W_Textheight, textColor, data->data + 1,
+			strlen(data->data) - 1, W_BoldFont);
+	else
+	    W_WriteText(win, 20, i * W_Textheight, textColor, data->data,
+			strlen(data->data), W_RegularFont);
+	data = data->next;
+    }
+}
+
+#define	BETWEEN_PAGES	0
+#define	IN_PAGE		1
+#define	IN_SYSDEF	3
+
+static int motdlinestate = BETWEEN_PAGES;
+static int pagecount = 0;
+static struct list **temp = NULL;
+static struct page **ptemp = NULL;
+static int linecount = 0;
+static struct piclist **motd_buftail = &motdPics;
+
+void
+erase_motd()
+{
+    struct piclist *temppic;
+    struct page *temppage;
+    struct list *templist;
+
+    while (motdPics) {
+	temppic = motdPics;
+	motdPics = temppic->next;
+	if (temppic->thepic)
+	    W_FreeBitmap(temppic->thepic);
+	free(temppic);
+    }
+    motd_buftail = &motdPics;
+
+    while (motddata) {
+	temppage = motddata;
+	motddata = temppage->next;
+	while (temppage->text) {
+	    templist = temppage->text;
+	    temppage->text = templist->next;
+	    free(templist->data);
+	    free(templist);
+	}
+	free(temppage);
+    }
+    motdlinestate = BETWEEN_PAGES;
+    currpage = 0;
+    pagecount = 0;
+    temp = 0;
+    ptemp = 0;
+    linecount = 0;
+
+    while (sysdefptr) {
+	templist = sysdefptr;
+	sysdefptr = templist->next;
+	free(templist->data);
+	free(templist);
+    }
+}
+
+void
+newMotdPic(x, y, width, height, bits, page)
+    int     x, y, page, width, height;
+    char   *bits;
+{
+    struct piclist *temp;
+
+    {
+	struct motd_pic_spacket dummy;
+	if ((width + 7) / 8 * height > sizeof(dummy.bits) && bits) {
+	    fprintf(stderr, "MOTD picture from server is too big!  %dx%d couldn't possibly fit in the %d data bytes of the packet\n",
+		    width, height, (int) sizeof(dummy.bits));
+	    return;
+	}
+    }
+    if ((currpage && page == currpage->page) || page == 0)
+	newMotdStuff = 1;	/* set flag for event loop */
+
+    temp = (*motd_buftail) = (struct piclist *) malloc(sizeof(struct piclist));
+    temp->next = NULL;
+    temp->x = x;
+    temp->y = y;
+    temp->width = width;
+    temp->height = height;
+    temp->thepic = bits ? W_StoreBitmap(width, height, bits, motdWin) : 0;
+    temp->page = page;
+    motd_buftail = &(temp->next);
+}
+
+void
+newMotdLine(line)
+    char   *line;
+{
+
+    /*
+       Do this first.  That way we don't even have to worry about it at all.
+    */
+
+    if (strncmp("BLK: ", line, 5) == 0) {
+	blk_parsemotd(line);
+	return;
+    }
+    if (strncmp("\t@@@", line, 4) == 0 && motdlinestate != IN_SYSDEF) {
+	motdlinestate = IN_SYSDEF;
+	temp = &sysdefptr;
+    }
+    if (strncmp("\t@@b", line, 4) == 0 && motdlinestate == IN_PAGE)
+	motdlinestate = BETWEEN_PAGES;
+
+    if (motdlinestate == BETWEEN_PAGES ||
+	(motdlinestate == IN_PAGE && linecount >= LINESPERPAGE)) {
+	if (motddata == NULL)
+	    ptemp = &motddata;
+	(*ptemp) = (struct page *) malloc(sizeof(struct page));
+	(*ptemp)->next = NULL;
+	(*ptemp)->first = 1;
+	(*ptemp)->prev = NULL;
+	(*ptemp)->page = pagecount++;
+	temp = &((*ptemp)->text);
+	(*ptemp)->text = NULL;
+	ptemp = &((*ptemp)->next);
+	motdlinestate = IN_PAGE;
+	linecount = 0;
+    }
+    if (strncmp("\t@@", line, 3) == 0)
+	return;
+
+    if (!currpage ||
+	(pagecount - 1) == currpage->page ||
+	motdlinestate == IN_SYSDEF)
+	newMotdStuff = 1;	/* set flag for event loop */
+
+    (*temp) = (struct list *) malloc(sizeof(struct list));
+    (*temp)->next = NULL;
+    (*temp)->data = (char *) malloc(strlen(line) + 1);
+    strcpy((*temp)->data, line);
+    temp = &((*temp)->next);
+
+    if (motdlinestate == IN_PAGE)
+	linecount++;
+}
+
+/*ARGSUSED*/
+static void
+getResources(prog)
+    char   *prog;
+{
+    getColorDefs();
+    getTiles();
+}
+
+static void
+getTiles()
+{
+    stipple = W_StoreBitmap(stipple_width, stipple_height, stipple_bits, w);
+}
+
+static void
+redrawTeam(win, teamNo, lastnum)
+    W_Window win;
+    int     teamNo;
+    int    *lastnum;
+{
+    char    buf[BUFSIZ];
+    int     num = numShips(teamNo);
+
+    /* Only redraw if number of players has changed */
+    if (*lastnum == num)
+	return;
+
+    drawIcon();
+
+    W_ClearWindow(win);
+    W_WriteBitmap(0, 0, teaminfo[teamNo].shield_logo, shipCol[teamNo + 1]);
+
+    (void) sprintf(buf, "%d", num);
+    W_MaskText(win, 5, 46, shipCol[teamNo + 1], buf, strlen(buf),
+	       W_BigFont);
+    *lastnum = num;
+}
+
+static void
+redrawQuit()
+{
+    /* W_WriteText(qwin, 5, 5, textColor, "Quit xtrek", 10, W_RegularFont); */
+    if (me->p_status == PTQUEUE) {
+	W_ClearArea(qwin, 0, 0, BOXSIDE, BOXSIDE);
+	W_WriteBitmap(0, 0, safepic, foreColor);
+    }
+}
+
+void
+drawIcon()
+{
+    if (!iconified) {
+	me_messages = 0;
+	team_messages = 0;
+	all_messages = 0;
+    }
+#ifdef AMIGA
+    /*
+       not sure this isn't appropriate for X as well.  This is called from
+       redrawTeam(),  so iconified is set, and then all my personal messages
+       beep...iconified or not.
+    */
+    if (W_IsMapped(iconWin))
+#endif
+	iconified = 1;
+    if (!infoIcon) {
+	W_WriteBitmap(0, 0, icon, W_White);
+    } else {			/* code for information icon 1/15 [BDyess] */
+	int     side, bottom, top, digits, x, i;
+	char    buf[50];
+
+	W_ClearWindow(iconWin);
+	side = icon_width / number_of_teams;
+	bottom = 0 + side;
+	top = 0;
+	W_MakeLine(iconWin, 0, bottom, icon_width, bottom, W_White);
+	for (i = 0; i <= number_of_teams; i++) {	/* draw the vertical
+							   lines */
+	    x = i * side;
+	    x = (x > icon_width) ? icon_width : x;
+	    W_MakeLine(iconWin, x, bottom, x, top, W_White);
+	}
+	for (i = 0; i < number_of_teams; i++) {
+	    sprintf(buf, "%d", numShips(i));
+	    digits = strlen(buf);
+	    W_WriteText(iconWin, i * side + side / 2 - digits * W_Textwidth / 2,
+			bottom - side / 2 - W_Textheight / 2,
+			shipCol[i + 1], buf, digits, W_RegularFont);
+	}
+	if (me->p_status == PALIVE) {
+#define TOP icon_height-10
+	    if (me->p_flags & PFGREEN)
+		W_FillArea(iconWin, 0, TOP, icon_width,
+			   icon_height, W_Green);
+	    else if (me->p_flags & PFYELLOW)
+		W_FillArea(iconWin, 0, TOP,
+			   icon_width, icon_height, W_Yellow);
+	    else if (me->p_flags & PFRED)
+		W_FillArea(iconWin, 0, TOP,
+			   icon_width, icon_height, W_Red);
+	}
+	if (me_messages) {
+	    sprintf(buf, "Personal: %d", me_messages);
+	    W_WriteText(iconWin, 1, bottom + 2, W_White, buf, strlen(buf),
+			W_RegularFont);
+	}
+	if (team_messages) {
+	    sprintf(buf, "Team:     %d", team_messages);
+	    W_WriteText(iconWin, 1, bottom + 2 + W_Textheight, W_White, buf,
+			strlen(buf), W_RegularFont);
+	}
+	if (all_messages) {
+	    sprintf(buf, "All:      %d", all_messages);
+	    W_WriteText(iconWin, 1, bottom + 2 + 2 * W_Textheight, W_White, buf,
+			strlen(buf), W_RegularFont);
+	}
+	if (me->p_status == POUTFIT) {
+	    sprintf(buf, "Time left: %d", autoQuit - elapsed);
+	    W_WriteText(iconWin, 1, bottom + 2 + W_Textheight, W_White, buf,
+			strlen(buf), W_RegularFont);
+	}
+    }
+}
+
+#define CLOCK_WID	BOXSIDE
+#define CLOCK_HEI	BOXSIDE
+#define CLOCK_BDR	0
+
+#ifndef PI
+#define PI		3.141592654
+#endif				/* PI */
+
+static void
+showTimeLeft(time, max)
+    int     time, max;
+{
+    char    buf[BUFSIZ];
+    int     cx, cy, ex, ey, tx, ty;
+
+    if ((max - time) < 10 && time & 1) {
+	W_Beep();
+	W_Deiconify(baseWin);
+    }
+    if (iconified)
+	drawIcon();
+    /* XFIX */
+    W_ClearArea(qwin, 0, 0, BOXSIDE, BOXSIDE);
+
+    W_WriteBitmap(0, 0, clockpic, foreColor);
+
+    cx = BOXSIDE / 2;
+    cy = BOXSIDE / 2 - 6;
+    ex = cx - 35 * Sin[((255 * time) / max + 64) % 256];
+    ey = cy - 35 * Cos[((255 * time) / max + 64) % 256];
+    W_MakeLine(qwin, cx, cy, ex, ey, foreColor);
+
+    sprintf(buf, "%d", max - time);
+    cy = BOXSIDE / 2 - 1;
+    tx = cx - W_StringWidth(buf, W_RegularFont) / 2.0;
+    ty = cy - W_Textheight;
+    W_WriteText(qwin, tx, ty, textColor, buf, strlen(buf), W_RegularFont);
+}
+
+
+void
+do_refit(type)
+    int     type;
+{
+    sendRefitReq(type);
+    localflags &= ~PFREFIT;
+}