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

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

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 11, Issue 44
Archive-name: gb3/Patch2f
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 6 (of 9)."
# Contents:  Docs/mount.doc client/map.c server/dock.c server/doship.c
#   server/name.c
# Wrapped by billr@saab on Tue Aug 28 08:54:57 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Docs/mount.doc' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'Docs/mount.doc'\" to \"'Docs/mount.doc.orig'\"
  mv -f 'Docs/mount.doc' 'Docs/mount.doc.orig'
fi
echo shar: Extracting \"'Docs/mount.doc'\" \(784 characters\)
sed "s/^X//" >'Docs/mount.doc' <<'END_OF_FILE'
XMOUNT			Galactic Bloodshed			MOUNT
X
X
XNAME
X  mount -- mount a crystal into a ship's hyper-drive.
X  dismount -- dismount a crystal from the drive.
X
XSYNTAX
X  mount
X  dismount
X
XDESCRIPTION
X  
X   Normally, a ship requires a waiting period before a hyperspace
Xjump can be executed. This requires powering up the drive for
Xsome period of time. However, the charge-up time can been bypassed
Xif a player has a crystal mounted. The effect of a crystal also
Xallows the ship to jump farther and more fuel efficiently than
Xfor a ship without a crystal mounted.
X
X   In order to mount a crystal, the player must change scope to the
Xship which is to have a crystal mounted. The ship must have a
Xcrystal on board. A crystal can be dismounted using the 'dismount'
Xcommand.
X
XSEE ALSO
X	crystal, order  
X
END_OF_FILE
if test 784 -ne `wc -c <'Docs/mount.doc'`; then
    echo shar: \"'Docs/mount.doc'\" unpacked with wrong size!
fi
# end of 'Docs/mount.doc'
if test -f 'client/map.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'client/map.c'\" to \"'client/map.c.orig'\"
  mv -f 'client/map.c' 'client/map.c.orig'
fi
echo shar: Extracting \"'client/map.c'\" \(4750 characters\)
sed "s/^X//" >'client/map.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. Restrictions in
X * GB_copyright.h. 
X *
X *	map.c -- display sector map of current planet 
X *
X *	plot_surface():	Plot as much of the planet surface as possible.
X *			If the planet surface is complete, return. Else
X *			set MAP to FALSE, and wait for the next packet.
X *
X *	plot_balance():	Try to synchronize with the last character that
X *			was output. Complete the current character, then
X *			the current line, then the current map. Clear
X *			MAP flag.
X *	bugs: Not clean if the packets become screwy. plot_balance has
X *	no way of recovering from errors. Starting the balance of the
X *	map with the last character in a row or the last character in
X *	the map might screw up everything. No testing for this case.
X *
X *	Version 1.1	25-Jul-90	Hubert Bartels
X *					hgb@catalina.opt-sci.arizona.edu
X *					Made modifications to complete
X *					maps.
X */
X
X#include "GB_copyright.h"
X#define S_X (stdscr->_maxx - NAMESIZE)
X#define S_Y (stdscr->_maxy - 1)
X#define Midx ((S_X - NAMESIZE)/2.0)
X#define Midy (S_Y /2.0)
X#define DISP_DATA 1
X
X#include <curses.h>
X#include <stdio.h>
X
X/*
X	Map completion code
X*/
X#define SHIFT_IN	0x10
X#define SHIFT_OUT	0x20
X
Xextern int MAP;			/* True if in map mode */
Xextern int s_in_out;		/* TRUE if this was to be a shiftin/out flag */
X				/* if not TRUE, then SHIFT_OUT or SHIFT_IN */
X				/* depending on the state of stand. */ 
Xextern int curY;		/* The current Y ( row), location */
Xextern int curX;		/* The current X ( col), location */
Xextern int Maxx;		/* The maximum X size */
Xextern int Maxy;		/* The maximum Y size */
Xextern char    *index(), *malloc();
Xextern int	have_inv;
X
Xplot_surface(t)
Xchar *t;
X{
X	register int x, y;
X	int stand, show;
X	char *u, *v;
X	extern int MAP;
X	extern int s_in_out;
X	extern int curX;
X	extern int curY;
X	extern int Maxx;
X	extern int Maxy;
X
X	clear();
X	u = t + 1;
X	/* get planet name */
X	v = index(u, ';');
X	*v = 0;
X	move(0, 9);
X	printw("`%s'\n   ", u);
X
X	u = v + 1;
X	v = index(u, ';');
X	*v = 0;
X	Maxx = atoi(u);
X
X	u = v + 1;
X	v = index(u, ';');
X	*v = 0;
X	Maxy = atoi(u);
X
X	u = v + 1;
X	v = index(u, ';');
X	*v = 0;
X	show = atoi(u);
X	for (x = 0; x < Maxx; x++) printw("%d", x / 10);
X	printw("\n   ");
X	for (x = 0; x < Maxx; x++) printw("%d", x % 10);
X	printw("\n");
X	u = v + 1;
X	for (y = 0; y < Maxy; y++) {
X		curY = y;
X		mvaddch(y + 3, 0, y / 10 + '0');
X		addch(y % 10 + '0');
X		for (x = 0; x < Maxx; x++) {
X			curX = x;
X			if( *u == '\0') {
X				MAP = TRUE;
X				s_in_out = TRUE;
X				refresh();
X				return;
X			}
X			if (*u++ == '0') stand = 0; else stand = 1;
X			if( *u == '\0') {
X				MAP = TRUE;
X				if( stand == 0)
X					s_in_out = SHIFT_OUT;
X				else
X					s_in_out = SHIFT_IN;
X				refresh();
X				return;
X			}
X			if (stand && have_inv) standout();
X			mvaddch(y + 3, x + 3, *u);
X			if (stand && have_inv) standend();
X			u++;
X		}
X	}
X	MAP = FALSE;
X	curY = curX = 0;
X	move(Maxy + 4, 0);
X	refresh();
X}
X/*
X	plot_balance tries to find out where the map was truncated,
X	and tries to continue from the last location written.
X
X	Version 1.0	25-Jul-90	HGB, modified from plot_surface.
X*/
Xplot_balance(t)
Xchar *t;
X{
X	register int x, y;
X	int stand;
X	char *u;
X	extern int MAP;
X	extern int s_in_out;
X	extern int curY;
X	extern int curX;
X	extern int Maxx;
X	extern int Maxy;
X/*
X	Check if we are supposed to be here.
X*/
X	if( MAP == FALSE) return;
X/*
X	Try to write the rest of the current row from the current buffer
X	also, we need to synchronize. If the first character is 0/1, this
X	is the standout/standin character. If the first character is not,
X	output this character.
X*/
X	u = t;
X	y = curY;
X	x = curX;
X/*
X	Synchronize. SHIFT_IN means we saw the standout flag, but
X	not the character. We draw the character, up the X counter,
X	and enter the balance of items loop for this row.
X*/	
X	if( s_in_out == SHIFT_IN && have_inv ) standout();
X	if( s_in_out != TRUE) {
X		mvaddch(y + 3, x + 3, *u);
X		if (s_in_out == SHIFT_IN && have_inv) standend();
X		curX++;
X	}
X	refresh();
X/*
X	Now, draw the rest of the line.
X*/
X	for( x = curX; x < Maxx; x++) {
X		if (*u == '0') stand = 0; else stand = 1;
X		u++;
X		if (stand && have_inv) standout();
X		mvaddch(y + 3, x + 3, *u);
X		if (stand && have_inv) standend();
X		u++;
X	}
X	refresh();
X	curY++;
X/*
X	Try to draw the balance of the map, now. We should be synchronized.
X*/
X	for (y = curY; y < Maxy; y++) {
X		mvaddch(y + 3, 0, y / 10 + '0');
X		addch(y % 10 + '0');
X		for (x = 0; x < Maxx; x++) {
X			if (*u == '0') stand = 0; else stand = 1;
X			u++;
X			if (stand && have_inv)
X				standout();
X			mvaddch(y + 3, x + 3, *u);
X			if (stand && have_inv)
X				standend();
X			u++;
X		}
X		refresh();
X	}
X	MAP = FALSE;
X	curX = curY = 0;
X	move(Maxy + 4, 0);
X	refresh();
X	return;
X}
END_OF_FILE
if test 4750 -ne `wc -c <'client/map.c'`; then
    echo shar: \"'client/map.c'\" unpacked with wrong size!
fi
# end of 'client/map.c'
if test -f 'server/dock.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/dock.c'\" to \"'server/dock.c.orig'\"
  mv -f 'server/dock.c' 'server/dock.c.orig'
