diff src/sysdefaults.c @ 8:0836fb919dfa

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sysdefaults.c	Sat Dec 06 04:37:05 1997 +0000
@@ -0,0 +1,820 @@
+/*--------------------------------------------------------------------------
+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 <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "getship.h"
+#include "shmem.h"
+#include "path.h"
+#include "structdesc.h"
+
+
+/*-----------------------------MODULE VARS--------------------------------*/
+
+static struct stat oldstat;	/* to hold info about file so we */
+/* can check whether it has changed */
+
+/* these might not match new designations provided in the sysdef.  Oh well */
+static char *shiptypes[NUM_TYPES] = {
+  "SC", "DD", "CA", "BB", "AS", "SB", "AT",
+  "JS", "FR", "WB", "CL", "CV", "UT", "PT"
+};
+
+
+static char *weapontypes[WP_MAX] = {"PLASMA", "TRACTOR", "MISSILE", "FIGHTER"};
+
+static char *systemtypes[SHIPS_SYSTEMS] = {
+  "PLASMA", "TRACTOR", "MISSILE", "FIGHTER", "PHOTON", "PHASER", "SHIELD",
+  "REPAIR", "CLOAK", "SCANNER", "SENSOR", "WARP", "IMPULSE", "DOCK",
+  "NAVIGATION", "COMMUNICATION",
+};
+
+/*--------------------------------------------------------------------------*/
+
+
+
+
+
+
+
+/*-----------------------------INTERNAL FUNCTIONS-------------------------*/
+
+static void 
+load_clue_phrases()
+{
+  char *path;
+  FILE *fp;
+  int count;
+  int i;
+  char *s = cluephrase_storage;	/* damn, I'm tired of typing it */
+
+  path = build_path(CLUEPHRASEFILE);
+
+  fp = fopen(path, "r");
+  if (!fp)
+    return;
+
+  count = fread(s, 1, CLUEPHRASE_SIZE - 2, fp);
+  fclose(fp);
+
+  if (count < 0)
+  {
+    /* ACK, read fail */
+    s[0] = 0;
+  }
+  else
+  {
+    s[count] = 0;		/* two zeros terminates the clue phrase list */
+    s[count + 1] = 0;
+    for (i = 0; i < count; i++)
+      if (s[i] == '\n')
+	s[i] = 0;
+  }
+}
+
+/*------------------------------READSTRINGS-------------------------------*/
+/*
+ * This function reads in a list of strings.  An array of strings contains
+ * the name of the possible strings in the list.  If the string is read in
+ * from the file and matches one of the strings in the array, then the
+ * corresponding element in the parameter 'array' is set to 1.  All keys must
+ * be of the same length.
+ */
+
+
+#ifndef SYSV			/* HP's have a problem with this */
+extern int fprintf();
+#endif
+#ifndef	IRIX
+extern int sscanf();
+#endif
+#ifndef linux
+extern int atoi();
+#endif				/* linux */
+extern int fclose();
+
+void
+readstrings(type, string, keys, array, max)
+  char *type;			/* Used to specify the type for err messages */
+  char *string;			/* the string to parse. */
+  char **keys;			/* the array of key strings */
+  int *array;			/* the array tofill with 1's */
+  int max;			/* the size of the array */
+{
+  int i;			/* looping var */
+
+  while (*string != '\0')
+  {				/* go until end of string */
+    while ((*string == '\n') || (*string == ' ') || (*string == ',')
+	   || (*string == '\t'))
+      string++;			/* go to next char if white space */
+    if (*string == '\0')	/* if end of string found */
+      break;
+    for (i = 0; i < max; i++)
+    {				/* search through keys */
+      if (strncmp(keys[i], string, strlen(keys[i])) == 0)
+      {
+	string += strlen(keys[i]);	/* go to next key */
+	array[i] = 1;		/* set array element to 1 */
+	break;			/* found it, break out of for loop */
+      }
+    }
+    if (i == max)
+    {				/* if unknown key then */
+      fprintf(stderr, "%s type %s unknown!\n", type, string);
+      string++;			/* print error */
+    }
+  }
+}
+
+
+/* modifies flagp to return result */
+void
+read_longflags(flagp, str, names)
+  long *flagp;
+  char *str;
+  char **names;
+{
+  char buf[80];
+
+  *flagp = 0;
+
+  while (*str)
+  {
+    int i;
+    i = 0;
+    while (*str != 0 && *str != ',')
+      buf[i++] = *(str++);
+    if (*str == ',')
+      str++;
+    buf[i] = 0;
+
+    for (i = 0; names[i]; i++)
+      if (0 == strcasecmp(buf, names[i]))
+	break;
+
+    if (!names[i])
+    {
+      fprintf(stderr, "unknown flag %s\n", buf);
+      continue;
+    }
+    *flagp |= 1 << i;
+  }
+}
+
+
+/*--------------------------------SHIPDEFS---------------------------------*/
+/*
+ * This function gets all of the field values for a ship.  Each line of input
+ * for the ship fields has a single ship field on it.  The name of the ship
+ * field is followed by the value to place in that field.  The function stops
+ * when it encounters a line with "end" on it.   It places the values into
+ * the shipvals so that the next time getship is called, the new values will
+ * be used.
+ */
+
+void
+shipdefs(s, f)
+  int s;			/* ship number */
+  FILE *f;			/* file to load from */
+{
+  struct ship *currship = shipvals + s;
+  char buf[256];		/* to get a string from file */
+  char field_name[64];		/* to get name of field */
+  char value[256];		/* to get name */
+  char sdesig[64];		/* to get ship letters */
+  int len;			/* to hold length of read in string */
+  int i;			/* looping var */
+  int offset;			/* to offset into ship structure */
+
+  if ((s < 0) || (s >= NUM_TYPES))
+  {				/* invalid ship number? */
+    fprintf(stderr, "invalid ship number in .sysdef file\n");
+    return;
+  }
+  while (1)
+  {				/* loop until break */
+    if (0 == fgets(buf, sizeof(buf), f))	/* get a string of input */
+      break;			/* if end of file then break */
+    if (buf[0] == '!')
+      continue;			/* skip lines that begin with ! */
+    len = strlen(buf);
+    if (buf[len - 1] == '\n')	/* blast trailing newline */
+      buf[--len] = 0;
+    if (strncmp(buf, "end", 3) == 0)
+    {				/* if end of ship then break */
+      return;
+    }
+    if (shipvals == 0)
+      continue;
+
+    /* get field name and value */
+    sscanf(buf, "%s %s %s", sdesig, field_name, value);
+
+    for (i = 0; ship_fields[i].name; i++)
+    {				/* loop through field names */
+      if (strcmp(field_name, ship_fields[i].name) == 0 ||	/* found field? */
+	  (strncmp(field_name, "s_", 2) == 0 &&
+	   strcmp(field_name + 2, ship_fields[i].name) == 0))
+	break;
+    }
+    if (ship_fields[i].name == 0)
+    {				/* if we did not find name */
+      fprintf(stderr, "invalid field name in ship description `%s'\n",
+	      field_name);
+      continue;			/* print error, get next */
+    }
+    offset = ship_fields[i].offset;	/* get offset into struct */
+    switch (ship_fields[i].type)
+    {				/* parse the right type */
+     case FT_CHAR:
+      sscanf(value, "%c", offset + (char *) currship);
+      break;
+     case FT_SHORT:
+      sscanf(value, "%hi", (short *) (offset + (char *) currship));
+      break;
+     case FT_INT:
+      sscanf(value, "%i", (int *) (offset + (char *) currship));
+      break;
+     case FT_LONG:
+      sscanf(value, "%li", (long *) (offset + (char *) currship));
+      break;
+     case FT_FLOAT:
+      sscanf(value, "%f", (float *) (offset + (char *) currship));
+      break;
+     case FT_STRING:
+      sscanf(value, "%s", offset + (char *) currship);
+      break;
+     case FT_LONGFLAGS:
+      read_longflags((long *) (offset + (char *) currship), value,
+		     (char **) ship_fields[i].aux);
+      break;
+     default:
+      fprintf(stderr, "Internal error, unknown field type %d\n",
+	      ship_fields[i].type);
+    }
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+void
+initteamvals()
+{
+  strcpy(teams[NOBODY].nickname, "Independent");
+  strcpy(teams[NOBODY].name, "Independents");
+  teams[NOBODY].letter = 'I';
+  strcpy(teams[NOBODY].shortname, "IND");
+
+  strcpy(teams[FED].nickname, "Fed");
+  strcpy(teams[FED].name, "Federation");
+  teams[FED].letter = 'F';
+  strcpy(teams[FED].shortname, "FED");
+
+  strcpy(teams[ROM].nickname, "Romulan");
+  strcpy(teams[ROM].name, "Romulans");
+  teams[ROM].letter = 'R';
+  strcpy(teams[ROM].shortname, "ROM");
+
+  strcpy(teams[KLI].nickname, "Klingon");
+  strcpy(teams[KLI].name, "Klingons");
+  teams[KLI].letter = 'K';
+  strcpy(teams[KLI].shortname, "KLI");
+
+  strcpy(teams[ORI].nickname, "Orion");
+  strcpy(teams[ORI].name, "Orions");
+  teams[ORI].letter = 'O';
+  strcpy(teams[ORI].shortname, "ORI");
+}
+
+/*--------------------------------------------------------------------------*/
+
+
+
+#define OFFSET_OF(field)	( (char*)(&((struct configuration*)0)->field) -\
+ 			  (char*)0)
+
+static struct field_desc config_fields[] = {
+  {"TOURN", FT_INT, OFFSET_OF(tournplayers)},
+  {"TESTERS", FT_INT, OFFSET_OF(ntesters)},
+
+  {"CONFIRM", FT_BYTE, OFFSET_OF(binconfirm)},
+  {"MAXLOAD", FT_FLOAT, OFFSET_OF(maxload)},
+  {"UDP", FT_BYTE, OFFSET_OF(udpAllowed)},
+  {"MINUPDDELAY", FT_INT, OFFSET_OF(min_upd_delay)},
+  {"MINOBSUPDDELAY", FT_INT, OFFSET_OF(min_observer_upd_delay)},
+
+  {"PLKILLS", FT_FLOAT, OFFSET_OF(plkills)},
+  {"MSKILLS", FT_FLOAT, OFFSET_OF(mskills)},
+  {"EROSION", FT_FLOAT, OFFSET_OF(erosion)},
+  {"PENETRATION", FT_FLOAT, OFFSET_OF(penetration)},
+  {"NEWTURN", FT_INT, OFFSET_OF(newturn)},
+  {"HIDDEN", FT_INT, OFFSET_OF(hiddenenemy)},
+  {"PLANUPDSPD", FT_FLOAT, OFFSET_OF(planupdspd)},
+  {"GALAXYGENERATOR", FT_INT, OFFSET_OF(galaxygenerator)},
+  {"NUMWORMPAIRS", FT_INT, OFFSET_OF(num_wormpairs)},
+  {"NUMNEBULA", FT_INT, OFFSET_OF(num_nebula)},
+  {"NEBULADENSITY", FT_INT, OFFSET_OF(nebula_density)},
+  {"NEBULASUBCLOUDS", FT_INT, OFFSET_OF(nebula_subclouds)},
+  {"NUMASTEROID", FT_INT, OFFSET_OF(num_asteroid)},
+  {"ASTEROIDTHICKNESS", FT_FLOAT, OFFSET_OF(asteroid_thickness)},
+  {"ASTEROIDDENSITY", FT_INT, OFFSET_OF(asteroid_density)},
+  {"ASTEROIDRADIUS", FT_INT, OFFSET_OF(asteroid_radius)},
+  {"ASTEROIDTHICKVAR", FT_FLOAT, OFFSET_OF(asteroid_thick_variance)},
+  {"ASTEROIDDENSVAR", FT_INT, OFFSET_OF(asteroid_dens_variance)},
+  {"ASTEROIDRADVAR", FT_INT, OFFSET_OF(asteroid_rad_variance)},
+  {"POPSCHEME", FT_BYTE, OFFSET_OF(popscheme)},
+  {"POPCHOICE", FT_BYTE, OFFSET_OF(popchoice)},
+  {"POPSPEED%", FT_INT, OFFSET_OF(popspeed)},
+  {"RESOURCEBOMBING", FT_BYTE, OFFSET_OF(resource_bombing)},
+  {"REVOLTS", FT_BYTE, OFFSET_OF(revolts)},
+  {"BRONCOSHIPVALS", FT_BYTE, OFFSET_OF(bronco_shipvals)},
+  {"EVACUATION", FT_BYTE, OFFSET_OF(evacuation)},
+  {"JUSTIFY_GALAXY", FT_BYTE, OFFSET_OF(justify_galaxy)},
+  {"AFTERBURNERS", FT_BYTE, OFFSET_OF(afterburners)},
+  {"WARPDRIVE", FT_BYTE, OFFSET_OF(warpdrive)},
+  {"FUELEXPLOSIONS", FT_BYTE, OFFSET_OF(fuel_explosions)},
+  {"NEWCLOAK", FT_BYTE, OFFSET_OF(newcloak)},
+  {"BRONCORANKS", FT_BYTE, OFFSET_OF(bronco_ranks)},
+  {"NEWARMYGROWTH", FT_BYTE, OFFSET_OF(new_army_growth)},
+  {"WARPDECEL", FT_BYTE, OFFSET_OF(warpdecel)},
+  {"AFFECTSHIPTIMERSOUTSIDET", FT_BYTE, OFFSET_OF(affect_shiptimers_outside_T)},
+  {"DURABLESCOUTING", FT_BYTE, OFFSET_OF(durablescouting)},
+  {"FACILITYGROWTH", FT_BYTE, OFFSET_OF(facilitygrowth)},
+  {"FIREDURINGWARPPREP", FT_BYTE, OFFSET_OF(fireduringwarpprep)},
+  {"FIREDURINGWARP", FT_BYTE, OFFSET_OF(fireduringwarp)},
+  {"FIREWHILEDOCKED", FT_BYTE, OFFSET_OF(firewhiledocked)},
+  {"WARPPREPSTYLE", FT_BYTE, OFFSET_OF(warpprepstyle)},
+  {"BASERANKSTYLE", FT_BYTE, OFFSET_OF(baserankstyle)},
+  {"CLOAKDURINGWARPPREP", FT_BYTE, OFFSET_OF(cloakduringwarpprep)},
+  {"CLOAKWHILEWARPING", FT_BYTE, OFFSET_OF(cloakwhilewarping)},
+  {"TRACTABORTWARP", FT_BYTE, OFFSET_OF(tractabortwarp)},
+  {"ORBITDIRPROB", FT_FLOAT, OFFSET_OF(orbitdirprob)},
+  {"NEWORBITS", FT_BYTE, OFFSET_OF(neworbits)},
+  {"PLANETSINPLAY", FT_INT, OFFSET_OF(planetsinplay)},
+  {"PLANETLIMITTYPE", FT_INT, OFFSET_OF(planetlimittype)},
+  {"BEAMLASTARMIES", FT_BYTE, OFFSET_OF(beamlastarmies)},
+#ifdef LEAGUE_SUPPORT
+  {"TIMEOUTS", FT_INT, OFFSET_OF(timeouts)},
+  {"REGULATIONMINUTES", FT_INT, OFFSET_OF(regulation_minutes)},
+  {"OVERTIMEMINUTES", FT_INT, OFFSET_OF(overtime_minutes)},
+#endif
+  {"PING_PERIOD", FT_INT, OFFSET_OF(ping_period)},
+  {"PING_ILOSS_INTERVAL", FT_INT, OFFSET_OF(ping_iloss_interval)},
+  {"PING_GHOSTBUST", FT_INT, OFFSET_OF(ping_allow_ghostbust)},
+  {"PING_GHOSTBUST_INTERVAL", FT_INT, OFFSET_OF(ping_ghostbust_interval)},
+  {"CLUECHECK", FT_BYTE, OFFSET_OF(cluecheck)},
+  {"CLUEDELAY", FT_INT, OFFSET_OF(cluedelay)},
+  {"CLUETIME", FT_INT, OFFSET_OF(cluetime)},
+  {"CLUESOURCE", FT_INT, OFFSET_OF(cluesource)},
+  {"VARIABLE_WARP", FT_INT, OFFSET_OF(variable_warp)},
+  {"WARPPREP_SUSPENDABLE", FT_INT, OFFSET_OF(warpprep_suspendable)},
+  {"NOPREGAMEBEAMUP", FT_INT, OFFSET_OF(nopregamebeamup)},
+  {"GAMESTARTNUKE", FT_INT, OFFSET_OF(gamestartnuke)},
+  {"NOTTIMEOUT", FT_INT, OFFSET_OF(nottimeout)},
+  {"WARPZONE", FT_INT, OFFSET_OF(warpzone)},
+  {"HELPFULPLANETS", FT_INT, OFFSET_OF(helpfulplanets)},
+  {0}
+};
+
+#undef OFFSET_OF
+
+
+
+/*----------------------------VISIBLE FUNCTIONS----------------------------*/
+
+/*------------------------------READSYSDEFAULTS----------------------------*/
+/*
+ * This function reads in the system defaults from a file.  A number of
+ * defaults are set and if the file contains keywords with different settings
+ * then they are changed.
+ */
+
+void
+readsysdefaults()
+{
+  int i;			/* looping var */
+  FILE *f;			/* to open sysdefaults file */
+  char buf[200];		/* to get a line of text */
+  char *s;			/* to point to fields in text */
+  char *paths;			/* to hold path name of dot dir */
+
+  load_clue_phrases();
+
+  /*
+   * put default values in the configuration values for readsysdefaults() to
+   * override
+   */
+  configvals->tournplayers = 5;
+  configvals->ntesters =
+#ifdef LEAGUE_SUPPORT
+    status2->league ? 2 :
+#endif
+    12;
+
+  configvals->binconfirm = 0;
+  configvals->maxload = 100.0;
+  configvals->udpAllowed = 1;
+  configvals->min_upd_delay = 200000;	/* 5 updates/sec */
+  configvals->min_observer_upd_delay = 333000;	/* 3 updates/sec */
+
+  configvals->plkills = 2;
+  configvals->mskills = 2;	/* was 2.5, changed 5-Nov-94 by PLC */
+  configvals->erosion = 0.0;
+  configvals->penetration = 0.0;
+  configvals->newturn = 0;
+  configvals->hiddenenemy = 1;
+  configvals->planupdspd = 0;
+  configvals->justify_galaxy = 1;	/* changed 5-Nov-94 by PLC */
+
+#ifdef BRONCO
+  configvals->galaxygenerator = 4;	/* Bronco emulator */
+  configvals->resource_bombing = 0;
+  configvals->revolts = 0;
+  configvals->afterburners = 0;
+  configvals->warpdrive = 0;
+  configvals->fuel_explosions = 0;
+  configvals->bronco_shipvals = 1;
+  configvals->evacuation = 0;	/* evacuation is allowed in paradise */
+  configvals->newcloak = 0;	/* old formula is not based on speed */
+  configvals->new_army_growth = 0;	/* WAY faster than bronco in many
+					 * cases */
+  configvals->warpdecel = 0;
+  configvals->affect_shiptimers_outside_T = 0;
+
+  configvals->durablescouting = 1;
+  configvals->facilitygrowth = 0;
+  configvals->orbitdirprob = 1.0;
+  configvals->planetsinplay = 40;
+#else
+  configvals->galaxygenerator = 3;	/* Heath's galaxy generator */
+  /* changed 5-Nov-94 by PLC */
+  configvals->num_wormpairs = 0;
+  configvals->resource_bombing = 1;
+  configvals->revolts = 1;
+  configvals->afterburners = 1;
+  configvals->warpdrive = 1;
+  configvals->fuel_explosions = 1;
+  configvals->bronco_shipvals = 0;
+  configvals->evacuation = 1;	/* evacuation is allowed in paradise */
+  configvals->newcloak = 1;
+  configvals->new_army_growth = 1;	/* WAY faster than bronco in many
+					 * cases */
+  configvals->warpdecel = 0;
+  configvals->affect_shiptimers_outside_T = 0;
+
+  configvals->durablescouting = 0;
+  configvals->facilitygrowth = 1;
+  configvals->orbitdirprob = 1;	/* changed 5-Nov-94 by PLC */
+  configvals->neworbits = 1;
+  configvals->planetsinplay = 17;	/* changed 5-Nov-94 by PLC */
+  configvals->planetlimittype = 0;
+  configvals->popscheme = 1;
+  configvals->popchoice = 1;
+  configvals->popspeed = 14;	/* was 9, changed 5-Nov-94 by PLC */
+#endif
+  configvals->fireduringwarpprep = 0;
+  configvals->fireduringwarp = 0;
+  configvals->firewhiledocked = 0;
+  configvals->tractabortwarp = 0;	/* changed 5-Nov-94 by PLC */
+
+  configvals->warpprepstyle = WPS_TABORT;
+  configvals->baserankstyle = 0;
+  configvals->cloakduringwarpprep = 0;
+  configvals->cloakwhilewarping = 1;
+
+  configvals->num_nebula = 0;
+  configvals->nebula_density = 240;	/* temporily used as size */
+  configvals->nebula_subclouds = 0;
+  configvals->num_asteroid = 0;
+  configvals->asteroid_thickness = 1.0;	/* small to medium sized */
+  configvals->asteroid_radius = 12;	/* the distance from the "owning"
+					 * star */
+  configvals->asteroid_density = 60;	/* density is % chance an eligible
+					 * tgrid locale will have asteroids */
+  configvals->asteroid_thick_variance = 3.0;
+  configvals->asteroid_rad_variance = 8;
+  configvals->asteroid_dens_variance = 40;
+
+  configvals->beamlastarmies = 0;
+
+  for (i = 0; i < SHIPS_SYSTEMS; i++)
+    configvals->sun_effect[i] = (i == SS_PHOTON ||
+				 i == SS_PLASMA ||
+				 i == SS_MISSILE ||
+				 i == SS_FIGHTER);
+  for (i = 0; i < SHIPS_SYSTEMS; i++)
+    configvals->ast_effect[i] = (i == SS_PHOTON ||
+				 i == SS_PLASMA ||
+				 i == SS_MISSILE ||
+				 i == SS_FIGHTER ||
+				 i == SS_IMPULSE);
+  for (i = 0; i < SHIPS_SYSTEMS; i++)
+    configvals->neb_effect[i] = 0;
+  for (i = 0; i < SHIPS_SYSTEMS; i++)
+    configvals->wh_effect[i] = (i == SS_PHOTON ||
+				i == SS_PLASMA ||
+				i == SS_MISSILE ||
+				i == SS_FIGHTER ||
+				i == SS_WARP ||
+				i == SS_IMPULSE);
+
+  for (i = 0; i < SHIPS_SYSTEMS; i++)
+    configvals->improved_tracking[i] =
+      (
+#if 0
+    /* I recommend improved tracking for these - RF */
+       i == SS_MISSILE ||
+       i == SS_FIGHTER ||	/* except this doesn't work just yet */
+    /* fighter torps REALLY need this - MDM */
+       i == SS_PHOTON ||
+#endif
+       0);
+
+  for (i = 0; i < NUM_TYPES; i++)
+    configvals->shipsallowed[i] = (i == SCOUT ||
+				   i == DESTROYER ||
+				   i == CRUISER ||
+				   i == BATTLESHIP ||
+				   i == ASSAULT ||
+				   i == STARBASE ||
+				   i == JUMPSHIP ||
+				   i == FRIGATE ||
+				   i == WARBASE);
+  for (i = 0; i < WP_MAX; i++)
+    configvals->weaponsallowed[i] = (i == WP_PLASMA ||
+				     i == WP_TRACTOR ||
+#ifndef BRONCO
+				     i == WP_MISSILE ||
+#endif
+				     0);
+
+#ifdef LEAGUE_SUPPORT
+  configvals->timeouts = 0;	/* NYI */
+  configvals->regulation_minutes = 60;
+  configvals->overtime_minutes = 0;	/* NYI */
+  configvals->playersperteam = 8;
+#endif
+
+  configvals->nopregamebeamup = 0;
+  configvals->gamestartnuke = 0;
+  configvals->nottimeout = 0;
+
+  configvals->ping_period = 2;	/* every 2 seconds */
+  configvals->ping_iloss_interval = 10;
+  configvals->ping_allow_ghostbust = 0;
+  configvals->ping_ghostbust_interval = 10;
+
+  configvals->cluecheck = 0;	/* don't check clue */
+  configvals->cluetime = 5 * 60;/* 5 minutes */
+  configvals->cluedelay = 2 * 60 * 60;	/* 2 hours */
+  configvals->cluesource = CC_PHRASE_LIST_FILE;
+  configvals->variable_warp = 1;/* warp speed is variable [BDyess] */
+  /* changed 5-Nov-94 by PLC */
+  configvals->warpprep_suspendable = 1;	/* warp prep is suspendable [BDyess] */
+  /* changed 5-Nov-94 by PLC */
+  configvals->warpzone = 0;	/* warp zone default off [BDyess] */
+
+  configvals->plgrow.fuel = 100;
+  configvals->plgrow.agri = 350;
+  configvals->plgrow.repair = 150;
+  configvals->plgrow.shipyard = 400;
+
+  getshipdefaults();
+  initteamvals();
+
+  /* set server defaults */
+  testtime = -1;		/* not in testing mode */
+
+#ifdef LEAGUE_SUPPORT
+  if (status2->league)
+    return;			/* don't read .sysdef during league game */
+#endif
+  paths = build_path(SYSDEF_FILE);	/* cat on sysdef filename */
+  f = fopen(paths, "r");	/* attempt to open file */
+  if (f == NULL)
+  {				/* if failure to open file */
+    fprintf(stderr, "No system defaults file!\n");
+    return;			/* error message then out of here */
+  }
+  stat(paths, &oldstat);	/* record info about file */
+
+  while (fgets(buf, 199, f) != NULL)
+  {				/* read strings until end of file */
+    if (buf[0] == '!')
+      continue;			/* skip lines that begin with ! */
+    s = strchr(buf, '=');	/* find the equals sign in string */
+    if (s == NULL)		/* if no equals sign then */
+      continue;			/* go to next string */
+    *s = '\0';			/* break buf into rhs and lhs */
+    s++;
+    if (strcmp(buf, "SHIPS") == 0)
+    {				/* if ship enabling then */
+      for (i = 0; i < NUM_TYPES; i++)	/* go through ships */
+	shipsallowed[i] = 0;	/* turn off all ships */
+      readstrings("SHIPS", s, shiptypes, shipsallowed, NUM_TYPES);
+    }
+    else if (strcmp(buf, "WEAPONS") == 0)
+    {				/* if weapon enabling */
+      for (i = 0; i < WP_MAX; i++)	/* set all weapons as off */
+	weaponsallowed[i] = 0;	/* then read in weapons */
+      readstrings("WEAPONS", s, weapontypes, weaponsallowed, WP_MAX);
+    }
+    else if (strcmp(buf, "SUN_EFFECT") == 0)
+    {
+      for (i = 0; i < SHIPS_SYSTEMS; i++)
+	sun_effect[i] = 0;
+      readstrings("SUN_EFFECT", s, systemtypes, sun_effect, SHIPS_SYSTEMS);
+    }
+    else if (strcmp(buf, "ASTEROID_EFFECT") == 0)
+    {
+      for (i = 0; i < SHIPS_SYSTEMS; i++)
+	ast_effect[i] = 0;
+      readstrings("ASTEROID_EFFECT", s, systemtypes, ast_effect, SHIPS_SYSTEMS);
+    }
+    else if (strcmp(buf, "NEBULA_EFFECT") == 0)
+    {
+      for (i = 0; i < SHIPS_SYSTEMS; i++)
+	neb_effect[i] = 0;
+      readstrings("NEBULA_EFFECT", s, systemtypes, neb_effect, SHIPS_SYSTEMS);
+    }
+    else if (strcmp(buf, "WORMHOLE_EFFECT") == 0)
+    {
+      for (i = 0; i < SHIPS_SYSTEMS; i++)
+	wh_effect[i] = 0;
+      readstrings("WORMHOLE_EFFECT", s, systemtypes, wh_effect, SHIPS_SYSTEMS);
+    }
+    else if (strcmp(buf, "IMPROVED_TRACKING") == 0)
+    {
+      for (i = 0; i < SHIPS_SYSTEMS; i++)
+	improved_tracking[i] = 0;
+      readstrings("IMPROVED_TRACKING", s, systemtypes, improved_tracking, SHIPS_SYSTEMS);
+#if 0
+    }
+    else if (strcmp(buf, "PING_FREQ") == 0)
+    {
+      ping_freq = atoi(s);
+    }
+    else if (strcmp(buf, "PING_ILOSS_INTERVAL") == 0)
+    {
+      ping_iloss_interval = atoi(s);
+    }
+    else if (strcmp(buf, "PING_GHOSTBUST") == 0)
+    {
+      ping_allow_ghostbust = atoi(s);
+    }
+    else if (strcmp(buf, "PING_GHOSTBUST_INTERVAL") == 0)
+    {
+      ping_ghostbust_interval = atoi(s);
+#endif
+    }
+    else if (strcmp(buf, "SHIP") == 0)
+    {				/* if ship being entered */
+      shipdefs(atoi(s), f);
+    }
+    else if (strcmp(buf, "RELOAD_SHIPDEFAULTS") == 0)
+    {
+      getshipdefaults();
+    }
+    else
+    {
+      for (i = 0; config_fields[i].name; i++)
+      {
+	if (strcmp(buf, config_fields[i].name) == 0)
+	  break;
+      }
+      if (!config_fields[i].name)
+      {
+	fprintf(stderr, "System default %s unknown\n", buf);
+      }
+      else
+      {
+	int offset = config_fields[i].offset;
+	char *curr = (char *) configvals;
+	switch (config_fields[i].type)
+	{			/* parse the right type */
+	 case FT_BYTE:
+	  *(offset + curr) = atoi(s);
+	  break;
+	 case FT_SHORT:
+	  sscanf(s, "%hi", (short *) (offset + curr));
+	  break;
+	 case FT_INT:
+	  sscanf(s, "%i", (int *) (offset + curr));
+	  break;
+	 case FT_LONG:
+	  sscanf(s, "%li", (long *) (offset + curr));
+	  break;
+	 case FT_FLOAT:
+	  sscanf(s, "%f", (float *) (offset + curr));
+	  break;
+	 case FT_STRING:
+	  sscanf(s, "%s", offset + curr);
+	  break;
+	 case FT_LONGFLAGS:
+	  read_longflags((long *) (offset + curr), s,
+			 (char **) config_fields[i].aux);
+	  break;
+	 default:
+	  fprintf(stderr, "Internal error, unknown config field type %d\n",
+		  config_fields[i].type);
+	}
+      }
+    }
+  }
+
+  if (configvals->tournplayers < 1)	/* get number of players needed */
+    configvals->tournplayers = 5;	/* cannot set tournplayers to 0 */
+
+  if (configvals->erosion > 1)
+    configvals->erosion = 1;
+  if (configvals->penetration > 1)
+    configvals->penetration = 1;
+  if (configvals->penetration < 0)
+    configvals->penetration = 0;
+
+  if (configvals->ping_period <= 0)
+    configvals->ping_period = 1;
+  if (configvals->ping_iloss_interval <= 0)
+    configvals->ping_iloss_interval = 1;
+  if (configvals->ping_ghostbust_interval <= 0)
+    configvals->ping_ghostbust_interval = 1;
+
+  fclose(f);			/* close sysdefaults file */
+}
+
+
+
+
+/*--------------------------UPDATE_SYS_DEFAULTS---------------------------*/
+/*
+ * This function will update all of the defaults if the default file changed.
+ * It is called often, and assuming the OS caches the file inode info well,
+ * this isn't a problem. This function returns a 1 if new sysdefaults were
+ * loaded.  Otherwise a zero is returned.
+ */
+
+int
+update_sys_defaults()
+{
+  struct stat newstat;
+  static char *paths = NULL;	/* to hold full pathname */
+
+#ifdef LEAGUE_SUPPORT
+  if (status2->league)
+    return 0;			/* don't read .sysdef during league game */
+#endif
+
+  if (!paths)			/* just do the build_path once */
+    paths = strdup(build_path(SYSDEF_FILE));
+
+  if (stat(paths, &newstat) == 0)
+  {				/* get info about sysdef file */
+    if (newstat.st_ino != oldstat.st_ino ||	/* if the file has */
+	newstat.st_mtime != oldstat.st_mtime)
+    {				/* changed then */
+      readsysdefaults();	/* load new defaults and */
+
+      /*
+       * touch the motd file so the clients will re-load the sysdef screen
+       */
+      touch(build_path(MOTD));
+
+      return (1);		/* return that they were loaded */
+    }
+  }
+  return (0);			/* return 0 for no new stats */
+}
+
+/*--------------------------------------------------------------------------*/
+
+
+
+
+
+/*--------END OF FILE-------*/