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

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

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 11, Issue 46
Archive-name: gb3/Patch2h
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 8 (of 9)."
# Contents:  client/cmd.c server/capture.c server/cs.c server/declare.c
#   server/land.c server/launch.c server/scrap.c server/ships.h
# Wrapped by billr@saab on Tue Aug 28 08:54:59 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'client/cmd.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'client/cmd.c'\" to \"'client/cmd.c.orig'\"
  mv -f 'client/cmd.c' 'client/cmd.c.orig'
fi
echo shar: Extracting \"'client/cmd.c'\" \(1462 characters\)
sed "s/^X//" >'client/cmd.c' <<'END_OF_FILE'
X/* cmd.c -- client commands.  so far, 'source <file>'
X * copyright (C) Robert Chansky, 1990.  See the disclaimer in the GB server
X * for copyright information.
X */
X
X#include <string.h>
X#include <stdio.h>
X
X/* return '1' if this was, in fact, a client-recognized command. */
X
Xint client_cmd(cmd)
Xchar 	      *cmd;
X{
Xchar *c;
X 
X c=cmd;
X while (*c!='\0' && *c!=' ' && *c!='\t') c++;	/* skip over command */
X while (*c==' ' || *c=='\t') c++;	/* skip over ws */
X
X if (!strncmp(cmd, "source", strlen("source"))) {
X	source(c);		/* the rest is the filename argument */
X	return 1;
X } else if (!strncmp(cmd, "script", strlen("script"))) {
X	script(c);
X	return 1;
X } else
X	return 0;
X
X}
X
X/* "script" (send output to) a file */
Xscript(file)
Xchar*  file;
X{
X
X}
X
X
X/* "source" the file, if the file exists. */
X
Xsource(file)
Xchar  *file;
X{
XFILE *sourcefd;
Xint c,i=0,j=1;
Xchar sourcein[1024], *nn;
X
X if ((nn = rindex(file, '\n'))!=NULL)	/* remove '\n' from file name */
X	*nn = '\0';
X
X if (file=='\0') {
X	printf("usage: source <file>\n");
X	return;
X }
X
X if ((sourcefd = fopen(file, "r"))==NULL) {
X	printf("error opening file '%s'\n",file);
X	return;
X }
X
X printf("sourceing file '%s'\n",file);
X
X /* get a line of input and send to GB */
X do {
X	do {
X		c=fgetc(sourcefd);
X		sourcein[i++] = c;
X 	} while (c != '\n' && c!=EOF);
X	sourcein[i] = '\0'; sourcein[i+1] = '\0';
X
X	printf("%d: '%s'\n", j, sourcein);
X	transmit(sourcein, i+1);
X	i = 0;
X	j++;
X
X } while (c!=EOF);
X
X fclose(sourcefd);
X
X}
END_OF_FILE
if test 1462 -ne `wc -c <'client/cmd.c'`; then
    echo shar: \"'client/cmd.c'\" unpacked with wrong size!
fi
# end of 'client/cmd.c'
if test -f 'server/capture.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/capture.c'\" to \"'server/capture.c.orig'\"
  mv -f 'server/capture.c' 'server/capture.c.orig'
fi
echo shar: Extracting \"'server/capture.c'\" \(8187 characters\)
sed "s/^X//" >'server/capture.c' <<'END_OF_FILE'
X/*
X** Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X** smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X** Restrictions in GB_copyright.h.
X**
X**  capture.c -- capture a ship on the ground
X**
X*/
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "buffers.h"
X#include <signal.h>
X#include <math.h>
X#include <signal.h>
X
Xint capture_sectdata,capture_shdata,capture_pdata, capture_racedata;
X
Xextern int Defensedata[];
X
X
Xcapture(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xshiptype *ship;
Xplanettype *p;
Xsectortype *sect;
Xboolean Land=0,Dock=0,cont,planetmod=0,sectmod=0;
Xint boarders,olddpopn,oldapopn,oldowner,shipdam,booby,pris,
X	numdest=0,shipno,x= -1,y= -1,i,mask, casualties, casualties2, casualty_scale;
Xfloat astrength,dstrength;
Xracetype *Race, *alien;
X
Xcapture_sectdata = capture_shdata = capture_pdata = NEUTRAL_FD;
X
Xsscanf(args[1]+(args[1][0]=='#'), "%d",&shipno);
X
X  openshdata(&capture_shdata);
X  if (!getship(capture_shdata, &ship, shipno)) {
X	sprintf(buf,"Ship doesn't exist.\n");
X	notify(Playernum, buf);
Xclose(capture_shdata);
X	return;
X  }
Xclose(capture_shdata);
X
X  if (!ship->is_alive || !(ship->is_docked && ship->whatdest==LEVEL_PLAN) ) {
X	sprintf(buf,"%s #%d is not landed on a planet.\n",
X		Shipnames[ship->type], shipno);
X	notify(Playernum, buf);
X	free(ship);
X	return;
X  }
X
X  if (ship->owner==Playernum) {
X	sprintf(buf,"That's your own ship.\n");
X	notify(Playernum, buf);
X	free(ship);
X	return;
X  }
X
X
X  if (!enufAP(Playernum,Stars[ship->storbits]->AP[Playernum-1], APcount)) {
X      free(ship);
X      return;
X    }
X
Xx = (int)ship->xpos;
Xy = (int)ship->ypos;
X
X     openpdata(&capture_pdata);
X     getplanet(capture_pdata, &p, Stars[ship->storbits]->planetpos[ship->pnumorbits]);
X     close_file(capture_pdata);
X
X     opensectdata(&capture_sectdata);
X     getsector(capture_sectdata,&sect,
X     p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype));
X
X     if (sect->owner!=Playernum) {
X	sprintf(buf,"You don't own the sector where the ship is landed.\n");
X	notify(Playernum, buf);
X	free(sect);
X	free(p);
X	free(ship);
X	return;
X     }
X
Xif(argn<2)
X    boarders = sect->popn;
Xelse
X    boarders = atoi(args[2]);
X
X		if (boarders > sect->popn || boarders <= 0) {
X			sprintf(buf,"Illegal number of boarders (max can be %d).\n",
X				sect->popn);
X			notify(Playernum, buf);
X			free(ship);
X			free(sect);
X			free(p);
X			return;
X		}
X
X	openracedata(&capture_racedata);
X	getrace(capture_racedata, &Race, Playernum);
X	close_file(capture_racedata);
X
X	openracedata(&capture_racedata);
X     	getrace(capture_racedata, &alien, (int)ship->owner);
X	close_file(capture_racedata);
X
X     if (isset(Race->allied, ship->owner))
X	{
X	sprintf(buf,"Boarding the ship of your ally, %s\n", alien->name);
X	notify(Playernum, buf);
X	}
X
X     oldapopn = boarders;
X     olddpopn = ship->popn;
X     oldowner = ship->owner;
X	shipdam = 0;
X	casualties = 0;
X	casualties2 = 0;
X
X	if(olddpopn || !Max_crew(ship)) {
X
X     sprintf(buf,"Attack strength: %.2f     Defense strength: %.2f\n",
X		   astrength = (float)boarders * (float)Race->fighters
X		        * .01 * Race->tech
X	                * (Race->likes[sect->des] + 0.01)
X			* ((sect->is_wasted ? 0.0 : (float)Defensedata[sect->des]) + 1.0),
X
X		    dstrength = (Max_crew(ship) ? (float)ship->popn * (float)alien->fighters : 1)
X		        * .01 * alien->tech
X	 		* ((float)Armor(ship) + 0.01)
X	                * .01 * (100.0 - (float)ship->damage));
X
X	notify(Playernum, buf);
X 
X	sect->popn -= boarders;
X	booby = 0;
Xcasualty_scale = MIN(boarders, ship->popn + ship->destruct);
X
Xif(astrength > 0.0)
X        casualties = int_rand(0, round_rand((float)casualty_scale * (dstrength+1.0) /
X			  (astrength+1.0)));
X
Xif(dstrength > 0.0) {
X	casualties2 =  int_rand(0, round_rand((float)casualty_scale * (astrength+1.0) / 
X			(dstrength+1.0)));
X
X     	shipdam = int_rand(0,round_rand(25. * (astrength+1.0)/(dstrength+1.0)));
X	ship->damage = MIN(100, ship->damage+shipdam);
X
X	if(!Max_crew(ship) && ship->destruct) {	/* booby trapped robot ships */
X		casualties += int_rand(0, 10*ship->destruct);	
X		booby = int_rand(0, 10*ship->destruct);
X		booby = MIN(100, booby);
X		shipdam += booby;
X		ship->damage += booby;
X	}
X
X
X	if(ship->damage >= 100)
X			kill_ship(Playernum, ship);
X						
X	}
X
X     	casualties = MIN(boarders, casualties);
X	boarders -= casualties;
X
X	casualties2 = MIN(olddpopn, casualties2);
X	ship->popn -= casualties2;
X	ship->mass -= casualties2 * alien->mass;
X
X }
X
X		   if (!ship->popn && ship->is_alive) {
X				/* we got 'em */
X			ship->owner = Playernum;
X			ship->popn = MIN(boarders, Max_crew(ship));
X			sect->popn += boarders - ship->popn;
X			                     /* return excess boarders home */
X			ship->mass += ship->popn * Race->mass;	/* our mass */
X		   } else {		/* retreat */
X			sect->popn += boarders;
X		   }
X
X	if(!sect->popn)
X		sect->owner = 0;
X
X		sprintf(buf,"BULLETIN from %s/%s!!\n",
X			Stars[ship->storbits]->name,Stars[ship->storbits]->pnames[ship->pnumorbits]);
X		notify(oldowner, telegram_buf);
X		sprintf(buf,"You are being attacked by%s Player #%d (%s)!!!\n",
X			(isset(alien->allied,Playernum) ? " your ally" :
X				(isset(alien->atwar,Playernum) ? " your enemy" : " neutral")),
X				Playernum,Race->name);
X		notify(oldowner, buf);
X		sprintf(buf,"%s #%d ASSAULTED at sector %d,%d [owner %d] !\n",
X			Shipnames[ship->type], shipno, x, y, sect->owner);
X		notify(oldowner, buf);
X
Xif(booby) {
X     sprintf(buf,"Booby trap triggered causing %d%% damage.\n", booby);
X		notify(oldowner, buf);
X		notify(Playernum, buf);
X}
X
Xif(shipdam) {
X     sprintf(buf,"Total damage: %d%% (now %d%%)\n", shipdam, ship->damage);
X		notify(oldowner, buf);
X		sprintf(buf,"Damage inflicted:  Them: %d%% (now %d%%)\n",
X			shipdam,ship->damage);
X		notify(Playernum, buf);
X }
X
X     if(!ship->is_alive) {
X  		sprintf(buf,"              YOUR SHIP WAS DESTROYED!!!\n");
X		notify(oldowner, buf);
X  		sprintf(buf,"              Their ship DESTROYED!!!\n");
X		notify(Playernum, buf);
X	}
X
X			if (ship->owner==Playernum) {
X				sprintf(buf,"%s CAPTURED!\n",Shipnames[ship->type]);
X					notify(oldowner, buf);
X				sprintf(buf,"VICTORY! The ship is yours!\n");
X					notify(Playernum, buf);
X			     if ((astrength+1.0)/(dstrength+1.0) > 5.0 && olddpopn) {
X				   pris=astrength/dstrength;
X				   pris=MIN(pris,olddpopn);
X				if (Race->captured_prisoners[oldowner-1]<100) {
X				     Race->captured_prisoners[oldowner-1] +=
X					 pris;
X				   sprintf(buf,"%d prisoner%s captured!\n",
X				       pris, ((pris>1) ? "s" : ""));
X					notify(Playernum, buf);
X					notify(oldowner, buf);
X				 }
X			       }
X
X				if (ship->popn)
X					{
X				  sprintf(buf,"%d boarders move in.\n",
X					  MIN(boarders, ship->popn));
X				  	notify(Playernum, buf);
X					}
X			} else if(ship->popn) {
X				sprintf(buf,"You fought them off!\n");
X					notify(oldowner, buf);
X				sprintf(buf,"The boarding was repulsed; try again.\n");
X					notify(Playernum, buf);
X			}
X
X		if (ship->is_alive) {
X			if (sect->popn + boarders == 0) {
X				sprintf(buf,"You killed all the aliens in this sector!\n");
X					notify(oldowner, buf);
X			} else sprintf(buf," ");
X			if (boarders==0) {
X				sprintf(buf,"Oh no! They killed your party to the last man!\n");
X					notify(Playernum, buf);
X			}
X		} else {
X			sprintf(buf,"Your ship was weakened too much!\n");
X					notify(oldowner, buf);
X			sprintf(buf,"The assault weakened their ship too much!\n");
X					notify(Playernum, buf);
X		}
X
Xif(casualties || casualties2) {
Xsprintf(buf,"Casualties: Yours: %d, Theirs: %d\n", casualties2, casualties);
X				notify(oldowner, buf);
X		sprintf(buf,"Casualties: Yours: %d, Theirs: %d\n", casualties, casualties2);
X				notify(Playernum, buf);
X}
X     openshdata(&capture_shdata);
X     putship(capture_shdata, ship, shipno);
X     close_file(capture_shdata);
X
X     putsector(capture_sectdata,sect,p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype));
X     close_file(capture_sectdata);
X
X     deductAPs(Playernum, APcount, ship->storbits, 0);
X
X	openracedata(&capture_racedata);
X    	putrace(capture_racedata, Race);
X	close_file(capture_racedata);
X
X
X     	free(alien);
X	free(Race);
X	free(p);
X     	free(ship);
X     	free(sect);
X
X}
X
END_OF_FILE
if test 8187 -ne `wc -c <'server/capture.c'`; then
    echo shar: \"'server/capture.c'\" unpacked with wrong size!