fi
echo shar: Extracting \"'server/dock.c'\" \(13087 characters\)
sed "s/^X//" >'server/dock.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**  dock.c -- dock a ship
X**  and..... assault -- a very un-PC version of 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 dock_sectdata, dock_shdata, dock_pdata, dock_racedata;
Xint dock_stdata;
X
Xdock(Playernum,APcount, argn,args, Assault)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint Assault;	/* unfriendly dock */
X{
Xchar c;
Xshiptype *s,*s2,*s3;
Xplanettype *p;
Xsectortype *sect;
Xint boarders,oldspopn,olds2popn,dam,dam2,booby,
X	numdest=0,ship2no,shipno,x= -1,y= -1,i,mask;
Xint old2owner,sh, sh3;
Xint casualties, casualties2, casualty_scale;
Xfloat fuel,bstrength,b2strength,pris;
Xdouble Dist;
Xracetype *Race, *alien;
X
Xdock_sectdata = dock_shdata = dock_pdata = NEUTRAL_FD;
X
X
X		sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X		sscanf(args[2]+(args[2][0]=='#'),"%d",&ship2no);
X
X
X openshdata(&dock_shdata);
X  if (!getship(dock_shdata, &s, shipno)) {
X      notify(Playernum, "The ship wasn't found.\n");
X	close_file(dock_shdata);
X	return;
X  }
Xclose_file(dock_shdata);
X  if (testship(Playernum,s, shipno)) {
X      notify(Playernum, "Illegal format.\n");
X      free(s);
X      return;
X	}
X
X	if(!Assault) {
X  		if (s->is_docked) {
X			sprintf(buf,"Ship #%d is already docked.\n",shipno);
X			notify(Playernum, buf);
X			free(s);
X			return;
X  			}
X		} else if(s->is_docked) {
X			if(s->whatdest==LEVEL_PLAN) {
X				notify(Playernum, "Target ship is landed.\n");
X				free(s);
X				return;
X			} else if(!(s->whatdest==LEVEL_SHIP)) {
X				notify(Playernum, "Weird error..\n");
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		} 
X 	} else if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) { 
X	 free(s);
X	 return;
X	}
X
X
X	if(shipno==ship2no) {
X	    notify(Playernum, "You can't dock with yourself!\n");
X	    free(s);
X	    return;
X	}
X	
X
Xopenshdata(&dock_shdata);
X  if (!getship(dock_shdata, &s2, ship2no)) {
X      notify(Playernum, "The ship wasn't found.\n");
X	close_file(dock_shdata);
X	free(s);
X	return;
X  }
Xclose_file(dock_shdata);
X/*  if (testship(Playernum,s2, ship2no)) {
X      notify(Playernum, "Illegal format.\n");
X	free(s2);
X      	free(s);
X      	return;
X	}
X*/
X	
X  if (s2->is_docked) {
X	sprintf(buf,"Ship #%d is already docked.\n",ship2no);
X		notify(Playernum, buf);
X	free(s);
X	free(s2);
X	return;
X  }
X
X
X		Dist = sqrt((double)Distsq(s2->xpos, s2->ypos, s->xpos, s->ypos ) );
X		fuel = 0.05 + Dist * 0.025 * (Assault ? 2.0 : 1.0)*sqrt(s->mass);
X
X 	if (Dist > DIST_TO_DOCK) {
X	     sprintf(buf,"Ship #%d must be %.2f or closer to ship #%d.\n",
X			shipno, DIST_TO_DOCK, ship2no);
X		notify(Playernum, buf);
X	     free(s);
X	     free(s2);
X	     return;
X	} else if(s->is_docked && Assault) {
X/* first undock the target ship */
X		s->is_docked = 0;
X		s->whatdest==LEVEL_UNIV;
X		openshdata(&dock_shdata);
X		(void)getship(dock_shdata, &s3, s->destshipno);
X		s3->is_docked==0;
X		s3->whatdest==LEVEL_UNIV;
X		putship(dock_shdata, s3, s->destshipno);
X		free(s3);
X	}
X
X	if (fuel > s->fuel) {
X		sprintf(buf,"Not enough fuel.\n");
X			notify(Playernum, buf);
X		free(s);
X		free(s2);
X		return;
X	}
X		sprintf(buf,"Distance to %s #%d: %.2f.\n", s2->name, ship2no, Dist);
X		notify(Playernum, buf);
X		sprintf(buf,"This maneuver will take %.2f fuel (of %.2f.)\n\n",fuel,s->fuel);
X		notify(Playernum, buf);
X
X
X
X	if (s->type == STYPE_FIGHTER && s2->type == STYPE_CARRIER) {
X		/* docking fighters with a carrier */
X
X	if(s->whatorbits==LEVEL_PLAN) {
X     			openpdata(&dock_pdata);
X     			getplanet(dock_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]);
X			sh = p->ships;
X
X			if(sh == shipno) {
X				p->ships = s->nextship;
X				putplanet(dock_pdata, p, Stars[s->storbits]->planetpos[s->pnumorbits]);
X	    		} else {
X			openshdata(&dock_shdata);
X	    		while(sh != shipno){
X				(void)getship(dock_shdata, &s3, sh);
X				sh3 = sh;
X				sh = s3->nextship;
X				if(sh != shipno) free(s3);	/* don't free it if it is the s3 we want */
X	  			}
X	  		s3->nextship = s->nextship;
X	  		putship(dock_shdata, s3, sh3);
X			free(s3);
X	  		if(sh3 == ship2no) { /* s3 was actually s2! */
X			    free(s2);
X			    (void)getship(dock_shdata, &s2, sh3);
X			}
X	  		close_file(dock_shdata);
X
X
X		    }
X      			close_file(dock_pdata);
X		} else if(s->whatorbits==LEVEL_STAR) {
X     			openstardata(&dock_stdata);
X     			getstar(dock_stdata, &Stars[s->storbits], s->storbits);
X			sh = Stars[s->storbits]->ships;
X
X			if(sh == shipno) {
X			 	Stars[s->storbits]->ships = s->nextship;
X			 	putstar(dock_stdata, Stars[s->storbits], s->storbits);
X			} else {
X				openshdata(&dock_shdata);
X				while(sh != shipno){
X     					(void)getship(dock_shdata, &s3, sh);
X					sh3 = sh;
X					sh = s3->nextship;
X					if(sh != shipno) free(s3); /* don't free it if it is the s3 we want */
X    				}
X			s3->nextship = s->nextship;
X			putship(dock_shdata, s3, sh3);
X			free(s3);
X			if(sh3 == ship2no) { /* we just wrote it to disk! */
X			    free(s2);
X			    (void)getship(dock_shdata, &s2, s3);
X			}
X			close(dock_shdata);
X			    
X    			}
X
X     			close_file(dock_stdata);
X		} else {
X			notify(Playernum, "Illegal scope.\n");
X			free(s);
X			free(s2);
X			return;
X		}
X
X
X		s->fuel -= fuel;
X		s->mass -= fuel * MASS_FUEL;
X		s->is_docked = 1;
X		s->whatdest = LEVEL_SHIP;
X		s->whatorbits = LEVEL_UNIV;
X		s->destshipno = ship2no;
X		s->nextship = 0;
X
X		s->xpos = s2->xpos;
X		s->ypos = s2->ypos;
X
X		s->object.number = s2->object.number;
X		s->object.number4 = 1; /* docked with carrier */
X
X		 /* remove fighter from upper level linked list */
X		s2->object.number = shipno;
X		s2->object.number4 += 1; /* number of fighters docked */
X		s2->mass += s->mass;
X
X    	} else {
X	   if (s2->is_docked && !Assault) {
X		sprintf(buf,"ship #%d is already docked.\n",ship2no);
X			notify(Playernum, buf);
X		free(s);
X		free(s2);
X		return;
X	   }
X
X	if (Assault) {
X
X	    	openracedata(&dock_racedata);
X		getrace(dock_racedata, &alien, (int)s2->owner);
X		getrace(dock_racedata, &Race, Playernum); 
X		close_file(dock_racedata);
X
X	sscanf(args[3],"%d",&boarders);
X		if (boarders > MIN(s->popn, Max_crew(s2))
X		    || boarders <= 0) {
X			sprintf(buf,"Illegal number of boarders (max can be %d).\n",
X				MIN(s->popn, Max_crew(s2)));
X			notify(Playernum, buf);
X			free(alien);
X			free(s);
X			free(s2);
X			return;
X		}
X		old2owner = s2->owner;
X		s->popn -= boarders;
X		s->mass -= boarders * Race->mass;
X		sprintf(buf,"Boarding strength :%.2f       Defense strength: %.2f.\n", 
X		   bstrength = boarders * Race->fighters
X			* .01 * Race->tech
X			* .01 * (100 - s->damage),
X		/* 1 is dummy armor */
X
X		   b2strength = s2->popn * alien->fighters
X			* .01 * alien->tech
X			* .01 * (100 - s2->damage)
X				);
X	notify(Playernum, buf);
X
X	}
X
X
X	 /* the ship moves into position, regardless of success of attack */
X	s->fuel -= fuel;
X	s->mass -= fuel * MASS_FUEL;
X
X	s->xpos = s2->xpos + int_rand(-1,1);
X	s->ypos = s2->ypos + int_rand(-1,1);
X
X	if (Assault) {
X/* if the assaulted ship is docked, undock it first */
X	if(s2->is_docked && s2->whatdest==LEVEL_SHIP) {
X
X	    openshdata(&dock_shdata);
X	    getship(dock_shdata, &s3, s2->destshipno);
X	    s3->is_docked = 0;
X	    s3->whatdest = LEVEL_UNIV;
X	    s3->destshipno = 0;
X	    putship(dock_shdata, s3, s2->destshipno);
X	    close_file(dock_shdata);
X	    free(s3);
X
X	    s2->is_docked = 0;
X	    s2->whatdest = LEVEL_UNIV;
X	    s2->destshipno = 0;
X	}
X		 /* nuke both populations, ships */
X	casualty_scale = MIN(boarders, s2->popn);
X
Xif(b2strength) {	/* otherwise the ship surrenders */
X		casualties = int_rand(0, round_rand((float)casualty_scale * (b2strength+1.0) /
X				  (bstrength+1.0)));
X		casualties = MIN(boarders, casualties);
X		boarders -= casualties;
X
X		dam = int_rand(0, round_rand(25. * (b2strength+1.0)/ (bstrength+1.0)));
X	        dam = MIN(100, dam);
X		s->damage = MIN(100, s->damage+dam);
X		if (s->damage >= 100)	
X			kill_ship(Playernum, s);
X
X
X		   casualties2 = int_rand(0, round_rand((float)casualty_scale * (bstrength+1.0) / 
X				(b2strength+1.0)));
X		   casualties2 = MIN(s2->popn, casualties2);
X		   s2->popn -= casualties2;
X		   s2->mass -= casualties2 * alien->mass;
X			/* (their mass) */
X		   dam2 = int_rand(0,round_rand(25. * (bstrength+1.0)/(b2strength+1.0)));
X		   dam2 = MIN(100, dam2);
X		   s2->damage = MIN(100, s2->damage+dam2);
X		   if ( s2->damage >= 100) 
X			kill_ship(Playernum, s2);
X} else {
X		s2->popn = 0; booby = 0;
X/* do booby traps */
X		 /* check for boobytrapping */
X		if (!Max_crew(s2) && s2->destruct > 0)
X			booby = int_rand(0, 10*s2->destruct);
X			booby = MIN(100, booby);
X	}
X
X		   if ((s2->popn == 0) &&  s->is_alive && s2->is_alive) {
X				/* we got 'em */
X			s->is_docked = 1;
X			s->whatdest = LEVEL_SHIP;
X			s->destshipno = ship2no;
X
X			s2->is_docked = 1;
X			s2->whatdest = LEVEL_SHIP;
X			s2->destshipno = shipno;
X			old2owner = s2->owner;
X			s2->owner = Playernum;
X			s2->popn = boarders;
X			s2->mass += boarders * Race->mass;	/* our mass */
X		   } else {		/* retreat */
X			s->popn += boarders;
X			s->mass += boarders * Race->mass;
X		   }
X
X/* races find out about each other */
X	alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+5, 100);
X	Race->translate[old2owner-1] = MIN(Race->translate[old2owner-1]+5, 100);
X
X	if(!boarders && s2->popn) /* boarding party killed */
X		alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+25, 100);
X	if(s2->owner==Playernum)	/* captured ship */
X		Race->translate[old2owner-1] = MIN(Race->translate[old2owner-1]+25, 100);
X
X	openracedata(&dock_racedata);
X	putrace(dock_racedata, Race, 7);
X	putrace(dock_racedata, alien, 8);
X	close_file(dock_racedata);
X	free(alien);
X	free(Race);
X    } else {
X		s->is_docked = 1;
X		s->whatdest = LEVEL_SHIP;
X		s->destshipno = ship2no;
X
X		s2->is_docked = 1;
X		s2->whatdest = LEVEL_SHIP;
X		s2->destshipno = shipno;
X	}
X
X	if (Assault) {
X		sprintf(telegram_buf,"%s #%d ASSAULTED by ",
X			Shipnames[s2->type], ship2no);
X	         sprintf(buf,"%s #%d [%d] at %s\n", 
X			Shipnames[s->type], shipno, s->owner, prin_ship_orbits(s2));
X			str_cat(telegram_buf, buf);
X		sprintf(buf,"Your damage: %d%%, theirs: %d%%.\n", dam2, dam);
X			str_cat(telegram_buf, buf);
X		if (!Max_crew(s2) && s2->destruct) {
X		       sprintf(buf,"(Your boobytrap gave them %.0f%% damage.)\n",
X				booby);
X			str_cat(telegram_buf, buf);
X			sprintf(buf,"Their boobytrap gave you %.0f%% damage!)\n",
X				booby);
X			notify(Playernum, buf);
X		}
X		sprintf(buf,"Damage taken:  You: %d%% (now %d%%)\n", dam, s->damage);
X			notify(Playernum, buf);
Xif(!s->is_alive) {
X  sprintf(buf,"              YOUR SHIP WAS DESTROYED!!!\n");
X			notify(Playernum, buf);
X  sprintf(buf,"              Their ship DESTROYED!!!\n");
X		str_cat(telegram_buf, buf);
X}
X		sprintf(buf,"              Them: %d%% (now %d%%)\n",dam2,s2->damage);
X			notify(Playernum, buf);
Xif(!s2->is_alive) {
X  sprintf(buf,"              Their ship DESTROYED!!!  Boarders are dead.\n");
X			notify(Playernum, buf);
X  sprintf(buf,"              YOUR SHIP WAS DESTROYED!!!\n");
X		str_cat(telegram_buf, buf);
X}
X		if (s->is_alive) {
X			if (s2->owner==Playernum) {
X				sprintf(buf,"CAPTURED!\n");
X					str_cat(telegram_buf, buf);
X				sprintf(buf,"VICTORY! the ship is yours!\n");
X					notify(Playernum, buf);
X				if (boarders) {
X				  sprintf(buf,"%d boarders move in.\n", boarders);
X					notify(Playernum, buf);
X					}
X
X			} else if(s2->popn) {
X				sprintf(buf,"The boarding was repulsed; try again.\n");
X					notify(Playernum, buf);
X				sprintf(buf,"You fought them off!\n");
X					str_cat(telegram_buf, buf);
X			}
X		} else {
X			sprintf(buf,"The assault was too much for your bucket of bolts.\n");
X					notify(Playernum, buf);
X			sprintf(buf,"The assault was too much for their ship..\n");
X				str_cat(telegram_buf, buf);
X		}
X		if (s2->is_alive) {
X			if (!boarders) {
X				sprintf(buf,"Oh no! They killed your boarding party to the last man!\n");
X					notify(Playernum, buf);
X			}
X
X			if (!s->popn) {
X				sprintf(buf,"You killed all their crew!\n");
X				str_cat(telegram_buf, buf);
X			} 
X		} else {
X			sprintf(buf,"The assault weakened their ship too much!\n");
X				notify(Playernum, buf);				
X			sprintf(buf,"Your ship was weakened too much!\n");
X				str_cat(telegram_buf, buf);
X		}
X		sprintf(buf,"Casualties: Yours: %d     Theirs: %d\n", casualties2, casualties);
X			str_cat(telegram_buf, buf);
X		sprintf(buf,"Crew casualties: Yours: %d     Theirs: %d\n", casualties, casualties2);
X			notify(Playernum, buf);
X			if(!notify(old2owner, telegram_buf))
X			    push_message(TELEG_PLAYER_AUTO, old2owner, telegram_buf, TELEGRAM);
X	} else {
X		sprintf(buf,"%s #%d docked with %s #%d.\n",
X			Shipnames[s->type], shipno, 
X			Shipnames[s2->type], ship2no);
X			notify(Playernum, buf);
X		}
X
X	} 
X
X		s->notified = s2->notified = 0;
X	   	openshdata(&dock_shdata);
X		putship(dock_shdata, s, shipno);
X		putship(dock_shdata, s2, ship2no);
X	  	close_file(dock_shdata);
X		free(s2);
X		free(s);
X
X
X}
END_OF_FILE
if test 13087 -ne `wc -c <'server/dock.c'`; then
    echo shar: \"'server/dock.c'\" unpacked with wrong size!
