diff src/packets.c @ 4:aa38447a4b21

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:03 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/packets.c	Sat Dec 06 04:37:03 1997 +0000
@@ -0,0 +1,359 @@
+/*--------------------------------------------------------------------------
+NETREK II -- Paradise
+
+Permission to use, copy, modify, and distribute this software and its
+documentation, or any derivative works thereof, for any NON-COMMERCIAL
+purpose 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
+--------------------------------------------------------------------------*/
+
+#include "config.h"
+#include <stddef.h>
+#include <stdio.h>
+
+#include "defs.h"
+#include "packets.h"
+#include "gppackets.h"
+#include "wtext.h"
+
+size_t client_packet_sizes[] = {
+  0,
+  sizeof(struct mesg_cpacket),
+  sizeof(struct speed_cpacket),
+  sizeof(struct dir_cpacket),
+  sizeof(struct phaser_cpacket),
+  sizeof(struct plasma_cpacket),
+  sizeof(struct torp_cpacket),
+  sizeof(struct quit_cpacket),
+  sizeof(struct login_cpacket),
+  sizeof(struct outfit_cpacket),
+  /* 10 v */
+  sizeof(struct war_cpacket),
+  sizeof(struct practr_cpacket),
+  sizeof(struct shield_cpacket),
+  sizeof(struct repair_cpacket),
+  sizeof(struct orbit_cpacket),
+  sizeof(struct planlock_cpacket),
+  sizeof(struct playlock_cpacket),
+  sizeof(struct bomb_cpacket),
+  sizeof(struct beam_cpacket),
+  sizeof(struct cloak_cpacket),
+  /* 20 v */
+  sizeof(struct det_torps_cpacket),
+  sizeof(struct det_mytorp_cpacket),
+  sizeof(struct copilot_cpacket),
+  sizeof(struct refit_cpacket),
+  sizeof(struct tractor_cpacket),
+  sizeof(struct repress_cpacket),
+  sizeof(struct coup_cpacket),
+  sizeof(struct socket_cpacket),
+  sizeof(struct options_cpacket),
+  sizeof(struct bye_cpacket),
+  /* 30 v */
+  sizeof(struct dockperm_cpacket),
+  sizeof(struct updates_cpacket),
+  sizeof(struct resetstats_cpacket),
+  sizeof(struct reserved_cpacket),
+  sizeof(struct scan_cpacket),
+  sizeof(struct udp_req_cpacket),
+  sizeof(struct sequence_cpacket),
+  sizeof(struct rsa_key_cpacket),
+  sizeof(struct obvious_packet),
+  0,
+  /* 40 v */
+  0,
+  0,
+  sizeof(struct ping_cpacket),
+#ifdef SHORT_PACKETS
+  sizeof(struct shortreq_cpacket),
+  sizeof(struct threshold_cpacket),
+  0,				/* CP_S_MESSAGE */
+  0,				/* CP_S_RESERVED */
+  0,				/* CP_S_DUMMY */
+#else
+  0,
+  0,
+  0,
+  0,
+  0,
+#endif
+  0,
+  0,
+  /* 50 v */
+  0,
+  0,
+  0,
+  0,
+  0,
+  0,
+  0,
+  0,
+  0,
+  0,
+  /* 60 v */
+#ifdef FEATURE
+  sizeof(struct feature_cpacket)/* CP_FEATURE */
+#else
+  0
+#endif
+};
+
+#define num_cpacket_sizes	sizeof(client_packet_sizes)/sizeof(*client_packet_sizes)
+
+int 
+size_of_cpacket(pkt)
+  void *pkt;
+{
+  CARD8 type;
+  CARD8 subtype;
+
+  type = ((CARD8 *) pkt)[0];
+  subtype = ((CARD8 *) pkt)[1];
+
+  if (type < num_cpacket_sizes && client_packet_sizes[type] > 0)
+    return client_packet_sizes[type];
+
+  switch (type)
+  {
+#ifdef CP_FIRE_WEAPON
+   case CP_FIRE_WEAPON:
+    {
+      struct fire_weapon_cpacket *fwp = pkt;
+      return (fwp->mech == TM_POSITION) ? 12 : 4;
+    }
+#endif
+
+#ifdef SHORT_PACKETS
+   case CP_S_MESSAGE:
+    return ((unsigned char *) pkt)[3];
+   case CP_S_RESERVED:
+   case CP_S_DUMMY:
+    /* hmm? good question */
+    return 0;
+#endif				/* SHORT_PACKETS */
+
+   default:
+    return 0;
+  }
+}
+
+
+int server_packet_sizes[] = {
+  0,				/* record 0 */
+  sizeof(struct mesg_spacket),	/* SP_MESSAGE */
+  sizeof(struct plyr_info_spacket),	/* SP_PLAYER_INFO */
+  sizeof(struct kills_spacket),	/* SP_KILLS */
+  sizeof(struct player_spacket),/* SP_PLAYER */
+  sizeof(struct torp_info_spacket),	/* SP_TORP_INFO */
+  sizeof(struct torp_spacket),	/* SP_TORP */
+  sizeof(struct phaser_spacket),/* SP_PHASER */
+  sizeof(struct plasma_info_spacket),	/* SP_PLASMA_INFO */
+  sizeof(struct plasma_spacket),/* SP_PLASMA */
+  /* 10 v */
+  sizeof(struct warning_spacket),	/* SP_WARNING */
+  sizeof(struct motd_spacket),	/* SP_MOTD */
+  sizeof(struct you_spacket),	/* SP_YOU */
+  sizeof(struct queue_spacket),	/* SP_QUEUE */
+  sizeof(struct status_spacket),/* SP_STATUS */
+  sizeof(struct planet_spacket),/* SP_PLANET */
+  sizeof(struct pickok_spacket),/* SP_PICKOK */
+  sizeof(struct login_spacket),	/* SP_LOGIN */
+  sizeof(struct flags_spacket),	/* SP_FLAGS */
+  sizeof(struct mask_spacket),	/* SP_MASK */
+  /* 20 v */
+  sizeof(struct pstatus_spacket),	/* SP_PSTATUS */
+  sizeof(struct badversion_spacket),	/* SP_BADVERSION */
+  sizeof(struct hostile_spacket),	/* SP_HOSTILE */
+  sizeof(struct stats_spacket),	/* SP_STATS */
+  sizeof(struct plyr_login_spacket),	/* SP_PL_LOGIN */
+  sizeof(struct reserved_spacket),	/* SP_RESERVED */
+  sizeof(struct planet_loc_spacket),	/* SP_PLANET_LOC */
+  sizeof(struct scan_spacket),	/* SP_SCAN (ATM) */
+  sizeof(struct udp_reply_spacket),	/* SP_UDP_REPLY */
+  sizeof(struct sequence_spacket),	/* SP_SEQUENCE */
+  /* 30 v */
+  sizeof(struct sc_sequence_spacket),	/* SP_SC_SEQUENCE */
+  sizeof(struct rsa_key_spacket),	/* SP_RSA_KEY */
+  sizeof(struct motd_pic_spacket),	/* SP_MOTD_PIC */
+  sizeof(struct stats_spacket2),/* SP_STATS2 */
+  sizeof(struct status_spacket2),	/* SP_STATUS2 */
+  sizeof(struct planet_spacket2),	/* SP_PLANET2 */
+  sizeof(struct obvious_packet),/* SP_NEW_MOTD */
+  sizeof(struct thingy_spacket),/* SP_THINGY */
+  sizeof(struct thingy_info_spacket),	/* SP_THINGY_INFO */
+  sizeof(struct ship_cap_spacket),	/* SP_SHIP_CAP */
+  /* 40 v */
+#ifdef SHORT_PACKETS
+  sizeof(struct shortreply_spacket),	/* SP_S_REPLY */
+  -1,				/* SP_S_MESSAGE */
+  -1,				/* SP_S_WARNING */
+  sizeof(struct youshort_spacket),	/* SP_S_YOU */
+  sizeof(struct youss_spacket),	/* SP_S_YOU_SS */
+  -1,				/* SP_S_PLAYER */
+#else
+  -1,
+  -1,
+  -1,
+  -1,
+  -1,
+  -1,
+#endif
+  sizeof(struct ping_spacket),	/* SP_PING */
+  -1,				/* SP_S_TORP */
+  -1,				/* SP_S_TORP_INFO */
+  20,				/* SP_S_8_TORP */
+  /* 50 v */
+  -1,				/* SP_S_PLANET */
+  -1,				/* SP_GPARAM */
+  -1,				/* SP_PARADISE_EXT1 */
+  sizeof(struct terrain_packet2),	/* SP_TERRAIN2 */
+  sizeof(struct terrain_info_packet2),	/* SP_TERRAIN_INFO2 */
+  -1,
+  -1,
+  -1,
+  -1,
+  -1,
+  /* 60 v */
+#ifdef FEATURE
+  sizeof(struct feature_spacket),	/* SP_FEATURE */
+#else
+  -1,
+#endif
+  -1				/* The fools!  I'm pretty sure there is an */
+  /* off-by-one in the test in the last fnc */
+  /* but I'm not sure and this WILL fix it. */
+};
+
+#define num_spacket_sizes (sizeof(server_packet_sizes) / sizeof(server_packet_sizes[0]) - 1)
+
+#ifdef SHORT_PACKETS
+unsigned char numofbits[256] =
+{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1,
+  2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1,
+  2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1,
+  2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3,
+  4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1,
+  2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3,
+  4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2,
+  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3,
+  4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3,
+  4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4,
+5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
+
+static int vtsize[9] =
+{4, 8, 8, 12, 12, 16, 20, 20, 24};	/* How big is the torppacket */
+int vtisize[9] =
+{4, 7, 9, 11, 13, 16, 18, 20, 22};	/* 4 byte Header + torpdata */
+
+
+static int 
+padto4(sz)
+  int sz;
+{
+  return (sz % 4) ? (sz / 4 + 1) * 4 : sz;
+
+}
+#endif
+
+int
+size_of_spacket(pkt)
+  unsigned char *pkt;
+{
+  switch (pkt[0])
+  {
+   case SP_GPARAM:
+    switch (pkt[1])
+    {
+     case 0:
+      return sizeof(struct gp_sizes_spacket);
+     case 1:
+      return sizeof(struct gp_team_spacket);
+     case 2:
+      return sizeof(struct gp_teamlogo_spacket);
+     case 3:
+      return sizeof(struct gp_shipshape_spacket);
+     case 4:
+      return sizeof(struct gp_shipbitmap_spacket);
+     case 5:
+      return sizeof(struct gp_rank_spacket);
+     case 6:
+      return sizeof(struct gp_royal_spacket);
+     case 7:
+      return sizeof(struct gp_teamplanet_spacket);
+     default:
+      return 0;
+    }
+#ifdef SHORT_PACKETS
+   case SP_S_MESSAGE:
+    return padto4(pkt[4]);	/* IMPORTANT  Changed */
+   case SP_S_WARNING:
+    if (pkt[1] == STEXTE_STRING ||
+	pkt[1] == SHORT_WARNING)
+    {
+      return padto4(pkt[3]);
+    }
+    else
+      return 4;			/* Normal Packet */
+   case SP_S_PLAYER:
+    if (pkt[1] & 128)
+    {				/* Small +extended Header */
+      return padto4(((pkt[1] & 0x3f) * 4) + 4);
+    }
+    else if (pkt[1] & 64)
+    {				/* Small Header */
+      return padto4(((pkt[1] & 0x3f) * 4) + 4);
+    }
+    else
+    {				/* Big Header */
+      return padto4((pkt[1] * 4 + 12));
+    }
+   case SP_S_TORP:
+    return padto4(vtsize[numofbits[pkt[1]]]);
+   case SP_S_TORP_INFO:
+    return padto4((vtisize[numofbits[pkt[1]]] + numofbits[pkt[3]]));
+   case SP_S_PLANET:
+    return padto4((pkt[1] * VPLANET_SIZE) + 2);
+#endif
+   case SP_PARADISE_EXT1:
+    switch (pkt[1])
+    {
+     case SP_PE1_MISSING_BITMAP:
+      return sizeof(struct pe1_missing_bitmap_spacket);
+     case SP_PE1_NUM_MISSILES:
+      return sizeof(struct pe1_num_missiles_spacket);
+     default:
+      return 0;
+    }
+   default:
+#ifdef FEATURE_DIAG
+    if (*pkt >= num_spacket_sizes)
+    {
+      fprintf(stderr, "Packet type %d out of range (%d)\n", (*pkt), num_spacket_sizes);
+      return (0);
+    }
+    if (server_packet_sizes[*pkt] < 0)
+    {
+      fprintf(stderr, "Packet type %d has no size\n", (*pkt));
+      return (0);
+    }
+    return (server_packet_sizes[*pkt]);
+#else
+    return (*pkt < num_spacket_sizes && server_packet_sizes[*pkt] >= 0)
+      ? server_packet_sizes[*pkt] : 0;
+#endif
+  }
+}