fi
# end of 'server/capture.c'
if test -f 'server/cs.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/cs.c'\" to \"'server/cs.c.orig'\"
  mv -f 'server/cs.c' 'server/cs.c.orig'
fi
echo shar: Extracting \"'server/cs.c'\" \(6810 characters\)
sed "s/^X//" >'server/cs.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X * Restrictions in GB_copyright.h.
X *  cs.c -- change scope (directory)
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "buffers.h"
Xint cs_racedata, cs_shdata;
X
Xcenter(Playernum, APcount, argn, args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xplacetype where;
X
X  where = Getplace(Playernum,args[1],1);	
X
X  if (where.err) {
X	sprintf(buf,"cs: bad scope.\n");
X		notify(Playernum, buf);
X	return;
X  }
X
XDir[Playernum-1].lastx[1] = Stars[where.snum]->xpos;
XDir[Playernum-1].lasty[1] = Stars[where.snum]->ypos;
X
X}
X
Xdo_prompt(r)
Xracetype *r;
X{
Xshiptype *s;
Xint Playernum;
X
XPlayernum = r->Playernum;
X
X    if(Dir[Playernum-1].level==LEVEL_UNIV) {
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] / )\n",
X		r->weekly/60, r->daily/60,
X		Sdata.AP[Playernum-1]);
X    } else if(Dir[Playernum-1].level==LEVEL_STAR) {
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] /%s )\n",
X	    r->weekly/60, r->daily/60,
X	    Stars[Dir[Playernum-1].snum]->AP[Playernum-1],
X	    Stars[Dir[Playernum-1].snum]->name);
X    } else if(Dir[Playernum-1].level==LEVEL_PLAN) {
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] /%s/%s )\n",
X	    r->weekly/60, r->daily/60,
X	    Stars[Dir[Playernum-1].snum]->AP[Playernum-1],
X	    Stars[Dir[Playernum-1].snum]->name,
X	    Stars[Dir[Playernum-1].snum]->pnames[Dir[Playernum-1].pnum]);
X    } else if(Dir[Playernum-1].level==LEVEL_SHIP) {
X	openshdata(&cs_shdata);
X	getship(cs_shdata, &s, Dir[Playernum-1].shipno);
X	switch(s->whatorbits) {
X	    case LEVEL_UNIV :
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] /  #%d)\n",
X	    r->weekly/60, r->daily/60, Sdata.AP[Playernum-1],
X	    Dir[Playernum-1].shipno);
X	        break;
X	    case LEVEL_STAR :
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] /%s #%d)\n",
X	    r->weekly/60, r->daily/60,
X	    Stars[s->storbits]->AP[Playernum-1],
X	    Stars[s->storbits]->name,
X	    Dir[Playernum-1].shipno);
X		break;
X	    case LEVEL_PLAN :
X	sprintf(Dir[Playernum-1].prompt," ( [%d:%d:%02d] /%s/%s #%d)\n",
X	    r->weekly/60, r->daily/60,
X	    Stars[s->storbits]->AP[Playernum-1],
X	    Stars[s->storbits]->name,
X	    Stars[s->storbits]->pnames[Dir[Playernum-1].pnum],
X	    Dir[Playernum-1].shipno);
X		break;
X	      default :
X		  break;
X	}
X	close_file(cs_shdata);
X	free(s);
X    }
X}
X
Xcs(Playernum, APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
X placetype where;
X planettype *planet;
X shiptype *s;
X int cs_shdata,cs_pdata;
X racetype *Race;
X 
Xopenracedata(&cs_racedata);
Xgetrace(cs_racedata, &Race, Playernum); 
Xclose_file(cs_racedata);
X
Xif (argn==1) {
X	/* chdir to def scope */
X  Dir[Playernum-1].level = Race->deflevel;
X  if ((Dir[Playernum-1].snum = Race->defsystem) >= Sdata.numstars)
X	Dir[Playernum-1].snum = Sdata.numstars-1;
X  if ((Dir[Playernum-1].pnum = Race->defplanetnum) >= Stars[Dir[Playernum-1].snum]->numplanets)
X  Dir[Playernum-1].pnum = Stars[Dir[Playernum-1].snum]->numplanets-1;
X  Dir[Playernum-1].shipno = 0;
X  Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X  Dir[Playernum-1].lastx[1] = Stars[Dir[Playernum-1].snum]->xpos;
X  Dir[Playernum-1].lasty[1] = Stars[Dir[Playernum-1].snum]->ypos;
X  free(Race);
X  return;
X } else if (argn==2) {
X	/* chdir to specified scope */
X
X  where = Getplace(Playernum,args[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	Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X	free(Race);
X	return;
X  }
X
X	/* fix lastx, lasty coordinates */
X
X  switch (Dir[Playernum-1].level) {
X
X	case LEVEL_UNIV:
X		Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X		break;
X
X	case LEVEL_STAR:
X		if (where.level==LEVEL_UNIV) {
X			Dir[Playernum-1].lastx[1] = Stars[Dir[Playernum-1].snum]->xpos;
X			Dir[Playernum-1].lasty[1] = Stars[Dir[Playernum-1].snum]->ypos;
X		} else
X			Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X		break;
X
X	case LEVEL_PLAN:
X		openpdata(&cs_pdata);
X		getplanet(cs_pdata,&planet,Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X		close_file(cs_pdata);
X		if (where.level==LEVEL_STAR && where.snum==Dir[Playernum-1].snum) {
X			Dir[Playernum-1].lastx[0] = planet->xpos;
X			Dir[Playernum-1].lasty[0] = planet->ypos;
X		} else if (where.level==LEVEL_UNIV) {
X			Dir[Playernum-1].lastx[1] = Stars[Dir[Playernum-1].snum]->xpos + planet->xpos;
X			Dir[Playernum-1].lasty[1] = Stars[Dir[Playernum-1].snum]->ypos + planet->ypos;
X		} else
X			Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X		free(planet);
X		break;
X	case LEVEL_SHIP:
X		openshdata(&cs_shdata);
X		getship(cs_shdata, &s, Dir[Playernum-1].shipno);
X		close_file(cs_shdata);
X		if (!s->is_docked) {
X		 switch (where.level) {
X		   case LEVEL_UNIV:
X			Dir[Playernum-1].lastx[1] = s->xpos;
X			Dir[Playernum-1].lasty[1] = s->ypos;
X			break;
X		   case LEVEL_STAR:
X			if (s->whatorbits>=LEVEL_STAR && s->storbits==where.snum) {
X				/* we are going UP from the ship.. change last*/
X				Dir[Playernum-1].lastx[0] = s->xpos - Stars[s->storbits]->xpos;
X				Dir[Playernum-1].lasty[0] = s->ypos - Stars[s->storbits]->ypos;
X			} else
X				Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X			break;
X		   case LEVEL_PLAN:
X			if (s->whatorbits==LEVEL_PLAN && s->storbits==where.snum
X				   && s->pnumorbits==where.pnum) {
X				/* same */
X				openpdata(&cs_pdata);
X				getplanet(cs_pdata,&planet,Stars[s->storbits]->planetpos[s->pnumorbits]);
X				close_file(cs_pdata);
X				Dir[Playernum-1].lastx[0] = s->xpos - Stars[s->storbits]->xpos - planet->xpos;
X				Dir[Playernum-1].lasty[0] = s->ypos - Stars[s->storbits]->ypos - planet->ypos;
X				free(planet);
X			} else
X				Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X			break;
X		   case LEVEL_SHIP:
X			Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X			break;
X		   default:
X			break;
X		    }
X		} else
X			Dir[Playernum-1].lastx[0] = Dir[Playernum-1].lasty[0] = 0.0;
X		free(s);
X		break;
X	default:
X		break;
X  }
X
X  Dir[Playernum-1].level = where.level;
X  Dir[Playernum-1].snum = where.snum;
X  Dir[Playernum-1].pnum = where.pnum;
X  Dir[Playernum-1].shipno = where.shipno;
X
X
X } else if (argn==3 && args[1][1]=='d') {
X	/* make new def scope */
X  where = Getplace(Playernum,args[2],0);
X  if (!where.err) {
X	Race->deflevel = where.level;
X	Race->defsystem = where.snum;
X	Race->defplanetnum = where.pnum;
X	openracedata(&cs_racedata);
X    	putrace(cs_racedata, Race);
X	close_file(cs_racedata);
X
X	sprintf(buf,"New home system is %s\n",Dispplace(Playernum, &where));
X  } else {
X	sprintf(buf,"cs: bad home system.\n");
X	free(Race);
X	return;
X  }
X}
X free(Race);
X}
X
END_OF_FILE
if test 6810 -ne `wc -c <'server/cs.c'`; then
    echo shar: \"'server/cs.c'\" unpacked with wrong size!
fi
# end of 'server/cs.c'
if test -f 'server/declare.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/declare.c'\" to \"'server/declare.c.orig'\"
  mv -f 'server/declare.c' 'server/declare.c.orig'
fi
echo shar: Extracting \"'server/declare.c'\" \(8063 characters\)
sed "s/^X//" >'server/declare.c' <<'END_OF_FILE'
X/* 
X** Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X** smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X** Restrictions in GB_copyright.h.
X** declare.c -- declare alliance, neutrality, war, the basic thing.
X*/
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "races.h"
X#include "buffers.h"
X#include <signal.h>
X#include <ctype.h>
Xint declare_racedata, i;
X
X/* invite people to join your alliance block */
Xinvite(Playernum, APcount, argn, args, mode)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint mode;
X{
Xint n;
Xracetype *Race, *alien;
X
XGetPlayer(args[1], &n, &alien);
X   if (n < 1 || n > Numraces() ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
X
Xif(n==Playernum) {
X	notify(Playernum, "Not needed, you are the leader.\n");
X	free(alien);
X	return;
X	}
X
X  openracedata(&declare_racedata); 
X  getrace(declare_racedata, &Race, Playernum);	
X  close_file(declare_racedata);
X
Xif(mode) {
X	setbit(Blocks[Playernum-1].invite, n);
X	sprintf(buf, "%s [%d] has invited you to join %s\n", Race->name, 
X			Playernum, Blocks[Playernum-1].name);
X	if(!notify(n, buf))
X	push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X	sprintf(buf, "%s [%d] has been invited to join %s [%d]\n",
X		alien->name, n, Blocks[Playernum-1].name, Playernum);
X	notify(Playernum, buf);
X    } else {
X	clrbit(Blocks[Playernum-1].invite, n);
X
X	sprintf(buf, "You have been blackballed from %s [%d]\n",
X		Blocks[Playernum-1].name, Playernum);
X	if(!notify(n, buf))
X	push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X
X	sprintf(buf, "%s [%d] has been blackballed from %s [%d]\n",
X		alien->name, n, Blocks[Playernum-1].name, Playernum);
X	notify(Playernum, buf);
X    }
X	for(i=1; i<=Numraces(); i++)
X	    push_message(TELEG_PLAYER_AUTO, i, buf, DECLARATION);
X
XPutblock(Blocks);
Xfree(Race);
Xfree(alien);
X}
X
X/* declare that you wish to be included in the alliance block */
Xpledge(Playernum, APcount, argn, args, mode)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint mode;
X{
Xint n;
Xracetype *alien, *Race;
X
XGetPlayer(args[1], &n, &alien);
X   if (n < 1 || n > Numraces() ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
X
Xif(n==Playernum) {
X	notify(Playernum, "Not needed, you are the leader.\n");
X	free(alien);
X	return;
X	}
X
X  openracedata(&declare_racedata); 
X  getrace(declare_racedata, &Race, Playernum);	
X  close_file(declare_racedata);
X
X if(mode) {
X	setbit(Blocks[n-1].pledge, Playernum);
X	sprintf(buf, "%s [%d] has pledged %s.\n", Race->name, 
X			Playernum, Blocks[n-1].name);
X	if(!notify(n, buf))
X	push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X	sprintf(buf, "You have pledged allegiance to %s.\n",
X                  Blocks[n-1].name);
X	notify(Playernum, buf);
X
X	switch(int_rand(1,20)) {
X	  case 1:
X	    sprintf(buf, "%s [%d] joins the band wagon and pledges allegiance to %s [%d]!\n",
X		    Race->name, Playernum, Blocks[n-1].name, n);
X	    break;
X	  default:
X	    sprintf(buf, "%s [%d] pledges allegiance to %s [%d].\n",
X		    Race->name, Playernum, Blocks[n-1].name, n);
X	    break;
X	}
X
X    } else {
X	clrbit(Blocks[n-1].pledge, Playernum);
X	sprintf(buf, "%s [%d] has quit %s [%d].\n", Race->name,
X			Playernum, Blocks[n-1].name, n);
X	if(!notify(n, buf))
X	push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X	sprintf(buf, "You have quit %s\n", Blocks[n-1].name);
X	notify(Playernum, buf);
X
X	switch(int_rand(1,20)) {
X	  case 1:
X	    sprintf(buf, "%s [%d] calls %s [%d] a bunch of geeks and QUITS %s [%d]!\n",
X		    Race->name, Playernum, Blocks[n-1].name, n);
X	  default:
X	    sprintf(buf, "%s [%d] has QUIT %s [%d]!\n",
X		 Race->name, Playernum, Blocks[n-1].name, n);   
X	    break;
X	}
X    }
X
X	for(i=1; i<=Numraces(); i++)
X	    push_message(TELEG_PLAYER_AUTO, i, buf, DECLARATION);
X	
X
Xcompute_power_blocks();
Xfree(alien);
Xfree(Race);
XPutblock(Blocks);
X}
X
Xdeclare(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xchar str[RNAMESIZE];
Xint n;
Xracetype *Race, *alien;
X
X     /* look in sdata for APs first */
X   if (Sdata.AP[Playernum] >= APcount)  /* enufAPs would print something */
X	   deductAPs(Playernum,APcount, 0, 1);
X     /* otherwise use current star */
X   else if (Dir[Playernum-1].level==LEVEL_STAR || Dir[Playernum-1].level==LEVEL_PLAN) {
X       if (enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount) )
X	   deductAPs(Playernum,APcount, Dir[Playernum-1].snum, 0);
X   } else {
X	   sprintf(buf,"You don't have enough AP's (%d)\n",APcount);
X		notify(Playernum, buf);
X	return;
X   }
X
X   GetPlayer(args[1], &n, &alien);
X   if (n < 1 || n > Numraces() ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
X
X	openracedata(&declare_racedata); 
X         getrace(declare_racedata, &Race, Playernum);	
X	close_file(declare_racedata);
X
Xif(Race->Playernum != Playernum) {
X    notify(Playernum, "Illegal race number - report to deity.\n");
X    sprintf(buf, "Declare race number error %d != %d\n",
X	    Race->Playernum, Playernum);
X    free(Race);
X    free(alien);
X    return;
X}
X
X   switch (*args[2]) {
X	case 'a':
X		setbit(Race->allied, n);
X		clrbit(Race->atwar, n);
X		if (int_rand(0,100) >= 96)
X			{
X			sprintf(buf,"But would you want your sister to marry one?\n");
X				notify(Playernum, buf);
X		} else {
X			sprintf(buf,"Good for you.\n");
X				notify(Playernum, buf);
X			}
X
X		sprintf(buf," Player #%d (%s) has declared an alliance with you!\n",
X			Playernum,Race->name);
X			if(!notify(n, buf))
X		push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X
X		switch(int_rand(1,20)) {
X		  case 1:
X		    sprintf(buf, "%s [%d] sucks up to %s [%d] and declares an ALLIANCE!\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		  default:
X		    sprintf(buf, "%s [%d] declares an ALLIANCE with %s [%d].\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		}
X
X		break;
X	case 'n':
X		clrbit(Race->allied, n);
X		clrbit(Race->atwar, n);
X		sprintf(buf,"Done.\n");
X			notify(Playernum, buf);
X
X		sprintf(buf," Player #%d (%s) has declared neutrality with you!\n",Playernum,Race->name);
X			if(!notify(n, buf))
X		push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X
X		sprintf(buf, "%s [%d] declares a state of neutrality with %s [%d].\n",
X			Race->name, Playernum, alien->name, n);
X
X		break;
X	case 'w':
X		setbit(Race->atwar, n);
X		clrbit(Race->allied, n);
X		if (int_rand(0,100) >= 96) {
X			sprintf(buf, "Your enemies flaunt their secondary male reproductive glands in your\ngeneral direction.\n");
X				notify(Playernum, buf);
X		} else {
X			sprintf(buf, "Give 'em hell!\n");
X				notify(Playernum, buf);
X			}
X
X		sprintf(buf," Player #%d (%s) has declared war against you!\n",Playernum,Race->name);
X			if(!notify(n, buf))
X		push_message(TELEG_PLAYER_AUTO, n, buf, TELEGRAM);
X
X		switch(int_rand(1,5)) {
X		  case 1:
X		    sprintf(buf, "%s [%d] declares WAR on %s [%d].\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		  case 2:
X		    sprintf(buf, "%s [%d] has had enough of %s [%d] and declares WAR!\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		  case 3:
X		    sprintf(buf, "%s [%d] decided that it is time to declare WAR on %s [%d]!\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		  case 4:
X		    sprintf(buf, "%s [%d] had no choice but to declare WAR against %s [%d]!\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		  case 5:
X		    sprintf(buf, "%s [%d] says 'screw it!' and declares WAR on %s [%d]!\n",
X			    Race->name, Playernum, alien->name, n);
X		    break;
X		default:
X			break;
X		}
X		
X		break;
X	default:
X		notify(Playernum, "I don't understand.\n");
X		free(Race);
X		free(alien);
X		return;
X		break;
X   }
X
X		for(i=1; i<=Numraces(); i++)
X		    push_message(TELEG_PLAYER_AUTO, i, buf, DECLARATION);
X
X		
X/* They, of course, learn more about you */
Xalien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+30, 100);
X
Xopenracedata(&declare_racedata);
Xputrace(declare_racedata, alien);
Xputrace(declare_racedata, Race);
Xclose_file(declare_racedata);
Xfree(Race);
Xfree(alien);
X}
X
X
END_OF_FILE
if test 8063 -ne `wc -c <'server/declare.c'`; then
    echo shar: \"'server/declare.c'\" unpacked with wrong size!
fi
# end of 'server/declare.c'
if test -f 'server/land.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/land.c'\" to \"'server/land.c.orig'\"
  mv -f 'server/land.c' 'server/land.c.orig'
fi
echo shar: Extracting \"'server/land.c'\" \(6431 characters\)
sed "s/^X//" >'server/land.c' <<'END_OF_FILE'
X/*
X** Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X** smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X** Restrictions in GB_copyright.h.
X**
X**  land.c -- land a ship
X**  also.... dock -- dock a ship w/ another ship 
X**  and..... assault -- a very un-PC version of land/dock
X*/
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "buffers.h"
X#include <signal.h>
X#include <math.h>
X
Xint land_sectdata,land_shdata,land_pdata, land_racedata;
Xint land_stdata;
X
Xland(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xchar c;
Xshiptype *s;
Xplanettype *p;
Xsectortype *sect;
Xplacetype where;
Xint shipno,x= -1,y= -1,i, numdest;
Xfloat fuel;
Xdouble Dist;
Xracetype *Race, *alien;
X
Xland_sectdata = land_shdata = land_pdata = NEUTRAL_FD;
X
X
X	sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X
X
X openshdata(&land_shdata);
X  if (!getship(land_shdata, &s, shipno)) {
X      notify(Playernum, "The ship wasn't found.\n");
X	close_file(land_shdata);
X	return;
X  }
Xclose_file(land_shdata);
X
X  if (testship(Playernum,s, shipno)) {
X      notify(Playernum, "Illegal format.\n");
X      free(s);
X      return;
X	}
X
X  if (s->is_docked) {
X	sprintf(buf,"Ship #%d is docked.\n",shipno);
X		notify(Playernum, buf);
X	free(s);
X	return;
X  }
X
X
X	sscanf(args[2],"%d,%d",&x,&y); /* landing on a sector */
X
X     if (s->whatorbits!=LEVEL_PLAN) {
X		sprintf(buf,"%s #%d doesn't orbit a planet.\n", Shipnames[s->type],
X			shipno);
X			notify(Playernum, buf);
X			free(s);
X			return;
X     			}
X
X  	if (!Shipdata[s->type][ABIL_CANLAND]) {
X		sprintf(buf,"This ship is not equipped to land.\n");
X		notify(Playernum, buf);
X		free(s);
X		return;
X  	}
X
X    if(s->storbits != Dir[Playernum-1].snum || s->pnumorbits != Dir[Playernum-1].pnum) {
X	sprintf(buf,"You have to cs to the planet it orbits.\n");
X		notify(Playernum, buf);
X	free(s);
X	return;
X	}
X
Xif (!speed_rating(s)) {
X		sprintf(buf,"This ship is not rated for maneuvering.\n");
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(&land_pdata);
X     getplanet(land_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]);
X     close_file(land_pdata);
X     
X     sprintf(buf,"Planet /%s/%s has gravity field of %.2f.\n", Stars[s->storbits]->name,
X	Stars[s->storbits]->pnames[s->pnumorbits], gravity(p));
X		notify(Playernum, buf);
X
X     sprintf(buf,"Distance to planet: %.2f.\n",
X  	Dist = sqrt((double)Distsq(Stars[s->storbits]->xpos + p->xpos, 
X  		      Stars[s->storbits]->ypos + p->ypos, 
X  		      s->xpos, s->ypos ) ) );
X		notify(Playernum, buf);
X
X     if (Dist > DIST_TO_LAND) {
X        sprintf(buf,"Ship #%d must be %.3g or closer to the planet (%.2f).\n",shipno, DIST_TO_LAND, Dist);
X		notify(Playernum, buf);
X	free(s);
X	free(p);
X	return;
X     }
X
X     fuel = 0.05 + .05*s->mass*gravity(p) * LAND_GRAV_MASS_FACTOR;
X
X	if (s->resource > Max_resource(s) || s->fuel > Max_fuel(s)
X	    || s->popn > Max_crew(s) || s->destruct > Max_destruct(s)) {
X		sprintf(buf,"Ship is too overloaded to land.\n");
X		notify(Playernum, buf);
X		free(s);
X		free(p);
X		return;
X  	}
X
X	if(x < 0 || y < 0 || x > p->Maxx || y > p->Maxy) {
X		sprintf(buf,"Illegal coordinates.\n");
X			notify(Playernum, buf);
X		free(s);
X		free(p);
X		return;
X			}
X
X	opensectdata(&land_sectdata);
X	getsector(land_sectdata,&sect,p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype));
X	close_file(land_sectdata);
X
X       if(s->type != OTYPE_TERRA) {
X		openracedata(&land_racedata);
X		getrace(land_racedata, &Race, Playernum); 
X		close_file(land_racedata);
X       if (Race->likes[sect->des] == 0.0 && !sect->is_wasted) {
X	sprintf(buf,"The ship is not built to land on that sector.\n");
X		notify(Playernum, buf);
X	free(Race);
X	free(s);
X	free(p);
X	free(sect);
X	return;
X       		}
X	} 
X
X       if (sect->is_wasted) {
X	sprintf(buf,"Warning: That sector is a wasteland!\n");
X		notify(Playernum, buf);
X       } else if (sect->owner && sect->owner!=Playernum) {
X		openracedata(&land_racedata);
X		getrace(land_racedata, &Race, Playernum); 
X	 	getrace(land_racedata, &alien, (int)sect->owner);
X		close_file(land_racedata);
X
X       if(!(isset(Race->allied, sect->owner) && isset(alien->allied, Playernum))) {
X	sprintf(buf,"You are not mutually allied with %s.\n", alien->name);
X		notify(Playernum, buf);
X	free(Race);
X	free(alien);
X	free(sect);
X	free(p);
X	free(s);
X	return;
X      } else {
X	sprintf(buf,"You have landed on allied sector (%s).\n",alien->name);
X		notify(Playernum, buf);
X    }
X	free(alien);
X	free(Race);
X	    }
X
X     if (s->fuel < fuel) {
X
X	kill_ship(s->owner, s);
X
X	  where.level = LEVEL_PLAN;
X	  where.snum = s->storbits;
X	  where.pnum = s->pnumorbits;
X
X	  numdest =(int)blast(Playernum,&where, &where, 0, p, x, y, Dist, 100.,
X			round_rand(log1p((double)s->mass)*2+(float)s->destruct/3.), 1);
X	  sprintf(buf,"BOOM!! Ship #%d crashes on sector %d,%d with blast radius of %d.\n",
X		shipno, x, y, numdest);
X
X	  for (i=1; i<=Numraces(); i++)
X		if (p->info[i-1].numsectsowned || i==Playernum)
X			notify(i, buf);
X
X     } else {
X       	s->xpos = (float)x;
X     	s->ypos = (float)y;
X
X     	s->fuel -= fuel;
X     	s->mass -= fuel * MASS_FUEL;
X     	s->is_docked = 1;
X     	s->whatdest = LEVEL_PLAN;	/* no destination */
X     	s->deststar = s->storbits;
X     	s->destpnum = s->pnumorbits;
X     }
X
X	openshdata(&land_shdata);
X     	putship(land_shdata, s, shipno);
X  	close_file(land_shdata);
X
X
X  if (s->whatorbits==LEVEL_UNIV)
X	  deductAPs(Playernum,APcount, 0, 1);
X  else
X	  deductAPs(Playernum,APcount, s->storbits, 0);
X
X
X	  	openpdata(&land_pdata);
X	  	putplanet(land_pdata,p,Stars[s->storbits]->planetpos[s->pnumorbits]);
X      		close_file(land_pdata);
X 
X	if(numdest) {
X		opensectdata(&land_sectdata);
X	  	putsector(land_sectdata,sect,p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype));
X      		close_file(land_sectdata);
X		}
X
X	/* send messages to anyone there */
X		  sprintf(buf,"%s #%d observed landing on sector %.0f,%.0f, planet /%s/%s.\n",
X			Shipnames[s->type], shipno, s->xpos,s->ypos,Stars[s->storbits]->name,
X			Stars[s->storbits]->pnames[s->pnumorbits]);
X
X	  for (i=1; i<=Numraces(); i++)
X		if (p->info[i-1].numsectsowned && i!=Playernum)
X			notify(i, buf);
X
X  	  sprintf(buf,"%s #%d %s landed on planet.\n",Shipnames[s->type],
X		 shipno,s->name);
X		notify(Playernum, buf);
X
X     	free(sect);
X   	free(p);
X	free(s);
X
X}
X
X
END_OF_FILE
if test 6431 -ne `wc -c <'server/land.c'`; then
    echo shar: \"'server/land.c'\" unpacked with wrong size!
fi
# end of 'server/land.c'
if test -f 'server/launch.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/launch.c'\" to \"'server/launch.c.orig'\"
  mv -f 'server/launch.c' 'server/launch.c.orig'
fi
echo shar: Extracting \"'server/launch.c'\" \(6685 characters\)
sed "s/^X//" >'server/launch.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X * Restrictions in GB_copyright.h.
X *
X *  launch.c -- launch or undock a ship (also undock)
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "buffers.h"
X#include <signal.h>
X
X
Xint launch_shdata,launch_pdata,launch_stdata;
X
Xlaunch(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint sh, sh2, sh3;
Xshiptype *s,*s2,*s3;
Xplanettype *p;
Xboolean planet=0;
Xint shipno, i;
Xfloat fuel;
X
Xlaunch_shdata = launch_pdata = NEUTRAL_FD;
X
X	sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X
X  openshdata(&launch_shdata);
X  if (!getship(launch_shdata, &s, shipno)) {
X      close_file(launch_shdata);
X      return;
X  }
Xclose_file(launch_shdata);
X
X
X  if (s->owner!=Playernum) {
X	DontOwnErr(Playernum,shipno);
X	free(s);
X	return;
X  }
X
X  if (!speed_rating(s)) {
X	sprintf(buf,"That ship is not designed to be launched.\n");
X		notify(Playernum, buf);
X	free(s);
X	return;
X  }
X
X
X  if (testship(Playernum,s,shipno)) {
X	free(s);
X	return;
X	}
X
X  if (!s->is_docked) {
X	sprintf(buf,"Ship #%d is not landed or docked.\n",shipno);
X		notify(Playernum, buf);
X	free(s);
X	return;
X  }
X
X  if (s->whatdest==LEVEL_PLAN && s->resource > Max_resource(s)) {
X	sprintf(buf,"Ship #%d is too overloaded to launch.\n", shipno);
X		notify(Playernum, buf);
X	free(s);
X	return;
X  }
X
X  if (s->whatdest==LEVEL_SHIP) {
X
X	sh2 = s->destshipno; 
X
X     	openshdata(&launch_shdata);
X	(void)getship(launch_shdata, &s2, sh2);
X      	close_file(launch_shdata);
X  	if (s2->whatorbits==LEVEL_UNIV) {
X	  if (!enufAP(Playernum,Sdata.AP[Playernum-1], APcount)) { 
X		free(s);
X		free(s2);
X		return;
X	 } else
X  		deductAPs(Playernum,APcount, 0, 1);
X  	} else {
X	  if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) {
X		free(s);
X		free(s2);
X		return;
X	  } else
X  		deductAPs(Playernum,APcount, s->storbits, 0);
X	}
X
X	if(s->type == STYPE_FIGHTER && s2->type == STYPE_CARRIER && 
X			s2->destshipno!=shipno) {   
X
X		/* fighters docked with carriers - in the sublist!*/
X		/* fix carrier linked list */
X
X	sh = s2->object.number;
X	if(!sh) {
X		notify(Playernum, "Weird error!  01\n");
X		free(s);
X		free(s2);
X		return;
X		}
X
X	if(sh == shipno) {
X		s2->object.number = s->object.number;
X		} else {
X
X		    openshdata(&launch_shdata);
X		    while(sh != shipno) {
X			(void)getship(launch_shdata, &s3, sh);
X			sh3 = sh;
X			sh = s3->object.number;
X			if(sh != shipno) free(s3);
X		}
X
X		s3->object.number = s->object.number; /* change pointer */
X		putship(launch_shdata, s3, sh3);
X		close_file(launch_shdata);
X		free(s3);
X		}
X
X	/* fighter is on its own */
X	s->is_docked = 0;
X	s->whatdest = LEVEL_UNIV;
X	s->whatorbits = s2->whatorbits;
X	s->object.number = 0;
X	s->object.number4 = 0;
X	s->destshipno = 0;
X	s->xpos = s2->xpos;
X	s->ypos = s2->ypos;
X	s->storbits = s2->storbits;
X	s->pnumorbits = s2->pnumorbits;
X
X	s2->mass -= s->mass; /* carrier is lighter */
X	s2->object.number4 -= 1;
X/* put fighter into the appropriate linked list (planet/star/universe).
X   it is put into the level of the carrier */
X
X	if(s2->whatorbits==LEVEL_PLAN) {
X    		openpdata(&launch_pdata);
X  		getplanet(launch_pdata, &p, Stars[s2->storbits]->planetpos[s2->pnumorbits]);
X			s->nextship = p->ships;
X			p->ships = shipno;	
X  		putplanet(launch_pdata,p,Stars[s2->storbits]->planetpos[s2->pnumorbits]);
X  		close_file(launch_pdata);
X		free(p);
X	} else if(s2->whatorbits==LEVEL_STAR) {
X  		openstardata(&launch_stdata);
X		free(Stars[s2->storbits]);
X  		getstar(launch_stdata, &Stars[s2->storbits],s2->storbits);
X			s->nextship = Stars[s2->storbits]->ships;
X			Stars[s2->storbits]->ships = shipno;
X  		putstar(launch_stdata, Stars[s2->storbits],s2->storbits);
X		close_file(launch_stdata);
X	} else if(s2->whatorbits==LEVEL_UNIV) {
X			s->nextship = Sdata.ships;
X			Sdata.ships = shipno;
X		}
X
X    } else {
X	s->is_docked = 0;
X	s->whatdest = LEVEL_UNIV;
X	sh2 = s->destshipno;
X	s->destshipno = 0;
X	s2->is_docked = 0;
X	s2->whatdest = LEVEL_UNIV;
X	s2->destshipno = 0;
X
X		} 
X
X
X	sprintf(buf,"%s #%d undocked from %s #%d.\n", 
X		Shipnames[s->type], shipno, Shipnames[s2->type],sh2);
X		notify(Playernum, buf);
X	openshdata(&launch_shdata);
X	putship(launch_shdata, s, shipno);
X	putship(launch_shdata, s2, sh2);
X	close_file(launch_shdata);
X
X	free(s);
X	free(s2);
X
X  } else {
X
X	  if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) { 
X		free(s);
X		return;
X	  } else
X  		deductAPs(Playernum,APcount, s->storbits, 0);
X
X  s->is_docked = 0;
X  s->whatdest = LEVEL_UNIV;	/* no destination */
X
X
X	/* adjust x,ypos to absolute coords */
X  openpdata(&launch_pdata);
X  getplanet(launch_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]);
X  close_file(launch_pdata);
X
X  sprintf(buf,"Planet /%s/%s has gravity field of %.2f\n", Stars[s->storbits]->name,
X	Stars[s->storbits]->pnames[s->pnumorbits], gravity(p));
X		notify(Playernum, buf);
X   /* alter sector location of ship x,y to stellar coords x,y */
X  s->xpos = Stars[s->storbits]->xpos + p->xpos + 
X		(float)int_rand((int)(-DIST_TO_LAND/4),(int)(DIST_TO_LAND/4));
X  s->ypos = Stars[s->storbits]->ypos + p->ypos + 
X		(float)int_rand((int)(-DIST_TO_LAND/4),(int)(DIST_TO_LAND/4));
X
X   /* subtract fuel from ship */
X  fuel = gravity(p) * s->mass * LAUNCH_GRAV_MASS_FACTOR;
X  if (s->fuel < fuel) {
X	sprintf(buf,"Ship #%d does not have enough fuel! (%.1f)\n",shipno, fuel);
X		notify(Playernum, buf);
X	free(p);
X	free(s);
X	return;
X  }
X  s->fuel -= fuel;
X  s->mass -= fuel * MASS_FUEL;
X
X
X  if (s->type == OTYPE_CANIST)
X	s->object.number = 80;	/* canister dissapates after 80 updates */
X
X  	s->notified = 0;
X	openshdata(&launch_shdata);
X	  putship(launch_shdata, s, shipno);
X  	close_file(launch_shdata);
X
X  if (!p->is_explored) {
X		/* not yet explored by owner; space exploration causes the
X		   player to see a whole map */
X	p->is_explored = 1;
Xopenpdata(&launch_pdata);
X  	putplanet(launch_pdata,p,Stars[s->storbits]->planetpos[s->pnumorbits]);
X  	close_file(launch_pdata);
X  }
X
X		  sprintf(buf,"%s #%d observed launching from planet /%s/%s.\n",
X			Shipnames[s->type], shipno,Stars[s->storbits]->name,
X			Stars[s->storbits]->pnames[s->pnumorbits]);
X	  for (i=1; i<=Numraces(); i++)
X		if (p->info[i-1].numsectsowned && i!=Playernum) notify(i, telegram_buf);
X
X  free(p);
X
X  sprintf(buf,"%s #%d %s launched from planet,", Shipnames[s->type], shipno, s->name);
X		notify(Playernum, buf);
X  sprintf(buf," using %.1f fuel.\n",fuel);
X 		notify(Playernum, buf);
X if (s->type == OTYPE_CANIST) {
X		notify(Playernum, buf);
X	sprintf(buf, "A thick cloud of dust envelops your planet.\n");
X		notify(Playernum, buf); 
X	}
X
X  free(s);
X
X  }
X
X}
X
X
END_OF_FILE
if test 6685 -ne `wc -c <'server/launch.c'`; then
    echo shar: \"'server/launch.c'\" unpacked with wrong size!
fi
# end of 'server/launch.c'
if test -f 'server/scrap.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/scrap.c'\" to \"'server/scrap.c.orig'\"
  mv -f 'server/scrap.c' 'server/scrap.c.orig'
fi
echo shar: Extracting \"'server/scrap.c'\" \(7618 characters\)
sed "s/^X//" >'server/scrap.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h.
X * Restrictions in GB_copyright.h.
X *
X * scrap.c -- turn a ship to junk
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "buffers.h"
X#include <signal.h>
X
Xint scrap_shdata, scrap_pdata,scrap_sectdata, scrap_racedata;
X
Xscrap(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xplanettype *planet;
Xsectortype *sect;
Xshiptype *s,*s2;
Xint i,mask,shipno,scrapval=0,destval=0,crewval=0, xtalval=0;
Xfloat fuelval=0.0;
Xracetype *Race;
X
Xscrap_shdata = scrap_pdata = NEUTRAL_FD;
X
X 	sscanf(args[1] + (*args[1]=='#'),"%d", &shipno);
X
X openshdata(&scrap_shdata);
X if (!getship(scrap_shdata,&s,shipno)) {
X     close_file(scrap_shdata);
X	return;
X }
Xclose_file(scrap_shdata);
X
X if (s->owner!=Playernum || !s->is_alive) {
X	DontOwnErr(Playernum,shipno);
X	free(s);
X	return;
X }
X
X
X if (s->whatorbits==LEVEL_UNIV) {
X 	if (!enufAP(Playernum,Sdata.AP[Playernum-1], APcount))
X	    free(s);
X	    return;
X } else if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) {
X	    free(s);
X	    return;
X		}
X
X if (s->whatorbits==LEVEL_PLAN && s->type==OTYPE_TOXWC) {
X	sprintf(buf,"WARNING: This will release %d toxin points back into the atmosphere!!\n", s->object.number);
X		notify(Playernum, buf);
X	}
X
X if ( !s->is_docked) {
X	sprintf(buf,"%s #%d is not landed or docked.\nNo resources can be reclaimed.\n",Shipnames[s->type], shipno);
X		notify(Playernum, buf);
X }
X
X if (s->whatorbits==LEVEL_PLAN) {		/* wc's release poison */
X 	openpdata(&scrap_pdata);
X 	getplanet(scrap_pdata, &planet, Stars[s->storbits]->planetpos[s->pnumorbits]);
X	close_file(scrap_pdata);
X	
X   if (s->is_docked && s->whatdest==LEVEL_PLAN) {
X        opensectdata(&scrap_sectdata);
X        getsector(scrap_sectdata, &sect, planet->sectormappos
X		 +((int)s->ypos*planet->Maxx+(int)s->xpos)*sizeof(sectortype));
X	close_file(scrap_sectdata);
X	}
X
X    }
X
X
X if (s->is_docked && s->whatdest==LEVEL_SHIP) {
X     openshdata(&scrap_shdata);
X     if (!getship(scrap_shdata, &s2, (int)s->destshipno)) {
X	    close_file(scrap_shdata);
X	    free(s);
X	    return;
X		}
X	close_file(scrap_shdata);
X	if ( !(s2->is_docked && s2->destshipno == shipno) ) {
X		sprintf(buf,"Warning, other ship not docked..\n");
X			notify(Playernum, buf);
X		free(s);
X		free(s2);
X		return;
X	}
X } 
X
X scrapval = Cost(s) * .50 + s->resource;
X
X if (s->is_docked) {
X
X	 sprintf(buf,"%s #%d:original cost: %d\n",
X		Shipnames[s->type], shipno, Cost(s));
X			notify(Playernum, buf);
X	 sprintf(buf,"         scrap value%s: %d rp's.\n",
X		s->resource ? "(with stockpile) " : "", scrapval);
X			notify(Playernum, buf);
X
X	 if (s->whatdest==LEVEL_SHIP && s->resource+scrapval > Max_resource(s2) 
X			&& s->type!=STYPE_SHUTTLE) {
X		scrapval = Max_resource(s2) - s->resource;
X		sprintf(buf,"(There is only room for %d resources.)\n",scrapval);
X			notify(Playernum, buf);
X	 		}
X
X	 if (s->fuel) {
X	   sprintf(buf,"Fuel recovery: %.0f.\n", s->fuel);
X			notify(Playernum, buf);
X	   fuelval = s->fuel;
X	   if (s->whatdest == LEVEL_SHIP && s->fuel+fuelval > Max_fuel(s2)) {
X		fuelval = Max_fuel(s2) - s->fuel;
X		sprintf(buf,"(There is only room for %.2f fuel.)\n",fuelval);
X			notify(Playernum, buf);
X	   }
X	 } else
X	   fuelval = 0.0;
X
X	 if (s->destruct) {
X	   sprintf(buf,"Weapons recovery: %d.\n", s->destruct);
X			notify(Playernum, buf);
X	   destval = s->destruct;
X	   if (s->whatdest == LEVEL_SHIP && s->destruct+destval > Max_destruct(s2)) {
X		destval = Max_destruct(s2) - s->destruct;
X		sprintf(buf,"(There is only room for %d destruct.)\n",destval);
X			notify(Playernum, buf);
X	   }
X	 } else
X	   destval = 0;
X
X	 if (s->popn) {
X	   if (s->whatdest==LEVEL_PLAN && sect->owner>0 && sect->owner!=Playernum) {
X		sprintf(buf,"You don't own this sector; no crew can be recovered.\n");
X			notify(Playernum, buf);
X	   } else {
X	      sprintf(buf,"Population recovery: %d.\n", s->popn);
X			notify(Playernum, buf);
X	      crewval = s->popn;
X	      if (s->whatdest==LEVEL_SHIP && s->popn+crewval > Max_crew(s2)) {
X		crewval = Max_crew(s) - s->popn;
X		sprintf(buf,"(There is only room for %d crew.)\n",crewval);
X			notify(Playernum, buf);
X	      }
X	   }
X	 } else
X	   crewval = 0;
X
X	 if (s->crystals) {
X	   if (s->whatdest==LEVEL_PLAN && sect->owner>0 && sect->owner!=Playernum) {
X		sprintf(buf,"You don't own this sector; no crystals can be recovered.\n");
X			notify(Playernum, buf);
X	   } else {
X	      sprintf(buf,"Crystal recovery: %d.\n", s->crystals);
X			notify(Playernum, buf);
X	      xtalval = s->crystals;
X	      if (s->whatdest==LEVEL_SHIP && s->crystals+xtalval > Max_crystals(s2)) {
X		xtalval = Max_crystals(s) - s->crystals;
X		sprintf(buf,"(There is only room for %d crystals.)\n",xtalval);
X			notify(Playernum, buf);
X	      }
X	   }
X	 } else
X	   xtalval = 0;
X
X}
X
X
X
X if (s->whatorbits==LEVEL_UNIV)
X 	deductAPs(Playernum,APcount, 0, 1);
X else
X 	deductAPs(Playernum,APcount, s->storbits, 0);
X
X kill_ship(Playernum, s);
X
Xopenshdata(&scrap_shdata);
Xputship(scrap_shdata, s, shipno);
Xclose_file(scrap_shdata);
X if (s->is_docked && s->whatdest==LEVEL_SHIP) {
X     fuelval = MIN(fuelval, 1.*Max_fuel(s2) - s2->fuel);
X     destval = MIN(destval, Max_destruct(s2) - s2->destruct);
X     scrapval = MIN(scrapval, Max_resource(s2) - s2->resource);
X     crewval = MIN(crewval, Max_crew(s2) - s2->popn);
X     xtalval = MIN(xtalval, Max_crystals(s2) - s2->crystals);
X     	s2->fuel += fuelval;
X	s2->destruct += destval;
X	s2->resource += scrapval;
X	s2->popn += crewval;
X	s2->crystals += xtalval;
X
Xopenracedata(&scrap_racedata);
Xgetrace(scrap_racedata, &Race, Playernum);
Xclose_file(scrap_racedata);
X	s2->mass += fuelval*MASS_FUEL + destval*MASS_DESTRUCT + scrapval*MASS_RESOURCE + crewval*Race->mass;
Xfree(Race);
X
X     s2->is_docked = 0; /* undock the surviving ship */
X     s2->whatdest = LEVEL_UNIV;
X     s2->destshipno = 0;
X     openshdata(&scrap_shdata);
X	putship(scrap_shdata, s2, s->destshipno);
X	close_file(scrap_shdata);
X	free(s2);
X    }
X
X
X
X if (s->whatorbits==LEVEL_PLAN) {
X
X     /* distribute poison over planet even if orbiting */
X   if (s->type==OTYPE_TOXWC) {
X	if (planet->conditions[TOXIC] > 100 - s->object.number)
X		planet->conditions[TOXIC] = 100;
X	else
X		planet->conditions[TOXIC] += s->object.number;
X
X	sprintf(buf,"Planetary toxin concentration is now %d.\n", 
X		planet->conditions[TOXIC]);
X		notify(Playernum, buf);
X   }
X
X   if (s->is_docked && s->whatdest==LEVEL_PLAN) {
X
X       if (sect->owner==Playernum) {
X		sect->popn += crewval;
X       } else if (sect->owner == 0) {
X		sect->owner = Playernum;
X		sect->popn += crewval;
X		planet->info[Playernum-1].numsectsowned++;
X		sprintf(buf,"Sector %.0f,%.0f Colonized.\n",s->xpos,s->ypos);
X		notify(Playernum, buf);
X       }
X 	planet->info[Playernum-1].resource += scrapval;
X 	planet->popn += crewval;
X 	planet->info[Playernum-1].destruct += destval;
X 	planet->info[Playernum-1].fuel += (int)fuelval;
X 	planet->info[Playernum-1].crystals += (int)xtalval;
X
X       opensectdata(&scrap_sectdata);
X       putsector(scrap_sectdata, sect, planet->sectormappos
X		 +((int)s->ypos*planet->Maxx+(int)s->xpos)*sizeof(sectortype));
X       close_file(scrap_sectdata);
X       free(sect);
X
X   }
X
X   openpdata(&scrap_pdata);
X   putplanet(scrap_pdata, planet, Stars[s->storbits]->planetpos[s->pnumorbits]);
X   close_file(scrap_pdata);
X   free(planet);
X }
X
X
X   if (s->is_docked && s->whatdest==LEVEL_PLAN) {
X	sprintf(buf,"\nScrapped.\n");
X		notify(Playernum, buf);
X   } else {
X	sprintf(buf,"\nDestroyed.\n");
X		notify(Playernum, buf);
X		}
X
X free(s);
X}
X
X
END_OF_FILE
if test 7618 -ne `wc -c <'server/scrap.c'`; then
    echo shar: \"'server/scrap.c'\" unpacked with wrong size!
fi
# end of 'server/scrap.c'
if test -f 'server/ships.h' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/ships.h'\" to \"'server/ships.h.orig'\"
  mv -f 'server/ships.h' 'server/ships.h.orig'
fi
echo shar: Extracting \"'server/ships.h'\" \(7935 characters\)
sed "s/^X//" >'server/ships.h' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X * smq@ucscb.ucsc.edu, mods by people in GB.c, enroll.dat.
X * Restrictions in GB.c.
X */
X
X
X#define STYPE_POD	0
X#define STYPE_SHUTTLE 	1
X#define STYPE_CARRIER   2
X#define STYPE_DREADNT	3
X#define STYPE_BATTLE 	4
X#define STYPE_INTCPT	5
X#define STYPE_CRUISER	6
X#define STYPE_DESTROYER 7
X#define STYPE_FIGHTER 	8
X#define STYPE_EXPLORER 	9
X#define STYPE_HABITAT 	10
X#define STYPE_STATION	11
X#define STYPE_ASS	12
X#define STYPE_CARGO 	13
X#define STYPE_TANKER 	14
X#define STYPE_GOD	15
X#define STYPE_MINE	16
X#define STYPE_MIRROR	17
X
X#define OTYPE_STELE	18
X#define OTYPE_GTELE	19
X#define OTYPE_TRACT	20
X#define OTYPE_AP	21
X#define OTYPE_CANIST	22
X#define OTYPE_VN	23
X#define OTYPE_BERS	24
X#define OTYPE_GOV	25
X#define OTYPE_OMCL	26
X#define OTYPE_TOXWC	27
X#define OTYPE_PROBE	28
X#define OTYPE_GR	29
X#define OTYPE_FACTORY	30
X#define OTYPE_TERRA	31
X#define OTYPE_BERSCTLC	32
X#define OTYPE_AUTOFAC	33
X#define OTYPE_TRANSDEV	34
X#define OTYPE_REPAIR	35
X#define OTYPE_PLANDEF	36
X
X#define ABIL_CARGO 	0
X#define ABIL_DESTCAP 	1
X#define ABIL_GUNS 	2
X#define ABIL_FUELCAP 	3
X#define ABIL_TECH 	4
X#define ABIL_MAXCREW 	5
X#define ABIL_ARMOR 	6
X#define ABIL_COST 	7
X#define ABIL_JUMP 	8
X#define ABIL_CANLAND	9
X#define ABIL_HASSWITCH	10
X#define ABIL_SPEED	11
X#define ABIL_DAMAGE	12
X#define ABIL_BUILD	13
X#define ABIL_CONSTRUCT	14
X#define ABIL_MOD	15
X#define ABIL_LASER	16
X#define ABIL_PROGRAMMED 17
X
X#define NUMSTYPES 	(OTYPE_PLANDEF+1)
X#define NUMABILS 	(ABIL_PROGRAMMED+1)
X
X#define SHIP_NAMESIZE	18
X
X
X
Xtypedef struct ship shiptype;
Xtypedef struct ship_new shiptype_new;
Xtypedef struct place placetype;
X
X
Xstruct ship {
X    float xpos,ypos;
X    float fuel,mass;
X    char name[SHIP_NAMESIZE];	    /* name of ship (optional) */
X    char class[SHIP_NAMESIZE];	    /* class of ship - designated by players */
X    char mission[64];			/* notes for each ship */
X    percent morale;			/* morale of the crew */
X    unsigned short command;		/* captain+staff leadership value */
X
X    int dummy1;
X
X    unsigned short destshipno;		/* destination ship # */
X    unsigned short nextship;		/* next ship in linked list */
X
X    percent armor;
X    percent guns;
X    percent size;
X
X    unsigned short max_crew;
X    unsigned short max_resource;
X    unsigned short max_destruct;
X    unsigned short max_fuel;
X    unsigned short max_speed;
X    unsigned short build_type;	/* for factories - type of ship it makes */
X    unsigned short build_cost;
X
X    int dummy2;
X    
X    float base_mass;
X    float tech;		/* technology rating */
X
X    unsigned short destruct;	 	/* stuff it's carrying */
X    unsigned short resource;
X    unsigned short popn;			/* crew */
X    unsigned short crystals;
X
X
X    struct a {		/* if the ship is a Space Mirror */
X		unsigned short shipno;	/* aimed at what ship */
X		char snum;		/* aimed at what star */
X		percent intensity;		/* intensity of aiming */
X		unsigned pnum : BITS_MAXPLANETS;  /* aimed at what planet */
X		unsigned level : 2;	/* aimed at what level */
X	} aimed_at;
X	
X	struct o2 {
X		short number;	/* for misc functions */
X		short number2;	/* again */
X		short number3;
X		short number4;  /* again */
X	} object;
X	
X	struct nv {
X		unsigned on : 1;    /* toggles navigate mode */
X		unsigned speed : 4; /* speed for navigate command */
X		unsigned turns : 15;/* number turns left in maneuver */
X		unsigned bearing : 9; /* course */
X		unsigned dummy : 3;
X	    } navigate;
X	
X	struct prot {
X		float maxrng;	       /* maximum range for autoshoot */
X		unsigned on	 :  1; /* toggle on/off */
X		unsigned planet  :  1; /* planet defender */
X 		unsigned self	 :  1; /* retaliate if attacked */
X 		unsigned evade	 :  1; /* evasive action */
X 		unsigned ship	 : 14; /* ship it is protecting */
X		unsigned dummy	 :  6;
X	    } protect;
X
X    	struct hd {
X    		unsigned int charge : 7;
X    		unsigned ready : 1;
X    		unsigned on : 1;
X    		unsigned has : 1;
X    		unsigned mounted : 1;	/* has crystal mounted */
X		unsigned dummy : 5;
X	    } hyper_drive;
X
X
X    unsigned owner : BITS_MAXPLAYERS;	/* owner of ship */
X    char storbits;		/* what star # orbits */
X    char deststar;		/* destination star */
X    unsigned destpnum : BITS_MAXPLANETS;	/* destination planet */
X    unsigned pnumorbits : BITS_MAXPLANETS;	/* # of planet if orbiting */
X    unsigned whatdest : 2;	/* where going (same as Dir) */
X    unsigned whatorbits : 2;	/* where orbited (same as Dir) */
X
X    unsigned damage : 7;		/* amt of damage */
X    unsigned rad : 7;			/* radiation level */
X    unsigned short retaliate;
X    unsigned short laser;
X    
X    unsigned type : 6;		/* what type ship is */
X    unsigned active: 1;			/* tells whether the ship is active */
X    unsigned is_alive : 1;	/* 1 bit: ship is alive */
X    unsigned mode : 1;
X    unsigned bombard : 1;	/* bombard planet we're orbiting */
X    
X    unsigned speed : 4;		/* what speed to travel at 0-9 */
X    unsigned is_cloaked : 1;	/* 1 bit: is cloaked ship */
X    unsigned is_sheep : 1;	/* 1 bit: is under influence of mind control */
X    unsigned is_docked : 1;	/* 1 bit: is landed on a planet or docked */
X    unsigned notified : 1; 	/* 1bit: has been notified of something */
X    unsigned is_examined : 1;	/* 1 bit: has been examined */
X    unsigned on : 1;		/* on or off */
X    unsigned short fire_laser;	/* retaliation strength for lasers */
X    unsigned dummy4 : 1;
X};
X
X
Xstruct place {		/* used in function return for finding place */
X    char snum;
X    char pnum;
X    short shipno;
X    shiptype *shipptr;
X    unsigned level : 2;	/* .level: same as Dir */
X    unsigned err : 1;		/* if error */
X    unsigned dummy : 13;
X};
X
X /* whether ship is an object or not */
X#define is_object(s) ((s)->type > STYPE_MIRROR)
X
X /* can takeoff & land, is mobile, etc. */
X#define speed_rating(s) ((s)->max_speed)
X
X /* has an on/off switch */
X#define has_switch(s) (Shipdata[(s)->type][ABIL_HASSWITCH])
X
X /* can bombard planets */
X#define can_bombard(s) \
X	(Shipdata[(s)->type][ABIL_GUNS] && ((s)->type != STYPE_MINE))
X
X/* can navigate */
X#define can_navigate(s) (Shipdata[(s)->type][ABIL_SPEED] > 0 && (s)->type != OTYPE_TERRA && (s)->type != OTYPE_VN)
X
X /* can aim at things. */
X#define can_aim(s) ((s)->type>=STYPE_MIRROR && (s)->type<=OTYPE_TRACT)
X
X /* macro for killing a ship.  !notified means we have not yet written it
X    to the dead_ship file.  */
X/* macros to get ship stats */
X#define Armor(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_ARMOR] : (s)->armor)
X#define Guns(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_GUNS] : (s)->guns)
X#define Laser(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_LASER] : (s)->laser)
X#define Max_crew(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_MAXCREW] : (s)->max_crew)
X#define Max_resource(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_CARGO] : (s)->max_resource)
X#define Max_fuel(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_FUELCAP] : (s)->max_fuel)
X#define Max_destruct(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_DESTCAP] : (s)->max_destruct)
X#define Max_speed(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_SPEED] : (s)->max_speed)
X#define Max_crystals(s) (15)
X#define Cost(s) ( ((s)->type==OTYPE_FACTORY) ? 2*(s)->build_cost*(s)->on + Shipdata[(s)->type][ABIL_COST ] : (s)->build_cost)
X#define Mass(s) ( ((s)->type==OTYPE_FACTORY) ? 100.0 : (s)->base_mass)
X#define Sight(s) ( ((s)->type==OTYPE_PROBE) || (s)->popn)
X#define Retaliate(s) ( (s)->retaliate)
X#define Size(s) ( ((s)->type==OTYPE_FACTORY) ? ship_size(s) : (s)->size)
X#define Repair(s) ( ((s)->type==OTYPE_FACTORY) ? (s)->on : Max_crew(s))
X
Xextern placetype Getplace();
Xextern char *Dispplace(),*Dispshiporbits(),*prin_ship_orbits(),
X	*prin_aimed_at(), *prin_ship_dest();
Xextern int Shipdata[NUMSTYPES][NUMABILS];
Xextern char Shipltrs[];
Xextern char *Shipnames[];
Xextern float tele_range(), gun_range(), getmass();
X
XEXTERN shiptype **ships;
XEXTERN shiptype *shipptr;
X
END_OF_FILE
if test 7935 -ne `wc -c <'server/ships.h'`; then
    echo shar: \"'server/ships.h'\" unpacked with wrong size!
fi
# end of 'server/ships.h'
echo shar: End of archive 8 \(of 9\).
cp /dev/null ark8isdone
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