fi
# end of 'server/dock.c'
if test -f 'server/doship.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/doship.c'\" to \"'server/doship.c.orig'\"
  mv -f 'server/doship.c' 'server/doship.c.orig'
fi
echo shar: Extracting \"'server/doship.c'\" \(17924 characters\)
sed "s/^X//" >'server/doship.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 * doship -- do one ship turn.
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 "doturn.h"
X#include "power.h"
X#include "buffers.h"
X#include <math.h>
X#include <strings.h>
X
X
Xdoship(shipno,ship)
Xint shipno;
Xshiptype *ship;
X{
X int sh,sh2,j,shfdata, doship_racedata;
X boolean trigger;
Xracetype *Race;
X
X/*ship is active */
X	ship->active = 1;
X
X if (ship->is_alive && ship->owner) {
X
X/* for debugging */
X	if(ship->popn > Max_crew(ship)) 
X			ship->popn = Max_crew(ship);
X	if(ship->destruct > Max_destruct(ship))
X			ship->destruct = Max_destruct(ship);
X	if(ship->fuel > (float)Max_fuel(ship))
X			ship->fuel = (float)Max_fuel(ship);
X
X/* upgrade factory tech (if off) */
X	if(ship->type==OTYPE_FACTORY && !ship->on) {
X		openshdata(&doship_racedata);
X		getrace(doship_racedata, &Race, ship->owner);
X		close_file(doship_racedata);
X		ship->tech = Race->tech;
X		free(Race);
X	}
X
X		/* repair radiation */
X      if (ship->rad) {
X	ship->active = 1;
X			/* irradiated ships are immobile.. */
X			/* kill off some people */
X		/* check to see if ship is active */
X		if(int_rand(1,100) <= ship->rad)
X			ship->active = 0;
X		ship->popn = round_rand(ship->popn * .80);
X		if (ship->rad >= (int)REPAIR_RATE)
X			ship->rad -= int_rand(0,(int)REPAIR_RATE);
X		else
X			ship->rad -= int_rand(0,ship->rad);
X      } else
X	   ship->active = 1;
X
X      if(!ship->popn && Max_crew(ship) && !ship->is_docked)
X	ship->whatdest = LEVEL_UNIV;
X
X
X      if (ship->whatorbits != LEVEL_UNIV
X	  && Stars[ship->storbits]->nova_stage>0) {
X		/* damage ships from supernovae */
X	ship->damage += 5*Stars[ship->storbits]->nova_stage/(Armor(ship)+1);
X	if (ship->damage >= 100) {
X		kill_ship(1, ship);
X		return;
X	}
X      }
X
X   if(ship->active)
X	Moveship(shipno, ship);
X
X	ship->size = ship_size(ship);	/* for debugging */
X
X	if(ship->whatorbits != LEVEL_UNIV) {
X/* printf("checking #%d\n",shipno); */
X		StarsInhab[ship->storbits] = 1;
X		setbit(Stars[ship->storbits]->inhabited, ship->owner);
X		setbit(Stars[ship->storbits]->explored, ship->owner);
X		if(ship->whatorbits == LEVEL_PLAN) {
X			planets[ship->storbits][ship->pnumorbits]->info[ship->owner-1].explored = 1;
X					}
X		}
X/* just making sure */	
X
X
X		/* add ships, popn to total count to add AP's */
X	Power[ship->owner-1].ships_owned++;
X	Power[ship->owner-1].resource += ship->resource;
X	Power[ship->owner-1].fuel += ship->fuel;
X	Power[ship->owner-1].destruct += ship->destruct;
X	Power[ship->owner-1].popn += ship->popn;
X
X	if (ship->whatorbits==LEVEL_UNIV) {
X		 Sdatanumships[ship->owner-1]++;
X		 Sdatapopns[ship->owner] += ship->popn;
X	} else {
X		starnumships[ship->storbits][ship->owner-1]++; 
X	         /* add popn of ships to popn */
X	        starpopns[ship->storbits][ship->owner-1] += ship->popn;
X		 /* set inhabited for ship */
X		StarsInhab[ship->storbits] = 1;
X		setbit(Stars[ship->storbits]->inhabited, ship->owner);
X		setbit(Stars[ship->storbits]->explored, ship->owner);
X	}
X
X
X
X
X	if (ship->active) {
X
X		/* bombard the planet */
X	   if (can_bombard(ship) && ship->bombard
X			&& ship->whatorbits==LEVEL_PLAN
X			&& ship->whatdest==LEVEL_PLAN
X			&& ship->deststar== ship->storbits
X			&& ship->destpnum== ship->pnumorbits) {
X				/* ship bombards planet */
X		Stinfo[ship->storbits][ship->pnumorbits].inhab = 1;
X	   }
X
X
X
X	       /* repair ship by the amount of crew it has */
X	       /* industrial complexes can repair (robot ships
X		  and offline factories can't repair) */
X	if (ship->damage && Repair(ship)) {
X             reg int drep,cost;
X             reg float maxrep;
X             maxrep = REPAIR_RATE;
X	       /* stations repair for free, and ships docked with them */
X	     if (ship->type==STYPE_STATION || !Shipdata[ship->type][ABIL_BUILD]
X		|| (ship->is_docked && ship->whatdest==LEVEL_SHIP && 
X		 ships[ship->destshipno]->type==STYPE_STATION) )
X		  cost = 0.0;
X	     else {
X		 maxrep *= (float)ship->popn / (float)Max_crew(ship);
X		 cost = 0.005 * maxrep * Cost(ship);
X	     }
X
X	     if (cost > ship->resource) 
X              { 
X	     drep = (int)maxrep * ship->resource / cost;
X                ship->resource = 0; 
X		} else { 
X	      	ship->resource -= cost; 
X		drep = (int)maxrep;
X	      }
X
X	     ship->mass -= cost * MASS_RESOURCE;
X
X	     if (drep > ship->damage) ship->damage = 0;
X                else 
X		  ship->damage -= drep;
X	 }
X
X/* compute the mass of the ship (there is a wierd bug that changes
X   mass the wrong way) */
X	ship->mass = ((ship->type==OTYPE_TOXWC) ? 1.0 : Mass(ship))
X	    + (float)ship->popn*races[ship->owner-1]->mass
X	    + (float)ship->resource*MASS_RESOURCE
X  	    + (float)ship->fuel*MASS_FUEL
X	    + (float)ship->destruct*MASS_DESTRUCT;
X
X     switch (ship->type) {
X
X      case OTYPE_CANIST:
X	   if (ship->whatorbits == LEVEL_PLAN && !ship->is_docked) { short *t;
X	      if (--ship->object.number) {
X		if ( Stinfo[ship->storbits][ship->pnumorbits].temp_add < -90 )
X		  Stinfo[ship->storbits][ship->pnumorbits].temp_add = -100;
X		else  
X		  Stinfo[ship->storbits][ship->pnumorbits].temp_add -= 10;
X	      } else {	/* timer expired; destroy canister */
X		   reg int j=0;
X
X		  kill_ship(1, ship);
X		  sprintf(telegram_buf,"Notice from /%s/%s\n", 
X			   Stars[ship->storbits]->name, 
X			   Stars[ship->storbits]->pnames[ship->pnumorbits]);
X		  sprintf(buf, "Canister of dust previously covering this planet has dissipated.\n");
X			str_cat(telegram_buf, buf);
X		  for (j=1; j<=Num_races; j++)
X		       if (planets[ship->storbits][ship->pnumorbits]->info[j-1].numsectsowned) 
X				push_message(TELEG_PLAYER_AUTO, j, telegram_buf, TELEGRAM);
X	      }
X	   }
X	   break;
X
X      case STYPE_MIRROR:
X	  switch (ship->aimed_at.level) {
X	   case LEVEL_SHIP: /* ship aimed at is a legal ship now */
X			  /* if in the same system */
X	    if ( (ship->whatorbits==LEVEL_STAR || ship->whatorbits==LEVEL_PLAN)
X		   && (ships[ship->aimed_at.shipno]!=NULL)
X		   && (ships[ship->aimed_at.shipno]->whatorbits==LEVEL_STAR ||
X			ships[ship->aimed_at.shipno]->whatorbits==LEVEL_PLAN)
X		   && ship->storbits == ships[ship->aimed_at.shipno]->storbits 
X		   && ships[ship->aimed_at.shipno]->is_alive ) {
X			    shiptype *s;
X			      reg int i;
X			      float range;
X				s = ships[ship->aimed_at.shipno];
X		  range = sqrt(Distsq(ship->xpos, ship->ypos,s->xpos,s->ypos));
X		  i = int_rand(0,round_rand((2./((float)Size(s)))
X		    *(float)ship->aimed_at.intensity/(range/PLORBITSIZE+1.0)));
X	  sprintf(telegram_buf, "Space Mirror #%d %s [owner %d] aimed at ",
X		  shipno, ship->name, ship->owner);
X		str_cat(telegram_buf, buf);
X	  sprintf(buf, "%s #%d %s [owner %d] !\n",Shipnames[s->type],
X		  ship->aimed_at.shipno, s->name, s->owner);
X		str_cat(telegram_buf, buf);
X				s->damage += i;
X			    if(i) {
X	  sprintf(buf, "\n%d%% damage done.\n",i);
X		str_cat(telegram_buf, buf); 
X			    }
X				if (s->damage >= 100) {
X	  sprintf(buf, "%s #%d DESTROYED!!!\n",Shipnames[s->type],
X		  ship->aimed_at.shipno);
X					kill_ship(ship->owner, s);
X				      }
X
X push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM);
X push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf, TELEGRAM);
X			}
X		break;
X	   case LEVEL_PLAN: { reg short *t; 
X			      reg int i;
X			      float range;
X		  range = sqrt(Distsq(ship->xpos, ship->ypos,
X			Stars[ship->storbits]->xpos
X		       +planets[ship->storbits][ship->pnumorbits]->xpos,
X			Stars[ship->storbits]->ypos
X		       +planets[ship->storbits][ship->pnumorbits]->ypos));
X
X		  if ( range > PLORBITSIZE ) 
X			  i = PLORBITSIZE * ship->aimed_at.intensity/range;
X		  else
X			  i = ship->aimed_at.intensity;
X
X		i = round_rand(.01*(100.0-(float)ship->damage)*(float)i);
X		  Stinfo[ship->storbits][ship->aimed_at.pnum].temp_add += i;
X
X		} break;
X
X	   case LEVEL_STAR: { float range;
X		  /* have to be in the same system as the star; otherwise
X		      it's not too fair.. */
X		if (ship->aimed_at.snum>0 && 
X			ship->aimed_at.snum < Sdata.numstars &&
X			ship->whatorbits > LEVEL_UNIV &&
X			ship->aimed_at.snum == ship->storbits)
X		    Stars[ship->aimed_at.snum]->stability += random()&01;
X		} break;
X	   case LEVEL_UNIV:
X		break;
X	}
X	break;
X     case STYPE_GOD:
X		/* gods have infinite power.... heh heh heh */
X	ship->fuel = Max_fuel(ship);
X	ship->popn = Max_crew(ship);
X	ship->destruct = Max_destruct(ship);
X	ship->resource = Max_resource(ship);
X	break;
X
X     case OTYPE_AP:	/* atmospheric processor */
X		/* if landed on planet, change conditions to be like race */
X	if (ship->is_docked && ship->whatdest==LEVEL_PLAN && ship->on) {
X		int j,d,a;planettype *p;
X		p = planets[ship->storbits][ship->pnumorbits];
X		if (ship->fuel >= 3.0) {
X			ship->fuel -= 3.0;
X			for (j=RTEMP+1; j<=OTHER; j++) {
X				if ( (d = races[ship->owner-1]->conditions[j] - 
X				      p->conditions[j]) != 0) {
X	   
X				  a = sgn(d)*int_rand(-1,
X           round_rand(MIN(3,d*sgn(d))
X	   *(float)ship->popn/(float)Shipdata[OTYPE_AP][ABIL_MAXCREW]));
X				  if (p->conditions[j] + a < 0)
X					p->conditions[j] = 0;
X				  else if (p->conditions[j] + a > 100)
X					p->conditions[j] = 100;
X				  else p->conditions[j] += a;
X				}
X			}
X		} else if (!ship->notified) {
X			ship->notified = 1;
X			msg_OOF(ship, shipno, telegram_buf);
X		}
X	}
X	break;
X
X     case OTYPE_VN:	/* Von Neumann machine */
X	do_VN(ship,shipno);
X	break;
X
X     case OTYPE_BERS:	/* Berserker */
X		/* (turn done in doplanet() ) */
X	break;
X
X     case STYPE_ASS:
X	 /* "indimidate" the planet below, for enslavement purposes. */
X	if (ship->whatorbits==LEVEL_PLAN)
X		Stinfo[ship->storbits][ship->pnumorbits].intimidated = 1;
X	break;
X
X     case OTYPE_OMCL:
X	 /* orbital mind control laser */
X	if (ship->aimed_at.level==LEVEL_PLAN && ship->on &&
X	    ship->speed==1) {
X		planets[ship->aimed_at.snum][ship->aimed_at.pnum]
X			->is_sheep = 1;
X	}
X	break;
X
X     case STYPE_HABITAT:{ reg int add;
X	 /* habitats multiply some resources inside them. */
X	add = ship->resource *
X		((float)ship->popn / Shipdata[STYPE_HABITAT][ABIL_MAXCREW]) 
X	         * (100 - ship->damage) * 0.0005;
X	if (ship->resource+add > Shipdata[STYPE_HABITAT][ABIL_CARGO])
X		add = Shipdata[STYPE_HABITAT][ABIL_CARGO] - ship->resource;
X	ship->resource += add;
X	ship->mass += add * MASS_RESOURCE;
X	add = ship->popn * races[ship->owner-1]->birthrate * 
X		(100 - ship->damage) * 0.002;
X	if (ship->popn+add > Shipdata[STYPE_HABITAT][ABIL_MAXCREW])
X		add = Shipdata[STYPE_HABITAT][ABIL_MAXCREW] - ship->popn;
X	ship->popn += add;
X	ship->mass += add * races[ship->owner-1]->mass;
X	} break;
X
X     case STYPE_POD:
X      if (ship->notified) {
X    	/* we just arrived at this system -- explode */
X    	/* or, we are floating in space with no fuel -- just die */
X    	reg int i,f;
X
X	f = -1;
X    	kill_ship(1, ship);
X    	if (ship->whatorbits==LEVEL_STAR) {
X
X		  i = int_rand(0,Stars[ship->storbits]->numplanets - 1);
X
X		     if(int_rand(1,4)==1)
X    			f = i;
X
X    	  sprintf(telegram_buf, "Bulletin\n\nSpore pod #%d has warmed and exploded.\n",shipno);
X     	  if (f != -1) {
X    		sprintf(buf,"A spore has landed on planet %s.\n",Stars[ship->storbits]->pnames[f]);
X    		Stinfo[ship->storbits][f].Thing_add = ship->owner;
X    			/* so doplanet does not pass over it */
X		StarsInhab[ship->storbits] = 1;
X    		setbit(Stars[ship->storbits]->inhabited,ship->owner);
X    		setbit(Stars[ship->storbits]->explored, ship->owner);
X    		planets[ship->storbits][f]->info[ship->owner-1].explored = 1;
X    	  } else {
X    		sprintf(buf,"No spores have survived.\n");
X    	  }
X			str_cat(telegram_buf, buf);
X	push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf); 
X    	  sprintf(telegram_buf,"BULLETIN!\n\n A spore pod has exploded in system /%s.\n",
X			Stars[ship->storbits]->name);
X    	  sprintf(buf, "Spores may have drifted to planets here.\n");
X			str_cat(telegram_buf, buf);
X    	  for (i=1; i<=Num_races; i++)
X    		if (i!=ship->owner && isset(Stars[ship->storbits]->inhabited,i))
X	push_message(TELEG_PLAYER_AUTO, i, telegram_buf, TELEGRAM);
X
X   	}
X     }
X     break;
X
X     default:
X	break;
X    }
X
X   }
X
X } else if (!ship->is_alive && !ship->notified) {
X	 /* ship is dead -- add to shipfree file, remove from all lists. */
X	 /* if notified, this means it's already been deleted and written. */
X/*	printf("destroyed ship #%d\n",shipno);*/
X	if (ship->type == OTYPE_VN || ship->type==OTYPE_BERS) {
X
X		 /* add ship to VN shit list */
X
X		if (ship->object.number3>0 && ship->object.number3<=Num_races 
X		    && ship->object.number3 != ship->owner) {
X		 Sdata.VN_hitlist[ship->object.number3-1] += ship->object.number;
X
X		  /* keep track of where these VN's were shot up */
X
X		 if (Sdata.VN_index1[ship->object.number3-1] == -1)
X			 /* there's no star in the first index */
X			Sdata.VN_index1[ship->object.number3-1] = ship->storbits;
X		 else if (Sdata.VN_index2[ship->object.number3-1] == -1)
X			 /* there's no star in the second index */
X			Sdata.VN_index2[ship->object.number3-1] = ship->storbits;
X		 else {
X			 /* pick an index to supplant */
X		    if (random()&01)
X			Sdata.VN_index1[ship->object.number3-1] = ship->storbits;
X		    else
X			Sdata.VN_index2[ship->object.number3-1] = ship->storbits;
X		 }
X		 printf("\t-- added %d ships, player %d\n",
X				ship->object.number, ship->object.number3);
X		}
X	}
X	ship->notified = 1;
X	makeshipdead(shipno);
X    }
X
X}
X
X
Xdomine(shipno, detonate)
Xint shipno;
Xint detonate;
X{
X int sh,sh2,j,shfdata,pdata,rdata,hits;
X boolean trigger;
X shiptype *s, *ship;
X planettype *planet;
X racetype *r;
X
X openshdata(&shfdata);
X getship(shfdata, &ship, shipno);
X close_file(shfdata);
X 
Xif(ship->is_alive && ship->owner)
Xswitch(ship->type) {
X      case STYPE_MINE:
X		/* check around and see if we should explode. */
X	   if (ship->on || detonate) {
X		int rad=0; int dam=0; double xd,yd,range; int p;
X
X		switch(ship->whatorbits) {
X		  case LEVEL_STAR:
X		    sh = Stars[ship->storbits]->ships;
X		    break;
X		  case LEVEL_PLAN:
X		    openpdata(&pdata);
X		    getplanet(pdata, &planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]);
X		    sh = planet->ships;
X		    close_file(pdata);
X		    free(planet);
X		    break;
X		  default:
X		    free(ship);
X		    return;
X		    break;
X		}
X		
X	     sh2 = sh;
X	      /* traverse the list, look for ships that 
X			are closer than the trigger radius... */
X/*printf("found mine  sh = %d rad = %d\n",sh,rad);*/
X		rad = 0;
X		if(!detonate) {
X		openracedata(&rdata);
X		getrace(rdata, &r, ship->owner);
X		close_file(rdata);
X
X		openshdata(&shfdata);
X		    while (sh && !rad) {
X		getship(shfdata, &s, sh);		
X			getship(shfdata, &s, sh);		
X			if(s->is_docked && s->whatdest==LEVEL_PLAN) {
X				xd = ship->xpos;
X				yd = ship->ypos;
X			} else {
X				xd = s->xpos - ship->xpos;
X				yd = s->ypos - ship->ypos;
X			}
X			range = sqrt(xd*xd + yd*yd);
X				
X		if( !isset(r->allied, s->owner) && 
X		   (s->owner != ship->owner) && 
X		   ( (int)range <= ship->object.number) )
X			 rad = 1;
X		else
X			 sh = s->nextship;
X
X		free(s);
X	        }
X		close_file(shfdata);
X		free(r);
X	    } else
X		rad = 1;
X/*printf("rad = %d\n",rad);*/
X	     if (rad) {
X		  char telegram_not[1000];
X		kill_ship(ship->owner, ship);
X		sprintf(telegram_buf, "Mine #%d triggered at %s\n",
X				shipno,prin_ship_orbits(ship));
X
X		/* I have made the blast radius equal to the trigger radius.*/
X		/* -R. */
X
X		sh = sh2 ;   /* Make sh start from beginning of the list */
X		openshdata(&shfdata);
X		while (sh) {
X			getship(shfdata, &s, sh);		
X			if(s->is_docked && s->whatdest==LEVEL_PLAN) {
X				xd = ship->xpos;
X				yd = ship->ypos;
X			} else {
X				xd = s->xpos - ship->xpos;
X				yd = s->ypos - ship->ypos;
X			}
X			range = sqrt(xd*xd + yd*yd);
X			if(!detonate)
X			trigger = (int_rand(1,100)<= 2 * Size(s));
X
X		   if (s->is_alive && sh != shipno &&
X		     (detonate || (range <= ship->object.number && trigger))) {
X
X		     if (!ship->mode) {
X			 /* radiation mine */
X
X			hits =MIN(ship->destruct,
X				  (int)(ship->destruct/(range/100.0+1.0)));
X			rad = MAX(0, 20*(hits - Armor(s)) / Size(s));
X
X			rad = int_rand(0, rad);
X			rad = MIN(rad ,100);
X
X			if (rad > s->rad) {
X			s->rad = MAX(rad, s->rad);
X			if(int_rand(1,100) <= s->rad)
X			    s->active = 0;
X			
X			     sprintf(telegram_not, "%s #%d %s irradiated by mine #%d\n", Shipnames[s->type], sh, s->name, shipno);
X			     sprintf(buf," at %s - dosage %d%%\n",prin_ship_orbits(s), rad);
X			str_cat(telegram_not, buf);
X	push_message(TELEG_PLAYER_AUTO, s->owner, telegram_not, TELEGRAM);
X			     sprintf(buf,"%s #%d [%d] received %d%% dosage\n",
X				Shipnames[s->type], sh, 
X					s->owner, rad);
X		str_cat(telegram_buf, buf);
X			}
X
X		      } else {
X			int totaldam;	
X			 /* explosive mine */
X
X			hits =MIN(ship->destruct,
X				  (int)(ship->destruct/(range/100.0+1.0)));
X			dam = MAX(0, 20*(hits - Armor(s)) / Size(s));
X			
X			dam = int_rand(0, dam);
X			dam = MIN(100, dam);
X			if (dam) {
X			   s->damage = MIN(100, s->damage+dam);
X			   sprintf(telegram_not, "%s #%d %s damaged by mine #%d\n",
X					 Shipnames[s->type], sh, s->name, shipno);
X			   sprintf(buf," at %s - %d %% damage", prin_ship_orbits(ship), dam);
X					str_cat(telegram_not, buf);
X			   sprintf(buf,"%s #%d [%d] received %d%% damage\n",
X				Shipnames[s->type], sh, 
X				s->owner, dam);
X				str_cat(telegram_buf, buf);
X			   if (s->damage >= 100) {
X				kill_ship(ship->owner, s);
X				sprintf(buf, " %s #%d DESTROYED\n",Shipnames[s->type],sh);
X					str_cat(telegram_not, buf);
X				sprintf(buf,"\t--DESTROYED\n");
X					str_cat(telegram_buf, buf);
X			   }
X			   if(!notify(s->owner, telegram_not))
X			   push_message(TELEG_PLAYER_AUTO, s->owner, telegram_not, TELEGRAM);
X			}
X		       }
X
X			putship(shfdata, s, sh);		
X		     }
X
X		     sh = s->nextship;
X			free(s);
X		}
X		close_file(shfdata);
X	     }
X		if(!notify(ship->owner, telegram_buf))
X		push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf,
X			     TELEGRAM); 
X
X		openshdata(&shfdata);
X		putship(shfdata, ship, shipno);
X		close_file(shfdata);
X	    }
X	   break;
X	 default:
X	   break;
X       }
Xfree(ship);
X}
X
END_OF_FILE
if test 17924 -ne `wc -c <'server/doship.c'`; then
    echo shar: \"'server/doship.c'\" unpacked with wrong size!
