diff src/gameconf.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/gameconf.c	Sat Dec 06 04:37:03 1997 +0000
@@ -0,0 +1,343 @@
+/*--------------------------------------------------------------------------
+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 <sys/types.h>
+#include <stdio.h>
+#include <netinet/in.h>
+#include "defs.h"
+#include "gppackets.h"
+#include "shmem.h"
+#include "data.h"
+
+/* some game params packet stuff */
+/* status experimental */
+
+void
+updateGPrank()
+{
+  int i;
+  struct gp_rank_spacket pkt;
+
+  pkt.type = SP_GPARAM;
+  pkt.subtype = 5;
+
+  for (i = 0; i < NUMRANKS; i++)
+  {
+    pkt.rankn = i;
+    pkt.genocides = htonl(ranks[i].genocides);
+#ifndef BAD_SVR4_HACKS
+    pkt.milliDI = htonl(1000 * ranks[i].di);
+    pkt.millibattle = htonl(1000 * ranks[i].battle);
+    pkt.millistrat = htonl(1000 * ranks[i].strategy);
+    pkt.millispec = htonl(1000 * ranks[i].specship);
+#else				/* Unixware/IRIX requires explicit casts */
+    /* this next define will make the next more readable */
+#define BAD_SVR4_HACKS_CAST(a,b) (unsigned long)( (long double)a * (long double)b )
+    pkt.milliDI = htonl(BAD_SVR4_HACKS_CAST(1000, ranks[i].di));
+    pkt.millibattle = htonl(BAD_SVR4_HACKS_CAST(1000, ranks[i].battle));
+    pkt.millistrat = htonl(BAD_SVR4_HACKS_CAST(1000, ranks[i].strategy));
+    pkt.millispec = htonl(BAD_SVR4_HACKS_CAST(1000, ranks[i].specship));
+#endif				/* BAD_SVR4_HACKS */
+    strcpy(pkt.name, ranks[i].name);
+
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+}
+
+void
+updateGProyal()
+{
+  int i;
+  struct gp_royal_spacket pkt;
+
+  pkt.type = SP_GPARAM;
+  pkt.subtype = 6;
+
+  for (i = 0; i < NUMROYALRANKS; i++)
+  {
+    pkt.rankn = i;
+    strcpy(pkt.name, royal[i].name);
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+}
+
+void
+updateGPteams()
+{
+  struct gp_team_spacket pkt;
+  int i;
+
+  for (i = 0; i < NUMTEAM; i++)
+  {
+    pkt.type = SP_GPARAM;
+    pkt.subtype = 1;
+
+    pkt.index = i;
+    pkt.letter = teams[idx_to_mask(i)].letter;
+    strncpy(pkt.shortname, teams[idx_to_mask(i)].shortname,
+	    sizeof(pkt.shortname));
+    strncpy(pkt.teamname, teams[idx_to_mask(i)].name, sizeof(pkt.teamname));
+
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+}
+
+static void
+send_one_teamlogo(teamidx, data, width, height)
+  int teamidx;
+  unsigned char *data;
+  int width, height;
+{
+  struct gp_teamlogo_spacket pkt;
+  int pwidth;
+
+  if (width > 99 || height > 99)
+  {
+    printf("logo too big: %dx%d\n", width, height);
+    return;
+  }
+
+  pkt.type = SP_GPARAM;
+  pkt.subtype = 2;
+
+  pkt.logowidth = width;
+  pkt.logoheight = height;
+  pkt.teamindex = teamidx;
+
+  pwidth = (width - 1) / 8 + 1;
+  pkt.thisheight = sizeof(pkt.data) / pwidth;
+
+  for (pkt.y = 0; pkt.y < height; pkt.y += pkt.thisheight)
+  {
+
+    if (pkt.y + pkt.thisheight > height)
+      pkt.thisheight = height - pkt.y;
+
+    memcpy(pkt.data, data + pkt.y * pwidth, pkt.thisheight * pwidth);
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+}
+
+void
+updateGPteamlogos()
+{
+  char buf[40];
+  char *data;
+  int width, height;
+  int i;
+
+  for (i = 0; i < NUMTEAM; i++)
+  {
+    sprintf(buf, "artwork/%d/logo", i);
+#ifdef LEAGUE_SUPPORT
+    if (status2->league == 1)
+    {
+      if (i == 0)
+	sprintf(buf, "artwork/%s/logo", status2->home.name);
+      else if (i == 1)
+	sprintf(buf, "artwork/%s/logo", status2->away.name);
+    }
+    else if (status2->league)
+    {
+      if (i == status2->home.index)
+	sprintf(buf, "artwork/%s/logo", status2->home.name);
+      else if (i == status2->away.index)
+	sprintf(buf, "artwork/%s/logo", status2->away.name);
+    }
+#endif
+    {
+      FILE *fp;
+      fp = fopen(build_path(buf), "r");
+      if (!fp)
+	continue;		/* no image to transmit */
+      ParseXbmFile(fp, &width, &height, &data);
+      fclose(fp);
+    }
+    if (!data)
+    {
+      continue;
+    }
+    send_one_teamlogo(i, data, width, height);
+    free(data);
+  }
+}
+
+/* #include "borgcube.bm" */
+
+void
+updateGPshipshapes()
+{
+#if 0
+  {
+    struct gp_shipshape_spacket pkt;
+
+    pkt.type = SP_GPARAM;
+    pkt.subtype = 3;
+
+    pkt.shipno = ATT;
+    pkt.race = -1;
+    pkt.nviews = 1;
+    pkt.width = borgcube_width;
+    pkt.height = borgcube_height;
+
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+
+  {
+    struct gp_shipbitmap_spacket pkt;
+
+    pkt.type = SP_GPARAM;
+    pkt.subtype = 4;
+
+    pkt.shipno = ATT;
+    pkt.race = -1;
+    pkt.thisview = 0;
+
+    memcpy(pkt.bitmapdata, borgcube_bits, sizeof(borgcube_bits));
+
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+#endif
+}
+
+void
+updateGPplanetbitmaps()
+{
+  struct gp_teamplanet_spacket pkt;
+  char buf[40];
+  char *data;
+  int width, height;
+  int i;
+
+  for (i = 0; i < NUMTEAM; i++)
+  {
+
+    pkt.type = SP_GPARAM;
+    pkt.subtype = 7;
+
+    pkt.teamn = i;
+
+    sprintf(buf, "artwork/%d/tplanet", i);
+#ifdef LEAGUE_SUPPORT
+    if (status2->league == 1)
+    {
+      if (i == 0)
+	sprintf(buf, "artwork/%s/tplanet", status2->home.name);
+      else if (i == 1)
+	sprintf(buf, "artwork/%s/tplanet", status2->away.name);
+    }
+    else if (status2->league)
+    {
+      if (i == status2->home.index)
+	sprintf(buf, "artwork/%s/tplanet", status2->home.name);
+      else if (i == status2->away.index)
+	sprintf(buf, "artwork/%s/tplanet", status2->away.name);
+    }
+#endif
+    {
+      FILE *fp;
+      fp = fopen(build_path(buf), "r");
+      if (!fp)
+	continue;		/* no image to transmit */
+      ParseXbmFile(fp, &width, &height, &data);
+      fclose(fp);
+    }
+    if (!data)
+    {
+      continue;
+    }
+    memcpy(pkt.tactical, data, 120);
+    memcpy(pkt.tacticalM, data, 120);
+    free(data);
+
+    sprintf(buf, "artwork/%d/gplanet", i);
+#ifdef LEAGUE_SUPPORT
+    if (status2->league == 1)
+    {
+      if (i == 0)
+	sprintf(buf, "artwork/%s/gplanet", status2->home.name);
+      else if (i == 1)
+	sprintf(buf, "artwork/%s/gplanet", status2->away.name);
+    }
+    else if (status2->league)
+    {
+      if (i == status2->home.index)
+	sprintf(buf, "artwork/%s/gplanet", status2->home.name);
+      else if (i == status2->away.index)
+	sprintf(buf, "artwork/%s/gplanet", status2->away.name);
+    }
+#endif
+    {
+      FILE *fp;
+      fp = fopen(build_path(buf), "r");
+      if (!fp)
+	continue;		/* no image to transmit */
+      ParseXbmFile(fp, &width, &height, &data);
+      fclose(fp);
+    }
+    if (!data)
+    {
+      continue;
+    }
+    memcpy(pkt.galactic, data, 32);
+    memcpy(pkt.galacticM, data, 32);
+    free(data);
+
+    sendClientPacket((struct player_spacket *) & pkt);
+  }
+
+}
+
+void
+updateGameparams()
+{
+  struct gp_sizes_spacket pkt;
+
+  memset((char *) &pkt, 0, sizeof(pkt));
+
+  pkt.type = SP_GPARAM;
+  pkt.subtype = 0;
+
+  pkt.nplayers = MAXPLAYER;
+  pkt.nteams = 4;
+  pkt.nshiptypes = NUM_TYPES;
+  pkt.nranks = NUMRANKS;
+  pkt.nroyal = NUMROYALRANKS;
+  pkt.nphasers = 1;
+  pkt.ntorps = MAXTORP;
+  pkt.nplasmas = MAXPLASMA;
+  pkt.nthingies = NPTHINGIES;
+  pkt.gthingies = NGTHINGIES;
+  pkt.gwidth = GWIDTH;
+  pkt.flags = 0;
+  pkt.nplanets = configvals->numplanets;
+  sendClientPacket((struct player_spacket *) & pkt);
+
+  updateGPteams();
+  if (me == 0 || !(me->p_stats.st_flags & ST_NOBITMAPS))
+  {
+    updateGPteamlogos();
+    updateGPshipshapes();
+    updateGPplanetbitmaps();
+  }
+  updateGPrank();
+  updateGProyal();
+}
+
+/* end game params stuff */