diff shortcomm.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/shortcomm.c	Sat Dec 06 05:41:29 1997 +0000
@@ -0,0 +1,1387 @@
+/* $Id: shortcomm.c,v 1.1.1.1 1997/12/06 05:41:30 darius Exp $ */
+
+/* This file implements all SHORT_PACKETS functions */
+/*  HW 19.07.93 */
+#ifdef SHORT_PACKETS
+
+#ifdef HPBSD
+#include <machine/endian.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#ifdef RS6K
+#include <sys/select.h>
+#endif				/* RS6K */
+#include <netdb.h>
+#include <math.h>
+#include <errno.h>
+#include "Wlib.h"
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "packets.h"
+#include "gameconf.h"
+#ifdef SOUND
+#include "Slib.h"
+#endif
+#include "sound.h"
+
+#if 1
+
+char   *
+ship_type(shp)
+    struct ship *shp;
+{
+    static char ring[4][3];
+    static int ri;
+    char   *rval;
+    ring[ri][0] = shp->s_desig[0];
+    ring[ri][1] = shp->s_desig[1];
+    ring[ri][2] = 0;
+    rval = ring[ri];
+    ri++;
+    if (ri >= sizeof(ring) / sizeof(*ring))
+	ri = 0;
+    return rval;
+}
+#define TEAM_LETTER(p) ( teaminfo[(p).p_teami].letter )
+#define TEAM_SHORT(p) ( teaminfo[(p).p_teami].shortname )
+#define TEAM_LETTERP(pl) ( teaminfo[mask_to_idx((pl).pl_owner)].letter )
+#define TEAM_SHORTP(pl) ( teaminfo[mask_to_idx((pl).pl_owner)].shortname )
+#define reviewWin	messWin[WREVIEW].window
+#define MAXTORP	ntorps
+#define MAXPLANETS	nplanets
+#define MAXPLASMA	nplasmas
+
+#else
+
+#define ship_type(shp)	shiptype[(shp).s_type]
+#define TEAM_LETTER(p) ( teamlet[(p).p_team] )
+#define TEAM_SHORT(p) ( teamshort[(p).p_team] )
+#define TEAM_LETTERP(pl) ( teamlet[(pl).pl_owner] )
+#define TEAM_SHORTP(pl) ( teamshort[(pl).pl_owner] )
+
+#endif
+
+/* from here on all SHORT_PACKETS */
+#include "wtext.h"		/* here are all warningdefines */
+
+/*      Here are all warnings that are send with SP_S_WARNING */
+/*              HW 93           */
+
+/* DaemonMessages */
+char   *daemon_texts[] =
+{
+/* Game_Paused() */
+    "Game is paused.  CONTINUE to continue.",	/* 0 */
+    "Game is no-longer paused!",/* 1 */
+    "Game is paused. Captains CONTINUE to continue.",	/* 2 */
+    "Game will continue in 10 seconds",	/* 3 */
+/* send_about_to_start() */
+    "Teams chosen.  Game will start in 1 minute.",	/* 4 */
+    "----------- Game will start in 1 minute -------------",	/* 5 */
+};
+
+/* VARITEXTE = warnings with 1 or more arguments argument */
+char   *vari_texts[] =
+{
+/* redraw.c */
+    "Engineering:  Energizing transporters in %d seconds",	/* 0 */
+    "Stand By ... Self Destruct in %d seconds",	/* 1 */
+    "Helmsman:  Docking manuever completed Captain.  All moorings secured at port %d.",	/* 2 */
+/* interface.c from INL server */
+    "Not constructed yet. %d minutes required for completion",	/* 3 */
+
+};
+
+
+
+char   *w_texts[] =
+{
+/* socket.c             */
+    "Tractor beams haven't been invented yet.",	/* 0 */
+    "Weapons's Officer:  Cannot tractor while cloaked, sir!",	/* 1 */
+    "Weapon's Officer:  Vessel is out of range of our tractor beam.",	/* 2 */
+
+/* handleRepressReq */
+/****************       coup.c  ***********************/
+/*      coup()  */
+    "You must have one kill to throw a coup",	/* 3 */
+    "You must orbit your home planet to throw a coup",	/* 4 */
+    "You already own a planet!!!",	/* 5 */
+    "You must orbit your home planet to throw a coup",	/* 6 */
+    "Too many armies on planet to throw a coup",	/* 7 */
+    "Planet not yet ready for a coup",	/* 8 */
+/*      getentry.c              */
+/*      getentry()              */
+    "I cannot allow that.  Pick another team",	/* 9 */
+    "Please confirm change of teams.  Select the new team again.",	/* 10 */
+    "That is an illegal ship type.  Try again.",	/* 11 */
+    "That ship hasn't beed designed yet.  Try again.",	/* 12 */
+    "Your new starbase is still under construction",	/* 13 */
+    "Your team is not capable of defending such an expensive ship!",	/* 14 */
+    "Your team's stuggling economy cannot support such an expenditure!",	/* 15 */
+    "Your side already has a starbase!",	/* 16 */
+/*      plasma.c        */
+/* nplasmatorp(course, type)    */
+    "Plasmas haven't been invented yet.",	/* 17 */
+    "Weapon's Officer:  Captain, this ship is not armed with plasma torpedoes!",	/* 18 */
+    "Plasma torpedo launch tube has exceeded the maximum safe temperature!",	/* 19 */
+    "Our fire control system limits us to 1 live torpedo at a time captain!",	/* 20 */
+    "Our fire control system limits us to 1 live torpedo at a time captain!",	/* 21 */
+    "We don't have enough fuel to fire a plasma torpedo!",	/* 22 */
+    "We cannot fire while our vessel is undergoing repairs.",	/* 23 */
+    "We are unable to fire while in cloak, captain!",	/* 24 */
+/********       torp.c  *********/
+/*      ntorp(course, type)     */
+    "Torpedo launch tubes have exceeded maximum safe temperature!",	/* 25 */
+    "Our computers limit us to having 8 live torpedos at a time captain!",	/* 26 */
+    "We don't have enough fuel to fire photon torpedos!",	/* 27 */
+    "We cannot fire while our vessel is in repair mode.",	/* 28 */
+    "We are unable to fire while in cloak, captain!",	/* 29 */
+    "We only have forward mounted cannons.",	/* 30 */
+/*      phasers.c       */
+/*      phaser(course) */
+    "Weapons Officer:  This ship is not armed with phasers, captain!",	/* 31 */
+    "Phasers have not recharged",	/* 32 */
+    "Not enough fuel for phaser",	/* 33 */
+    "Can't fire while repairing",	/* 34 */
+    "Weapons overheated",	/* 35 */
+    "Cannot fire while cloaked",/* 36 */
+    "Phaser missed!!!",		/* 37 */
+    "You destroyed the plasma torpedo!",	/* 38 */
+/*      interface.c     */
+/* bomb_planet()        */
+    "Must be orbiting to bomb",	/* 39 */
+    "Can't bomb your own armies.  Have you been reading Catch-22 again?",	/* 40 */
+    "Must declare war first (no Pearl Harbor syndrome allowed here).",	/* 41 */
+    "Bomb out of T-mode?  Please verify your order to bomb.",	/* 42 */
+    "Hoser!",			/* 43 */
+/*      beam_up()       */
+    "Must be orbiting or docked to beam up.",	/* 44 */
+    "Those aren't our men.",	/* 45 */
+    "Comm Officer: We're not authorized to beam foriegn troops on board!",	/* 46 */
+/* beam_down() */
+    "Must be orbiting or docked to beam down.",	/* 47 */
+    "Comm Officer: Starbase refuses permission to beam our troops over.",	/* 48 */
+/*      declare_war(mask)       */
+    "Pausing ten seconds to re-program battle computers.",	/* 49 */
+/* do_refit(type) */
+    "You must orbit your HOME planet to apply for command reassignment!",	/* 50 */
+    "You must orbit your home planet to apply for command reassignment!",	/* 51 */
+    "Can only refit to starbase on your home planet.",	/* 52 */
+    "You must dock YOUR starbase to apply for command reassignment!",	/* 53 */
+    "Must orbit home planet or dock your starbase to apply for command reassignment!",	/* 54 */
+    "Central Command refuses to accept a ship in this condition!",	/* 55 */
+    "You must beam your armies down before moving to your new ship",	/* 56 */
+    "That ship hasn't been designed yet.",	/* 57 */
+    "Your side already has a starbase!",	/* 58 */
+    "Your team is not capable of defending such an expensive ship",	/* 59 */
+    "Your new starbase is still under construction",	/* 60 */
+    "Your team's stuggling economy cannot support such an expenditure!",	/* 61 */
+    "You are being transported to your new vessel .... ",	/* 62 */
+/* redraw.c */
+/* auto_features()  */
+    "Engineering:  Energize. [ SFX: chimes ]",	/* 63 */
+    "Wait, you forgot your toothbrush!",	/* 64 */
+    "Nothing like turning in a used ship for a new one.",	/* 65 */
+    "First officer:  Oh no, not you again... we're doomed!",	/* 66 */
+    "First officer:  Uh, I'd better run diagnostics on the escape pods.",	/* 67 */
+    "Shipyard controller:  This time, *please* be more careful, okay?",	/* 68 */
+    "Weapons officer:  Not again!  This is absurd...",	/* 69 */
+    "Weapons officer:  ... the whole ship's computer is down?",	/* 70 */
+    "Weapons officer:  Just to twiddle a few bits of the ship's memory?",	/* 71 */
+    "Weapons officer:  Bah! [ bangs fist on inoperative console ]",	/* 72 */
+    "First Officer:  Easy, big guy... it's just one of those mysterious",	/* 73 */
+    "First Officer:  laws of the universe, like 'tires on the ether'.",	/* 74 */
+    "First Officer:  laws of the universe, like 'Klingon bitmaps are ugly'.",	/* 75 */
+    "First Officer:  laws of the universe, like 'all admirals have scummed'.",	/* 76 */
+    "First Officer:  laws of the universe, like 'Mucus Pig exists'.",	/* 77 */
+    "First Officer:  laws of the universe, like 'guests advance 5x faster'.",	/* 78 */
+/* orbit.c */
+/*orbit() */
+    "Helmsman: Captain, the maximum safe speed for docking or orbiting is warp 2!",	/* 79 */
+    "Central Command regulations prohibits you from orbiting foreign planets",	/* 80 */
+    "Helmsman:  Sensors read no valid targets in range to dock or orbit sir!",	/* 81 */
+/* redraw.c */
+    "No more room on board for armies",	/* 82 */
+    "You notice everyone on the bridge is staring at you.",	/* 83 */
+/* startdaemon.c */
+/* practice_robo() */
+    "Can't send in practice robot with other players in the game.",	/* 84 */
+/*      socket.c */
+/*      doRead(asock) */
+    "Self Destruct has been canceled",	/* 85 */
+/* handleMessageReq(packet) */
+    "Be quiet",			/* 86 */
+    "You are censured.  Message was not sent.",	/* 87 */
+    "You are ignoring that player.  Message was not sent.",	/* 88 */
+    "That player is censured.  Message was not sent.",	/* 89 */
+/* handleQuitReq(packet) */
+    "Self destruct initiated",	/* 90 */
+/* handleScan(packet) */
+    "Scanners haven't been invented yet",	/* 91 */
+/* handleUdpReq(packet) */
+    "WARNING: BROKEN mode is enabled",	/* 92 */
+    "Server can't do that UDP mode",	/* 93 */
+    "Server will send with TCP only",	/* 94 */
+    "Server will send with simple UDP",	/* 95 */
+    "Request for fat UDP DENIED (set to simple)",	/* 96 */
+    "Request for double UDP DENIED (set to simple)",	/* 97 */
+/* forceUpdate() */
+    "Update request DENIED (chill out!)",	/* 98 */
+/* INL redraw.c */
+    "Player lock lost while player dead.",	/* 99 */
+    "Can only lock on own team.",	/* 100 */
+    "You can only warp to your own team's planets!",	/* 101 */
+    "Planet lock lost on change of ownership.",	/* 102 */
+    " Weapons officer: Finally! systems are back online!",	/* 103 */
+
+};
+
+#define NUMWTEXTS (sizeof w_texts / sizeof w_texts[0])
+#define NUMVARITEXTS ( sizeof vari_texts / sizeof   vari_texts[0])
+#define NUMDAEMONTEXTS ( sizeof daemon_texts / sizeof daemon_texts[0])
+
+
+void    add_whydead();
+
+extern int vtisize[];
+extern unsigned char numofbits[];
+#if 0
+int     Plx[MAX_PLAYER], Ply[MAX_PLAYER], Pgx[MAX_PLAYER], Pgy[MAX_PLAYER];
+unsigned char Pdir[MAX_PLAYER];
+#endif
+int     my_x, my_y;		/* for rotation we need to keep track of our
+				   real coordinates */
+/* SP_S_WARNING vari texte */
+char   *s_texte[256];		/* Better with a malloc scheme */
+char    no_memory[] =
+{"Not enough memory for warning string!"};
+
+#if 0
+/* For INL Server */
+char   *shiptype[NUM_TYPES] =
+{"SC", "DD", "CA", "BB", "AS", "SB", "??"};
+#endif
+int     spwinside = 500;	/* WINSIDE from Server */
+long    spgwidth = 100000;
+
+
+void
+sendThreshold(v)
+    unsigned short v;
+{
+    struct threshold_cpacket p;
+
+    p.type = CP_S_THRS;
+    p.thresh = v;
+    sendServerPacket((struct player_spacket *) & p);
+}
+
+void
+handleVTorp(sbuf)
+    unsigned char *sbuf;
+{
+    unsigned char *which, *data;
+    unsigned char bitset;
+    struct torp *thetorp;
+    int     dx, dy;
+    int     shiftvar;
+
+    int     i;
+    register int shift = 0;	/* How many torps are extracted (for shifting
+				   ) */
+
+/* now we must find the data ... :-) */
+    if (sbuf[0] == SP_S_8_TORP) {	/* MAX packet */
+	bitset = 0xff;
+	which = &sbuf[1];
+	data = &sbuf[2];
+    } else {			/* Normal Packet */
+	bitset = sbuf[1];
+	which = &sbuf[2];
+	data = &sbuf[3];
+    }
+
+#ifdef CORRUPTED_PACKETS
+/* we probably should do something clever here - jmn */
+#endif
+
+    thetorp = &torps[((unsigned char) *which * 8)];
+    for (shift = 0, i = 0; i < 8;
+#if defined(RS6K) || defined(__SABER__)
+	 i++, thetorp++, bitset >>= 1) {
+#else
+	 i++, thetorp++, bitset = ((unsigned char)bitset) >> 1) {
+#endif
+	if (bitset & 01) {
+	    dx = (*data >> shift);
+	    data++;
+	    shiftvar = (unsigned char) *data;	/* to silence gcc */
+	    shiftvar <<= (8 - shift);
+	    dx |= (shiftvar & 511);
+	    shift++;
+	    dy = (*data >> shift);
+	    data++;
+	    shiftvar = (unsigned char) *data;	/* to silence gcc */
+	    shiftvar <<= (8 - shift);
+	    dy |= (shiftvar & 511);
+	    shift++;
+	    if (shift == 8) {
+		shift = 0;
+		data++;
+	    }
+/* This is necessary because TFREE/TMOVE is now encoded in the bitset */
+	    if (thetorp->t_status == TFREE) {
+		thetorp->t_status = TMOVE;	/* guess */
+		players[thetorp->t_owner].p_ntorp++;
+#ifdef UNIX_SOUND
+            play_sound (SND_FIRETORP); /* Fire Torp */
+#endif
+	    } else if (thetorp->t_owner == me->p_no && thetorp->t_status == TEXPLODE) {
+		thetorp->t_status = TMOVE;	/* guess */
+	    }
+	    /* Check if torp is visible */
+	    if (dx > spwinside || dy > spwinside) {
+		thetorp->t_x = -100000;	/* Not visible */
+		thetorp->t_y = -100000;
+	    } else {		/* visible */
+/*	    thetorp->t_x = me->p_x + ((dx - spwinside / 2) * SCALE);
+	    thetorp->t_y = me->p_y + ((dy - spwinside / 2) * SCALE); */
+		thetorp->t_x = my_x + ((dx - spwinside / 2) * SCALE);
+		thetorp->t_y = my_y + ((dy - spwinside / 2) * SCALE);
+#ifdef ROTATERACE
+		if (rotate) {
+		    rotate_coord(&thetorp->t_x, &thetorp->t_y, rotate_deg,
+				 spgwidth / 2, spgwidth / 2);
+		}
+#endif
+	    }
+	}
+	/* if */
+	else {			/* We got a TFREE */
+	    if (thetorp->t_status && thetorp->t_status != TEXPLODE) {
+		players[thetorp->t_owner].p_ntorp--;
+		thetorp->t_status = TFREE;	/* That's no guess */
+	    }
+	}
+    }				/* for */
+}
+
+void
+handleSelfShort(packet)
+    struct youshort_spacket *packet;
+{
+    me = (ghoststart ? &players[ghost_pno] : &players[packet->pnum]);
+    myship = me->p_ship;
+    mystats = &(me->p_stats);
+    me->p_hostile = packet->hostile;
+    me->p_swar = packet->swar;
+    me->p_armies = packet->armies;
+    me->p_flags = ntohl(packet->flags);
+    me->p_whydead = packet->whydead;
+    me->p_whodead = packet->whodead;
+#ifdef SOUND
+    S_HandlePFlags();
+#endif
+}
+
+void
+handleSelfShip(packet)
+    struct youss_spacket *packet;
+{
+    if (!me)
+	return;			/* wait.. */
+
+    me->p_damage = ntohs(packet->damage);
+    me->p_shield = ntohs(packet->shield);
+    me->p_fuel = ntohs(packet->fuel);
+    me->p_etemp = ntohs(packet->etemp);
+    me->p_wtemp = ntohs(packet->wtemp);
+#ifdef SOUND
+    S_HandlePFlags();
+#endif
+}
+
+void
+handleVPlayer(sbuf)
+    unsigned char *sbuf;
+{
+    register int x, y, i, numofplayers, pl_no, save;
+    register struct player *pl;
+    unsigned char newdir;	/* needed for uncloak kludge with ROTATERACE */
+    int     offset;
+
+    numofplayers = (unsigned char) sbuf[1] & 0x3f;
+
+    if (sbuf[1] & (unsigned char) 128) {	/* Short Header + Extended */
+	sbuf += 4;
+	offset = 32;		/* more than 32 players? */
+    } else if (sbuf[1] & 64) {	/* Short Header  */
+	sbuf += 4;
+	offset = 0;
+    } else {
+	struct player_s_spacket *packet = (struct player_s_spacket *) sbuf;
+	pl = &players[me->p_no];
+	pl->p_dir = (unsigned char) packet->dir;
+#if 0
+	Pdir[me->p_no] = (unsigned char) rosette(pl->p_dir, 16);
+#endif
+	pl->p_speed = packet->speed;
+#ifdef FEATURE
+	if (F_dead_warp && (pl->p_speed == 14)) {
+	    if (pl->p_status == PALIVE) {
+		pl->p_status = PEXPLODE;
+		pl->p_explode = 0;
+	    }
+	} else
+#endif
+	{
+	    pl->p_x = my_x = ntohl(packet->x);
+	    pl->p_y = my_y = ntohl(packet->y);
+#ifdef ROTATERACE
+	    if (rotate) {
+		rotate_coord(&pl->p_x, &pl->p_y,
+			     rotate_deg, spgwidth / 2, spgwidth / 2);
+		rotate_dir(&pl->p_dir, rotate_deg);
+	    }
+#endif
+#if 0
+	    Plx[me->p_no] = WINSIDE / 2;
+	    Ply[me->p_no] = WINSIDE / 2;
+	    Pgx[me->p_no] = pl->p_x * WINSIDE / spgwidth;
+	    Pgy[me->p_no] = pl->p_y * WINSIDE / spgwidth;
+#endif
+	}
+	redrawPlayer[me->p_no] = 1;
+	sbuf += 12;		/* Now the small packets */
+	offset = 0;
+    }
+    for (i = 0; i < numofplayers; i++) {
+	pl_no = ((unsigned char) *sbuf & 0x1f) + offset;
+	if (pl_no >= nplayers)
+	    continue;
+	save = (unsigned char) *sbuf;
+	sbuf++;
+	pl = &players[pl_no];
+	pl->p_speed = (unsigned char) *sbuf & 15;	/* SPEED */
+#if 0
+	Pdir[pl_no] = (unsigned char) *sbuf >> 4;	/* DIR */
+#endif
+	newdir = (unsigned char) *sbuf & 0xf0;	/* realDIR */
+
+#ifdef ROTATERACE
+	if (rotate)
+	    rotate_dir(&newdir, rotate_deg);
+#endif
+#ifdef FEATURE
+	if (cloakerMaxWarp) {
+	    if (pl->p_speed == 15)
+		pl->p_flags |= PFCLOAK;
+	    else
+		pl->p_flags &= ~(PFCLOAK);
+	} else
+#endif
+	{
+#ifdef CHECK_DROPPED
+	    /*
+	       this is a mess.  Too many exceptions.  I don't use it any
+	       more.  cloakerMaxWarp is much much better, but requires server
+	       support.
+	    */
+	    /*
+	       Kludge to fix lost uncloak packets! [3/94] -JR may be a
+	       problem with server sending directions after cloakphase is at
+	       CLOAK_PHASES-1, since cloakphase is strictly a client variable
+	       :(
+	    */
+	    if (pl->p_flags & PFCLOAK && pl->p_cloakphase >= (CLOAK_PHASES - 1) &&
+		(pl->p_dir & 0xf0 != newdir & 0xf0) && !(pl->p_flags & PFORBIT)) {
+		int     i, plocked = 0;
+		for (i = 0; i < nplayers; i++) {
+		    if ((phasers[i].ph_status & PHHIT) && (phasers[i].ph_target == pl_no)) {
+			plocked = 1;
+			break;
+		    }
+		}
+		if (!plocked)
+		    /*
+		       if all of the above, the guy is *probably* uncloaked.
+		       Ask the server.
+		    */
+		    sendShortReq(SPK_SALL);
+	    }
+#endif
+	}
+	pl->p_dir = newdir;	/* realDIR */
+
+	sbuf++;
+	x = (unsigned char) *sbuf++;
+	y = (unsigned char) *sbuf++;	/* The lower 8 Bits are saved */
+
+	/* Now we must preprocess the coordinates */
+	if ((unsigned char) save & 64)
+	    x |= 256;
+	if ((unsigned char) save & 128)
+	    y |= 256;
+#ifdef FEATURE
+	/*
+	   MAY CHANGE!  dead_warp is still an experiment, some servers are
+	   also sending illegal co-ords for dead players, so we'll just
+	   ignore 'em for now if the guy's dead.
+	*/
+	if (F_dead_warp && pl->p_speed == 14) {
+	    if (pl->p_status == PALIVE) {
+		pl->p_status = PEXPLODE;
+		pl->p_explode = 0;
+	    }
+	    redrawPlayer[pl->p_no] = 1;
+	    continue;
+	}
+#endif
+	/* Now test if it's galactic or local coord */
+	if (save & 32) {	/* It's galactic */
+#if 0
+	    if (x >= 501 || y >= 501) {
+		pl->p_x = -500 * spgwidth / spwinside;
+		pl->p_y = -500 * spgwidth / spwinside;
+	    } else
+#endif
+	    {
+		pl->p_x = x * spgwidth / spwinside;
+		pl->p_y = y * spgwidth / spwinside;
+	    }
+#if 0
+	    Pgx[pl_no] = x;
+	    Pgy[pl_no] = y;
+	    Plx[pl_no] = -1;	/* Not visible */
+	    Ply[pl_no] = -1;
+#endif
+	} else {		/* Local */
+	    pl->p_x = my_x + ((x - spwinside / 2) * SCALE);
+	    pl->p_y = my_y + ((y - spwinside / 2) * SCALE);
+#if 0
+	    Plx[pl_no] = x;
+	    Ply[pl_no] = y;
+	    Pgx[pl_no] = pl->p_x * spwinside / spgwidth;
+	    Pgy[pl_no] = pl->p_y * spwinside / spgwidth;
+#endif
+	}
+	redrawPlayer[pl->p_no] = 1;
+#ifdef ROTATERACE
+	if (rotate) {
+	    rotate_coord(&pl->p_x, &pl->p_y,
+			 rotate_deg, spgwidth / 2, spgwidth / 2);
+	}
+#endif
+    }				/* for */
+}
+
+void
+handleSMessage(packet)
+    struct mesg_s_spacket *packet;
+{
+    char    buf[100];
+    char    addrbuf[9];
+
+#if 0
+    if (debug)
+	printf("Length of Message is: %d  total Size %d \n", strlen(&packet->mesg), (int) packet->length);
+#endif
+    if (packet->m_from >= nplayers)
+	packet->m_from = 255;
+
+    if (packet->m_from == 255)
+	strcpy(addrbuf, "GOD->");
+    else {
+	sprintf(addrbuf, " %c%c->", TEAM_LETTER(players[packet->m_from]),
+		shipnos[players[packet->m_from].p_no]);
+    }
+
+    switch (packet->m_flags & (MTEAM | MINDIV | MALL)) {
+    case MALL:
+	sprintf(addrbuf + 5, "ALL");
+	break;
+    case MTEAM:
+	sprintf(addrbuf + 5, TEAM_SHORT(*me));
+	break;
+    case MINDIV:
+	/* I know that it's me -> xxx but i copied it straight ... */
+	sprintf(addrbuf + 5, "%c%c ", TEAM_LETTER(players[packet->m_recpt]),
+		shipnos[packet->m_recpt]);
+	break;
+    default:
+	sprintf(addrbuf + 5, "ALL");
+	break;
+    }
+    sprintf(buf, "%-9s%s", addrbuf, &packet->mesg);
+    dmessage(buf, packet->m_flags, packet->m_from, packet->m_recpt);
+}
+
+void
+handleShortReply(packet)
+    struct shortreply_spacket *packet;
+{
+    switch (packet->repl) {
+    case SPK_VOFF:
+	recv_short = 0;
+	sprefresh(SPK_VFIELD);
+	break;
+    case SPK_VON:
+	recv_short = 1;
+	sprefresh(SPK_VFIELD);
+
+	spwinside = (CARD16) ntohs(packet->winside);
+	/*
+	   bug in server-side SP code, wrong-endian machines confuse a client
+	   with normal byte order
+	*/
+	if (spwinside == 0xf401)
+	    spwinside = 0x01f4;
+
+	if (paradise) {
+	    spgwidth = (INT32) ntohl(packet->gwidth);
+	    blk_gwidth = spgwidth;
+	    blk_windgwidth = (float)spwinside;
+	    redrawall = 1;
+
+	    /*
+	       bug in server-side SP code, wrong-endian machines confuse a
+	       client with normal byte order
+	    */
+	    if (spgwidth == 0xa0860100)
+		spgwidth = 0x000186a0;
+	    if (spgwidth == 0x0100)
+		spgwidth = 0x000186a0;
+	}
+	break;
+    case SPK_MOFF:
+	recv_mesg = 0;
+	sprefresh(SPK_MFIELD);
+	W_SetSensitive(reviewWin, 0);
+	break;
+    case SPK_MON:
+	recv_mesg = 1;
+	sprefresh(SPK_MFIELD);
+	W_SetSensitive(reviewWin, 1);
+	break;
+    case SPK_M_KILLS:
+	recv_kmesg = 1;
+	sprefresh(SPK_KFIELD);
+	break;
+    case SPK_M_NOKILLS:
+	recv_kmesg = 0;
+	sprefresh(SPK_KFIELD);
+	break;
+    case SPK_M_WARN:
+	recv_warn = 1;
+	sprefresh(SPK_WFIELD);
+	break;
+    case SPK_M_NOWARN:
+	recv_warn = 0;
+	sprefresh(SPK_WFIELD);
+	break;
+
+    case SPK_THRESHOLD:
+	break;
+    default:
+	fprintf(stderr, "%s: unknown response packet value short-req: %d\n",
+		"netrek", packet->repl);
+    }
+}
+
+void
+handleVTorpInfo(sbuf)
+    unsigned char *sbuf;
+{
+    unsigned char *bitset, *which, *data, *infobitset, *infodata;
+    struct torp *thetorp;
+    int     dx, dy;
+    int     shiftvar;
+    char    status, war;
+    register int i;
+    register int shift = 0;	/* How many torps are extracted (for shifting
+				   ) */
+
+/* now we must find the data ... :-) */
+    bitset = &sbuf[1];
+    which = &sbuf[2];
+    infobitset = &sbuf[3];
+/* Where is the data ? */
+    data = &sbuf[4];
+    infodata = &sbuf[vtisize[numofbits[(unsigned char) sbuf[1]]]];
+
+    thetorp = &torps[(unsigned char) (*which * 8)];
+
+    for (shift = 0, i = 0; i < 8;
+#if defined(RS6K) || defined(__SABER__)
+	 thetorp++, *bitset >>= 1, *infobitset >>= 1, i++) {
+#else
+	 thetorp++, *bitset = ((unsigned char)*bitset)  >> 1, *infobitset = ((unsigned char) *infobitset) >> 1, i++) {
+#endif
+
+	if (*bitset & 01) {
+	    dx = (*data >> shift);
+	    data++;
+	    shiftvar = (unsigned char) *data;	/* to silence gcc */
+	    shiftvar <<= (8 - shift);
+	    dx |= (shiftvar & 511);
+	    shift++;
+	    dy = (*data >> shift);
+	    data++;
+	    shiftvar = (unsigned char) *data;	/* to silence gcc */
+	    shiftvar <<= (8 - shift);
+	    dy |= (shiftvar & 511);
+	    shift++;
+	    if (shift == 8) {
+		shift = 0;
+		data++;
+	    }
+	    /* Check for torp with no TorpInfo */
+	    if (!(*infobitset & 01)) {
+		if (thetorp->t_status == TFREE) {
+		    thetorp->t_status = TMOVE;	/* guess */
+		    players[thetorp->t_owner].p_ntorp++;
+		} else if (thetorp->t_owner == me->p_no &&
+			   thetorp->t_status == TEXPLODE) {	/* If TFREE got lost */
+		    thetorp->t_status = TMOVE;	/* guess */
+		}
+	    }
+	    /* Check if torp is visible */
+	    if (dx > spwinside || dy > spwinside) {
+		thetorp->t_x = -100000;	/* Not visible */
+		thetorp->t_y = -100000;
+	    } else {		/* visible */
+/*	    thetorp->t_x = me->p_x + ((dx - spwinside / 2) * SCALE);
+	    thetorp->t_y = me->p_y + ((dy - spwinside / 2) * SCALE);
+*/
+		thetorp->t_x = my_x + ((dx - spwinside / 2) *
+				       SCALE);
+		thetorp->t_y = my_y + ((dy - spwinside / 2) *
+				       SCALE);
+
+#ifdef ROTATERACE
+		if (rotate) {
+		    rotate_coord(&thetorp->t_x, &thetorp->t_y, rotate_deg,
+				 spgwidth / 2, spgwidth / 2);
+		}
+#endif
+	    }
+	}
+	/* if */
+	else {			/* Got a TFREE ? */
+	    if (!(*infobitset & 01)) {	/* No other TorpInfo for this Torp */
+		if (thetorp->t_status && thetorp->t_status != TEXPLODE) {
+		    players[thetorp->t_owner].p_ntorp--;
+		    thetorp->t_status = TFREE;	/* That's no guess */
+		}
+	    }
+	}
+	/* Now the TorpInfo */
+	if (*infobitset & 01) {
+	    war = (unsigned char) *infodata & 15 /* 0x0f */ ;
+	    status = ((unsigned char) *infodata & 0xf0) >> 4;
+	    infodata++;
+	    if (status == TEXPLODE && thetorp->t_status == TFREE) {
+		/* FAT: redundant explosion; don't update p_ntorp */
+		continue;
+	    }
+	    if (thetorp->t_status == TFREE && status) {
+		players[thetorp->t_owner].p_ntorp++;
+#ifdef UNIX_SOUND
+                play_sound (SND_FIRETORP); /* Fire Torp */
+#endif
+	    }
+	    if (thetorp->t_status && status == TFREE) {
+		players[thetorp->t_owner].p_ntorp--;
+	    }
+	    thetorp->t_war = war;
+	    if (status != thetorp->t_status) {
+		/* FAT: prevent explosion reset */
+		thetorp->t_status = status;
+		if (thetorp->t_status == TEXPLODE) {
+		    thetorp->t_fuse = NUMDETFRAMES;
+		}
+	    }
+	}			/* if */
+    }				/* for */
+}
+
+void
+handleVPlanet(sbuf)
+    unsigned char *sbuf;
+{
+    register int i;
+    register int numofplanets;	/* How many Planets are in the packet */
+    struct planet *plan;
+    struct planet_s_spacket *packet = (struct planet_s_spacket *) & sbuf[2];
+    /* FAT: prevent excessive redraw */
+    int     redraw = 0;
+
+    numofplanets = (unsigned char) sbuf[1];
+
+    if (numofplanets > MAXPLANETS + 1)
+	return;
+
+    for (i = 0; i < numofplanets; i++, packet++) {
+	if (packet->pnum < 0 || packet->pnum >= MAXPLANETS)
+	    continue;
+
+	plan = &planets[packet->pnum];
+	if (plan->pl_owner != packet->owner)
+	    redraw = 1;
+	plan->pl_owner = packet->owner;
+
+	if (plan->pl_info != packet->info)
+	    redraw = 1;
+
+	plan->pl_info = packet->info;
+	/* Redraw the planet because it was updated by server */
+
+	if (plan->pl_flags != (int) ntohs(packet->flags))
+	    redraw = 1;
+	plan->pl_flags = (int) ntohs(packet->flags);
+
+	if (plan->pl_armies != (unsigned char) packet->armies) {
+/*#ifdef EM*/
+	    /*
+	       don't redraw when armies change unless it crosses the '4' *
+	       army limit. Keeps people from watching for planet 'flicker' *
+	       when players are beaming
+	    */
+	    int     planetarmies = (unsigned char) packet->armies;
+	    if ((plan->pl_armies < 5 && planetarmies > 4) ||
+		(plan->pl_armies > 4 && planetarmies < 5))
+/*#endif*/
+		redraw = 1;
+	}
+
+	plan->pl_armies = (unsigned char) packet->armies;
+	if (plan->pl_info == 0) {
+	    plan->pl_owner = NOBODY;
+	}
+
+	if (redraw) {
+	    plan->pl_flags |= PLREDRAW;
+	    pl_update[packet->pnum].plu_update = 1;
+	    pl_update[packet->pnum].plu_x = plan->pl_x;
+	    pl_update[packet->pnum].plu_y = plan->pl_y;
+
+	}
+    }				/* FOR */
+}
+
+void
+sendShortReq(state)
+    char    state;
+{
+    struct shortreq_cpacket shortReq;
+
+    shortReq.type = CP_S_REQ;
+    shortReq.req = state;
+    shortReq.version = SHORTVERSION;
+    switch (state) {
+    case SPK_VON:
+	warning("Sending short packet request");
+	break;
+    case SPK_VOFF:
+	warning("Sending old packet request");
+	break;
+    default:
+	break;
+    }
+    if ((state == SPK_SALL || state == SPK_ALL) && recv_short) {
+	/* Let the client do the work, and not the network :-) */
+
+	register int i;
+	for (i = 0; i < nplayers * MAXTORP; i++)
+	    torps[i].t_status = TFREE;
+
+	for (i = 0; i < nplayers * MAXPLASMA; i++)
+	    plasmatorps[i].pt_status = PTFREE;
+
+	for (i = 0; i < nplayers; i++) {
+	    players[i].p_ntorp = 0;
+	    players[i].p_nplasmatorp = 0;
+	    phasers[i].ph_status = PHFREE;
+	}
+	if (state == SPK_SALL)
+	    warning("Sent request for small update (weapons+planets+kills)");
+	else if (state == SPK_ALL)
+	    warning("Sent request for medium update (all except stats)");
+	else
+	    warning("Sent some unknown request...");
+    }
+    sendServerPacket((struct shortreq_cpacket *) & shortReq);
+}
+
+char   *whydeadmess[] =
+{"", "[quit]", "[photon]", "[phaser]", "[planet]", "[explosion]",
+    "", "", "[ghostbust]", "[genocide]", "", "[plasma]", "[detted photon]", "[chain explosion]",
+"[TEAM]", "", "[team det]", "[team explosion]"};
+
+
+void
+handleSWarning(packet)
+    struct warning_s_spacket *packet;
+{
+    char    buf[80];
+    register struct player *target;
+    register int damage;
+    static int arg3, arg4;	/* Here are the arguments for warnings with
+				   more than 2 arguments */
+    static int karg3, karg4, karg5 = 0;
+    char    killmess[20];
+
+    switch (packet->whichmessage) {
+    case TEXTE:		/* damage used as tmp var */
+	damage = (unsigned char) packet->argument;
+	damage |= (unsigned char) packet->argument2 << 8;
+	if (damage >= 0 && damage < NUMWTEXTS)
+	    warning(w_texts[damage]);
+	break;
+    case PHASER_HIT_TEXT:
+	target = &players[(unsigned char) packet->argument & 0x3f];
+	damage = (unsigned char) packet->argument2;
+	if ((unsigned char) packet->argument & 64)
+	    damage |= 256;
+	if ((unsigned char) packet->argument & 128)
+	    damage |= 512;
+	(void) sprintf(buf, "Phaser burst hit %s for %d points", target->p_name, damage);
+	warning(buf);
+	break;
+    case BOMB_INEFFECTIVE:
+	sprintf(buf, "Weapons Officer: Bombing is ineffective.  Only %d armies are defending.",
+		(int) packet->argument);	/* nifty info feature 2/14/92
+						   TMC */
+	warning(buf);
+	break;
+    case BOMB_TEXT:
+	sprintf(buf, "Weapons Officer: Bombarding %s...  Sensors read %d armies left.",
+		planets[(unsigned char) packet->argument].pl_name,
+		(unsigned char) packet->argument2);
+	warning(buf);
+	break;
+    case BEAMUP_TEXT:
+	sprintf(buf, "%s: Too few armies to beam up",
+		planets[(unsigned char) packet->argument].pl_name);
+	warning(buf);
+	break;
+    case BEAMUP2_TEXT:
+	sprintf(buf, "Beaming up. (%d/%d)", (unsigned char) packet->argument, (unsigned char) packet->argument2);
+	warning(buf);
+	break;
+    case BEAMUPSTARBASE_TEXT:
+	sprintf(buf, "Starbase %s: Too few armies to beam up",
+		players[packet->argument].p_name);
+	warning(buf);
+	break;
+    case BEAMDOWNSTARBASE_TEXT:
+	sprintf(buf, "No more armies to beam down to Starbase %s.",
+		players[packet->argument].p_name);
+	warning(buf);
+
+	break;
+    case BEAMDOWNPLANET_TEXT:
+	sprintf(buf, "No more armies to beam down to %s.",
+		planets[(unsigned char) packet->argument].pl_name);
+	warning(buf);
+	break;
+    case SBREPORT:
+	sprintf(buf, "Transporter Room:  Starbase %s reports all troop bunkers are full!",
+		players[packet->argument].p_name);
+	warning(buf);
+	break;
+    case ONEARG_TEXT:
+	if (packet->argument >= 0 && packet->argument < NUMVARITEXTS) {
+	    sprintf(buf, vari_texts[packet->argument], (unsigned char) packet->argument2);
+	    warning(buf);
+	}
+	break;
+    case BEAM_D_PLANET_TEXT:
+	sprintf(buf, "Beaming down.  (%d/%d) %s has %d armies left",
+		arg3,
+		arg4,
+		planets[(unsigned char) packet->argument].pl_name,
+		packet->argument2);
+	warning(buf);
+	break;
+    case ARGUMENTS:
+	arg3 = (unsigned char) packet->argument;
+	arg4 = (unsigned char) packet->argument2;
+	break;
+    case BEAM_U_TEXT:
+	sprintf(buf, "Transfering ground units.  (%d/%d) Starbase %s has %d armies left",
+		(unsigned char) arg3, (unsigned char) arg4, players[packet->argument].p_name, (unsigned char) packet->argument2);
+	warning(buf);
+	break;
+    case LOCKPLANET_TEXT:
+	sprintf(buf, "Locking onto %s", planets[(unsigned char) packet->argument].pl_name);
+	warning(buf);
+	break;
+    case SBRANK_TEXT:
+	sprintf(buf, "You need a rank of %s or higher to command a starbase!", ranks[packet->argument].name);
+	warning(buf);
+	break;
+    case SBDOCKREFUSE_TEXT:
+	sprintf(buf, "Starbase %s refusing us docking permission captain.",
+		players[packet->argument].p_name);
+	warning(buf);
+	break;
+    case SBDOCKDENIED_TEXT:
+	sprintf(buf, "Starbase %s: Permission to dock denied, all ports currently occupied.", players[packet->argument].p_name);
+	warning(buf);
+	break;
+    case SBLOCKSTRANGER:
+	sprintf(buf, "Locking onto %s (%c%c)",
+		players[packet->argument].p_name,
+		TEAM_LETTER(players[packet->argument]),
+		shipnos[players[packet->argument].p_no]);
+	warning(buf);
+	break;
+    case SBLOCKMYTEAM:
+	sprintf(buf, "Locking onto %s (%c%c) (docking is %s)",
+		players[packet->argument].p_name,
+		TEAM_LETTER(players[packet->argument]),
+		shipnos[players[packet->argument].p_no],
+		(players[packet->argument].p_flags & PFDOCKOK) ? "enabled" : "disabled");
+	warning(buf);
+	break;
+    case DMKILL:
+	{
+	    struct mesg_spacket msg;
+	    int     killer, victim, armies;
+	    float   kills;
+	    victim = (unsigned char) packet->argument & 0x3f;
+	    killer = (unsigned char) packet->argument2 & 0x3f;
+	    /* that's only a temp */
+	    damage = (unsigned char) karg3;
+	    damage |= (karg4 & 127) << 8;
+	    kills = damage / 100.0;
+	    if (kills == 0.0)
+		strcpy(killmess, "NO CREDIT");
+	    else
+		sprintf(killmess, "%0.2f", kills);
+	    armies = (((unsigned char) packet->argument >> 6) | ((unsigned char) packet->argument2 & 192) >> 4);
+	    if (karg4 & 128)
+		armies |= 16;
+	    if (armies == 0) {
+		(void) sprintf(msg.mesg, "%s%s (%c%c) [%c%c] was kill %s for %s (%c%c) [%c%c]",
+			       (godToAllOnKills ? "GOD->ALL " : ""),
+			       players[victim].p_name,
+			       TEAM_LETTER(players[victim]),
+			       shipnos[victim],
+			       players[victim].p_ship->s_desig[0],
+			       players[victim].p_ship->s_desig[1],
+			       killmess,
+			       players[killer].p_name,
+			       TEAM_LETTER(players[killer]),
+			       shipnos[killer],
+			       players[killer].p_ship->s_desig[0],
+			       players[killer].p_ship->s_desig[1]);
+		msg.m_flags = MALL | MVALID | MKILL;
+	    } else {
+#ifdef SOUND			/* was feeling a little silly :-) */
+		if (killer == me->p_no || alwaysSoundDoosh)
+		    S_PlaySound(S_DOOSH);
+#endif
+		(void) sprintf(msg.mesg, "%s%s (%c%c+%d armies) [%c%c]: kill %s for %s (%c%c) [%c%c]",
+			       (godToAllOnKills ? "GOD->ALL " : ""),
+			       players[victim].p_name,
+			       TEAM_LETTER(players[victim]),
+			       shipnos[victim],
+			       armies,
+			       players[victim].p_ship->s_desig[0],
+			       players[victim].p_ship->s_desig[1],
+			       killmess,
+			       players[killer].p_name,
+			       TEAM_LETTER(players[killer]),
+			       shipnos[killer],
+			       players[killer].p_ship->s_desig[0],
+			       players[killer].p_ship->s_desig[1]);
+		msg.m_flags = MALL | MVALID | MKILLA;
+	    }
+	    if (why_dead) {
+		add_whydead(msg.mesg, karg5);
+		karg5 = 0;
+	    }
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case KILLARGS:
+	karg3 = (unsigned char) packet->argument;
+	karg4 = (unsigned char) packet->argument2;
+	break;
+    case KILLARGS2:
+	karg5 = (unsigned char) packet->argument;
+	break;
+    case DMKILLP:
+	{
+	    struct mesg_spacket msg;
+	    (void) sprintf(msg.mesg, "%s%s (%c%c) [%c%c] killed by %s (%c)",
+			   (godToAllOnKills ? "GOD->ALL " : ""),
+			   players[packet->argument].p_name,
+			   TEAM_LETTER(players[packet->argument]),
+			   shipnos[packet->argument],
+			   players[packet->argument].p_ship->s_desig[0],
+			   players[packet->argument].p_ship->s_desig[1],
+			 planets[(unsigned char) packet->argument2].pl_name,
+		  TEAM_LETTERP(planets[(unsigned char) packet->argument2]));
+	    if (why_dead) {
+		add_whydead(msg.mesg, karg5);
+		karg5 = 0;
+	    }
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MALL | MVALID | MKILLP;
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case DMBOMB:
+	{
+	    struct mesg_spacket msg;
+	    char    buf1[80];
+	    (void) sprintf(buf, "%-3s->%-3s", planets[(unsigned char) packet->argument2].pl_name, TEAM_SHORTP(planets[(unsigned char) packet->argument2]));
+	    (void) sprintf(buf1, "We are being attacked by %s %c%c who is %d%% damaged.",
+			   players[packet->argument].p_name,
+			   TEAM_LETTER(players[packet->argument]),
+			   shipnos[packet->argument],
+			   arg3);
+	    (void) sprintf(msg.mesg, "%s %s", buf, buf1);
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MTEAM | MBOMB | MVALID;
+	    msg.m_recpt = planets[(unsigned char) packet->argument2].pl_owner;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case DMDEST:
+	{
+	    struct mesg_spacket msg;
+	    char    buf1[80];
+	    (void) sprintf(buf, "%s destroyed by %s (%c%c)",
+			   planets[(unsigned char) packet->argument].pl_name,
+			   players[packet->argument2].p_name,
+			   TEAM_LETTER(players[packet->argument2]),
+			   shipnos[(unsigned char) packet->argument2]);
+	    (void) sprintf(buf1, "%-3s->%-3s",
+			   planets[(unsigned char) packet->argument].pl_name, TEAM_SHORTP(planets[(unsigned char) packet->argument]));
+	    (void) sprintf(msg.mesg, "%s %s", buf1, buf);
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MTEAM | MDEST | MVALID;
+	    msg.m_recpt = planets[(unsigned char) packet->argument].pl_owner;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case DMTAKE:
+	{
+	    struct mesg_spacket msg;
+	    char    buf1[80];
+	    (void) sprintf(buf, "%s taken over by %s (%c%c)",
+			   planets[(unsigned char) packet->argument].pl_name,
+			   players[packet->argument2].p_name,
+			   TEAM_LETTER(players[packet->argument2]),
+			   shipnos[packet->argument2]);
+	    (void) sprintf(buf1, "%-3s->%-3s",
+			   planets[(unsigned char) packet->argument].pl_name, TEAM_SHORT(players[packet->argument2]));
+	    (void) sprintf(msg.mesg, "%s %s", buf1, buf);
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MTEAM | MTAKE | MVALID;
+	    msg.m_recpt = idx_to_mask(players[packet->argument2].p_teami);
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case DGHOSTKILL:
+	{
+	    struct mesg_spacket msg;
+	    ushort  damage;
+	    damage = (unsigned char) karg3;
+	    damage |= (unsigned char) (karg4 & 0xff) << 8;
+	    (void) sprintf(msg.mesg, "GOD->ALL %s (%c%c) was kill %0.2f for the GhostBusters",
+			   players[(unsigned char) packet->argument].p_name, TEAM_LETTER(players[(unsigned char) packet->argument]),
+			   shipnos[(unsigned char) packet->argument],
+			   (float) damage / 100.0);
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MALL | MVALID;
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+/* INL Daemon Mesages */
+    case INLDMKILLP:
+	{
+	    struct mesg_spacket msg;
+	    *buf = 0;
+	    if (arg3) {		/* Armies */
+		sprintf(buf, "+%d", arg3);
+#ifdef SOUND
+		if(alwaysSoundDoosh)
+		    S_PlaySound(S_DOOSH);
+#endif
+	    }
+	    (void) sprintf(msg.mesg, "%s%s[%s] (%c%c%s) killed by %s (%c)",
+			   (godToAllOnKills ? "GOD->ALL " : ""),
+			   players[(unsigned char) packet->argument].p_name,
+			   ship_type(players[(unsigned char) packet->argument].p_ship),
+			   TEAM_LETTER(players[(unsigned char) packet->argument]),
+			   shipnos[(unsigned char) packet->argument],
+			   buf,
+			 planets[(unsigned char) packet->argument2].pl_name,
+		  TEAM_LETTERP(planets[(unsigned char) packet->argument2]));
+	    if (why_dead) {
+		add_whydead(msg.mesg, karg5);
+		karg5 = 0;
+	    }
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_flags = MALL | MVALID | MKILLP;
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case INLDMKILL:
+	{
+	    struct mesg_spacket msg;
+	    int     killer, victim, armies;
+	    float   kills;
+	    victim = (unsigned char) packet->argument & 0x3f;
+	    killer = (unsigned char) packet->argument2 & 0x3f;
+	    /* that's only a temp */
+	    damage = (unsigned char) karg3;
+	    damage |= (karg4 & 127) << 8;
+	    kills = damage / 100.0;
+	    armies = (((unsigned char) packet->argument >> 6) | ((unsigned char) packet->argument2 & 192) >> 4);
+	    if (karg4 & 128)
+		armies |= 16;
+	    if (armies == 0) {
+		(void) sprintf(msg.mesg, "%s%s[%s] (%c%c) was kill %0.2f for %s[%s] (%c%c)",
+			       (godToAllOnKills ? "GOD->ALL " : ""),
+			       players[victim].p_name,
+			       ship_type(players[victim].p_ship),
+			       TEAM_LETTER(players[victim]),
+			       shipnos[victim],
+			       kills,
+			       players[killer].p_name,
+			       ship_type(players[killer].p_ship),
+			       TEAM_LETTER(players[killer]),
+			       shipnos[killer]);
+		msg.m_flags = MALL | MVALID | MKILL;
+	    } else {
+#ifdef SOUND
+		if(killer == me->p_no || alwaysSoundDoosh)
+		    S_PlaySound(S_DOOSH);
+#endif
+		(void) sprintf(msg.mesg, "%s%s[%s] (%c%c+%d armies) was kill %0.2f for %s[%s] (%c%c)",
+			       (godToAllOnKills ? "GOD->ALL " : ""),
+			       players[victim].p_name,
+			       ship_type(players[victim].p_ship),
+			       TEAM_LETTER(players[victim]),
+			       shipnos[victim],
+			       armies,
+			       kills,
+			       players[killer].p_name,
+			       ship_type(players[killer].p_ship),
+			       TEAM_LETTER(players[killer]),
+			       shipnos[killer]);
+		msg.m_flags = MALL | MVALID | MKILLA;
+	    }
+	    if (why_dead) {
+		add_whydead(msg.mesg, karg5);
+		karg5 = 0;
+	    }
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case INLDRESUME:
+	{
+	    struct mesg_spacket msg;
+	    sprintf(msg.mesg, " Game will resume in %d seconds", (unsigned char) packet->argument);
+	    msg.m_flags = MALL | MVALID;
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case INLDTEXTE:
+	if (packet->argument >= 0 && (unsigned char) packet->argument < NUMDAEMONTEXTS) {
+	    struct mesg_spacket msg;
+	    strcpy(msg.mesg, daemon_texts[(unsigned char) packet->argument]);
+	    msg.m_flags = MALL | MVALID;
+	    msg.type = SP_MESSAGE;
+	    msg.mesg[79] = '\0';
+	    msg.m_recpt = 0;
+	    msg.m_from = 255;
+	    handleMessage(&msg);
+	}
+	break;
+    case STEXTE:
+	warning(s_texte[(unsigned char) packet->argument]);
+	break;
+    case SHORT_WARNING:
+	{
+	    struct warning_spacket *warn = (struct warning_spacket *) packet;
+	    warning(warn->mesg);
+	}
+	break;
+    case STEXTE_STRING:
+	{
+	    struct warning_spacket *warn = (struct warning_spacket *) packet;
+	    warning(warn->mesg);
+	    s_texte[(unsigned char) warn->pad2] = (char *) malloc(warn->pad3 - 4);
+	    if (s_texte[(unsigned char) warn->pad2] == NULL) {
+		s_texte[(unsigned char) warn->pad2] = no_memory;
+		warning("Could not add warning! (No memory!)");
+	    } else
+		strcpy(s_texte[(unsigned char) warn->pad2], warn->mesg);
+	}
+	break;
+    default:
+	warning("Unknown Short Warning!");
+	break;
+    }
+}
+
+#define MY_SIZEOF(a) (sizeof(a) / sizeof(*(a)))
+
+void
+add_whydead(s, m)		/* 7/22/93 LAB */
+    char   *s;
+    int     m;
+{
+    char    b[256];
+
+    if (m < MY_SIZEOF(whydeadmess)) {
+	sprintf(b, "%-50s %s", s, whydeadmess[m]);
+	b[79] = '\0';
+	strcpy(s, b);
+    }
+}
+
+#endif
+
+/* END SHORT_PACKETS */