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,§,
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,§,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, §, 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