view packets.h @ 3:5a977ccbc7a9 default tip

Empty changelog
author darius
date Sat, 06 Dec 1997 05:41:29 +0000
parents
children
line wrap: on
line source

/* $Id: packets.h,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */

/*--------------------------------------------------------------------------
NETREK II -- Paradise 2.1                    FILE: packets.h

Permission to use, copy, modify, and distribute this software and its
documentation for any NON-COMMERCIAL purpose (following the terms of
the GNU General Public License (read the file 'COPYING')) and without
fee is hereby granted, provided that this copyright notice appear in all
copies.  No representations are made about the suitability of this
software for any purpose.  This software is provided "as is" without
express or implied warranty.

    Xtrek Copyright 1986                            Chris Guthrie
    Netrek (Xtrek II) Copyright 1989                Kevin P. Smith
                                                    Scott Silvey
    Paradise II (Netrek II) Copyright 1993          Larry Denys
                                                    Kurt Olsen
                                                    Brandon Gillespie
    Paradise II by:
       Larry Denys, Kurt Olsen, Brandon Gillespie, and Rob Forsman
    and:
       Heath Kehoe, Mike Lutz, Mike McGrath, Ted Hadley, and Mark Kolb
--------------------------------------------------------------------------*/

/*
 * Include file for socket I/O xtrek.
 *
 * Kevin P. Smith 1/29/89
 */

#ifndef packets_h_
#define packets_h_

#define STATUS_TOKEN	"\t@@@"	/* ATM */

/* the following typedefs allow portability to machines without the
   ubiquitous 32-bit architecture (KSR1, Cray, DEC Alpha) */

typedef unsigned int CARD32;
typedef unsigned short CARD16;
typedef unsigned char CARD8;

typedef int INT32;
typedef short INT16;
#if __STDC__ || defined(sgi) || defined(RS6K)
typedef signed char INT8;
#else
/* stupid compilers */
typedef char INT8;
#endif

/*
 * TCP and UDP use identical packet formats; the only difference is that,
 * when in UDP mode, all packets sent from server to client have a sequence
 * number appended to them.
 *
 * (note: ALL packets, whether sent on the TCP or UDP channel, will have
 * the sequence number.  Thus it's important that client & server agree on
 * when to switch.  This was done to keep critical and non-critical data
 * in sync.)
 */

/* the various pad members of the structures are used for explicit
   data alignment.  They do not contain any data.  All structures are
   aligned to 4 bytes.  If your compiler forces 8 byte alignment, you
   will not be adhering to the netrek protocol.
   */

/* packets sent from xtrek server to remote client */
#define SP_MESSAGE 	1
#define SP_PLAYER_INFO 	2	/* general player info not elsewhere */
#define SP_KILLS	3	/* # kills a player has */
#define SP_PLAYER	4	/* x,y for player */
#define SP_TORP_INFO	5	/* torp status */
#define SP_TORP		6	/* torp location */
#define SP_PHASER	7	/* phaser status and direction */
#define SP_PLASMA_INFO	8	/* player login information */
#define SP_PLASMA	9	/* like SP_TORP */
#define SP_WARNING	10	/* like SP_MESG */
#define SP_MOTD		11	/* line from .motd screen */
#define SP_YOU		12	/* info on you? */
#define SP_QUEUE	13	/* estimated loc in queue? */
#define SP_STATUS	14	/* galaxy status numbers */
#define SP_PLANET 	15	/* planet armies & facilities */
#define SP_PICKOK	16	/* your team & ship was accepted */
#define SP_LOGIN	17	/* login response */
#define SP_FLAGS	18	/* give flags for a player */
#define SP_MASK		19	/* tournament mode mask */
#define SP_PSTATUS	20	/* give status for a player */
#define SP_BADVERSION   21	/* invalid version number */
#define SP_HOSTILE	22	/* hostility settings for a player */
#define SP_STATS	23	/* a player's statistics */
#define SP_PL_LOGIN	24	/* new player logs in */
#define SP_RESERVED	25	/* for future use */
#define SP_PLANET_LOC	26	/* planet name, x, y */