fi
# end of 'server/doship.c'
if test -f 'server/name.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/name.c'\" to \"'server/name.c.orig'\"
  mv -f 'server/name.c' 'server/name.c.orig'
fi
echo shar: Extracting \"'server/name.c'\" \(17264 characters\)
sed "s/^X//" >'server/name.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 * name.c -- rename something to something else
X* announce.c -- make announcements in the system you currently in.
X*			You must be inhabiting that system for your message to sent.
X*			You must also be in that system (and inhabiting) to receive announcements.
X* page.c -- send a message to a player requesting his presence in a system. 
X*/
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "races.h"
X#include "ships.h"
X#include "buffers.h"
X#include <ctype.h>
X#include <signal.h>
X#include <strings.h>
X#include <time.h>
Xint name_shdata,name_stardata, name_racedata, name_pdata;
Xint i;
X
Xchar msg[1024];
Xstruct tm *current_tm;/* for watching for next update */
Xlong clk;
X
Xgive(Playernum, APcount, argn, args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint who, sh;
Xshiptype *ship;
Xplanettype *planet;
Xracetype *Race, *alien;
X
XGetPlayer(args[1], &who, &alien);
X   if (who < 1 || who > Numraces() ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
X
Xopenracedata(&name_racedata);
Xgetrace(name_racedata, &Race, Playernum);
Xclose_file(name_racedata);
X
X/* check to see if both players are mutually allied */
Xif(!(isset(Race->allied, who) && isset(alien->allied, Playernum))) {
X      notify(Playernum, "You two are not mutually allied.\n");
X      free(Race);
X      free(alien);
X      return;
X}
Xsscanf(args[2]+(args[2][0]=='#'), "%d", &sh);
X
X		openshdata(&name_shdata);
X		if(!getship(name_shdata, &ship, sh)) {
X		    notify(Playernum, "Illegal ship number.\n");
X		    close_file(name_shdata);
X		    free(Race);
X		    free(alien);
X		    return;
X		}
X		close_file(name_shdata);
X
X                if(ship->owner != Playernum || !ship->is_alive) {
X		    DontOwnErr(Playernum, sh);
X		    free(ship);
X		    free(Race);
X		    free(alien);
X		    return;
X		}
Xif(ship->type == STYPE_POD) {
X    notify(Playernum, "You cannot change the ownership of spore pods.\n");
X    free(ship);
X    free(Race);
X    free(alien);
X    return;
X}
X
Xif(ship->popn && !Race->God) {
X	notify(Playernum, "You can't give this ship away while it has crew on board.\n");
X	free(ship);
X	free(Race);
X	free(alien);
X	return;
X	}
X
Xswitch(ship->whatorbits) { 
X	case LEVEL_UNIV:
X		if(!enufAP(Playernum, Sdata.AP[Playernum-1], APcount)) {
X		    free(Race);
X		    free(alien);
X		    free(ship);
X		    return;
X		    }
X		break;
X	default:
X		if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) {
X		    free(Race);
X		    free(alien);
X		    free(ship);
X		    return;
X		    }
X			break;
X	}
X
Xopenshdata(&name_shdata);
Xship->owner = who;
Xputship(name_shdata, ship, sh);
Xclose_file(name_shdata);
X
X/* set inhabited/explored bits */
Xswitch(ship->whatorbits) {
X  case LEVEL_UNIV:
X    break;
X  case LEVEL_STAR:
X    free(Stars[ship->storbits]);
X    openstardata(&name_stardata);
X    getstar(name_stardata, &(Stars[ship->storbits]), ship->storbits);
X    setbit(Stars[ship->storbits]->inhabited, who);
X    setbit(Stars[ship->storbits]->explored, who);
X    putstar(name_stardata, Stars[ship->storbits], ship->storbits);
X    close_file(name_stardata);
X    break;
X  case LEVEL_PLAN:
X    free(Stars[ship->storbits]);
X    openstardata(&name_stardata);
X    getstar(name_stardata, &(Stars[ship->storbits]), ship->storbits);
X    setbit(Stars[ship->storbits]->inhabited, who);
X    setbit(Stars[ship->storbits]->explored, who);
X    putstar(name_stardata, Stars[ship->storbits], ship->storbits);
X    close_file(name_stardata);
X
X    openpdata(&name_pdata);
X    getplanet(name_pdata, &planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]);
X    planet->info[who-1].explored = 1;
X    putplanet(name_pdata, planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]);
X    close_file(name_pdata);
X	free(planet);
X
X    break;
X  default:
X    notify(Playernum, "Something wrong with this ship's scope.\n");
X	free(ship);
X    free(Race);
X    free(alien);
X    return;
X    break;
X}
X
Xswitch(ship->whatorbits) { 
X	case LEVEL_UNIV:
X		deductAPs(Playernum, APcount, 0, 1);
X		free(Race);
X		free(alien);
X		free(ship);
X		return;
X		break;
X	default:
X		deductAPs(Playernum,APcount, Dir[Playernum-1].snum, 0);
X		break;
X	}
X
X
Xnotify(Playernum, "Owner changed.\n");
Xsprintf(buf, "%s [%d] gave you %s #%d at %s.\n", Race->name, Playernum,
X	Shipnames[ship->type], sh, prin_ship_orbits(ship));
Xnotify(who, buf);
Xpush_message(TELEG_PLAYER_AUTO, who, buf, TELEGRAM);
X
Xsprintf(buf, "%s [%d] gives %s [%d] a ship.\n", Race->name, alien->name);
X
Xfor(i=1; i<=Numraces(); i++)
X    push_message(TELEG_PLAYER_AUTO, who, buf, TRANSFER);
X
Xfree(ship);
Xfree(Race);
Xfree(alien);
X
X}
X
X
Xpage(Playernum, APcount0, argn, args)
Xint Playernum;
Xint APcount0;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint i, who, to_block, dummy, APcount;
Xracetype *Race, *alien;
X
XAPcount = APcount0;
Xto_block = 0;
Xif(!strncmp(args[1], "block", strlen(args[1]))) {
X    to_block = 1;
X    notify(Playernum, "Paging alliance block.\n");
X} else {
X   GetPlayer(args[1], &who, &alien);
X   if (who < 1 || who > Numraces() ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
XAPcount *= !alien->God;
Xfree(alien);
X}
X
X	switch(Dir[Playernum-1].level) {
X		case LEVEL_UNIV:
X			sprintf(buf, "You can't make pages at universal scope.\n");
X			notify(Playernum, buf);
X			break;
X		default:
X			openstardata(&name_stardata);
X			free(Stars[Dir[Playernum-1].snum]);
X		getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum);
X			close_file(name_stardata);
X			if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) {
X			    free(Race);
X			    return;
X		}
X
X		openracedata(&name_racedata);
X		getrace(name_racedata, &Race, Playernum); 
X		close_file(name_racedata);
X
X		sprintf(buf, "%s page(s) you from the %s star system.\n",
X			Race->name, Stars[Dir[Playernum-1].snum]->name);
X		free(Race);
X
X		if(to_block) {
X		  dummy = (Blocks[Playernum-1].invite &
X			      Blocks[Playernum-1].pledge);
X		  for(i=1; i<=Numraces(); i++)
X		      if(isset(dummy, i) && i!=Playernum)
X			  notify(i, buf);
X	      } else
X			notify(who, buf);
X
X			notify(Playernum, "Request sent.\n");
X			break;
X		}
X	deductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0);
X}
X
Xsend_message(Playernum, APcount0, argn, args)
Xint Playernum;
Xint APcount0;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint who, i, j, to_block, dummy, APcount;
Xracetype *Race, *alien;
X
X    APcount = APcount0;
X    Num_races = Numraces();
X
Xto_block = 0;
Xif(!strncmp(args[1], "block", strlen(args[1]))) {
X    to_block = 1;
X    notify(Playernum, "Sending message to alliance block.\n");
X} else {
X    GetPlayer(args[1], &who, &alien);
X   if (who < 1 || who > Num_races ) {
X	sprintf(buf,"No such player.\n");
X		notify(Playernum, buf);
X	return;
X   }
XAPcount *= !alien->God;
Xfree(alien);
X}
X
X	switch(Dir[Playernum-1].level) {
X		case LEVEL_UNIV:
X			sprintf(buf, "You can't send messages from universal scope.\n");
X			notify(Playernum, buf);
X			return;
X			break;
X
X		case LEVEL_SHIP:
X			sprintf(buf, "You can't send messages from ship scope.\n");
X			notify(Playernum, buf);
X			return;
X			break;
X
X		default:
X			openstardata(&name_stardata);
X			free(Stars[Dir[Playernum-1].snum]);
X			getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum);
X			close_file(name_stardata);
X			if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount))
X			    return;
X			break;
X		    }
X
Xopenracedata(&name_racedata);
Xgetrace(name_racedata, &Race, Playernum); 
Xclose_file(name_racedata);
X
X			/* send the message */
X	sprintf(msg, "From %s [%d]: ", Race->name, Playernum);
X	       
X/* put the message together */
X		for(j=2; j < argn; j++)	
X			{
X			sprintf(buf, "%s ", args[j]);
X			strcat(msg, buf);			
X			}
X/* post it */
X		sprintf(buf, "%s has sent you a telegram. Use `read' to read it.\n", Race->name);
X		if(to_block) {
X		  dummy = (Blocks[Playernum-1].invite &
X			      Blocks[Playernum-1].pledge);
X		  sprintf(buf, "%s [%d] sends a message to alliance block.\n",
X			  Race->name, Playernum);
X		  for(i=1; i<=Num_races; i++) {
X		      if(isset(dummy, i) && i!=Playernum) {
X			 notify(i, buf);
X		          push_message(Playernum, i, msg, TELEGRAM); 
X		      }
X		      push_message(TELEG_PLAYER_AUTO, i, buf, TRANSFER);
X		  }
X		  } else {
X		  notify(who, buf);
X		  push_message(Playernum, who, msg, TELEGRAM); 
X
X		openracedata(&name_racedata);
X		  getrace(name_racedata, &alien, who);
X
X		  sprintf(buf, "%s [%d] sends a message to %s [%d].\n",
X			  Race->name, Playernum, alien->name, who);
X
X		  for(i=1; i<=Num_races; i++)
X		      push_message(TELEG_PLAYER_AUTO, i, buf, TRANSFER);
X
X		  /* translation modifier increases */
X		  alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+2, 100);
X		  putrace(name_racedata, alien);	
X		  close_file(name_racedata);
X		  free(alien);
X	      }
X
X		free(Race);
X		notify(Playernum, "Message sent.\n");
XdeductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0);
X}
X
Xread_messages(Playernum, APcount, argn, args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint i;
X  i = strlen(args[1]);
X
X    if(argn==1 || !strncmp("telegram", args[1], i))
X	teleg_read(Playernum, TELEGRAM);
X    else if(!strncmp("news", args[1], i)) {
X	notify(Playernum, CUTE_MESSAGE);
X	notify(Playernum, "\n----------           Politics        ----------\n");
X	teleg_read(Playernum, DECLARATION);
X	notify(Playernum, "\n----------          War Stories      ----------\n");
X	teleg_read(Playernum, COMBAT);
X	notify(Playernum, "\n----------	 Wheelin' and Dealin'  ----------\n");
X	teleg_read(Playernum, TRANSFER);
X	notify(Playernum, "\n----------         Classifieds       ----------\n");
X	teleg_read(Playernum, ANNOUNCE);
X    } else
X	notify(Playernum, "Read what?\n");
X   }
X
X
Xannounce(Playernum, APcount, argn, args, broadcast)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint broadcast;
X{
Xint i, j;
Xracetype *r, *Race;
X
Xopenracedata(&name_racedata);
Xgetrace(name_racedata, &Race, Playernum); 
Xclose_file(name_racedata);
X
Xswitch(Dir[Playernum-1].level) {
X	case LEVEL_UNIV:
X		sprintf(buf, "You can't make announcements at universal scope.\n");
X			notify(Playernum, buf);
X		break;
X	default:
X		openstardata(&name_stardata);
X		free(Stars[Dir[Playernum-1].snum]);
X		getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum);
X		close_file(name_stardata);
X		if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) {
X		    free(Race);
X		    return;
X
X		    }
X	if(!(!!isset(Stars[Dir[Playernum-1].snum]->inhabited, Playernum) || Race->God)) {
X			sprintf(buf, "You do not inhabit this system or have diety privileges.\n");
X			notify(Playernum, buf);
X			free(Race);
X			return;
X		}
X
Xif(!broadcast)
X	sprintf(msg, "%s : ", Race->name);
Xelse
X	sprintf(msg, "%s [%d] > ", Race->name, Playernum);
X
X	Num_races = Numraces();
X
X		for(j=1; j < argn; j++)	
X			{
X			sprintf(buf, "%s ", args[j]);
X			strcat(msg, buf);			
X			}
X			strcat(msg, "\n");
X
X	for(i=1; i<=Num_races; i++) 
X		if(i != Playernum) {
X		openracedata(&name_racedata);
X		getrace(name_racedata, &r, i); 
X		close_file(name_racedata);
X
X	if((broadcast && !r->gag) || (Dir[i-1].level != LEVEL_UNIV && (Dir[i-1].snum == Dir[Playernum-1].snum) 
X			&&  (!!isset(Stars[Dir[Playernum-1].snum]->inhabited, i) || Race->God)))
X	    notify(i, msg);
X		free(r);
X	    }
X
X		break;
X	}
X
X	deductAPs(Playernum,APcount, Dir[Playernum-1].snum, 0);
Xfree(Race);
X}
X
X
Xmotto(Playernum, APcount, argn, args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{ 
Xint i;
Xchar temp[128];
X
Xsprintf(buf, "%s", args[1]);
X		for(i=2; i < argn; i++)	
X			{
X			sprintf(temp, " %s", args[i]);
X			strcat(buf, temp);			
X			}
X
X	sprintf(Blocks[Playernum-1].motto, "%s", buf);
X	Putblock(Blocks);
X	notify(Playernum, "Done.\n");
X}
X
Xname(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xchar *ch;
Xregister int i, s, spaces;
Xboolean check=0;
Xshiptype *ship;
Xstartype *star;
Xplanettype *p;
Xchar string[1024];
Xchar temp[128];
Xracetype *Race;
X
Xname_stardata = NEUTRAL_FD;
X
Xif(!isalnum(args[2][0]) || argn < 3) {
X		notify(Playernum, "Illegal name format.\n");
X		return;
X		}
X
Xsprintf(buf, "%s", args[2]);
X		for(i=3; i < argn; i++)	
X			{
X			sprintf(temp, " %s", args[i]);
X			strcat(buf, temp);			
X			}
X
Xsprintf(string, "%s", buf);
X
X	i=strlen(args[0]);
X
X  	/* make sure there are no ^'s or '/' in name, 
X		also make sure the name has at least 1 character in it */
X  ch = string;
X  spaces = 0;
X  while (*ch!='\0') {
X	  check |= ((!isalnum(*ch) && !(*ch==' ')) || (*ch=='/') );
X	  ch++;
X	  if(*ch==' ') spaces++;
X	}
X
X	if(spaces==strlen(buf)) {	
X		notify(Playernum, "Illegal name.\n");
X		return;
X		}
X
X  if (strlen(buf) < 1 || check) {
X	sprintf(buf, "Illegal name %s.\n", check ? "form" : "length" );
X		notify(Playernum, buf);
X	return;
X  }
X
X        if (!strncmp(args[1],"ship",i)) {
X		if(Dir[Playernum-1].level == LEVEL_SHIP) {
X		openshdata(&name_shdata);
X		getship(name_shdata, &ship, Dir[Playernum-1].shipno);
X
X		sprintf(ship->name, "%s", buf);
X		putship(name_shdata, ship, Dir[Playernum-1].shipno);
X		close_file(name_shdata);
X			notify(Playernum, "Name set.\n");
X			free(ship);
X			return;
X		} else {
X			notify(Playernum, "You have to 'cs' to a ship to name it.\n");
X			return;
X		}
X        } else if (!strncmp(args[1],"class",i)) {
X		if(Dir[Playernum-1].level == LEVEL_SHIP) {
X		openshdata(&name_shdata);
X		getship(name_shdata, &ship, Dir[Playernum-1].shipno);
X		close_file(name_shdata);
X	if(ship->type != OTYPE_FACTORY) {
X		notify(Playernum, "You are not at a factory!\n");
X		free(ship);
X		return;
X		}
X	if(ship->on) {
X		notify(Playernum, "This factory is already on line.\n");
X		free(ship);
X		return;
X		}
X
X		sprintf(ship->class, "%s", buf);
X		openshdata(&name_shdata);
X		putship(name_shdata, ship, Dir[Playernum-1].shipno);
X		close_file(name_shdata);
X			notify(Playernum, "Class set.\n");
X			free(ship);
X			return;
X		} else {
X			notify(Playernum, "You have to 'cs' to a factory to name the ship class.\n");
X			return;
X		}
X        } else if (!strncmp(args[1], "block", i)) {
X/* name your alliance block */
X	sprintf(Blocks[Playernum-1].name, "%s", buf);
X	Putblock(Blocks);
X	notify(Playernum, "Done.\n");
X	}else if (!strncmp(args[1],"star",i)) {
X
X		if(Dir[Playernum-1].level == LEVEL_STAR) {
X			openracedata(&name_racedata);
X			getrace(name_racedata, &Race, Playernum);
X			close_file(name_racedata);
X		if (!Race->God) {
X		        notify(Playernum, "Only dieties may name a star.\n");
X			free(Race);
X			return;
X					}
X			free(Race);
X/* got to get all stars, to stop cheaters */
X			openstardata(&name_stardata);
X			for (s=0; s<Sdata.numstars; s++) {
X			    free(Stars[s]);
X			    getstar(name_stardata, &Stars[s], s);
X				}
X			close_file(name_stardata);
X
X			for(s=0; s<Sdata.numstars; s++) {
X				if(s!=Dir[Playernum-1].snum)
X					if(!strncmp(Stars[s]->name, buf, strlen(Stars[s]->name)))
X						{
X			notify(Playernum, 
X				"Thats not fair trying to name a star that! 50 APs deducted for cheating!!!\n");
X						return;
X						}
X				}
X
X
X/* check to see if there are any other stars with this name - stops cheaters */
X	
X
Xsprintf(Stars[Dir[Playernum-1].snum]->name, "%s", buf);
X			openstardata(&name_stardata);
X			putstar(name_stardata, Stars[Dir[Playernum-1].snum], 
X			Dir[Playernum-1].snum);
X		close_file(name_stardata);
X		} else {
X			notify(Playernum, "You have to 'cs' to a star to name it.\n");
X			return;
X		}
X        } else if (!strncmp(args[1],"planet",i)) {
X		if(Dir[Playernum-1].level == LEVEL_PLAN) {
X		    	free(Stars[Dir[Playernum-1].snum]);
X		    	openstardata(&name_stardata);
X			getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum);
X			close_file(name_stardata);
X
X			openracedata(&name_racedata);
X			getrace(name_racedata, &Race, Playernum);
X			close_file(name_racedata);
X
X			if (!Race->God && !MostAPs(Playernum,Stars[Dir[Playernum-1].snum])) {
X	  			notify(Playernum,"You don't have the most AP's in that system.\n");
X	  			free(Race);
X	  			return;
X				}
X				free(Race);
X
X		for(s=0; s<Stars[Dir[Playernum-1].snum]->numplanets; s++)
X			if(!strncmp(Stars[Dir[Playernum-1].snum]->pnames[s], buf, 
X				strlen(Stars[Dir[Playernum-1].snum]->pnames[s])))
X				{
X				notify(Playernum, 
X					"Sorry, that name is already taken. 50 APs deducted for cheating!!!\n");
X				return;
X				}
X
X
Xsprintf(Stars[Dir[Playernum-1].snum]->pnames[Dir[Playernum-1].pnum], "%s", buf);
X			openstardata(&name_stardata);
X			putstar(name_stardata, Stars[Dir[Playernum-1].snum],  Dir[Playernum-1].snum);
X			close_file(name_stardata);
X		deductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0);
X
X		} else {
X			notify(Playernum, "You have to 'cs' to a planet to name it.\n");
X			return;
X		}
X        } else if (!strncmp(args[1],"race",i)) {
X		openracedata(&name_racedata);
X		getrace(name_racedata, &Race, Playernum);
X		sprintf(Race->name, "%s", buf);
X		putrace(name_racedata, Race);
X		close_file(name_racedata);
X		free(Race);
X	} else {
X		notify(Playernum, "I don't know what you mean.\n");
X		return;
X	}	
X
X}
X
X
Xint MostAPs(Playernum,s)
Xint Playernum;
Xstartype *s;
X{
X register int i,t = 0;
X
X  for (i=0; i<MAXPLAYERS; i++)
X     if (s->AP[i] >= t)
X	  t = s->AP[i];
X
X  return (s->AP[Playernum-1] == t);
X
X}
X
X
END_OF_FILE
if test 17264 -ne `wc -c <'server/name.c'`; then
    echo shar: \"'server/name.c'\" unpacked with wrong size!
fi
# end of 'server/name.c'
echo shar: End of archive 6 \(of 9\).
cp /dev/null ark6isdone
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