[comp.sources.games] v11i040: gb3 - Galactic Bloodshed, an empire-like war game [Ver. 2.0], Patch2b

billr@saab.CNA.TEK.COM (Bill Randle) (08/29/90)

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 11, Issue 40
Archive-name: gb3/Patch2b
Patch-To: gb3: Volume 10, Issue 1-14



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 9)."
# Contents:  patches02b server/patchlevel.h
# Wrapped by billr@saab on Tue Aug 28 08:54:53 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patches02b' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'patches02b'\" to \"'patches02b.orig'\"
  mv -f 'patches02b' 'patches02b.orig'
fi
echo shar: Extracting \"'patches02b'\" \(56321 characters\)
sed "s/^X//" >'patches02b' <<'END_OF_FILE'
X*** /usr/cna/billr/games/gb3/server/dosector.c	Wed May 30 15:13:03 1990
X--- server/dosector.c	Thu Aug 23 16:54:49 1990
X***************
X*** 31,41 ****
X  reg struct plinfo *pinf;
X  reg int new;
X  
X- if(s->resource < 0)
X-   s->resource = -s->resource;
X- 
X  	 check(planet,20);
X! 	 factor = .4 * log10(1.0+(double)s->eff) * s->resource
X  	     * races[s->owner-1]->metabolism;
X  	 pinf = &planet->info[s->owner-1];
X  
X--- 31,38 ----
X  reg struct plinfo *pinf;
X  reg int new;
X  
X  	 check(planet,20);
X! 	 factor = .4 * log10(1.0+(double)s->eff) * s->resource * (1+(planet->type==TYPE_EARTH))
X  	     * races[s->owner-1]->metabolism;
X  	 pinf = &planet->info[s->owner-1];
X  
X***************
X*** 51,56 ****
X--- 48,61 ----
X  	   pdes = round_rand( factor * DEST_PRODUCTION
X  			* s->mobilization );
X  	 prod_destruct[s->owner-1] += pdes;
X+ 
X+ 
X+ /* try to find crystals */
X+ /* chance of digging out a crystal depends on efficiency */
X+ 	if(s->crystals && int_rand(1,100) < s->eff) {	
X+ 			prod_crystals[s->owner-1]++;
X+ 			s->crystals--;
X+ 					}
X  
X  		/* increase mobilization to planetary quota */
X  	 if (s->mobilization < pinf->mob_set) {
X*** /usr/cna/billr/games/gb3/server/enrol.c	Wed May 30 15:13:07 1990
X--- server/enrol.c	Fri Aug 24 15:10:01 1990
X***************
X*** 19,24 ****
X--- 19,25 ----
X  #include "buffers.h"
X  extern int errno;
X  char desshow();
X+ racetype *Race;
X  
X  struct stype {
X  	char here;
X***************
X*** 29,44 ****
X  
X  /* racial types (10 racial types ) */
X  int Thing[RACIAL_TYPES] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0};
X! float db_Mass[RACIAL_TYPES] = {1.0, 1.5, 2.0, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25};
X  float db_Birthrate[RACIAL_TYPES] = {0.8, 0.8, 0.9, 0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5};
X  int db_Fighters[RACIAL_TYPES] = {6, 7, 8, 2, 3, 3, 4, 4, 5, 5};
X  int db_Intelligence[RACIAL_TYPES] = {80, 70, 60, 190, 180, 170, 160, 150, 140, 130};
X! float db_Adventurism[RACIAL_TYPES] = {0.89, 0.89, 0.89, .5, .5, .5, .6, .6, .7, .8};
X  int Min_Sexes[RACIAL_TYPES] = {1, 1, 1, 2, 2, 2, 2, 2, 2, 2};
X  int Max_Sexes[RACIAL_TYPES] = {1, 1, 1, 2, 2, 4, 4, 4, 4, 4};
X  float db_Metabolism[RACIAL_TYPES] = {1.3, 1.3, 1.3, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
X  
X! #define RMass(x) (db_Mass[(x)] + .01*(float)int_rand(-25, 25))
X  #define Birthrate(x) (db_Birthrate[(x)] + .01*(float)int_rand(-10, 10))
X  #define Fighters(x) (db_Fighters[(x)] + int_rand(-1, 1))
X  #define Intelligence(x) (db_Intelligence[(x)] + int_rand(-10, 10))
X--- 30,45 ----
X  
X  /* racial types (10 racial types ) */
X  int Thing[RACIAL_TYPES] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0};
X! float db_Mass[RACIAL_TYPES] = {.1,.15,.2,.125,.125,.125,.125,.125,.125,.125};
X  float db_Birthrate[RACIAL_TYPES] = {0.8, 0.8, 0.9, 0.4, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5};
X  int db_Fighters[RACIAL_TYPES] = {6, 7, 8, 2, 3, 3, 4, 4, 5, 5};
X  int db_Intelligence[RACIAL_TYPES] = {80, 70, 60, 190, 180, 170, 160, 150, 140, 130};
X! float db_Adventurism[RACIAL_TYPES] = {0.89, 0.89, 0.89, .6, .65, .7, .7, .75, .75, .8};
X  int Min_Sexes[RACIAL_TYPES] = {1, 1, 1, 2, 2, 2, 2, 2, 2, 2};
X  int Max_Sexes[RACIAL_TYPES] = {1, 1, 1, 2, 2, 4, 4, 4, 4, 4};
X  float db_Metabolism[RACIAL_TYPES] = {1.3, 1.3, 1.3, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
X  
X! #define RMass(x) (db_Mass[(x)] + .001*(float)int_rand(-25, 25))
X  #define Birthrate(x) (db_Birthrate[(x)] + .01*(float)int_rand(-10, 10))
X  #define Fighters(x) (db_Fighters[(x)] + int_rand(-1, 1))
X  #define Intelligence(x) (db_Intelligence[(x)] + int_rand(-10, 10))
X***************
X*** 90,107 ****
X  		Two[i]=2*Two[i-1];
X  
X   if ( (Playernum=Numraces()+1) >= MAXPLAYERS) {
X! 	printf("There are already %d players; No more allowed.\n",MAXPLAYERS);
X  	exit(-1);
X   }
X  
X  /*printf("Enter racial type to be created (1-%d):", RACIAL_TYPES);
X  scanf("%d", &idx);
X  getchr();
X  idx -= 1;
X  */
X! idx = int_rand(3,10);
X  
X! if(idx < 0 || idx > RACIAL_TYPES-1) {
X  	printf("Bad racial index.\n");
X  	exit(1);
X  	}
X--- 91,109 ----
X  		Two[i]=2*Two[i-1];
X  
X   if ( (Playernum=Numraces()+1) >= MAXPLAYERS) {
X! 	printf("There are already %d players; No more allowed.\n",MAXPLAYERS-1);
X  	exit(-1);
X   }
X  
X+ 
X  /*printf("Enter racial type to be created (1-%d):", RACIAL_TYPES);
X  scanf("%d", &idx);
X  getchr();
X  idx -= 1;
X  */
X! idx = int_rand(3,9);
X  
X! if(idx < 0 || idx >= RACIAL_TYPES) {
X  	printf("Bad racial index.\n");
X  	exit(1);
X  	}
X***************
X*** 134,140 ****
X  
X   bzero((char *)not_found, sizeof(not_found));
X   do {
X- /*
X      printf("\nLive on what type planet:(e)arth, (g)asgiant, (a)irless, (i)ce, (w)ater? ");
X      	c=getchr();
X  	getchr();
X--- 136,141 ----
X***************
X*** 154,162 ****
X  		 exit(-1);
X  		 break;
X      }
X- */
X  
X! 	switch(int_rand(1,4)) {
X  		case 1 : ppref = TYPE_EARTH; break;
X  		case 2 : ppref = TYPE_AIRLESS; break;
X  		case 3 : ppref = TYPE_ICEBALL; break;
X--- 155,162 ----
X  		 exit(-1);
X  		 break;
X      }
X  
X! /*	switch(int_rand(1,4)) {
X  		case 1 : ppref = TYPE_EARTH; break;
X  		case 2 : ppref = TYPE_AIRLESS; break;
X  		case 3 : ppref = TYPE_ICEBALL; break;
X***************
X*** 165,171 ****
X  		 exit(-1);
X  		 break;
X  		}
X! 
X  	printf("Looking for type %d planet...\n", ppref);
X  
X  	/* find first planet of right type */
X--- 165,172 ----
X  		 exit(-1);
X  		 break;
X  		}
X! */
X!     
X  	printf("Looking for type %d planet...\n", ppref);
X  
X  	/* find first planet of right type */
X***************
X*** 175,185 ****
X    for (star=0; star<Sdata.numstars && !found && count < 100; ) {
X  
X  	check = 1;
X! 	  /* skip over uninhabited stars */
X  	if (Stars[star]->inhabited)
X  			check = 0;
X  
X! 	  /* look for unihabited planets */
X  	 if (check) {
X  	  pnum = 0;
X  	  while (!found && pnum<Stars[star]->numplanets) {
X--- 176,186 ----
X    for (star=0; star<Sdata.numstars && !found && count < 100; ) {
X  
X  	check = 1;
X! 	  /* skip over inhabited stars */
X  	if (Stars[star]->inhabited)
X  			check = 0;
X  
X! 	  /* look for uninhabited planets */
X  	 if (check) {
X  	  pnum = 0;
X  	  while (!found && pnum<Stars[star]->numplanets) {
X***************
X*** 238,248 ****
X  	c=getchr();
X  	getchr();
X  
X-  if (c=='y') 
X- 	Race->God=1;
X- else 
X- 	Race->God=0;
X  
X  
X   printf("\n\nEnter a name for your race:");
X   dots(RNAMESIZE);
X--- 239,246 ----
X  	c=getchr();
X  	getchr();
X  
X  
X+ 	Race->God = (c=='y');
X  
X   printf("\n\nEnter a name for your race:");
X   dots(RNAMESIZE);
X***************
X*** 254,259 ****
X--- 252,258 ----
X   Race->homelevel = Race->deflevel = LEVEL_PLAN;
X   Race->homesystem = Race->defsystem = star;
X   Race->homeplanetnum = Race->defplanetnum = pnum;
X+  Race->highlight = Playernum;
X  
X  	/* make conditions preferred by your people set to (more or less) 
X  	   those of the planet : higher the concentration of gas, the higher
X***************
X*** 274,279 ****
X--- 273,279 ----
X  /* assign racial characteristics */
X  
X  	Race->tech = 0;
X+ do {
X  	Race->overbirthrate = float_rand() * 0.01;
X  		/* your race is like "the Thing" */
X  		Race->Thing = Thing[idx];
X***************
X*** 294,299 ****
X--- 294,304 ----
X  	printf("            Mass: %.2f\n",Race->mass);
X  	printf(" Number of sexes: %d (min req'd for colonization)\n",Race->number_sexes);
X  
X+ 	printf("\n\nLook OK(y/n)\?");
X+ 	if(gets(str)==NULL)
X+ 		exit(1);
X+ 	} while (str[0] != 'y');
X+ 
X   bzero((char *)secttypes, sizeof(secttypes));
X  
X   opensectdata(&enroll_sectdata);
X***************
X*** 369,375 ****
X  	s.build_type = OTYPE_GOV;
X  	s.armor = Shipdata[OTYPE_GOV][ABIL_ARMOR];
X  	s.guns = Shipdata[OTYPE_GOV][ABIL_GUNS];
X- 	s.size = Shipdata[OTYPE_GOV][ABIL_TARGET];
X  	s.max_crew = Shipdata[OTYPE_GOV][ABIL_MAXCREW];
X  	s.max_destruct = Shipdata[OTYPE_GOV][ABIL_DESTCAP];
X  	s.max_resource = Shipdata[OTYPE_GOV][ABIL_CARGO];
X--- 374,379 ----
X***************
X*** 376,381 ****
X--- 380,388 ----
X  	s.max_fuel = Shipdata[OTYPE_GOV][ABIL_FUELCAP];
X  	s.max_speed = Shipdata[OTYPE_GOV][ABIL_SPEED];
X  	s.build_cost = Shipdata[OTYPE_GOV][ABIL_COST];
X+ 	s.size = 0.1*s.guns + .1*s.max_crew + .03*s.max_resource + .03*s.max_fuel 
X+ 		+ .03*s.max_destruct;
X+ ;
X  	s.base_mass = MAX(1.0, (float)s.armor + (float)s.size/10.0 + (float)s.guns/10.0);
X  	sprintf(s.class, "Standard");
X  
X***************
X*** 401,407 ****
X  	s.rad = 0;
X  	s.damage = 0;	/*Shipdata[s.type][ABIL_DAMAGE];*/
X  		/* (first capitol is 100% efficient */
X! 
X  	s.object.number = 0;
X  	s.object.number2 = 0;
X  	s.object.number3 = 0;
X--- 408,415 ----
X  	s.rad = 0;
X  	s.damage = 0;	/*Shipdata[s.type][ABIL_DAMAGE];*/
X  		/* (first capitol is 100% efficient */
X! 	s.retaliate = 0;
X! 	
X  	s.object.number = 0;
X  	s.object.number2 = 0;
X  	s.object.number3 = 0;
X***************
X*** 410,416 ****
X  	s.on = 1;
X  
X  	s.name[0] = '\0';
X! 
X  	putship(enroll_shdata, &s, shipno);
X  	close_file(enroll_shdata);
X  
X--- 418,425 ----
X  	s.on = 1;
X  
X  	s.name[0] = '\0';
X! 	s.mission[0] = '\0';
X! 	
X  	putship(enroll_shdata, &s, shipno);
X  	close_file(enroll_shdata);
X  
X***************
X*** 487,492 ****
X--- 496,508 ----
X  
X  void notify(who, msg)
X  int who;
X+ char *msg;
X+ {
X+ /* this is a dummy routine */
X+ }
X+ 
X+ void push_message(what, who, msg)
X+ int what, who;
X  char *msg;
X  {
X  /* this is a dummy routine */
X*** /usr/cna/billr/games/gb3/server/enslave.c	Wed May 30 15:13:08 1990
X--- server/enslave.c	Thu Aug 23 16:54:54 1990
X***************
X*** 25,30 ****
X--- 25,31 ----
X  planettype *p;
X  int sh,shipno,i,mask,aliens=0,def=0,attack=0;
X  double Dist;
X+ racetype *Race;
X  
X  enslave_shdata = enslave_pdata = NEUTRAL_FD;
X  
X***************
X*** 39,48 ****
X--- 40,51 ----
X  
X    if (s->owner!=Playernum) {
X  	DontOwnErr(Playernum,shipno);
X+ 	free(s);
X  	return; 
X   }
X  
X    if (testship(Playernum,s, shipno)) {
X+ 	free(s);
X  	return;
X  	}
X  
X***************
X*** 49,77 ****
X    if (s->type != STYPE_ASS) {
X  	sprintf(buf,"This ship is not an %s.\n", Shipnames[STYPE_ASS]);
X  		notify(Playernum, buf);
X  	return;
X    }
X    if (s->whatorbits!=LEVEL_PLAN) {
X  	sprintf(buf,"%s #%d doesn't orbit a planet.\n", Shipnames[s->type],shipno);
X  		notify(Playernum, buf);
X  	return;
X    }
X  
X    if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) { 
X! 	return;
X  	}
X  
X! free(Race);
X! openracedata(&enslave_racedata);
X! getrace(enslave_racedata, &Race, Playernum); 
X! close_file(enslave_racedata);
X  
X-  openpdata(&enslave_pdata);
X-   getplanet(enslave_pdata,&p,Stars[s->storbits]->planetpos[s->pnumorbits]);
X- close_file(enslave_pdata);
X    if (p->info[Playernum-1].numsectsowned==0) {
X  	sprintf(buf,"You don't have a garrison on the planet.\n");
X  		notify(Playernum, buf);
X  	return;
X    }
X  
X--- 52,82 ----
X    if (s->type != STYPE_ASS) {
X  	sprintf(buf,"This ship is not an %s.\n", Shipnames[STYPE_ASS]);
X  		notify(Playernum, buf);
X+ 	free(s);
X  	return;
X    }
X+ 
X    if (s->whatorbits!=LEVEL_PLAN) {
X  	sprintf(buf,"%s #%d doesn't orbit a planet.\n", Shipnames[s->type],shipno);
X  		notify(Playernum, buf);
X+ 	free(s);
X  	return;
X    }
X  
X    if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) { 
X!       free(s);
X!       return;
X  	}
X  
X!  	openpdata(&enslave_pdata);
X!   	getplanet(enslave_pdata,&p,Stars[s->storbits]->planetpos[s->pnumorbits]);
X! 	close_file(enslave_pdata);
X  
X    if (p->info[Playernum-1].numsectsowned==0) {
X  	sprintf(buf,"You don't have a garrison on the planet.\n");
X  		notify(Playernum, buf);
X+ 	free(s);
X+ 	free(p);
X  	return;
X    }
X  
X***************
X*** 86,94 ****
X--- 91,105 ----
X    if (!aliens) {
X  	sprintf(buf,"There is no one else on this planet to enslave!\n");
X  		notify(Playernum, buf);
X+ 	free(s);
X+ 	free(p);
X  	return;
X    }
X  
X+ openracedata(&enslave_racedata);
X+ getrace(enslave_racedata, &Race, Playernum); 
X+ close_file(enslave_racedata);
X+ 
X    sh = p->ships;
X    openshdata(&enslave_shdata);
X    while (sh) {
X***************
X*** 164,171 ****
X  	if (p->info[i-1].numsectsowned && i!=Playernum)
X  		notify(i, telegram_buf);
X  
X!   free(p);
X! 
X  }
X  
X  
X--- 175,183 ----
X  	if (p->info[i-1].numsectsowned && i!=Playernum)
X  		notify(i, telegram_buf);
X  
X! free(p);
X! free(s);
X! free(Race);
X  }
X  
X  
X*** /usr/cna/billr/games/gb3/server/examine.c	Wed May 30 15:13:09 1990
X--- server/examine.c	Thu Aug 23 16:54:55 1990
X***************
X*** 41,51 ****
X--- 41,53 ----
X      if (ship->whatorbits==LEVEL_UNIV || isclr(Stars[ship->storbits]->inhabited, Playernum)) {
X  	sprintf(buf,"That ship it not visible to you.\n");
X  		notify(Playernum, buf);
X+ 	free(ship);
X  	return;
X      }
X  
X      if ((fd=fopen(EXAM_FL, "r"))==NULL) {
X  	perror(EXAM_FL);
X+ 	free(ship);
X  	return;
X      }
X  
X*** /usr/cna/billr/games/gb3/server/explore.c	Wed May 30 15:13:10 1990
X--- server/explore.c	Thu Aug 23 16:54:56 1990
X***************
X*** 25,34 ****
X  int inhab = 0;
X  int stardata,pdata;
X  char str[200];
X  
X   Num_races = Numraces();
X  
X- free(Race);
X  openracedata(&explore_racedata);
X  getrace(explore_racedata, &Race, Playernum);
X  close_file(explore_racedata);
X--- 25,34 ----
X  int inhab = 0;
X  int stardata,pdata;
X  char str[200];
X+ racetype *Race;
X  
X   Num_races = Numraces();
X  
X  openracedata(&explore_racedata);
X  getrace(explore_racedata, &Race, Playernum);
X  close_file(explore_racedata);
X***************
X*** 38,47 ****
X   openpdata(&pdata);
X   sprintf(buf,"             ========== Colonization Report ==========\n\n");
X  	notify(Playernum, buf); 
X! sprintf(buf,"       Planet        res  des fuel tox sects tech  mob       Type       Aliens\n");
X  	notify(Playernum, buf);
X   for (star=0; star<Sdata.numstars; star++) {
X!     getstar(stardata, &(Stars[star]), star);
X      if (isset(Stars[star]->explored,Playernum)) {
X          for (i=0; i<Stars[star]->numplanets; i++) {
X             getplanet(pdata,&pl,Stars[star]->planetpos[i]);
X--- 38,48 ----
X   openpdata(&pdata);
X   sprintf(buf,"             ========== Colonization Report ==========\n\n");
X  	notify(Playernum, buf); 
X! sprintf(buf,"       Planet    xtl res  des fuel tox sects tech  mob       Type       Aliens\n");
X  	notify(Playernum, buf);
X   for (star=0; star<Sdata.numstars; star++) {
X! 	free(Stars[star]);
X!     	getstar(stardata, &(Stars[star]), star);
X      if (isset(Stars[star]->explored,Playernum)) {
X          for (i=0; i<Stars[star]->numplanets; i++) {
X             getplanet(pdata,&pl,Stars[star]->planetpos[i]);
X***************
X*** 54,61 ****
X  			Stars[star]->pnames[i],
X  			(pl->info[Playernum-1].autorep ? "*" : ""));
X  
X! 		sprintf(buf,"%19s%5d%5d%5d %3d%% %4d %3d  %2d(%2d)",
X! 		       str,pl->info[Playernum-1].resource,
X  		       pl->info[Playernum-1].destruct,
X  		       pl->info[Playernum-1].fuel,pl->conditions[TOXIC],
X  		       pl->info[Playernum-1].numsectsowned,
X--- 55,64 ----
X  			Stars[star]->pnames[i],
X  			(pl->info[Playernum-1].autorep ? "*" : ""));
X  
X! 		sprintf(buf,"%16.16s %2d%5d%5d%5d %3d%% %4d %3d  %2d(%2d)",
X! 		       str,
X! 		       pl->info[Playernum-1].crystals,
X! 		       pl->info[Playernum-1].resource,
X  		       pl->info[Playernum-1].destruct,
X  		       pl->info[Playernum-1].fuel,pl->conditions[TOXIC],
X  		       pl->info[Playernum-1].numsectsowned,
X***************
X*** 92,97 ****
X--- 95,101 ----
X   }
X   close_file(stardata);
X   close_file(pdata);
X+ free(Race);
X  }
X  
X  
X***************
X*** 105,114 ****
X  placetype where;
X  int inhab = 0;
X  int stardata,pdata;
X  
X   Num_races = Numraces();
X  
X! 	starq = 0;
X  
X  if(argn==2) {
X  	where = Getplace(Playernum,args[1],0);
X--- 109,119 ----
X  placetype where;
X  int inhab = 0;
X  int stardata,pdata;
X+ racetype *Race;
X  
X   Num_races = Numraces();
X  
X! 	starq = -1;
X  
X  if(argn==2) {
X  	where = Getplace(Playernum,args[1],0);
X***************
X*** 120,126 ****
X  	starq = where.snum;
X  	}
X  
X- free(Race);
X  openracedata(&explore_racedata);
X  getrace(explore_racedata, &Race, Playernum);
X  close_file(explore_racedata);
X--- 125,130 ----
X***************
X*** 135,141 ****
X  sprintf(buf," Star  (stability)[AP]   #  Planet [Attributes] Type (Compatibility)\n");
X  			notify(Playernum, buf);
X   for (star=0; star<Sdata.numstars; star++)
X!  	if((starq ==0) || (starq  && starq == star)) {
X      getstar(stardata, &(Stars[star]), star);
X      if (isset(Stars[star]->explored,Playernum)) {
X          for (i=0; i<Stars[star]->numplanets; i++) {
X--- 139,146 ----
X  sprintf(buf," Star  (stability)[AP]   #  Planet [Attributes] Type (Compatibility)\n");
X  			notify(Playernum, buf);
X   for (star=0; star<Sdata.numstars; star++)
X!  	if((starq == -1) || (starq == star)) {
X! 		free(Stars[star]);
X      getstar(stardata, &(Stars[star]), star);
X      if (isset(Stars[star]->explored,Playernum)) {
X          for (i=0; i<Stars[star]->numplanets; i++) {
X***************
X*** 142,163 ****
X             getplanet(pdata,&pl,Stars[star]->planetpos[i]);
X             if (i == 0)
X                  if (Race->tech >= TECH_SEE_STABILITY){
X!                     sprintf(buf,"\n%13s (%2d)[%2d]",Stars[star]->name,Stars[star]->stability,Stars[star]->AP[Playernum-1]);
X  			notify(Playernum, buf);
X  	} else {
X!                     sprintf(buf,"\n%13s (??)[%2d]",Stars[star]->name,Stars[star]->stability,Stars[star]->AP[Playernum-1]);
X  		notify(Playernum, buf);
X! 	} else {
X!                 sprintf(buf,"\t\t      ");
X! 		notify(Playernum, buf);
X! 		}
X             sprintf(buf,"  #%d. %-15s [ ",i+1,Stars[star]->pnames[i]);
X  		notify(Playernum, buf);
X             if (pl->info[Playernum-1].explored)  {
X!                 sprintf(buf,"Expl ");
X  		notify(Playernum, buf);
X                  if (pl->info[Playernum-1].autorep) {
X! 		sprintf(buf,"Report ");
X  		notify(Playernum, buf);
X  			}
X                  if (pl->info[Playernum-1].numsectsowned) {
X--- 147,169 ----
X             getplanet(pdata,&pl,Stars[star]->planetpos[i]);
X             if (i == 0)
X                  if (Race->tech >= TECH_SEE_STABILITY){
X!                     sprintf(buf,"\n%13s (%2d)[%2d]\n",Stars[star]->name,Stars[star]->stability,Stars[star]->AP[Playernum-1]);
X  			notify(Playernum, buf);
X  	} else {
X!                     sprintf(buf,"\n%13s (??)[%2d]\n",Stars[star]->name,Stars[star]->stability,Stars[star]->AP[Playernum-1]);
X  		notify(Playernum, buf);
X! 	} 
X! 
X!           sprintf(buf,"\t\t      ");
X! 	notify(Playernum, buf);
X! 
X             sprintf(buf,"  #%d. %-15s [ ",i+1,Stars[star]->pnames[i]);
X  		notify(Playernum, buf);
X             if (pl->info[Playernum-1].explored)  {
X!                 sprintf(buf,"Ex ");
X  		notify(Playernum, buf);
X                  if (pl->info[Playernum-1].autorep) {
X! 		sprintf(buf,"Rep ");
X  		notify(Playernum, buf);
X  			}
X                  if (pl->info[Playernum-1].numsectsowned) {
X***************
X*** 197,204 ****
X  	   free(pl);
X          }
X      }
X!  }
X   close_file(stardata);
X   close_file(pdata);
X  }
X  
X--- 203,212 ----
X  	   free(pl);
X          }
X      }
X! }
X   close_file(stardata);
X   close_file(pdata);
X+ free(Race);
X  }
X+ 
X  
X*** /usr/cna/billr/games/gb3/server/files.c	Wed May 30 15:13:10 1990
X--- server/files.c	Thu Aug 23 16:54:56 1990
X***************
X*** 27,31 ****
X  	DFILE(Tele),
X  	DFILE(Tele/tele),
X  	DFILE(power),
X! 	DFILE(LOCK)
X! };
X--- 27,36 ----
X  	DFILE(Tele),
X  	DFILE(Tele/tele),
X  	DFILE(power),
X! 	DFILE(LOCK),
X! 	DFILE(News),
X! 	DFILE(News/declaration),
X! 	DFILE(News/transfer),
X!         DFILE(News/combat),
X! 	DFILE(News/announce)
X! 	};
X*** /usr/cna/billr/games/gb3/server/files_rw.c	Wed May 30 15:13:11 1990
X--- server/files_rw.c	Thu Aug 23 16:54:57 1990
X***************
X*** 65,75 ****
X  int n2;
X  int i;
X  
X- Num_races=Numraces();
X- 
X-  
X- /* printf(" fd =%d writing %d bytes to %s posn %d.\n",fd,num,file,posn); */
X- 
X   if (lseek(fd, posn, L_SET) < 0) {
X  	char buf[100];
X  	sprintf(buf,"%s: err %d",file,errno);
X--- 65,70 ----
X*** /usr/cna/billr/games/gb3/server/files_shl.c	Wed May 30 15:13:13 1990
X--- server/files_shl.c	Fri Aug 24 15:14:32 1990
X***************
X*** 37,42 ****
X--- 37,43 ----
X  #include "ships.h"
X  #include "races.h"
X  #include "power.h"
X+ #include "buffers.h"
X  #include <strings.h>
X  #include <sys/stat.h>
X  #include <signal.h>
X***************
X*** 109,119 ****
X  }
X  
X  
X! getrace(fd, r,rnum)
X  int fd;
X  racetype **r;
X  int rnum;
X  {
X   *r = (racetype *)malloc(sizeof(racetype));
X   Fileread(fd, (char *)*r, sizeof(racetype), RACEDATAFL,
X  			(rnum-1)*sizeof(racetype) );
X--- 110,121 ----
X  }
X  
X  
X! getrace(fd, r, rnum)
X  int fd;
X  racetype **r;
X  int rnum;
X  {
X+ 
X   *r = (racetype *)malloc(sizeof(racetype));
X   Fileread(fd, (char *)*r, sizeof(racetype), RACEDATAFL,
X  			(rnum-1)*sizeof(racetype) );
X***************
X*** 295,302 ****
X   struct stat buf;
X  
X  fstat(fd,&buf);
X- 
X- /* printf("numships %d\n",(int)(buf.st_size / sizeof(shiptype)) ); */
X  return( (int)(buf.st_size / sizeof(shiptype)) );
X  }
X  
X--- 297,302 ----
X*** /usr/cna/billr/games/gb3/server/fix.c	Wed May 30 15:13:16 1990
X--- server/fix.c	Fri Aug 24 15:15:15 1990
X***************
X*** 29,36 ****
X  #include <signal.h>
X  int fix_stardata,fix_shdata,fix_pdata,fix_sectdata, fix_racedata;
X  char s[40];
X! 
X! boolean fix_mod;
X  int Playernum;
X  
X  main(argc, argv)
X--- 29,37 ----
X  #include <signal.h>
X  int fix_stardata,fix_shdata,fix_pdata,fix_sectdata, fix_racedata;
X  char s[40];
X! char z;                              				      /*nicgj3*/
X! racetype *Race;
X! int fix_mod;
X  int Playernum;
X  
X  main(argc, argv)
X***************
X*** 45,65 ****
X  sectortype *sect;
X  shiptype *sh;
X  int fix_handler();
X  
X  fix_mod = 0;
X  fix_stardata = fix_shdata = fix_pdata = fix_sectdata = NEUTRAL_FD;
X  	/* so closure does not cause wanted files to close (like stdin 
X  		or stdout) -- should not cause probs most vers. of UNIX */
X- 
X  printf("Enter race number: ");
X  scanf("%d", &Playernum);
X  
X! openracedata(&fix_racedata);
X! free(Race);
X! getrace(fix_racedata, &Race, Playernum);
X! close_file(fix_racedata);
X  
X! if (!strcmp(argv[1], "race", strlen(argv[1]))) {
X  	query(FLOAT,"tech",&Race->tech,0,0,0,0);
X  	query(FLOAT,"birthrate",&Race->birthrate,0,0,0,0);
X  	query(FLOAT,"mass",&Race->mass,0,0,0,0);
X--- 46,80 ----
X  sectortype *sect;
X  shiptype *sh;
X  int fix_handler();
X+ int numraces;                           			      /*nicgj3*/
X  
X  fix_mod = 0;
X  fix_stardata = fix_shdata = fix_pdata = fix_sectdata = NEUTRAL_FD;
X  	/* so closure does not cause wanted files to close (like stdin 
X  		or stdout) -- should not cause probs most vers. of UNIX */
X  printf("Enter race number: ");
X  scanf("%d", &Playernum);
X  
X! openracedata(&fix_racedata);                                          /*nicgj3*/
X! /*free(Race);   (freeing a pointer never allocated??)			*/
X! getrace(fix_racedata, &Race, Playernum);         		      /*nicgj3*/
X! close_file(fix_racedata);         				      /*nicgj3*/
X! numraces=Numraces();         					      /*nicgj3*/
X  
X! if(argc < 2) {
X! 	printf("You have to do 'fix <what>'!\n");
X! 	exit(0);
X! 	}
X! 
X! if ((argc==2) && (!strcmp(argv[1], "race"))) {                        /*nicgj3*/
X!         getchr();           				              /*nicgj3*/
X! 	for(i=1;i<=numraces;i++){                                     /*nicgj3*/
X! 	  if (i!=Playernum) {                                         /*nicgj3*/
X! 	    printf("Player %d ",i);                                   /*nicgj3*/
X! 	    query(CHAR,"Relations",0,0,&Race->translate[i-1],0,0);    /*nicgj3*/
X! 	    }
X! 	  }
X! 	query(SHORT,"God",0,0,0,&Race->God,0);                        /*nicgj3*/
X  	query(FLOAT,"tech",&Race->tech,0,0,0,0);
X  	query(FLOAT,"birthrate",&Race->birthrate,0,0,0,0);
X  	query(FLOAT,"mass",&Race->mass,0,0,0,0);
X***************
X*** 90,101 ****
X  	query(CHAR, "Sulfur",0,0,&Race->conditions[SULFUR],0,0);
X  	query(CHAR, "Helium",0,0,&Race->conditions[HELIUM],0,0);
X  	query(CHAR, "Other",0,0,&Race->conditions[OTHER],0,0);
X! 	if (fix_mod){
X  		printf("saving");
X! 		putrace(Race);}
X  } else {
X!   where = Getplace(Playernum,argv[1],0);	/* do not ignore the fact that you've not
X! 					explored the place */
X    if (where.err) {
X  	sprintf(buf,"cs: bad scope.\n");
X  		notify(Playernum, buf);
X--- 105,125 ----
X  	query(CHAR, "Sulfur",0,0,&Race->conditions[SULFUR],0,0);
X  	query(CHAR, "Helium",0,0,&Race->conditions[HELIUM],0,0);
X  	query(CHAR, "Other",0,0,&Race->conditions[OTHER],0,0);
X! 	if (fix_mod!=0){
X  		printf("saving");
X! 		openracedata(&fix_racedata);     		      /*nicgj3*/
X! 		putrace(fix_racedata,Race);           	              /*nicgj3*/
X! 		close_file(fix_racedata);       	              /*nicgj3*/
X! 		}
X  } else {
X!   openstardata(&fix_stardata);        				      /*nicgj3*/
X!   getsdata(fix_stardata, &Sdata);          			      /*nicgj3*/
X!   for (z=0; z<Sdata.numstars; z++) {          			      /*nicgj3*/
X!     getstar(fix_stardata,&(Stars[z]),z);           		      /*nicgj3*/
X!     }       							      /*nicgj3*/
X!   close(fix_stardata);           				      /*nicgj3*/
X!  
X!   where = Getplace(Playernum,argv[1],1);
X    if (where.err) {
X  	sprintf(buf,"cs: bad scope.\n");
X  		notify(Playernum, buf);
X***************
X*** 106,112 ****
X    case LEVEL_UNIV:
X  	openstardata(&fix_stardata);
X  	getsdata(fix_stardata, &Sdata);
X! 
X  	query(CHAR, "ActionPoints",0,0,&Sdata.AP[Playernum-1],0,0);
X  	query(SHORT, "shiplist start",0,0,0,&Sdata.ships,0);
X  	/*for (ch=MAXUSHIPS-1; ch>1 && Sdata.shipnums[ch]; ch--) ;
X--- 130,136 ----
X    case LEVEL_UNIV:
X  	openstardata(&fix_stardata);
X  	getsdata(fix_stardata, &Sdata);
X! 	getchr();             				              /*nicgj3*/
X  	query(CHAR, "ActionPoints",0,0,&Sdata.AP[Playernum-1],0,0);
X  	query(SHORT, "shiplist start",0,0,0,&Sdata.ships,0);
X  	/*for (ch=MAXUSHIPS-1; ch>1 && Sdata.shipnums[ch]; ch--) ;
X***************
X*** 128,133 ****
X--- 152,158 ----
X  
X  	printf("Star #%d : %s\n\n", where.snum, Stars[where.snum]->name );
X  
X+ 	getchr();  						      /*nicgj3*/
X  	query(SHORT, "shiplist start",0,0,0,&Stars[where.snum]->ships,0);
X  	query(CHAR, "ActionPoints",0,0,&Stars[where.snum]->AP[Playernum-1],0,0);
X  
X***************
X*** 146,152 ****
X  	ch = Stars[where.snum]->nova_stage;
X  	query(CHAR, "nova stage",0,0,&ch,0,0);
X  		Stars[where.snum]->nova_stage = ch;
X! 	 printf("(limit %d) ",MAXPLANETS);
X  	query(CHAR, "# planets",0,0,&Stars[where.snum]->numplanets,0,0);
X  	for (i=0; i<Stars[where.snum]->numplanets; i++) {
X  		printf("Planet #%d (%s) ", i, Stars[where.snum]->pnames[i]);
X--- 171,177 ----
X  	ch = Stars[where.snum]->nova_stage;
X  	query(CHAR, "nova stage",0,0,&ch,0,0);
X  		Stars[where.snum]->nova_stage = ch;
X!         printf("(limit %d) ",MAXPLANETS);
X  	query(CHAR, "# planets",0,0,&Stars[where.snum]->numplanets,0,0);
X  	for (i=0; i<Stars[where.snum]->numplanets; i++) {
X  		printf("Planet #%d (%s) ", i, Stars[where.snum]->pnames[i]);
X***************
X*** 170,175 ****
X--- 195,201 ----
X  		printf("\nPlanet / %s / %s\n", Stars[where.snum]->name, 
X  				Stars[where.snum]->pnames[where.pnum]);
X  		unl = p->info[Playernum-1].resource;
X+ 		getchr();   					      /*nicgj3*/
X  		query(LONG, "\nstockpile resources",0,0,0,0,&unl);
X  			p->info[Playernum-1].resource = unl;
X  		unl = p->info[Playernum-1].destruct;
X***************
X*** 287,293 ****
X  	query(CHAR, "owner",0,0,&ch,0,0);
X  		sh->owner = ch;
X  
X! 	 unl = sh->type;
X  	query(LONG, "type",0,0,0,0,&unl);
X  	 sh->type = unl;
X  	query(FLOAT,"technology",&sh->tech,0,0,0,0);
X--- 313,320 ----
X  	query(CHAR, "owner",0,0,&ch,0,0);
X  		sh->owner = ch;
X  
X! 	unl = sh->type;
X! 	getchr();                   				      /*nicgj3*/
X  	query(LONG, "type",0,0,0,0,&unl);
X  	 sh->type = unl;
X  	query(FLOAT,"technology",&sh->tech,0,0,0,0);
X***************
X*** 297,314 ****
X  
X  	query(FLOAT,"fuel",&sh->fuel,0,0,0,0);
X  	 unl = sh->destruct;
X! 	query(LONG, "destruct cap",0,0,0,0,&unl);
X  	 sh->destruct = unl;
X  	 unl = sh->resource;
X! 	query(LONG, "resource",0,0,0,0,&unl);
X  	 sh->resource = unl;
X  	 unl = sh->popn;
X  	query(LONG, "crew",0,0,0,0,&unl);
X  	 sh->popn = unl;
X  
X  	 unl = sh->rad;
X  	query(LONG, "irradiated",0,0,0,0,&unl);
X  	 sh->rad = unl;
X  
X  	 unl = sh->damage;
X  	query(LONG, "damage",0,0,0,0,&unl);
X--- 324,366 ----
X  
X  	query(FLOAT,"fuel",&sh->fuel,0,0,0,0);
X  	 unl = sh->destruct;
X! 	query(LONG, "destruct",0,0,0,0,&unl);
X  	 sh->destruct = unl;
X  	 unl = sh->resource;
X! 	query(LONG, "resources",0,0,0,0,&unl);
X  	 sh->resource = unl;
X  	 unl = sh->popn;
X  	query(LONG, "crew",0,0,0,0,&unl);
X  	 sh->popn = unl;
X+ 	 unl = sh->crystals;
X+ 	query(LONG, "crystals",0,0,0,0,&unl);
X+ 	 sh->crystals = unl;
X+ 	 unl = sh->hyper_drive.has;
X+ 	query(LONG, "hyper drive?",0,0,0,0,&unl);
X+ 	 sh->hyper_drive.has = unl;
X  
X+ 	 unl = sh->max_destruct;
X+ 	query(LONG, "max destruct",0,0,0,0,&unl);
X+ 	 sh->max_destruct = unl;
X+ 	 unl = sh->max_fuel;
X+ 	query(LONG, "max fuel",0,0,0,0,&unl);
X+ 	 sh->max_fuel = unl;
X+ 	 unl = sh->max_resource;
X+ 	query(LONG, "max resources",0,0,0,0,&unl);
X+ 	 sh->max_resource = unl;
X+ 	 unl = sh->max_crew;
X+ 	query(LONG, "max crew",0,0,0,0,&unl);
X+ 	 sh->max_crew = unl;
X+ 	 unl = sh->build_cost;
X+ 	query(LONG, "build cost",0,0,0,0,&unl);
X+ 	 sh->build_cost = unl;
X+ 
X  	 unl = sh->rad;
X  	query(LONG, "irradiated",0,0,0,0,&unl);
X  	 sh->rad = unl;
X+ 	 unl = sh->active;
X+ 	query(LONG, "active",0,0,0,0,&unl);
X+ 	 sh->active = unl;
X  
X  	 unl = sh->damage;
X  	query(LONG, "damage",0,0,0,0,&unl);
X***************
X*** 351,360 ****
X  	query(SHORT, "abil_max crew",0,0,0,&sh->abils[ABIL_MAXCREW],0);
X  	query(SHORT, "abil_armor",0,0,0,&sh->abils[ABIL_ARMOR],0);*/
X  
X! 	  query(SHORT, "object:number",0,0,0,&sh->object.number,0);
X! 	  query(SHORT, "object:number2",0,0,0,&sh->object.number2,0);
X! 	  query(SHORT, "object:number3",0,0,0,&sh->object.number3,0);
X! 	  query(SHORT, "object:number4",0,0,0,&sh->object.number4,0);
X  
X  
X  	if (fix_mod) {
X--- 403,412 ----
X  	query(SHORT, "abil_max crew",0,0,0,&sh->abils[ABIL_MAXCREW],0);
X  	query(SHORT, "abil_armor",0,0,0,&sh->abils[ABIL_ARMOR],0);*/
X  
X! 	query(SHORT, "object:number1",0,0,0,&sh->object.number,0);
X! 	query(SHORT, "object:number2",0,0,0,&sh->object.number2,0);
X! 	query(SHORT, "object:number3",0,0,0,&sh->object.number3,0);
X! 	query(SHORT, "object:number4",0,0,0,&sh->object.number4,0);
X  
X  
X  	if (fix_mod) {
X***************
X*** 365,377 ****
X  	break;
X  
X  
X   }
X  }
X  
X  
X- }
X- 
X- 
X  query( kind, quest, fprev, iprev, cprev, sprev, lprev)
X  int kind;
X  char *quest;
X--- 417,427 ----
X  	break;
X  
X  
X+  	}
X   }
X  }
X  
X  
X  query( kind, quest, fprev, iprev, cprev, sprev, lprev)
X  int kind;
X  char *quest;
X***************
X*** 441,446 ****
X--- 491,504 ----
X  printf("%s\n", temp);
X  }
X  
X+ void push_message(what, who, msg, type)
X+ int what, who;
X+ char *msg;
X+ int type;
X+ {
X+ /* this is a dummy routine */
X+ }
X+ 
X  fix_handler()
X  {
X   close_file(fix_stardata);
X***************
X*** 448,454 ****
X   close_file(fix_pdata);
X   close_file(fix_sectdata);
X  }
X- 
X- 
X- 
X  
X--- 506,509 ----
X*** /usr/cna/billr/games/gb3/server/getplace.c	Wed May 30 15:13:18 1990
X--- server/getplace.c	Thu Aug 23 16:55:04 1990
X***************
X*** 29,42 ****
X   boolean error;
X   int getplace_shdata;
X   placetype where;	/* return value */
X! 
X   Bzero(where);
X  
X! free(Race);
X  openracedata(&getplace_racedata);
X  getrace(getplace_racedata, &Race, Playernum);
X  close_file(getplace_racedata);
X! 
X  where.err = 0;
X  
X   switch (*string) {
X--- 29,46 ----
X   boolean error;
X   int getplace_shdata;
X   placetype where;	/* return value */
X!  racetype *Race;
X!  int God;
X!  
X   Bzero(where);
X  
X! 
X  openracedata(&getplace_racedata);
X  getrace(getplace_racedata, &Race, Playernum);
X  close_file(getplace_racedata);
X! God = Race->God;
X! free(Race);
X!  
X  where.err = 0;
X  
X   switch (*string) {
X***************
X*** 44,50 ****
X  		   where.level=LEVEL_UNIV;	/* scope = root (universe) */
X  		   where.snum=0;
X  		   where.pnum= where.shipno=0;
X! 		   return(Getplace2(Playernum, string+1,&where,ignoreexpl,Race->God));
X  	 case '#':
X  		   sscanf(++string,"%hd",&where.shipno);
X  		   openshdata(&getplace_shdata);
X--- 48,54 ----
X  		   where.level=LEVEL_UNIV;	/* scope = root (universe) */
X  		   where.snum=0;
X  		   where.pnum= where.shipno=0;
X! 		   return(Getplace2(Playernum, string+1,&where,ignoreexpl,God));
X  	 case '#':
X  		   sscanf(++string,"%hd",&where.shipno);
X  		   openshdata(&getplace_shdata);
X***************
X*** 55,62 ****
X  			return where;
X  		   }
X  		   close_file(getplace_shdata);
X! 		   if ( (where.shipptr->owner==Playernum || ignoreexpl || Race->God)
X! 				&& (where.shipptr->is_alive || Race->God)) {
X  /*			   if (!where.shipptr->is_alive)
X  				printf("Ship is dead.\n"); */
X  			   where.level = LEVEL_SHIP;
X--- 59,67 ----
X  			return where;
X  		   }
X  		   close_file(getplace_shdata);
X! 		   if ( (where.shipptr->owner==Playernum || ignoreexpl
X! 			 || God)
X! 				&& (where.shipptr->is_alive || God)) {
X  /*			   if (!where.shipptr->is_alive)
X  				printf("Ship is dead.\n"); */
X  			   where.level = LEVEL_SHIP;
X***************
X*** 65,79 ****
X  			/* where.shipno already taken care of */
X  			   while (isdigit(*string)) 
X  				string++;
X! 			   if (*string=='/')
X! 				 return Getplace2(Playernum, string+1,&where, ignoreexpl,Race->God);
X! 			   else
X! 				 return where;
X! 		   } else {
X  			where.err = 1;
X  			if (where.shipptr->is_alive)
X  				DontOwnErr(Playernum,where.shipno);
X- 
X  			return where;
X  		   }
X  
X--- 70,84 ----
X  			/* where.shipno already taken care of */
X  			   while (isdigit(*string)) 
X  				string++;
X! 			   if (*string=='/') {
X! 			       return Getplace2(Playernum, string+1,&where, ignoreexpl,God);
X! 			   } else {
X! 			       return where;
X! 			     }
X! 			     } else {
X  			where.err = 1;
X  			if (where.shipptr->is_alive)
X  				DontOwnErr(Playernum,where.shipno);
X  			return where;
X  		   }
X  
X***************
X*** 80,86 ****
X  	 case '-':
X  			/* no destination */
X  		   where.level = LEVEL_UNIV;
X! 		   return where;
X  
X  	default:
X  			/* copy current scope to scope */
X--- 85,91 ----
X  	 case '-':
X  			/* no destination */
X  		   where.level = LEVEL_UNIV;
X!  		   return where;
X  
X  	default:
X  			/* copy current scope to scope */
X***************
X*** 93,104 ****
X  			   getship(getplace_shdata,&(where.shipptr),where.shipno);
X  			   close_file(getplace_shdata);
X  		   }
X! 		   if (*string==CHAR_CURR_SCOPE)
X! 			return where;
X! 		   else 
X! 			return Getplace2(Playernum, string,&where, ignoreexpl,Race->God);
X!  }
X! 
X  }
X  
X  
X--- 98,109 ----
X  			   getship(getplace_shdata,&(where.shipptr),where.shipno);
X  			   close_file(getplace_shdata);
X  		   }
X! 		   if (*string==CHAR_CURR_SCOPE) {
X! 		       return where;
X! 		   } else {
X! 		       return Getplace2(Playernum, string,&where, ignoreexpl,God);
X! 		    }
X! 		    }
X  }
X  
X  
X***************
X*** 117,124 ****
X  int shdata,tick;
X  int getplace2_pdata;
X  
X- /* printf("getplace2:looking for '%s'\n",string); */
X- 
X   if (where->err || *string=='\0' || *string=='\n')
X  	return(*where);		/* base cases */
X  
X--- 122,127 ----
X***************
X*** 139,147 ****
X      }
X   } else {
X  		/* is a char string, name of something */
X!     /*printf("before scanf str=`%s`\n",string);*/
X!     sscanf(string,"%[^/ \n]",substr);
X!     /*printf("after scanf sub=`%s`\n",substr);*/
X  
X      do {
X         /*if (isupper(*string) )
X--- 142,148 ----
X      }
X   } else {
X  		/* is a char string, name of something */
X!       sscanf(string,"%[^/ \n]",substr);
X  
X      do {
X         /*if (isupper(*string) )
X***************
X*** 155,161 ****
X  	   if (!strncmp(substr,Stars[i]->name,l)) {
X  		 where->level=LEVEL_STAR;
X  		 where->snum = i;
X! 		 if (ignoreexpl || isset(Stars[where->snum]->explored, Playernum) || God) {
X  			 tick = (*string=='/');
X  			 return(Getplace2(Playernum, string+tick, where, ignoreexpl, God));
X  		 }
X--- 156,163 ----
X  	   if (!strncmp(substr,Stars[i]->name,l)) {
X  		 where->level=LEVEL_STAR;
X  		 where->snum = i;
X! 		 if (ignoreexpl ||
X! 		     isset(Stars[where->snum]->explored, Playernum) || God) {
X  			 tick = (*string=='/');
X  			 return(Getplace2(Playernum, string+tick, where, ignoreexpl, God));
X  		 }
X***************
X*** 196,202 ****
X  		where->err=1;
X  		return(*where);
X  	}
X!     } else if (where->level==LEVEL_PLAN) {
X  	sprintf(buf,"Can't descend to %s.\n",substr);
X  			notify(Playernum, buf);
X  	where->err=1;
X--- 198,204 ----
X  		where->err=1;
X  		return(*where);
X  	}
X!     } else {
X  	sprintf(buf,"Can't descend to %s.\n",substr);
X  			notify(Playernum, buf);
X  	where->err=1;
X***************
X*** 256,262 ****
X  			notify(Playernum, buf);
X  	r = 1;
X     } 
X!    if (!s->popn && Max_crew(s)) {
X  	sprintf(buf,"%s #%d %s has no crew and is not a robotic ship.\n", 
X  		Shipnames[s->type], n, s->name );
X  			notify(Playernum, buf);
X--- 258,264 ----
X  			notify(Playernum, buf);
X  	r = 1;
X     } 
X!    if (!s->popn && s->max_crew) {
X  	sprintf(buf,"%s #%d %s has no crew and is not a robotic ship.\n", 
X  		Shipnames[s->type], n, s->name );
X  			notify(Playernum, buf);
X*** /usr/cna/billr/games/gb3/server/makeplanet.c	Wed May 30 15:13:26 1990
X--- server/makeplanet.c	Thu Aug 23 16:55:10 1990
X***************
X*** 334,339 ****
X--- 334,349 ----
X  
X   }
X  
X+ /* make crystal deposits */
X+   for (y=0; y<planet.Maxy; y++)
X+      for (x=0; x<planet.Maxx; x++) {
X+ 	s = &Sector(planet,x,y);
X+ if(!int_rand(0, 200))
X+ 		s->crystals=int_rand(1,5);
X+ else
X+ 		s->crystals = 0;
X+ 	}
X+ 
X   return planet;
X  
X  }
X*** /usr/cna/billr/games/gb3/server/orbit.c	Wed May 30 15:13:38 1990
X--- server/orbit.c	Thu Aug 23 16:55:20 1990
X***************
X*** 27,32 ****
X--- 27,33 ----
X  float Lastx, Lasty, Zoom;
X  int SCALE = 100;
X  int orbit_racedata;
X+ racetype *Race;
X  
X  orbit(Playernum, APcount, argn, args)
X  int Playernum;
X***************
X*** 47,57 ****
X  
X   DontDispPlanets = DontDispShips = DontDispStars = 0;
X  
X-  free(Race);
X- openracedata(&orbit_racedata);
X- getrace(orbit_racedata, &Race, Playernum);
X- close_file(orbit_racedata);
X- 
X   /* find options, set flags accordingly */
X   for (flag=1; flag<=argn-1; flag++)
X      if (*args[flag]=='-') {
X--- 48,53 ----
X***************
X*** 93,98 ****
X--- 89,98 ----
X  	/* orbit type of map */
X  	sprintf(output, "#");
X  
X+ openracedata(&orbit_racedata);
X+ getrace(orbit_racedata, &Race, Playernum);
X+ close_file(orbit_racedata);
X+ 
X    switch (where.level) {
X      case LEVEL_UNIV:
X        for (i=0; i<Sdata.numstars; i++)
X***************
X*** 123,130 ****
X  	str_cat(output, buf);
X  
X        openpdata(&orbit_pdata);
X- 
X- 
X        for (i=0; i<Stars[where.snum]->numplanets; i++)
X  	 if (DontDispNum!=i) {
X  	   getplanet(orbit_pdata,&p,Stars[where.snum]->planetpos[i]);
X--- 123,128 ----
X***************
X*** 133,140 ****
X  		str_cat(output, buf);
X  	   free(p);
X  	 }
X!  
X!       close_file(orbit_pdata);
X  
X  /* check to see if you have ships at orbiting the star, if so you can
X  see enemy ships */
X--- 131,137 ----
X  		str_cat(output, buf);
X  	   free(p);
X  	 }
X!        close_file(orbit_pdata);
X  
X  /* check to see if you have ships at orbiting the star, if so you can
X  see enemy ships */
X***************
X*** 143,149 ****
X  	openshdata(&orbit_shdata);
X  	while (sh && !iq) {
X  	   (void)getship(orbit_shdata, &s, sh);
X! 		if(s->owner == Playernum && Shipdata[s->type][ABIL_SIGHT])
X  			iq = 1; /* you are there to sight, need a crew */
X  		sh = s->nextship;
X  		free(s);
X--- 140,146 ----
X  	openshdata(&orbit_shdata);
X  	while (sh && !iq) {
X  	   (void)getship(orbit_shdata, &s, sh);
X! 		if(s->owner == Playernum && Sight(s))
X  			iq = 1; /* you are there to sight, need a crew */
X  		sh = s->nextship;
X  		free(s);
X***************
X*** 188,194 ****
X  	openshdata(&orbit_shdata);
X  	while (sh && !iq) {
X  	   (void)getship(orbit_shdata, &s, sh);
X! 		if(s->owner == Playernum && Shipdata[s->type][ABIL_SIGHT])
X  			iq = 1; /* you are there to sight, need a crew */
X  		sh = s->nextship;
X  		free(s);
X--- 185,191 ----
X  	openshdata(&orbit_shdata);
X  	while (sh && !iq) {
X  	   (void)getship(orbit_shdata, &s, sh);
X! 		if(s->owner == Playernum && Sight(s))
X  			iq = 1; /* you are there to sight, need a crew */
X  		sh = s->nextship;
X  		free(s);
X***************
X*** 220,229 ****
X  
X     default:
X        notify(Playernum,"Bad scope.\n");
X! 	return;	 
X    }
X  
X  	notify(Playernum, output);
X  }
X  
X  
X--- 217,229 ----
X  
X     default:
X        notify(Playernum,"Bad scope.\n");
X!       free(Race);
X!       return;	 
X! 	break;
X    }
X  
X  	notify(Playernum, output);
X+ free(Race);
X  }
X  
X  
X***************
X*** 285,291 ****
X  /* check to see if the any planets are populated here. If so,
X  	standout() the name of it */
X  
X! 	sprintf(temp, "%d %s ;",isset(star->inhabited, Playernum), star->name);
X  	str_cat(string, temp);
X  	   }
X  }
X--- 285,291 ----
X  /* check to see if the any planets are populated here. If so,
X  	standout() the name of it */
X  
X! 	sprintf(temp, "%d %s ;",!!isset(star->inhabited, Playernum), star->name);
X  	str_cat(string, temp);
X  	   }
X  }
X***************
X*** 436,445 ****
X  
X  				/* (magnification) */
X      if (x>=0 && y>=0) {
X! 	if(ship->owner==Playernum)stand=1;
X  	else stand = 0;
X  
X  	sprintf(string, "%d %d %d %d %c %d %d;",stand,x,y,wm,Shipltrs[ship->type],stand,shipno);
X      }
X      break;
X  
X--- 436,451 ----
X  
X  				/* (magnification) */
X      if (x>=0 && y>=0) {
X! 
X! 	if(Race->color) {
X! 	sprintf(string, "%c %d %d %d %c %c %d;",(char)(ship->owner+48),x,y,wm,
X! 		Shipltrs[ship->type],(char)(ship->owner+48),shipno);
X! 	} else {
X! 	if(ship->owner==Race->highlight)stand=1;
X  	else stand = 0;
X  
X  	sprintf(string, "%d %d %d %d %c %d %d;",stand,x,y,wm,Shipltrs[ship->type],stand,shipno);
X+ 	}
X      }
X      break;
X  
X***************
X*** 459,469 ****
X  		xa = int_rand(x - (int)fac, x + (int)fac);
X  		ya = int_rand(y - (int)fac, y + (int)fac);
X  		if (xa>=0 && ya>=0) {
X! 		if(ship->owner==Playernum)stand=1;
X  			else stand = 0;
X  	sprintf(temp, "%d %d %d %d %c %d %d;",stand,xa,ya,wm,Shipltrs[ship->type],
X  				stand,shipno);
X! 
X  	str_cat(string, temp);
X  		}
X       	}
X--- 465,480 ----
X  		xa = int_rand(x - (int)fac, x + (int)fac);
X  		ya = int_rand(y - (int)fac, y + (int)fac);
X  		if (xa>=0 && ya>=0) {
X! 
X! 		if(Race->color) {
X! 	sprintf(temp, "%c %d %d %d %c %c %d;",(char)(ship->owner+48),xa,ya,wm,
X! 				Shipltrs[ship->type], (char)(ship->owner+48),shipno);
X! 		} else {
X! 		if(ship->owner==Race->highlight)stand=1;
X  			else stand = 0;
X  	sprintf(temp, "%d %d %d %d %c %d %d;",stand,xa,ya,wm,Shipltrs[ship->type],
X  				stand,shipno);
X! 		}
X  	str_cat(string, temp);
X  		}
X       	}
X***************
X*** 476,485 ****
X  	wm=0;
X      if (ship->whatorbits!=LEVEL_UNIV || (ship->owner == Playernum || God))
X         if (x>=0 && y>=0) {
X! 		if(ship->owner==Playernum)stand=1;
X  			else stand = 0;
X  	sprintf(string, "%d %d %d %d %c %d %d;",stand,x,y,wm,Shipltrs[ship->type],stand,shipno);
X! 
X         }
X      break;
X   }
X--- 487,501 ----
X  	wm=0;
X      if (ship->whatorbits!=LEVEL_UNIV || (ship->owner == Playernum || God))
X         if (x>=0 && y>=0) {
X! 
X! 	if(Race->color) {
X! 	sprintf(string, "%c %d %d %d %c %c %d;",(char)(ship->owner+48),x,y,wm,
X! 		Shipltrs[ship->type],(char)(ship->owner+48),shipno);
X! 	} else {
X! 		if(ship->owner==Race->highlight)stand=1;
X  			else stand = 0;
X  	sprintf(string, "%d %d %d %d %c %d %d;",stand,x,y,wm,Shipltrs[ship->type],stand,shipno);
X! 	}
X         }
X      break;
X   }
X*** /usr/cna/billr/games/gb3/server/order.c	Wed May 30 15:13:40 1990
X--- server/order.c	Thu Aug 23 16:55:22 1990
X***************
X*** 115,121 ****
X  	Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X   	close_file(pdata);
X        	shipno = p->ships;
X! 	      break; 
X     case LEVEL_STAR:
X        	shipno = Stars[Dir[Playernum-1].snum]->ships;
X  	      break; 
X--- 115,122 ----
X  	Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X   	close_file(pdata);
X        	shipno = p->ships;
X! 	free(p);
X! 	break; 
X     case LEVEL_STAR:
X        	shipno = Stars[Dir[Playernum-1].snum]->ships;
X  	      break; 
X***************
X*** 204,210 ****
X  	i=strlen(args[2]);
X  
X         if (!strncmp(args[2],"defense",i)) {
X! 		if (can_bombard(ship) || ship->type == OTYPE_GR) {
X  			if(!strncmp(args[3],"off", strlen(args[3]))) {
X  				ship->protect.planet = 0;
X  				notify(Playernum, "Planetary defense canceled.\n");
X--- 205,211 ----
X  	i=strlen(args[2]);
X  
X         if (!strncmp(args[2],"defense",i)) {
X! 		if (can_bombard(ship)) {
X  			if(!strncmp(args[3],"off", strlen(args[3]))) {
X  				ship->protect.planet = 0;
X  				notify(Playernum, "Planetary defense canceled.\n");
X***************
X*** 218,224 ****
X  				return;
X  		}
X           } else if (!strncmp(args[2],"jump",i)) {
X! 		if(Shipdata[ship->type][ABIL_JUMP]) {
X  			if(!strncmp(args[3],"off", strlen(args[3]))) {
X  				ship->hyper_drive.on = 0;
X  				notify(Playernum, "Hyper drive turned off.\n");
X--- 219,225 ----
X  				return;
X  		}
X           } else if (!strncmp(args[2],"jump",i)) {
X! 		if(ship->hyper_drive.has) {
X  			if(!strncmp(args[3],"off", strlen(args[3]))) {
X  				ship->hyper_drive.on = 0;
X  				notify(Playernum, "Hyper drive turned off.\n");
X***************
X*** 230,235 ****
X--- 231,242 ----
X  						}
X  				ship->hyper_drive.on = 1;
X  				ship->navigate.on = 0;
X+ 
X+ 			if(ship->hyper_drive.mounted) {
X+ 				ship->hyper_drive.charge = 1;
X+ 				ship->hyper_drive.ready = 1;
X+ 					}
X+ 
X  				notify(Playernum, "Hyper drive engine's activated.\n");
X  /* estimate how much fuel it will cost for this ship to get there */
X  				}
X***************
X*** 241,247 ****
X  
X           } else if (!strncmp(args[2],"protect",i)) {
X  
X! 	sscanf(args[3]+(args[3][0]=='#'),"%d",&j);
X  
X  		if(j < 0 || j > n_ships || j==shipno) {
X  				notify(Playernum, "You can't protect that!\n");
X--- 248,257 ----
X  
X           } else if (!strncmp(args[2],"protect",i)) {
X  
X! 	if(argn>3)
X! 		sscanf(args[3]+(args[3][0]=='#'),"%d",&j);
X! 	else
X! 		j = 0;
X  
X  		if(j < 0 || j > n_ships || j==shipno) {
X  				notify(Playernum, "You can't protect that!\n");
X***************
X*** 248,254 ****
X  				free(ship);
X  				return;
X  			}
X! 		  if (can_bombard(ship) || ship->type==OTYPE_GR) {
X  				if(!j) {
X  					ship->protect.on = 0;
X  					notify(Playernum, "Protection orders halted.\n");
X--- 258,264 ----
X  				free(ship);
X  				return;
X  			}
X! 		  if (can_bombard(ship)) {
X  				if(!j) {
X  					ship->protect.on = 0;
X  					notify(Playernum, "Protection orders halted.\n");
X***************
X*** 324,329 ****
X--- 334,347 ----
X  			    	ship->destshipno = where.shipno;
X  				ship->whatdest = LEVEL_SHIP;
X  			} else {
X+ /* to foil cheaters */
X+ 	      if(((ship->storbits != where.snum) && where.level != LEVEL_STAR)
X+ 	               && isclr(Stars[where.snum]->explored, ship->owner)){
X+ 				 notify(Playernum, "You haven't explored this system.\n");
X+ 				 free(ship);
X+ 				 return;			
X+ 					}
X+ 
X  			    ship->whatdest = where.level;
X  			    ship->deststar = where.snum;
X  			    ship->destpnum = where.pnum;
X***************
X*** 375,381 ****
X  		}
X         } else if (!strncmp(args[2],"retaliate",i)) {
X  		if (ship->type!=OTYPE_OMCL) {
X! 		    if (can_bombard(ship) || ship->type==OTYPE_GR) {
X  			if(!strncmp(args[3],"off",strlen(args[3]))) {
X  				ship->protect.self = 0;
X  				notify(Playernum, "Retaliation option turned off.\n");				
X--- 393,399 ----
X  		}
X         } else if (!strncmp(args[2],"retaliate",i)) {
X  		if (ship->type!=OTYPE_OMCL) {
X! 		    if (can_bombard(ship)) {
X  			if(!strncmp(args[3],"off",strlen(args[3]))) {
X  				ship->protect.self = 0;
X  				notify(Playernum, "Retaliation option turned off.\n");				
X***************
X*** 388,393 ****
X--- 406,430 ----
X  			notify(Playernum, "This type of ship cannot be set to retaliate.\n");
X  			}
X  		}
X+        } else if (!strncmp(args[2],"laser",i)) {
X+ 		if(ship->laser) {
X+ 		    if (can_bombard(ship)) {
X+ 			if(ship->hyper_drive.mounted) {
X+ 			if(!strncmp(args[3],"on",strlen(args[3]))) {
X+ 				ship->fire_laser = atoi(args[4]);
X+ 				sprintf(buf, "Combat lasers activated to attack with strength %d\n",
X+ 					ship->fire_laser);				
X+ 				notify(Playernum, buf);				
X+ 			} else {
X+ 				ship->fire_laser = 0;
X+ 				notify(Playernum, "Combat lasers deactivated.\n");
X+ 			}
X+ 			} else
X+ 				notify(Playernum, "You do not have a crystal mounted.\n");
X+ 		    } else
X+ 			notify(Playernum, "This type of ship cannot be set to retaliate.\n");
X+ 		} else
X+ 			notify(Playernum, "This ship is not equipped with combat lasers.\n");
X         } else if (!strncmp(args[2],"speed",i)) {
X  		if (speed_rating(ship)) {
X  			j = atoi(args[3]);			
X***************
X*** 408,431 ****
X  			return;
X  		}
X  
X!       } else if(!strncmp(args[2], "explosive", i)) {
X! 		if(ship->type==STYPE_MINE) {
X! 			ship->mine.mode = 1;
X! 			notify(Playernum, "This mine is set for explosive mode.\n");
X  		} else {
X! 			notify(Playernum, "This ship cannot be set for this.\n");
X  			free(ship);
X  			return;
X  		}
X        } else if(!strncmp(args[2], "radiative", i)) {
X! 		if(ship->type==STYPE_MINE) {
X! 			ship->mine.mode = 0;
X! 			notify(Playernum, "This mine is set for radiation mode.\n");
X! 		} else {
X! 			notify(Playernum, "This ship cannot be set for this.\n");
X! 			free(ship);
X! 			return;
X! 		}
X        } else if(!strncmp(args[2], "move", i)) {
X  		if (ship->type==OTYPE_TERRA) {
X  			ship->object.number = atoi(args[3]);
X--- 445,500 ----
X  			return;
X  		}
X  
X!       } else if(!strncmp(args[2], "salvo", i)) {
X! 		if (can_bombard(ship)) {
X! 			j = atoi(args[3]);			
X! 			if(j < 0) {
X! 				notify(Playernum, "Specify a positive number of guns.\n");
X! 				free(ship);
X! 				return;
X! 			} else {
X! 				if(j > ship->guns) j = ship->guns;
X! 				ship->retaliate = j;
X! 				sprintf(buf, "Retaliation strength set at %d.\n", j);
X! 				notify(Playernum, buf);
X! 			}
X! 
X  		} else {
X! 			notify(Playernum, "This ship cannot be set to retaliate.\n");
X  			free(ship);
X  			return;
X  		}
X+ 
X+       } else if(!strncmp(args[2], "explosive", i)) {
X+ 		switch(ship->type) {
X+ 				case STYPE_MINE:
X+ 					ship->mode = 1;
X+ 					notify(Playernum, "This mine is set for explosive mode.\n");
X+ 					break;
X+ 				case OTYPE_GR:
X+ 					ship->mode = 1;
X+ 					notify(Playernum, "Will inflict structural damage.\n");
X+ 					break;
X+ 				default:
X+ 					notify(Playernum, "This ship cannot be set for this.\n");
X+ 					free(ship);
X+ 					return;
X+ 				}
X        } else if(!strncmp(args[2], "radiative", i)) {
X! 		switch(ship->type) {
X! 				case STYPE_MINE:
X! 					ship->mode = 0;
X! 					notify(Playernum, "This mine is set for radiative mode.\n");
X! 					break;
X! 				case OTYPE_GR:
X! 					ship->mode = 0;
X! 					notify(Playernum, "Will inflict radiation damage.\n");
X! 					break;
X! 				default:
X! 					notify(Playernum, "This ship cannot be set for this.\n");
X! 					free(ship);
X! 					return;
X! 				}
X        } else if(!strncmp(args[2], "move", i)) {
X  		if (ship->type==OTYPE_TERRA) {
X  			ship->object.number = atoi(args[3]);
X***************
X*** 534,540 ****
X  		close_file(order_pdata);
X  
X  	if(planet->info[Playernum-1].resource < 2*ship->build_cost) {
X! 		sprintf(buf, "You don't have %s resources on the planet to activate this factory.\n",
X  				2*ship->build_cost);
X  		notify(Playernum, buf);
X  		free(ship);
X--- 603,609 ----
X  		close_file(order_pdata);
X  
X  	if(planet->info[Playernum-1].resource < 2*ship->build_cost) {
X! 		sprintf(buf, "You don't have %d resources on the planet to activate this factory.\n",
X  				2*ship->build_cost);
X  		notify(Playernum, buf);
X  		free(ship);
X***************
X*** 655,661 ****
X  			close_file(sdata);	/* don't need to care about Stars */
X  			sprintf(buf, "Surveyed, distance %g.\n",dist);
X  			notify(Playernum, buf);
X! 		} else {
X  			sprintf(buf, "Too far to see (%g, max %g).\n", 
X  						dist, tele_range(s->type, s->tech) );
X  			notify(Playernum, buf);
X--- 724,731 ----
X  			close_file(sdata);	/* don't need to care about Stars */
X  			sprintf(buf, "Surveyed, distance %g.\n",dist);
X  			notify(Playernum, buf);
X! 			free(str);
X! 		    } else {
X  			sprintf(buf, "Too far to see (%g, max %g).\n", 
X  						dist, tele_range(s->type, s->tech) );
X  			notify(Playernum, buf);
X***************
X*** 672,679 ****
X  			p->info[Playernum-1].explored = 1;
X  			openpdata(&pdata);
X  			putplanet(pdata, p, str->planetpos[s->aimed_at.pnum]);
X! 		close_file(pdata);
X! 			free(p);
X  			sprintf(buf, "Surveyed, distance %g.\n", dist);
X  			notify(Playernum, buf);
X  		} else {
X--- 742,748 ----
X  			p->info[Playernum-1].explored = 1;
X  			openpdata(&pdata);
X  			putplanet(pdata, p, str->planetpos[s->aimed_at.pnum]);
X! 			close_file(pdata);
X  			sprintf(buf, "Surveyed, distance %g.\n", dist);
X  			notify(Playernum, buf);
X  		} else {
X***************
X*** 681,686 ****
X--- 750,756 ----
X  						dist, tele_range(s->type, s->tech) );
X  			notify(Playernum, buf);
X  		}
X+ 		free(p);
X  		break;
X  	case LEVEL_SHIP:
X  		sprintf(buf, "You can't see anything of use there.\n");
X***************
X*** 692,698 ****
X  DispOrdersHeader(Playernum)
X  int Playernum;
X  {
X! notify(Playernum, "            name          destination     orbits     spd   options\n"); 
X  }
X  
X  DispOrders(Playernum, sh, next, check)
X--- 762,768 ----
X  DispOrdersHeader(Playernum)
X  int Playernum;
X  {
X! notify(Playernum, "            name          orbits     destination     spd   options\n"); 
X  }
X  
X  DispOrders(Playernum, sh, next, check)
X***************
X*** 703,708 ****
X--- 773,779 ----
X  {
X  int order_shdata, in_list;
X  shiptype *ship;
X+ float distfac;
X  char temp[128];
X  
X  openshdata(&order_shdata);
X***************
X*** 732,739 ****
X  		}
X  		}
X  
X! 	sprintf(buf, "%4d %c %14s %15s %15s %1d ", sh, Shipltrs[ship->type], ship->name, 
X! 		prin_ship_dest(Playernum, ship), prin_ship_orbits(ship),  ship->speed);
X  
X  if(ship->hyper_drive.on) {
X  	sprintf(temp, "/jump %s %d", (ship->hyper_drive.ready ? "ready" : "charging"),
X--- 803,810 ----
X  		}
X  		}
X  
X! 	sprintf(buf, "%4d %c %14.14s %15.15s %15.15s %1d ", sh, Shipltrs[ship->type], ship->name, 
X! 		prin_ship_orbits(ship), prin_ship_dest(Playernum, ship),  ship->speed);
X  
X  if(ship->hyper_drive.on) {
X  	sprintf(temp, "/jump %s %d", (ship->hyper_drive.ready ? "ready" : "charging"),
X***************
X*** 740,746 ****
X  		ship->hyper_drive.charge);
X  	strcat(buf, temp);
X  	}
X! if(ship->protect.self) strcat(buf, "/retal");
X  if(ship->protect.planet) strcat(buf, "/defense");
X  if(ship->protect.on) {
X  		sprintf(temp, "/prot %d", ship->protect.ship);
X--- 811,830 ----
X  		ship->hyper_drive.charge);
X  	strcat(buf, temp);
X  	}
X! if(ship->protect.self) {
X! sprintf(temp, "/retal");
X! strcat(buf, temp);
X! }
X! 
X! if(ship->fire_laser) {
X! sprintf(temp, "/laser %d", ship->fire_laser);
X! strcat(buf, temp);
X! }
X! 
X! if(ship->retaliate) {
X! sprintf(temp, "/salvo %d", ship->retaliate);
X! strcat(buf, temp);
X! }
X  if(ship->protect.planet) strcat(buf, "/defense");
X  if(ship->protect.on) {
X  		sprintf(temp, "/prot %d", ship->protect.ship);
X***************
X*** 756,763 ****
X  	}
X  if(ship->protect.evade) strcat(buf, "/evade");
X  if(ship->bombard) strcat(buf, "/bomb");
X! if(ship->type==STYPE_MINE) {
X! 	if(ship->mine.mode) strcat(buf, "/explode");
X  	else strcat(buf, "/radiate");
X  	}
X  if(ship->type==OTYPE_TERRA) {
X--- 840,847 ----
X  	}
X  if(ship->protect.evade) strcat(buf, "/evade");
X  if(ship->bombard) strcat(buf, "/bomb");
X! if(ship->type==STYPE_MINE || ship->type==OTYPE_GR) {
X! 	if(ship->mode) strcat(buf, "/explode");
X  	else strcat(buf, "/radiate");
X  	}
X  if(ship->type==OTYPE_TERRA) {
X***************
X*** 781,793 ****
X  notify(Playernum, buf);
X  /* if hyper space is on estimate how much fuel it will cost to get to the destination */
X  	if(ship->hyper_drive.on) {
X! 	double dist, fuse;
X  
X  	 dist = sqrt( Distsq(ship->xpos, ship->ypos, Stars[ship->deststar]->xpos, 
X  				Stars[ship->deststar]->ypos));
X! 	 fuse = HYPER_DRIVE_FUEL_USE * ship->mass 
X! 			* (dist/HYPER_DIST_FACTOR) * (dist/HYPER_DIST_FACTOR);
X! 			sprintf(buf, "	*** jump will cost %.1ff ***\n", fuse);
X  			notify(Playernum, buf);
X  	if(ship->max_fuel < fuse)
X  			notify(Playernum, "Your ship cannot carry enough fuel to do this jump.\n");
X--- 865,884 ----
X  notify(Playernum, buf);
X  /* if hyper space is on estimate how much fuel it will cost to get to the destination */
X  	if(ship->hyper_drive.on) {
X! 	float dist, fuse;
X  
X  	 dist = sqrt( Distsq(ship->xpos, ship->ypos, Stars[ship->deststar]->xpos, 
X  				Stars[ship->deststar]->ypos));
X! 	distfac = HYPER_DIST_FACTOR * (ship->tech + 100.0);
X! 	if(ship->hyper_drive.mounted && dist > distfac) {
X! 		fuse = HYPER_DRIVE_FUEL_USE * sqrt(ship->mass)
X! 			* (dist/distfac);
X! 	} else {
X! 		fuse = HYPER_DRIVE_FUEL_USE * sqrt(ship->mass)
X! 			* (dist/distfac) * (dist/distfac);
X! 			}
X! 
X! 			sprintf(buf, "	*** distance %.0f - jump will cost %.1ff ***\n", dist, fuse);
X  			notify(Playernum, buf);
X  	if(ship->max_fuel < fuse)
X  			notify(Playernum, "Your ship cannot carry enough fuel to do this jump.\n");
END_OF_FILE
if test 56321 -ne `wc -c <'patches02b'`; then
    echo shar: \"'patches02b'\" unpacked with wrong size!
fi
# end of 'patches02b'
if test -f 'server/patchlevel.h' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/patchlevel.h'\" to \"'server/patchlevel.h.orig'\"
  mv -f 'server/patchlevel.h' 'server/patchlevel.h.orig'
fi
echo shar: Extracting \"'server/patchlevel.h'\" \(21 characters\)
sed "s/^X//" >'server/patchlevel.h' <<'END_OF_FILE'
X#define PATCHLEVEL	2
END_OF_FILE
if test 21 -ne `wc -c <'server/patchlevel.h'`; then
    echo shar: \"'server/patchlevel.h'\" unpacked with wrong size!
fi
# end of 'server/patchlevel.h'
echo shar: End of archive 2 \(of 9\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 9 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0