#define SP_SCAN		27	/* scan packet */
#define SP_UDP_REPLY	28	/* notify client of UDP status */
#define SP_SEQUENCE	29	/* sequence # packet */
#define SP_SC_SEQUENCE	30	/* this trans is semi-critical info */
#define SP_RSA_KEY	31	/* RSA data packet */

#define SP_MOTD_PIC     32	/* motd bitmap pictures */
#define SP_STATS2	33	/* new stats packet */
#define SP_STATUS2	34	/* new status packet */
#define SP_PLANET2	35	/* new planet packet */
#define SP_NEW_MOTD     36	/* New MOTD info notification uses */
#define SP_THINGY	37	/* thingy location */
#define SP_THINGY_INFO	38	/* thingy status */
#define SP_SHIP_CAP	39	/* ship capabilities */

#ifdef SHORT_PACKETS
#define SP_S_REPLY      40	/* reply to send-short request */
#define SP_S_MESSAGE    41	/* var. Message Packet */
#define SP_S_WARNING    42	/* Warnings with 4  Bytes */
#define SP_S_YOU        43	/* hostile,armies,whydead,etc .. */
#define SP_S_YOU_SS     44	/* your ship status */
#define SP_S_PLAYER     45	/* variable length player packet */
#endif

#define SP_PING         46	/* ping packet */

#ifdef SHORT_PACKETS
#define SP_S_TORP       47	/* variable length torp packet */
#define SP_S_TORP_INFO  48	/* SP_S_TORP with TorpInfo */
#define SP_S_8_TORP     49	/* optimized SP_S_TORP */
#define SP_S_PLANET     50	/* see SP_PLANET */

/* variable length packets */
#define VPLAYER_SIZE    4
#define SHORTVERSION    10	/* other number blocks, like UDP Version */
#endif

#define SP_GPARAM	51	/* game params packet */

/* the following is a family of packets with the same type, but a
   discriminating subtype */
#define SP_PARADISE_EXT1	52
#define SP_PE1_MISSING_BITMAP	0
#define SP_PE1_NUM_MISSILES	1
/* end of packet 52 subtypes */
#define SP_TERRAIN2	53	/* Terrain packets */
#define SP_TERRAIN_INFO2 54	/* Terrain info */

#ifdef FEATURE
/* feature_spacket, response to feature_cpacket requests. identical structures */
#define SP_FEATURE              60
#endif

#ifdef RECORDER
/* special type tells us when to update the display on playback.
   Not sent or received, only placed in the recorder file */
#define REC_UPDATE 127
#endif

/* packets sent from remote client to xtrek server */
#define CP_MESSAGE      1	/* send a message */
#define CP_SPEED	2	/* set speed */
#define CP_DIRECTION	3	/* change direction */
#define CP_PHASER	4	/* phaser in a direction */
#define CP_PLASMA	5	/* plasma (in a direction) */
#define CP_TORP		6	/* fire torp in a direction */
#define CP_QUIT		7	/* self destruct */
#define CP_LOGIN	8	/* log in (name, password) */
#define CP_OUTFIT	9	/* outfit to new ship */
#define CP_WAR		10	/* change war status */
#define CP_PRACTR	11	/* create practice robot? */
#define CP_SHIELD	12	/* raise/lower sheilds */
#define CP_REPAIR	13	/* enter repair mode */
#define CP_ORBIT	14	/* orbit planet/starbase */
#define CP_PLANLOCK	15	/* lock on planet */
#define CP_PLAYLOCK	16	/* lock on player */
#define CP_BOMB		17	/* bomb a planet */
#define CP_BEAM		18	/* beam armies up/down */
#define CP_CLOAK	19	/* cloak on/off */
#define CP_DET_TORPS	20	/* detonate enemy torps */
#define CP_DET_MYTORP	21	/* detonate one of my torps */
#define CP_COPILOT	22	/* toggle copilot mode */
#define CP_REFIT	23	/* refit to different ship type */
#define CP_TRACTOR	24	/* tractor on/off */
#define CP_REPRESS	25	/* pressor on/off */
#define CP_COUP		26	/* coup home planet */
#define CP_SOCKET	27	/* new socket for reconnection */
#define CP_OPTIONS	28	/* send my options to be saved */
#define CP_BYE		29	/* I'm done! */
#define CP_DOCKPERM	30	/* set docking permissions */
#define CP_UPDATES	31	/* set number of usecs per update */
#define CP_RESETSTATS	32	/* reset my stats packet */
#define CP_RESERVED	33	/* for future use */

#define CP_SCAN		34	/* ATM: request for player scan */

#define CP_UDP_REQ	35	/* request UDP on/off */
#define CP_SEQUENCE	36	/* sequence # packet */
#define CP_RSA_KEY	37	/* request MOTD */
#define CP_ASK_MOTD	38	/* request MOTD */

#define CP_PING_RESPONSE 42	/* client response */

#ifdef SHORT_PACKETS
#define CP_S_REQ                43
#define CP_S_THRS               44
#define CP_S_MESSAGE    45	/* vari. Message Packet */
#define CP_S_RESERVED       46
#define CP_S_DUMMY      47
#endif

#ifdef FEATURE
#define CP_FEATURE   60
#endif

#define SOCKVERSION 	4
#define UDPVERSION	10	/* changing this blocks other */
 /* versions */

struct packet_handler {
    void    (*handler) ();
};


/*
 * These are server --> client packets
 */

struct mesg_spacket {
    INT8    type;		/* SP_MESSAGE */
    CARD8   m_flags;
    CARD8   m_recpt;
    CARD8   m_from;
    char    mesg[80];
};

struct plyr_info_spacket {
    INT8    type;		/* SP_PLAYER_INFO */
    INT8    pnum;
    INT8    shiptype;
    INT8    team;
};

struct kills_spacket {
    INT8    type;		/* SP_KILLS */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;
    CARD32  kills;		/* where 1234=12.34 kills and 0=0.00 kills */
};

struct player_spacket {
    INT8    type;		/* SP_PLAYER */
    INT8    pnum;
    CARD8   dir;
    INT8    speed;
    INT32   x, y;
};

struct torp_info_spacket {
    INT8    type;		/* SP_TORP_INFO */
    INT8    war;
    INT8    status;		/* TFREE, TDET, etc... */
    INT8    pad1;		/* pad needed for cross cpu compatibility */
    INT16   tnum;
    INT16   pad2;
};

struct torp_spacket {
    INT8    type;		/* SP_TORP */
    CARD8   dir;
    INT16   tnum;
    INT32   x, y;
};

/* Shapes of thingys.  It would be best to add to the end of this list and
   try to coordinate your additions with other hackers. */
enum thingy_types {
    SHP_BLANK, SHP_MISSILE, SHP_BOOM, SHP_TORP, SHP_PLASMA, SHP_MINE,
    SHP_PBOOM, SHP_FIGHTER, SHP_WARP_BEACON
};

struct thingy_info_spacket {
    INT8    type;		/* SP_THINGY_INFO */
    INT8    war;
    INT16   shape;		/* a thingy_types */
    INT16   tnum;
    INT16   owner;
};

struct thingy_spacket {
    INT8    type;		/* SP_THINGY */
    CARD8   dir;
    INT16   tnum;
    INT32   x, y;
};

struct phaser_spacket {
    INT8    type;		/* SP_PHASER */
    INT8    pnum;
    INT8    status;		/* PH_HIT, etc... */
    CARD8   dir;
    INT32   x, y;
    INT32   target;
};

struct plasma_info_spacket {
    INT8    type;		/* SP_PLASMA_INFO */
    INT8    war;
    INT8    status;		/* TFREE, TDET, etc... */
    INT8    pad1;		/* pad needed for cross cpu compatibility */
    INT16   pnum;
    INT16   pad2;
};

struct plasma_spacket {
    INT8    type;		/* SP_PLASMA */
    INT8    pad1;
    INT16   pnum;
    INT32   x, y;
};

struct warning_spacket {
    INT8    type;		/* SP_WARNING */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    char    mesg[80];
};

struct motd_spacket {
    INT8    type;		/* SP_MOTD */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    char    line[80];
};

struct you_spacket {
    INT8    type;		/* SP_YOU */
    INT8    pnum;		/* Guy needs to know this... */
    INT8    hostile;
    INT8    swar;
    INT8    armies;
    INT8    tractor;		/* ATM - visible tractor (was pad1) */
    CARD8   pad2;
    CARD8   pad3;
    CARD32  flags;
    INT32   damage;
    INT32   shield;
    INT32   fuel;
    INT16   etemp;
    INT16   wtemp;
    INT16   whydead;
    INT16   whodead;
};

struct queue_spacket {
    INT8    type;		/* SP_QUEUE */
    INT8    pad1;
    INT16   pos;
};

struct status_spacket {
    INT8    type;		/* SP_STATUS */
    INT8    tourn;
    INT8    pad1;
    INT8    pad2;
    CARD32  armsbomb;
    CARD32  planets;
    CARD32  kills;
    CARD32  losses;
    CARD32  time;
    CARD32  timeprod;
};

struct planet_spacket {
    INT8    type;		/* SP_PLANET */
    INT8    pnum;
    INT8    owner;
    INT8    info;
    INT16   flags;
    INT16   pad2;
    INT32   armies;
};

/* terrain info for Paradise terrain */
/* 5/16/95 rpg */

struct terrain_info_packet2 {
    CARD8   type;		/* SP_TERRAIN_INFO2 */
    CARD8   pad;
    CARD16  pad2;
    CARD16  xdim;
    CARD16  ydim;
};

struct terrain_packet2 {
    CARD8   type;		/* SP_TERRAIN2 */
    CARD8   sequence;
    CARD8   total_pkts;
    CARD8   length;
    CARD8   terrain_type[128];	/* Ugh... this needs to be fixed 5/16/95 rpg */
 /* CARD16  terrain_alt1[128]; */
 /* CARD16  terrain_alt2[128]; */
};

struct pickok_spacket {
    INT8    type;		/* SP_PICKOK */
    INT8    state;
    INT8    pad2;
    INT8    pad3;
};

struct login_spacket {
    INT8    type;		/* SP_LOGIN */
    INT8    accept;		/* 1/0 */
    INT8    pad2;
    INT8    pad3;
    INT32   flags;
    char    keymap[96];
};

struct flags_spacket {
    INT8    type;		/* SP_FLAGS */
    INT8    pnum;		/* whose flags are they? */
    INT8    tractor;		/* ATM - visible tractors */
    INT8    pad2;
    CARD32  flags;
};

struct mask_spacket {
    INT8    type;		/* SP_MASK */
    INT8    mask;
    INT8    pad1;
    INT8    pad2;
};

struct pstatus_spacket {
    INT8    type;		/* SP_PSTATUS */
    INT8    pnum;
    INT8    status;
    INT8    pad1;
};

struct badversion_spacket {
    INT8    type;		/* SP_BADVERSION */
    INT8    why;
    INT8    pad2;
    INT8    pad3;
};

struct hostile_spacket {
    INT8    type;		/* SP_HOSTILE */
    INT8    pnum;
    INT8    war;
    INT8    hostile;
};

struct stats_spacket {
    INT8    type;		/* SP_STATS */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;
    INT32   tkills;		/* Tournament kills */
    INT32   tlosses;		/* Tournament losses */
    INT32   kills;		/* overall */
    INT32   losses;		/* overall */
    INT32   tticks;		/* ticks of tournament play time */
    INT32   tplanets;		/* Tournament planets */
    INT32   tarmies;		/* Tournament armies */
    INT32   sbkills;		/* Starbase kills */
    INT32   sblosses;		/* Starbase losses */
    INT32   armies;		/* non-tourn armies */
    INT32   planets;		/* non-tourn planets */
    INT32   maxkills;		/* max kills as player * 100 */
    INT32   sbmaxkills;		/* max kills as sb * 100 */
};

struct plyr_login_spacket {
    INT8    type;		/* SP_PL_LOGIN */
    INT8    pnum;
    INT8    rank;
    INT8    pad1;
    char    name[16];
    char    monitor[16];
    char    login[16];
};

struct reserved_spacket {
    INT8    type;		/* SP_RESERVED */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    INT8    data[16];
};

struct planet_loc_spacket {
    INT8    type;		/* SP_PLANET_LOC */
    INT8    pnum;
    INT8    pad2;
    INT8    pad3;
    INT32   x;
    INT32   y;
    char    name[16];
};

struct scan_spacket {		/* ATM */
    INT8    type;		/* SP_SCAN */
    INT8    pnum;
    INT8    success;
    INT8    pad1;
    INT32   p_fuel;
    INT32   p_armies;
    INT32   p_shield;
    INT32   p_damage;
    INT32   p_etemp;
    INT32   p_wtemp;
};

struct udp_reply_spacket {	/* UDP */
    INT8    type;		/* SP_UDP_REPLY */
    INT8    reply;
    INT8    pad1;
    INT8    pad2;
    INT32   port;
};

struct sequence_spacket {	/* UDP */
    INT8    type;		/* SP_SEQUENCE */
    INT8    pad1;
    CARD16  sequence;
};
struct sc_sequence_spacket {	/* UDP */
    INT8    type;		/* SP_CP_SEQUENCE */
    INT8    pad1;
    CARD16  sequence;
};

/*
 * Game configuration.
 * KAO 1/23/93
 */

struct ship_cap_spacket {	/* Server configuration of client */
    INT8    type;		/* screw motd method */
    INT8    operation;		/* 0 = add/change a ship, 1 = remove a ship */
    INT16   s_type;		/* SP_SHIP_CAP */
    INT16   s_torpspeed;
    INT16   s_phaserrange;
    INT32   s_maxspeed;
    INT32   s_maxfuel;
    INT32   s_maxshield;
    INT32   s_maxdamage;
    INT32   s_maxwpntemp;
    INT32   s_maxegntemp;
    INT16   s_width;
    INT16   s_height;
    INT16   s_maxarmies;
    INT8    s_letter;
    INT8    pad2;
    char    s_name[16];
    INT8    s_desig1;
    INT8    s_desig2;
    INT16   s_bitmap;
};

struct motd_pic_spacket {
    INT8    type;		/* SP_MOTD_PIC */
    INT8    pad1;
    INT16   x, y, page;
    INT16   width, height;
    INT8    bits[1016];
};


 /* This is used to send paradise style stats */
struct stats_spacket2 {
    INT8    type;		/* SP_STATS2 */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;

    INT32   genocides;		/* number of genocides participated in */
    INT32   maxkills;		/* max kills ever * 100  */
    INT32   di;			/* destruction inflicted for all time * 100 */
    INT32   kills;		/* Kills in tournament play */
    INT32   losses;		/* Losses in tournament play */
    INT32   armsbomb;		/* Tournament armies bombed */
    INT32   resbomb;		/* resources bombed off */
    INT32   dooshes;		/* armies killed while being carried */
    INT32   planets;		/* Tournament planets conquered */
    INT32   tticks;		/* Tournament ticks */
    /* SB/WB/JS stats are entirely separate */
    INT32   sbkills;		/* Kills as starbase */
    INT32   sblosses;		/* Losses as starbase */
    INT32   sbticks;		/* Time as starbase */
    INT32   sbmaxkills;		/* Max kills as starbase * 100 */
    INT32   wbkills;		/* Kills as warbase */
    INT32   wblosses;		/* Losses as warbase */
    INT32   wbticks;		/* Time as warbase */
    INT32   wbmaxkills;		/* Max kills as warbase * 100 */
    INT32   jsplanets;		/* planets assisted with in JS */
    INT32   jsticks;		/* ticks played as a JS */
    INT32   rank;		/* Ranking of the player */
    INT32   royal;		/* royaly, specialty, rank */
};

 /* status info for paradise stats */
struct status_spacket2 {
    INT8    type;		/* SP_STATUS2 */
    INT8    tourn;
    INT8    pad1;
    INT8    pad2;
    CARD32  dooshes;		/* total number of armies dooshed */
    CARD32  armsbomb;		/* all t-mode armies bombed */
    CARD32  resbomb;		/* resources bombed */
    CARD32  planets;		/* all t-mode planets taken */
    CARD32  kills;		/* all t-mode kills made */
    CARD32  losses;		/* all t-mode losses */
    CARD32  sbkills;		/* total kills in SB's */
    CARD32  sblosses;		/* total losses in Sb's */
    CARD32  sbtime;		/* total time in SB's */
    CARD32  wbkills;		/* kills in warbases */
    CARD32  wblosses;		/* losses in warbases */
    CARD32  wbtime;		/* total time played in wb's */
    CARD32  jsplanets;		/* total planets taken by jump ships */
    CARD32  jstime;		/* total time in a jump ship */
    CARD32  time;		/* t mode time in this game */
    CARD32  timeprod;		/* t-mode ship ticks--sort of like */
};


 /* planet info for a paradise planet */
struct planet_spacket2 {
    INT8    type;		/* SP_PLANET2 */
    INT8    pnum;		/* planet number */
    INT8    owner;		/* owner of the planet */
    INT8    info;		/* who has touched planet */
    INT32   flags;		/* planet's flags */
    INT32   timestamp;		/* timestamp for info on planet */
    INT32   armies;		/* armies on the planet */
};

struct obvious_packet {
    INT8    type;		/* SP_NEW_MOTD */
    INT8    pad1;		/* CP_ASK_MOTD */
};

struct rsa_key_spacket {
    INT8    type;		/* SP_RSA_KEY */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    CARD8   data[KEY_SIZE];
};


struct ping_spacket {
    INT8    type;		/* SP_PING */
    CARD8   number;		/* id (ok to wrap) */
    CARD16  lag;		/* delay of last ping in ms */

    CARD8   tloss_sc;		/* total loss server-client 0-100% */
    CARD8   tloss_cs;		/* total loss client-server 0-100% */

    CARD8   iloss_sc;		/* inc. loss server-client 0-100% */
    CARD8   iloss_cs;		/* inc. loss client-server 0-100% */
};

struct paradiseext1_spacket {
    INT8    type;
    CARD8   subtype;
    INT16   pad;
};

struct pe1_missing_bitmap_spacket {
    INT8    type;
    CARD8   subtype;

    INT16   page;

    INT16   x, y;
    INT16   width, height;
};

struct pe1_num_missiles_spacket {
    INT8    type;		/* SP_PARADISE_EXT1 */
    CARD8   subtype;		/* SP_PE1_NUM_MISSILES */

    INT16   num;		/* number of missiles */
};

/*
 * These are the client --> server packets
 */

struct mesg_cpacket {
    INT8    type;		/* CP_MESSAGE */
    INT8    group;
    INT8    indiv;
    INT8    pad1;
    char    mesg[80];
};

struct speed_cpacket {
    INT8    type;		/* CP_SPEED */
    INT8    speed;
    INT8    pad1;
    INT8    pad2;
};

struct dir_cpacket {
    INT8    type;		/* CP_DIRECTION */
    CARD8   dir;
    INT8    pad1;
    INT8    pad2;
};

struct phaser_cpacket {
    INT8    type;		/* CP_PHASER */
    CARD8   dir;
    INT8    pad1;
    INT8    pad2;
};

struct plasma_cpacket {
    INT8    type;		/* CP_PLASMA */
    CARD8   dir;
    INT8    pad1;
    INT8    pad2;
};

struct torp_cpacket {
    INT8    type;		/* CP_TORP */
    CARD8   dir;		/* direction to fire torp */
    INT8    pad1;
    INT8    pad2;
};

struct quit_cpacket {
    INT8    type;		/* CP_QUIT */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
};

struct login_cpacket {
    INT8    type;		/* CP_LOGIN */
    INT8    query;
    INT8    pad2;
    INT8    pad3;
    char    name[16];
    char    password[16];
    char    login[16];
};

struct outfit_cpacket {
    INT8    type;		/* CP_OUTFIT */
    INT8    team;
    INT8    ship;
    INT8    pad1;
};

struct war_cpacket {
    INT8    type;		/* CP_WAR */
    INT8    newmask;
    INT8    pad1;
    INT8    pad2;
};

struct practr_cpacket {
    INT8    type;		/* CP_PRACTR */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
};

struct shield_cpacket {
    INT8    type;		/* CP_SHIELD */
    INT8    state;		/* up/down */
    INT8    pad1;
    INT8    pad2;
};

struct repair_cpacket {
    INT8    type;		/* CP_REPAIR */
    INT8    state;		/* on/off */
    INT8    pad1;
    INT8    pad2;
};

struct orbit_cpacket {
    INT8    type;		/* CP_ORBIT */
    INT8    state;		/* on/off */
    INT8    pad1;
    INT8    pad2;
};

struct planlock_cpacket {
    INT8    type;		/* CP_PLANLOCK */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;
};

struct playlock_cpacket {
    INT8    type;		/* CP_PLAYLOCK */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;
};

struct bomb_cpacket {
    INT8    type;		/* CP_BOMB */
    INT8    state;
    INT8    pad1;
    INT8    pad2;
};

struct beam_cpacket {
    INT8    type;		/* CP_BEAM */
    INT8    state;
    INT8    pad1;
    INT8    pad2;
};

struct cloak_cpacket {
    INT8    type;		/* CP_CLOAK */
    INT8    state;
    INT8    pad1;
    INT8    pad2;
};

struct det_torps_cpacket {
    INT8    type;		/* CP_DET_TORPS */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
};

struct det_mytorp_cpacket {
    INT8    type;		/* CP_DET_MYTORP */
    INT8    pad1;
    INT16   tnum;
};

struct copilot_cpacket {
    INT8    type;		/* CP_COPLIOT */
    INT8    state;
    INT8    pad1;
    INT8    pad2;
};

struct refit_cpacket {
    INT8    type;		/* CP_REFIT */
    INT8    ship;
    INT8    pad1;
    INT8    pad2;
};

struct tractor_cpacket {
    INT8    type;		/* CP_TRACTOR */
    INT8    state;
    INT8    pnum;
    INT8    pad2;
};

struct repress_cpacket {
    INT8    type;		/* CP_REPRESS */
    INT8    state;
    INT8    pnum;
    INT8    pad2;
};

struct coup_cpacket {
    INT8    type;		/* CP_COUP */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
};

struct socket_cpacket {
    INT8    type;		/* CP_SOCKET */
    INT8    version;
    INT8    udp_version;	/* was pad2 */
    INT8    pad3;
    CARD32  socket;
};

struct options_cpacket {
    INT8    type;		/* CP_OPTIONS */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    CARD32  flags;
    INT8    keymap[96];
};

struct bye_cpacket {
    INT8    type;		/* CP_BYE */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
};

struct dockperm_cpacket {
    INT8    type;		/* CP_DOCKPERM */
    INT8    state;
    INT8    pad2;
    INT8    pad3;
};

struct updates_cpacket {
    INT8    type;		/* CP_UPDATES */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    CARD32  usecs;
};

struct resetstats_cpacket {
    INT8    type;		/* CP_RESETSTATS */
    INT8    verify;		/* 'Y' - just to make sure he meant it */
    INT8    pad2;
    INT8    pad3;
};

struct reserved_cpacket {
    INT8    type;		/* CP_RESERVED */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    INT8    data[16];
    INT8    resp[16];
};

struct scan_cpacket {		/* ATM */
    INT8    type;		/* CP_SCAN */
    INT8    pnum;
    INT8    pad1;
    INT8    pad2;
};

struct udp_req_cpacket {	/* UDP */
    INT8    type;		/* CP_UDP_REQ */
    INT8    request;
    INT8    connmode;		/* respond with port # or just send UDP
				   packet? */
    INT8    pad2;
    INT32   port;		/* compensate for hosed recvfrom() */
};

struct sequence_cpacket {	/* UDP */
    INT8    type;		/* CP_SEQUENCE */
    INT8    pad1;
    CARD16  sequence;
};

struct rsa_key_cpacket {
    INT8    type;		/* CP_RSA_KEY */
    INT8    pad1;
    INT8    pad2;
    INT8    pad3;
    CARD8   global[KEY_SIZE];
    CARD8   public[KEY_SIZE];
    CARD8   resp[KEY_SIZE];
};

/* the CP_ASK_MOTD packet is the same as temp_spacket */

struct ping_cpacket {
    INT8    type;		/* CP_PING_RESPONSE */
    CARD8   number;		/* id */
    INT8    pingme;		/* if client wants server to ping */
    INT8    pad1;

    INT32   cp_sent;		/* # packets sent to server */
    INT32   cp_recv;		/* # packets recv from server */
};


#ifdef FEATURE
/* feature_cpacket and _spacket are identical! */
struct feature_cpacket {	/* CP_FEATURE */
    INT8    type;
    char    feature_type;	/* either 'C' or 'S' */
    CARD8   arg1;               /* could be INT8 depending on feature */
    CARD8   arg2;               /* but only BEEP_LITE uses it, for now */
    INT32   value;
    char    name[80];
};

struct feature_spacket {	/* SP_FEATURE */
    INT8    type;
    char    feature_type;	/* either 'C' or 'S' */
    CARD8   arg1;
    CARD8   arg2;
    INT32    value;
    char    name[80];
};
#endif				/* FEATURE */

/*
 * short stuff
 */

#ifdef SHORT_PACKETS
struct shortreq_cpacket {	/* CP_S_REQ */
    INT8    type;
    INT8    req;
    INT8    version;
    INT8    pad2;
};

struct threshold_cpacket {	/* CP_S_THRS */
    INT8    type;
    INT8    pad1;
    CARD16  thresh;
};

struct shortreply_spacket {	/* SP_S_REPLY */
    INT8    type;
    INT8    repl;
    CARD16  winside;
    INT32   gwidth;
};

struct youshort_spacket {	/* SP_S_YOU */
    INT8    type;

    INT8    pnum;
    INT8    hostile;
    INT8    swar;

    INT8    armies;
    INT8    whydead;
    INT8    whodead;

    INT8    pad1;

    CARD32  flags;
};

struct youss_spacket {		/* SP_S_YOU_SS */
    INT8    type;
    INT8    pad1;

    CARD16  damage;
    CARD16  shield;
    CARD16  fuel;
    CARD16  etemp;
    CARD16  wtemp;
};

#define VPLANET_SIZE 6

struct planet_s_spacket {	/* body of SP_S_PLANET  */
    INT8    pnum;
    INT8    owner;
    INT8    info;
    CARD8   armies;		/* more than 255 Armies ? ...  */
    INT16   flags;
};
struct warning_s_spacket {	/* SP_S_WARNING */
    INT8    type;
    CARD8   whichmessage;
    INT8    argument, argument2;/* for phaser  etc ... */
};

struct player_s_spacket {
    INT8    type;		/* SP_S_PLAYER Header */
    INT8    packets;		/* How many player-packets are in this packet
				   ( only the first 6 bits are relevant ) */
    CARD8   dir;
    INT8    speed;
    INT32   x, y;		/* To get the absolute Position */
};

/* The format of the body:
struct player_s_body_spacket {	Body of new Player Packet
	CARD8 pnum;	 0-4 = pnum, 5 local or galactic, 6 = 9. x-bit, 7 9. y-bit
	CARD8 speeddir;	 0-3 = speed , 4-7 direction of ship
	CARD8 x;	 low 8 bits from X-Pixelcoordinate
	CARD8 y;	 low 8 bits from Y-Pixelcoordinate
};
*/

struct torp_s_spacket {
    INT8    type;		/* SP_S_TORP */
    CARD8   bitset;		/* bit=1 that torp is in packet */
    CARD8   whichtorps;		/* Torpnumber of first torp / 8 */
    CARD8   data[21];		/* For every torp 2*9 bit coordinates */
};

struct mesg_s_spacket {
    INT8    type;		/* SP_S_MESSAGE */
    CARD8   m_flags;
    CARD8   m_recpt;
    CARD8   m_from;
    CARD8   length;		/* Length of whole packet */
    INT8    mesg;
    INT8    pad2;
    INT8    pad3;
    INT8    pad[76];
};

struct mesg_s_cpacket {
    INT8    type;		/* CP_S__MESSAGE */
    INT8    group;
    INT8    indiv;
    INT8    length;		/* Size of whole packet   */
    INT8    mesg[80];
};

#endif

#endif