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

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

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 11, Issue 43
Archive-name: gb3/Patch2e
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 5 (of 9)."
# Contents:  server/build.c server/fire.c server/map.c
# Wrapped by billr@saab on Tue Aug 28 08:54:56 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'server/build.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/build.c'\" to \"'server/build.c.orig'\"
  mv -f 'server/build.c' 'server/build.c.orig'
fi
echo shar: Extracting \"'server/build.c'\" \(28337 characters\)
sed "s/^X//" >'server/build.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 * build -- build a ship
X */
X
X#include "GB_copyright.h"
X
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "shipdata.h"
X#include "buffers.h"
X#include <curses.h>
X#include <setjmp.h>
X#include <signal.h>
X
Xint build_shdata,build_pdata,build_sectdata,sh_data_file, build_racedata;
X
Xmake_mod(Playernum, APcount, argn, args, mode)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint mode;
X{
Xint i, value;
Xchar shipc;
Xshiptype *dirship;
Xfloat getmass(), cost();
Xracetype *Race;
X
Xif(Dir[Playernum-1].level != LEVEL_SHIP) {
X    notify(Playernum, "You have to change scope to a factory to program it.\n");
X    return;
X}
X
X     openshdata(&build_shdata);
X     if (!getship(build_shdata, &dirship, Dir[Playernum-1].shipno)) {
X		sprintf(buf,"Illegal dir value.\n");
X		notify(Playernum, buf);
X		close_file(build_shdata);
X		return;
X	}
X	close_file(build_shdata);
X	if (testship(Playernum,dirship, Dir[Playernum-1].shipno))
X		{
X			free(dirship);
X			return;
X		}
Xif(dirship->type != OTYPE_FACTORY) {
X    notify(Playernum, "That is not a factory.\n");
X    free(dirship);
X    return;
X}
X
Xif(dirship->on && argn > 1) {
X    notify(Playernum, "This factory is already online.\n");
X    free(dirship);
X    return;
X}
X
Xopenracedata(&build_racedata);
Xgetrace(build_racedata, &Race, Playernum);
Xclose_file(build_racedata);
X
X
Xif(mode==0) {
Xif(argn<2) {	/* list the current settings for the factory */
Xif(!dirship->build_type) {
X	notify(Playernum, "No ship type specified.\n");
X	free(dirship);
X	free(Race);
X	return;
X	}
X
Xnotify(Playernum, "    - Current production specs -\n");
Xsprintf(buf, "  	   Ship type: %s\n", Shipnames[dirship->build_type]);
Xnotify(Playernum, buf);
Xsprintf(buf, "	       class: %s\n", dirship->class);
Xnotify(Playernum, buf);
Xsprintf(buf, "	        tech: %.1f\n", dirship->tech);
Xnotify(Playernum, buf);
Xsprintf(buf, "	       armor: %d\n", dirship->armor);
Xnotify(Playernum, buf);
Xsprintf(buf, "	        guns: %d\n", dirship->guns);
Xnotify(Playernum, buf);
Xsprintf(buf, "	        crew: %d\n", dirship->max_crew);
Xnotify(Playernum, buf);
Xsprintf(buf, "	    max fuel: %d\n", dirship->max_fuel);
Xnotify(Playernum, buf);
Xsprintf(buf, " 	   max cargo: %d\n", dirship->max_resource);
Xnotify(Playernum, buf);
Xsprintf(buf, "        max destruct: %d\n", dirship->max_destruct);
Xnotify(Playernum, buf);
Xsprintf(buf, " 	   max speed: %d\n\n", dirship->max_speed);
Xnotify(Playernum, buf);
X
Xif(dirship->hyper_drive.has)
X	notify(Playernum, "	Equipped with hyperdrive.\n");
Xelse
X	notify(Playernum, "	Not equipped with hyperdrive.\n");
X
Xif(Shipdata[dirship->build_type][ABIL_LASER]) {
X	if(dirship->laser)
X		notify(Playernum, "	Equipped with combat lasers.\n");
X	else
X		notify(Playernum, "	Not equipped with combat lasers.\n");
X}
X
Xsprintf(buf, "    Cost: %dr  Base Mass: %.1f \n    Size: %d\n", dirship->build_cost, dirship->base_mass,
X		dirship->size);
Xnotify(Playernum, buf);
Xsprintf(buf, "  Status: %s\n\n", (dirship->on ? "Online" : "Offline") );
Xnotify(Playernum, buf);
X
Xfree(dirship);
Xfree(Race);
Xreturn;
X}
X
Xshipc = args[1][0];
X
X    i=0;
X    while ((Shipltrs[i]!=shipc) && (i<NUMSTYPES)) i++;
X
Xif (i>=NUMSTYPES || (i==STYPE_POD && !Race->Thing) ) {
X	sprintf(buf, "Illegal ship letter.\n");
X	notify(Playernum, buf);
X	free(dirship);
X	free(Race);
X	return;
X    } else if (Race->tech < Shipdata[i][ABIL_TECH] && !Race->God) {
X	sprintf(buf,"You don't have enough technology to build one of those.\n");
X	notify(Playernum, buf);
X	free(dirship);
X	free(Race);
X	return;
X    } 
X
Xif(Shipdata[i][ABIL_BUILD] != Shipdata[OTYPE_FACTORY][ABIL_CONSTRUCT]) {
X    notify(Playernum, "This kind of ship does not require a factory to construct.\n");
X    free(dirship);
X    free(Race);
X    return;
X}
X
Xdirship->build_type = i;
Xdirship->armor = Shipdata[i][ABIL_ARMOR];
Xdirship->guns = Shipdata[i][ABIL_GUNS];
Xdirship->max_crew = Shipdata[i][ABIL_MAXCREW];
Xdirship->max_resource = Shipdata[i][ABIL_CARGO];
Xdirship->max_fuel = Shipdata[i][ABIL_FUELCAP];
Xdirship->max_destruct = Shipdata[i][ABIL_DESTCAP];
Xdirship->max_speed = Shipdata[i][ABIL_SPEED];
Xdirship->hyper_drive.has = Shipdata[i][ABIL_JUMP];
Xdirship->laser = 0;
X
Xdirship->size = ship_size(dirship);
X
Xsprintf(dirship->class, "mod %d", Dir[Playernum-1].shipno);
X
Xsprintf(buf, "Factory designated to produce %ss.\n", Shipnames[i]);
Xnotify(Playernum, buf);
X
X} else if(mode==1) {
X
Xif(!dirship->build_type) {
X	notify(Playernum, "No ship design specified. Use 'make <ship type>' first.\n");
X	free(dirship);
X	free(Race);
X	return;
X}
X
Xif(argn<2) {
X    notify(Playernum, "You have to specify the characteristic you wish to modify.\n");
X    free(dirship);
X    free(Race);
X    return;
X} 
X
Xif(argn==3)
X	   sscanf(args[2], "%d", &value);
Xelse
X	value = 0;
X
Xif(value < 0) {
X    notify(Playernum, "That's a ridiculous setting.\n");
X    free(dirship);
X    free(Race);
X    return;
X}
X
Xif(Shipdata[dirship->build_type][ABIL_MOD]) {
X
Xif(!strncmp(args[1], "armor", strlen(args[1]))) {
X    dirship->armor = MIN(value, 100);
X} else if(!strncmp(args[1], "guns", strlen(args[1]))) {
X    dirship->guns = MIN(value, 1000);
X} else if(!strncmp(args[1], "crew", strlen(args[1]))) {
X    dirship->max_crew = MIN(value, 10000);
X} else if(!strncmp(args[1], "cargo", strlen(args[1]))) {
X    dirship->max_resource = MIN(value, 10000);
X} else if(!strncmp(args[1], "fuel", strlen(args[1]))) {
X    dirship->max_fuel = MIN(value, 10000);
X} else if(!strncmp(args[1], "destruct", strlen(args[1]))) {
X   dirship->max_destruct = MIN(value, 10000);
X} else if(!strncmp(args[1], "speed", strlen(args[1]))) {
X    dirship->max_speed = MAX(1,MIN(value, 9));
X} else if(!strncmp(args[1], "hyperdrive", strlen(args[1]))) {
X	if (dirship->build_type == STYPE_SHUTTLE) {
X		notify(Playernum, "Shuttle's can't have hyperdrive.\n");
X		free(dirship);
X		free(Race);
X		return;
X	} else
X	    dirship->hyper_drive.has = !dirship->hyper_drive.has;
X} else if(!strncmp(args[1], "laser", strlen(args[1]))) {
X	if(Race->tech < TECH_LASER) {
X		sprintf(buf, "You need a technology level of %.1f to mount lasers.\n", TECH_LASER);
X		notify(Playernum, buf);
X		free(dirship);
X		free(Race);
X		return;
X	}
X	if(Shipdata[dirship->build_type][ABIL_LASER])
X    		dirship->laser = !dirship->laser;
X		else {
X		notify(Playernum, "That ship cannot be fitted with combat lasers.\n");
X		free(dirship);
X		free(Race);
X		return;
X		}
X} else {
X    notify(Playernum, "That characteristic either doesn't exist or can't be modified.\n");
X    free(dirship);
X    free(Race);
X    return;
X}
X
X} else {
X    if(!strncmp(args[1], "hyperdrive", strlen(args[1]))) {
X	dirship->hyper_drive.has = !dirship->hyper_drive.has;
X        } else {
X	    notify(Playernum, "You may only modify hyperdrive installation on this kind of ship.\n");
X	    free(dirship);
X	    free(Race);
X	    return;
X	}
X}
X
X} else {
X    notify(Playernum, "Weird error.\n");
X    free(dirship);
X    free(Race);
X    return;
X}
X/* compute how much it's going to cost to build the ship */
X
Xif(cost(Playernum, dirship, dirship->tech) > 65535.0) {
X    notify(Playernum, "Woah!! YOU CHEATER!!!  The max cost allowed is 65535!!! I'm Telllllllling!!!\n");
X    free(dirship);
X    free(Race);
X    return;
X}
X
Xdirship->build_cost = (int)cost(Playernum, dirship, dirship->tech);
Xsprintf(buf, "The current cost of the ship is %d resources.\n",
X	dirship->build_cost);
Xnotify(Playernum, buf);
Xdirship->size = ship_size(dirship);
Xdirship->base_mass = getmass(dirship);
Xsprintf(buf, "The current base mass of the ship is %.1f - size is %d.\n",
X	dirship->base_mass, dirship->size);
X
X		openshdata(&build_shdata);
X		putship(build_shdata, dirship, Dir[Playernum-1].shipno);
X		close_file(build_shdata);
Xfree(dirship);
Xfree(Race);
X
X}
X
X
Xbuild(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint j,i,x= -1 ,y= -1 ,shipno, mask;
Xint load_fuel,load_crew,picked=0,cost,sh,found;
Xfloat fraction;
Xchar c,shipc;
Xplanettype *planet;
Xsectortype *sect;
Xshiptype s,*s2,*dirship;
XFILE *fd;
Xchar temp[128];
Xfloat getmass();
Xracetype *Race;
X
Xbuild_shdata = build_pdata = build_sectdata = NEUTRAL_FD;
X
X if (Dir[Playernum-1].level==LEVEL_PLAN  && argn > 1) {
X	if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) {
X	    return;
X 	} else {
X     		openpdata(&build_pdata);
X     		getplanet(build_pdata,&planet, Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X		close_file(build_pdata);
X		shipc = args[1][0];
X	    }
X } else if (Dir[Playernum-1].level==LEVEL_SHIP) {
X     openshdata(&build_shdata);
X     if (!getship(build_shdata, &dirship, Dir[Playernum-1].shipno)) {
X		sprintf(buf,"Illegal dir value.\n");
X		notify(Playernum, buf);
X		close_file(build_shdata);
X		return;
X	}
X	close_file(build_shdata);
X	if (testship(Playernum,dirship, Dir[Playernum-1].shipno))
X		{
X		    free(dirship);
X			return;
X		}
X
X 	if (Shipdata[dirship->type][ABIL_CONSTRUCT]==0) {
X		sprintf(buf,"This ship cannot be used to construct other ships.\n");
X		notify(Playernum, buf);
X		free(dirship);
X		return;
X	}
X
X	if(dirship->type==OTYPE_FACTORY) {
X		if(!dirship->on) {
X			notify(Playernum, "This factory is not on line.\n");
X			free(dirship);
X			return;
X			}
X
X		if(dirship->damage) {
X			notify(Playernum, "This factory cannot produce ships until the damage is zero.\n");
X			free(dirship);
X			return;
X			}
X
X		if(!dirship->popn) {
X			notify(Playernum, "This factory doesn't have any crew!\n");
X			free(dirship);
X			return;
X			}
X
X		shipc = Shipltrs[dirship->build_type];
X	} else
X		shipc = args[1][0];
X
X	if (dirship->is_docked && dirship->type != OTYPE_FACTORY) {
X		if (dirship->whatdest==LEVEL_PLAN)
X			{
X			sprintf(buf,"This ship is landed.\n");
X		notify(Playernum, buf);
X			} else {
X			sprintf(buf,"There is already a ship docked here (#%d).\n",
X					dirship->destshipno);
X		notify(Playernum, buf);
X			}
X		free(dirship);
X		return;
X	}
X
X	 /* check stars, sdata for APs */
X 	if (dirship->whatorbits==LEVEL_UNIV) {
X	 	if (!enufAP(Playernum,Sdata.AP[Playernum-1], APcount))
X			{
X			free(dirship);
X			return;
X			}
X 	} else if (dirship->whatorbits==LEVEL_STAR) {
X	 	if (!enufAP(Playernum,Stars[dirship->storbits]->AP[Playernum-1], APcount))
X			{
X			free(dirship);
X			return;
X			}
X	}
X
X/* if we are at a factory, get the planet data too */
X	if(dirship->type==OTYPE_FACTORY) {
X     		openpdata(&build_pdata);
X     		getplanet(build_pdata,&planet,
X		Stars[dirship->deststar]->planetpos[dirship->destpnum]);
X		close_file(build_pdata);
X	}
X } else {
X	sprintf(buf,"You can't build anything here.\n");
X		notify(Playernum, buf);
X	return;
X }
X
Xopenracedata(&build_racedata);
Xgetrace(build_racedata, &Race, Playernum);
Xclose_file(build_racedata);
X
Xif(shipc=='?') {
X     if (argn==2) {
X	notify(Playernum, "     - Default ship parameters -\n");
X       sprintf(buf, "ltr             ship   crg  arm dstcap guns fcap tech ^crew speed cost\n");
X	notify(Playernum, buf);
X       for (i=0; i<NUMSTYPES; i++)
X	  if (Race->tech >= Shipdata[i][ABIL_TECH] || Race->God)
X	    if ((i==STYPE_POD && Race->Thing) || i!=STYPE_POD)
X	      if(Shipdata[i][ABIL_PROGRAMMED]) {
X	      sprintf(buf, " %c%18s%6d%5d%7d%5d%5d%5d%5d%6d%6d\n",
X		  Shipltrs[i], Shipnames[i],
X		  Shipdata[i][ABIL_CARGO],
X		  Shipdata[i][ABIL_ARMOR], Shipdata[i][ABIL_DESTCAP],
X		  Shipdata[i][ABIL_GUNS], Shipdata[i][ABIL_FUELCAP], 
X		  Shipdata[i][ABIL_TECH], Shipdata[i][ABIL_MAXCREW], 
X		  Shipdata[i][ABIL_SPEED], Shipdata[i][ABIL_COST] );
X	notify(Playernum, buf);
X	}
X     } else {
X	/* description of an individual object, ala' examine */
X
X	i = 0;
X        while ((Shipltrs[i]!=args[2][0]) && (i<NUMSTYPES)) 
X		i++;
X        if (i<0 || i>=NUMSTYPES || (i==STYPE_POD && !Race->Thing)
X	    || (Race->tech < Shipdata[i][ABIL_TECH] && !Race->God) ) {
X		sprintf(buf, "You can't examine that ship type (yet).\n");
X		notify(Playernum, buf);
X	} else if(!Shipdata[i][ABIL_PROGRAMMED]) {
X	  sprintf(buf, "This type of ship has not been programmed.\n");
X	  notify(Playernum, buf);
X	} else {
X    	   if ((fd=fopen(EXAM_FL, "r"))==NULL) {
X		perror(EXAM_FL);
X		free(Race);
X		return;
X    	   } else {
X   	      /* look through ship data file */
X	sprintf(buf, "\n");
X    	      for (j=0; j<=i; j++)
X       	         while (fgetc(fd) != '~') ;
X		   /* give report */
X    	      while ((c=fgetc(fd)) != '~') {
X		sprintf(temp, "%c", c);
X		strcat(buf, temp);
X		}
X	notify(Playernum, buf);
X    	      fclose(fd) ;
X	   }
X	}
X     }
X
X     free(Race);
X     return;
X }
X
X    i=0;
X    while ((Shipltrs[i]!=shipc) && (i<NUMSTYPES)) i++;
X
Xif (i>=NUMSTYPES || (i==STYPE_POD && !Race->Thing) ) {
X	sprintf(buf, "Illegal ship letter.\n");
X	notify(Playernum, buf);
X	free(planet);
X	free(Race);
X	return;
X    } else if (Race->tech < Shipdata[i][ABIL_TECH] && !Race->God) {
X	sprintf(buf,"You don't have enough technology to build one of those.\n");
X	notify(Playernum, buf);
X	free(planet);
X	free(Race);
X	return;
X    } else if (!Shipdata[i][ABIL_PROGRAMMED]) {
X	sprintf(buf, "That ship type has not been programmed into the game.\n");
X	notify(Playernum, buf);
X	free(planet);
X	free(Race);
X	return;
X    }
X
X
X
X/* figure out if the ship can be constructed in the current scope */
Xif(Dir[Playernum-1].level==LEVEL_SHIP) {
X
Xif(dirship->type==OTYPE_FACTORY)
X	i = dirship->build_type;
X
X	if(Shipdata[i][ABIL_BUILD] != Shipdata[dirship->type][ABIL_CONSTRUCT]) {
X	switch(Shipdata[dirship->type][ABIL_CONSTRUCT]) {
X		case 0 :
X			sprintf(buf, "%s cannot construct other ships.\n",
X				Shipnames[dirship->type]);
X			break;
X		case 1 :
X			sprintf(buf, "%s may only construct : or +.\n",
X				Shipnames[dirship->type]);
X			break;
X		case 2 :
X			sprintf(buf, "%s may only construct X, H, S, O, or m.\n",
X				Shipnames[dirship->type]);
X			break;
X		case 3:
X			sprintf(buf, "%s may only construct s, D, B, I, C, d, f, e, c, t, or =.\n",
X				Shipnames[dirship->type]);
X			break;
X		}
X		notify(Playernum, buf);
X	free(dirship);
X	free(Race);
X	return;
X		}
X
X} else if(Dir[Playernum-1].level == LEVEL_PLAN) {
X	if(Shipdata[i][ABIL_BUILD] > 1) {
X		switch(Shipdata[i][ABIL_BUILD]) {
X		case 2 :
X			sprintf(buf, "%s may only be constructed by s, c, S, H, or O.\n",
X				Shipnames[i]);
X			break;
X		case 3 :
X			sprintf(buf, "%s requires a factory to build it.\n", Shipnames[i]);
X			break;
X		default :
X			sprintf(buf, "Weird error in build.\n");
X			break;
X		}
X			notify(Playernum, buf);
X		free(planet);
X		free(Race);
X		return;
X	}
X
X
X
X
X} else {
X	notify(Playernum, "Illegal scope.\n");
X	free(Race);
X	return;
X	}
X
X	/* check for resource availability */
X     if (Dir[Playernum-1].level==LEVEL_SHIP && 
X		dirship->type != OTYPE_FACTORY &&
X		dirship->resource < Shipdata[i][ABIL_COST]) {
X	sprintf(buf,"Not enough resources on this ship (you need %d).\n", Shipdata[i][ABIL_COST]);
X	notify(Playernum, buf);
X	free(dirship);
X	free(Race);
X	return;
X     
X     } else if(Dir[Playernum-1].level==LEVEL_SHIP &&
X		dirship->type == OTYPE_FACTORY &&
X		planet->info[Playernum-1].resource < dirship->build_cost) {
X	sprintf(buf,"Not enough resources (%d) available.\n", dirship->build_cost);
X	notify(Playernum, buf);
X	free(dirship);
X	free(Race);
X	free(planet);
X	return;
X	}
X
X	/* find sector to build on (if planet) */
X
X     if (Dir[Playernum-1].level==LEVEL_PLAN || (Dir[Playernum-1].level==LEVEL_SHIP
X			&& dirship->type==OTYPE_FACTORY)) {
X
Xif(Dir[Playernum-1].level==LEVEL_PLAN) {
X	   sscanf(args[argn-1], "%d,%d", &x, &y);
X
Xif(x < 0 || x > planet->Maxx-1 || y < 0 || y > planet->Maxy-1) {
X    notify(Playernum, "Illegal sector.\n");
X    free(Race);
X    free(planet);
X    return;
X}
X} else {
X/* get factory coordinates */
X	x = (int)dirship->xpos;
X	y = (int)dirship->ypos;
X	}
X
X	   opensectdata(&build_sectdata);
X	   getsector(build_sectdata, &sect, planet->sectormappos+(y*planet->Maxx+x)*sizeof(sectortype));
X	close_file(build_sectdata);
X
X
X	 if (Dir[Playernum-1].level==LEVEL_PLAN &&
X		planet->info[Playernum-1].resource < Shipdata[i][ABIL_COST]) {
X		sprintf(buf, "not enough resources in stock (need %d).\n", 
X				Shipdata[i][ABIL_COST]);
X		notify(Playernum, buf);
X		free(sect);
X		free(Race);
X		free(planet);
X		return;
X	 } else if(Dir[Playernum-1].level==LEVEL_SHIP &&
X			planet->info[Playernum-1].resource < dirship->build_cost) {
X		sprintf(buf, "Not enough resources in stock (need %d).\n", 
X				dirship->build_cost);
X		notify(Playernum, buf);
X		free(sect);
X		free(dirship);
X		free(planet);
X		free(Race);
X		return;
X	    }
X
X	if (sect->owner != Playernum) {
X		sprintf(buf, "You don't own that sector.\n");
X		notify(Playernum, buf);
X		if(Dir[Playernum-1].level==LEVEL_SHIP)
X				free(dirship);
X		free(Race);
X		free(sect);
X		free(planet);
X		return;
X	   }
X	   load_crew = 0;
X	   load_fuel = 0;
X	 if(Race->autoload && i!=OTYPE_TRANSDEV) {
X	if(Dir[Playernum-1].level==LEVEL_PLAN) {
X	   load_crew = MIN(Shipdata[i][ABIL_MAXCREW], sect->popn);
X	   load_fuel = MIN(Shipdata[i][ABIL_FUELCAP], planet->info[Playernum-1].fuel);
X	} else {
X	   load_crew = MIN(dirship->max_crew, sect->popn);
X	   load_fuel = MIN(dirship->max_fuel, planet->info[Playernum-1].fuel);
X	}
X
X	   sect->popn -= load_crew;
X	   if (!sect->popn)
X		sect->owner = 0;
X
X	   planet->info[Playernum-1].fuel -= load_fuel;
X	 }
X
X    } else {
X      load_crew = 0;
X      load_fuel = 0;
X      if(Race->autoload && i!=OTYPE_TRANSDEV) {
X	   load_crew = MIN(Shipdata[i][ABIL_MAXCREW], dirship->popn);
X	   dirship->popn -= load_crew;
X	   dirship->mass -= load_crew * Race->mass;
X	   load_fuel = MIN(Shipdata[i][ABIL_FUELCAP], dirship->fuel);
X	   dirship->fuel -= load_fuel;
X	   dirship->mass -= load_fuel * MASS_FUEL;
X	 }
X    }
X
X
X 	Bzero(s);
X
X	s.type = i;
X	if (Dir[Playernum-1].level==LEVEL_PLAN) {
X		s.xpos = (float)x;
X		s.ypos = (float)y;
X	} else {
X		s.xpos = dirship->xpos + (float)(!(dirship->type==OTYPE_FACTORY));
X		s.ypos = dirship->ypos;
X	}
X
X	if(Shipdata[i][ABIL_SPEED])
X		s.speed = 1;
X	else
X		s.speed = 0;
X
X	s.owner = Playernum;
X
Xif(Dir[Playernum-1].level==LEVEL_SHIP && dirship->type==OTYPE_FACTORY) {
X        s.tech = dirship->tech;
X	s.armor = dirship->armor;
X	s.guns = dirship->guns;
X	s.size = dirship->size;
X	s.max_crew = dirship->max_crew;
X	s.max_resource = dirship->max_resource;
X	s.max_destruct = dirship->max_destruct;
X	s.max_fuel = dirship->max_fuel;
X	s.max_speed = dirship->max_speed;
X	s.build_cost = dirship->build_cost;
X	s.build_type = dirship->build_type;
X	s.base_mass = dirship->base_mass;
X	s.hyper_drive.has = dirship->hyper_drive.has;
X	s.laser = dirship->laser;
X	sprintf(s.class, "%s", dirship->class);
X			/* docked on the planet */
X		s.whatorbits = LEVEL_PLAN;
X		s.whatdest = LEVEL_PLAN;
X		s.deststar = dirship->deststar;
X		s.destpnum = dirship->destpnum;
X		s.storbits = dirship->storbits;
X		s.pnumorbits = dirship->pnumorbits;
X
X	} else {
X	s.tech = Race->tech;
X	s.armor = Shipdata[i][ABIL_ARMOR];
X	s.guns = Shipdata[i][ABIL_GUNS];
X	s.max_crew = Shipdata[i][ABIL_MAXCREW];
X	s.max_resource = Shipdata[i][ABIL_CARGO];
X	s.max_destruct = Shipdata[i][ABIL_DESTCAP];
X	s.max_fuel = Shipdata[i][ABIL_FUELCAP];
X	s.max_speed = Shipdata[i][ABIL_SPEED];
X	s.build_type = i;
X	s.build_cost = Shipdata[i][ABIL_COST];
X	s.hyper_drive.has = Shipdata[i][ABIL_JUMP];
X	s.laser = Shipdata[i][ABIL_LASER];
X	s.size = ship_size(&s);
X	s.base_mass = getmass(&s);
X	s.mass = getmass(&s);
X	sprintf(s.class, "Standard");
X
X	if (Dir[Playernum-1].level==LEVEL_SHIP) {
X		s.whatdest = LEVEL_SHIP;
X		s.destshipno = Dir[Playernum-1].shipno;
X		s.whatorbits = dirship->whatorbits;
X	} else {
X			/* docked on the planet */
X		s.whatorbits = LEVEL_PLAN;
X		s.whatdest = LEVEL_PLAN;
X		s.deststar = Dir[Playernum-1].snum;
X		s.destpnum = Dir[Playernum-1].pnum;
X	}
X	s.storbits = Dir[Playernum-1].snum;
X	s.pnumorbits = Dir[Playernum-1].pnum;
X}
X
X	s.fuel = load_fuel;
X	s.popn = load_crew;
X	s.destruct = s.resource = 0;
X
X	s.mass = s.base_mass + load_crew*Race->mass + load_fuel*MASS_FUEL;
X	s.is_alive = 1;
X 	s.active = 1;
X
X	if(s.guns)
X	 	s.protect.self = 1;
X	else
X		s.protect.self = 0;
X
X	s.hyper_drive.on = 0;
X	s.hyper_drive.ready = 0;
X	s.hyper_drive.charge = 0;
X	s.fire_laser = 0;
X
X	s.is_docked = 1;
X
X	s.rad = 0;
X	s.damage = Shipdata[s.type][ABIL_DAMAGE];
X        s.retaliate = s.guns;
X
X	s.object.number = 0;
X	s.object.number2 = 0;
X	s.object.number3 = 0;
X	s.object.number4 = 0;
X
X	if (has_switch(&s))
X		s.on = 0;
X
X	switch (s.type) {
X
X	    case OTYPE_VN:
X		s.object.number = 1;	/* one of them */
X		s.object.number2 = 1;	/* we have an assignment */
X		s.on = 1;
X		break;
X	    case STYPE_MINE:
X		s.object.number = 100;	/* trigger radius */
X		sprintf(buf, "Mine disarmed.\nTrigger radius set to 100.\n");
X		notify(Playernum, buf);
X		break;
X	    case OTYPE_TRANSDEV:
X		sprintf(buf, "Receive OFF.  Change with order.\n");
X		notify(Playernum, buf);
X		break;
X	    case OTYPE_AP:
X		sprintf(buf, "Processor OFF.\n");
X		notify(Playernum, buf);
X		break;
X	    case OTYPE_TOXWC:
X		sprintf(buf, "Toxin concentration of the planet was %d,",
X				planet->conditions[TOXIC]);
X		notify(Playernum, buf);
X		if (planet->conditions[TOXIC] > TOXMAX) {
X			planet->conditions[TOXIC] -= TOXMAX;
X			s.object.number = TOXMAX;
X		} else {
X			s.object.number = planet->conditions[TOXIC];
X			planet->conditions[TOXIC] = 0;
X		}
X		sprintf(buf, " now %d.\n",planet->conditions[TOXIC]);
X		notify(Playernum, buf);
X		break;
X	    case OTYPE_STELE:
X	    case OTYPE_GTELE:
X		sprintf(buf, "Telescope range is %.2f.\n", tele_range(s.type,s.tech));
X		notify(Playernum, buf);
X		break;
X	    default:
X		break;
X	}
X
X
X		/* deduct resource cost */
X
X	if (Dir[Playernum-1].level==LEVEL_PLAN || (Dir[Playernum-1].level==LEVEL_SHIP &&
X			dirship->type==OTYPE_FACTORY))
X		planet->info[Playernum-1].resource -= s.build_cost;
X	else
X		dirship->resource -= s.build_cost;
X
X	sprintf(buf, "Ship built at a cost of %d resources.\n", s.build_cost);
X	notify(Playernum, buf);
X	sprintf(buf, "Race/ship technologies %.1f/%.1f.\n", Race->tech, s.tech);
X	notify(Playernum, buf);
X
X		/* check for dead ships in the data files */
X
X	 /* erase any '0' entries in the dead ship file, which shouldn't be there */
X	while ( (shipno = getdeadship()) == 0){ };
X
X	if ( shipno == -1) {
X			/* otherwise recycle topmost dead ship in data file. */
X			/* no dead ships to recycle */
X	    openshdata(&build_shdata);
X	    shipno = Numships(build_shdata) + 1;
X	    close_file(build_shdata);
X	}
X
X	sprintf(buf, "%s #%d is %s %.0f,%.0f.\n", Shipnames[s.type], shipno,
X		(Dir[Playernum-1].level==LEVEL_SHIP && dirship->type != OTYPE_FACTORY)
X				 ? "at" : "on sector", s.xpos,s.ypos);
X		notify(Playernum, buf);
X
X		/* insert ship into planet's orbit */
X	if (Dir[Playernum-1].level==LEVEL_PLAN || (Dir[Playernum-1].level==LEVEL_SHIP
X		&& dirship->type==OTYPE_FACTORY)) {
X		 /* built on planet */
X		 /* next ship on list */
X		s.nextship = planet->ships;
X		planet->ships = shipno;
X		openpdata(&build_pdata);
X		putplanet(build_pdata,planet,
X			Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X		close_file(build_pdata);
X
X		  /* write sector to disk */
X		opensectdata(&build_sectdata);
X	   	putsector(build_sectdata, sect, planet->sectormappos+
X				(y*planet->Maxx+x)*sizeof(sectortype) );
X		 close_file(build_sectdata);
X
X	         free(planet);
X	   	free(sect);
X
X	} else {	/* was built on a ship -- insert after that ship */
X
X		s.nextship = dirship->nextship;
X		dirship->nextship = shipno;
X
X		dirship->is_docked = 1;
X		dirship->whatdest = LEVEL_SHIP;
X		dirship->destshipno = shipno;
X
X		openshdata(&build_shdata);
X		putship(build_shdata, dirship, Dir[Playernum-1].shipno);
X		close_file(build_shdata);
X
X	    }
Xif(Shipdata[s.type][ABIL_DAMAGE]) {
X  sprintf(buf, "Warning: This ship is constructed with a %d%% damage level.\n",
X	    Shipdata[s.type][ABIL_DAMAGE]);
X    notify(Playernum, buf);
X}
X  
X
X    if(Shipdata[s.type][ABIL_BUILD]) {
X	notify(Playernum,
X	       "It will need resources to make fully operational.\n");
X    } else {
X    notify(Playernum, "This ship does not need resources to repair.\n");
X    if(s.type==OTYPE_FACTORY)
X	notify(Playernum, "This factory may not begin repair until it has been activated.\n");
X}
X
Xif(!s.max_crew)
X    notify(Playernum, "This ship is robotic and may not repair itself.\n");
X
X
Xopenshdata(&build_shdata);
Xputship(build_shdata,&s,shipno);
Xclose_file(build_shdata);
X
X    if (Dir[Playernum-1].level==LEVEL_SHIP && dirship->whatorbits==LEVEL_UNIV)
X	    deductAPs(Playernum, APcount, 0, 1);
X    else 
X	    deductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0);
X
Xif(Dir[Playernum-1].level==LEVEL_SHIP) free(dirship);
X
Xif(Race->autoload) {
X    sprintf(buf, "Loaded with %d crew and %d fuel.\n", load_crew,load_fuel);
X     notify(Playernum, buf);
X	}
Xfree(Race);
X}
X
Xfloat getmass(s)
Xshiptype *s;
X{
X return 1.0 + (float)s->armor + (float)s->size/10.0 + (float)s->guns/10.0;
X}
X
Xint ship_size(s)
Xshiptype *s;
X{
Xfloat size;
Xsize = 0.1*s->guns + .01*s->max_crew + .03*s->max_resource + .03*s->max_fuel 
X		+ .03*s->max_destruct;
Xreturn(MAX(1,(int)size));
X}
X
Xfloat cost(Playernum, s, tech)
Xint Playernum;
Xshiptype *s;
Xfloat tech;
X{
Xint i;
Xfloat advantage, disadvantage, factor, techfactor;
X
Xi=s->build_type;
X/* compute how much it costs to build this ship */
X
Xtechfactor = (1.0 + tech/((float)Shipdata[i][ABIL_TECH] + 1.0));
Xadvantage = 0.;
Xdisadvantage = 0.;
X
X/* armor */
Xif((float)s->armor > techfactor*((float)Shipdata[i][ABIL_ARMOR]+1.0)) {
X    s->armor = (int)(techfactor*((float)Shipdata[i][ABIL_ARMOR]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->armor);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->armor + 1.0)/((float)Shipdata[i][ABIL_ARMOR]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* guns */
Xif((float)s->guns > techfactor*((float)Shipdata[i][ABIL_GUNS]+1.0)) {
X    s->guns = (int)(techfactor*((float)Shipdata[i][ABIL_GUNS]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->guns);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->guns + 1.0)/((float)Shipdata[i][ABIL_GUNS]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* crew */
Xif((float)s->max_crew > techfactor*((float)Shipdata[i][ABIL_MAXCREW]+1.0)) {
X    s->max_crew = (int)(techfactor*((float)Shipdata[i][ABIL_MAXCREW]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->max_crew);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->max_crew + 1.0)/((float)Shipdata[i][ABIL_MAXCREW]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* cargo capacity */
Xif((float)s->max_resource > techfactor*((float)Shipdata[i][ABIL_CARGO]+1.0)) {
X    s->max_resource = (int)(techfactor*((float)Shipdata[i][ABIL_CARGO]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->max_resource);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->max_resource + 1.0)/((float)Shipdata[i][ABIL_CARGO]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* fuel capacity */
Xif((float)s->max_fuel > techfactor*((float)Shipdata[i][ABIL_FUELCAP]+1.0)) {
X    s->max_fuel = (int)(techfactor*((float)Shipdata[i][ABIL_FUELCAP]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->max_fuel);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->max_fuel + 1.0)/((float)Shipdata[i][ABIL_FUELCAP]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* destruct capacity */
Xif((float)s->max_destruct > techfactor*((float)Shipdata[i][ABIL_DESTCAP]+1.0)) {
X    s->max_destruct = (int)(techfactor*((float)Shipdata[i][ABIL_DESTCAP]+1.0));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->max_destruct);
X    notify(Playernum, buf);
X}
Xfactor = (((float)s->max_destruct + 1.0)/((float)Shipdata[i][ABIL_DESTCAP]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
Xif((float)s->max_speed > techfactor*((float)Shipdata[i][ABIL_SPEED]+1.0)) {
X    s->max_speed = MIN(9, (int)(techfactor*((float)Shipdata[i][ABIL_SPEED]+1.0)));
X    sprintf(buf, "You can only modify to a max of %d - set.\n",
X	    s->max_speed);
X    notify(Playernum, buf);
X}
X
Xfactor = (((float)s->max_speed + 1.0)/((float)Shipdata[i][ABIL_SPEED]+1.0)) - 1.0;
Xif(factor >= 0.0)
X	advantage += factor;
Xelse
X	disadvantage -= factor;
X
X/* hyper drive is an advantage of 1 */
Xadvantage += s->hyper_drive.has;
X/* laser is an advantage of 1 */
Xadvantage += s->laser;
X
Xfactor = (1.+advantage*(1+(s->type==STYPE_CARGO)))/(1.+disadvantage);
X
Xreturn (factor * (float)Shipdata[i][ABIL_COST]);
X
X}
X
X
X
END_OF_FILE
if test 28337 -ne `wc -c <'server/build.c'`; then
    echo shar: \"'server/build.c'\" unpacked with wrong size!
fi
# end of 'server/build.c'
if test -f 'server/fire.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/fire.c'\" to \"'server/fire.c.orig'\"
  mv -f 'server/fire.c' 'server/fire.c.orig'
fi
echo shar: Extracting \"'server/fire.c'\" \(20116 characters\)
sed "s/^X//" >'server/fire.c' <<'END_OF_FILE'
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 * fire.c -- fire at ship or planet from ship or planet
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 fire_fromshdata,fire_toshdata, fire_shdata,
X    fire_frompdata,fire_topdata,fire_sectdata;
Xchar temp[128];
X
Xfire(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xplacetype from,to,to2;
Xplanettype *fpl,*tpl,*tpl2;
Xsectortype *sect;
Xshiptype *ship;
Xint dam=0,dam2=0,dam3=0,condition, ok,
X	strength,oldstrength,maxstrength,tostrength,to2strength,
X    i,from_firex= -1,from_firey= -1,firex= -1,firey= -1,Numplayersretaliate=0;
Xint sh;
Xfloat dist,tech;
Xchar string[PLACENAMESIZE],buf[200];
Xchar shoot_msg[1000], retal_msg[1000];
Xboolean sameplanet = 0, fromplanetmod=0,toplanetmod=0;
Xint mask;
X
Xfire_fromshdata = fire_toshdata = fire_frompdata = fire_topdata = 
X		fire_sectdata = NEUTRAL_FD;
X
X	Num_races = Numraces();
X
X	/* for telegramming and retaliating */
X bzero( (char *)Nuked, sizeof(Nuked) );
X
X	/***** get place we are firing from *****/
X
Xsscanf(args[1],"%35s",string);
X
X from = Getplace(Playernum,string,0);
X
X if (from.err && from.level!=LEVEL_SHIP) { 
X	sprintf(buf,"usage: fire\n");
X		notify(Playernum, buf);
X	return; 
X }
X
X
X if (from.level == LEVEL_UNIV || from.level == LEVEL_STAR) {
X
X    sprintf(buf,"You can't shoot from there.\n");
X	notify(Playernum, buf);
X	return;
X } else if (from.level == LEVEL_SHIP) {
X
X    if (from.err || from.shipptr->owner != Playernum) {
X	DontOwnErr(Playernum, from.shipno);
X	free(from.shipptr);
X	return;
X    }
X
X     free(from.shipptr);		
X     openshdata(&fire_fromshdata);
X     (void)getship(fire_fromshdata,&(from.shipptr),from.shipno);
X    close_file(fire_fromshdata);
X   if (testship(Playernum,from.shipptr, from.shipno)) {
X	free(from.shipptr);
X	return;
X	}
X     /* check for APs */
X    if (from.shipptr->whatorbits==LEVEL_UNIV) {
X	if (!enufAP(Playernum,Sdata.AP[Playernum-1], APcount) )
X		free(from.shipptr);
X		return;
X    } else
X	if (!enufAP(Playernum,Stars[from.shipptr->storbits]->AP[Playernum-1], APcount) ) {
X			free(from.shipptr);
X			return;
X		}
X
X     /* get planet we're landed on to calculate x,y pos */
X    if (from.shipptr->is_docked && from.shipptr->whatdest==LEVEL_PLAN) {
X	    openpdata(&fire_frompdata);
X	    getplanet(fire_frompdata,&fpl,Stars[from.snum]->planetpos[from.pnum]);
X	    close_file(fire_frompdata);
X    }
X
X } else if (from.level==LEVEL_PLAN) {
X
X   openpdata(&fire_frompdata);
X    getplanet(fire_frompdata,&fpl,Stars[from.snum]->planetpos[from.pnum]);
Xclose_file(fire_frompdata);
X   if (!enufAP(Playernum,Stars[from.snum]->AP[Playernum-1], APcount) ) { 
X	free(fpl);
X	return;
X	}
X
X   if (fpl->info[Playernum-1].destruct == 0) {
X	sprintf(buf,"No weapons available.\n");
X		notify(Playernum, buf);
X	free(fpl);
X	return;
X   }
X   if (fpl->slaved_to>0 && fpl->slaved_to!=Playernum) {
X	sprintf(buf,"That planet is enslaved!\n");
X		notify(Playernum, buf);
X	free(fpl);
X	return;
X   }
X
X } else {
X	sprintf(buf,"You can't shoot from there.\n");
X		notify(Playernum, buf);
X	return;
X }
X
X
X  /******* get target *******/
X
X sscanf(args[2],"%35s",string); 
X
X  to = Getplace(Playernum,string,1);
X if (to.err) {
X	return;
X	}
X
X if (to.level==LEVEL_SHIP) {
X
X
X
X	if (from.level==LEVEL_SHIP) {
X		if (from.shipno == to.shipno) {
X			sprintf(buf,"You can't do that.\n");
X				notify(Playernum, buf);
X			free(from.shipptr);
X			free(to.shipptr);
X			return;
X		} 
X
X	} else if (from.level==LEVEL_PLAN &&
X			   !((to.shipptr->whatorbits == LEVEL_PLAN) &&
X			     (to.shipptr->pnumorbits == from.pnum))) { 
X		  /* planets can only fire at orbiting ships*/
X		        sprintf(buf,"Planets can only fire at ships in orbit.\n");
X				notify(Playernum, buf);
X			free(fpl);
X			free(to.shipptr);
X			return;
X		      }
X
X		/* get ship again */
X	free(to.shipptr);
X	openshdata(&fire_toshdata);
X	(void)getship(fire_toshdata, &(to.shipptr), to.shipno);
X	close_file(fire_toshdata);
X	if (!to.shipptr->is_alive) {
X		sprintf(buf,"that ship has already been destroyed.\n");
X		notify(Playernum, buf);
X		free(to.shipptr);
X		if(from.level==LEVEL_PLAN) free(fpl);
X		else if(from.level==LEVEL_SHIP) free(from.shipptr);
X		return;
X	}
X
X/* save defense attack strength for retaliation */
X  tostrength = MIN(to.shipptr->destruct,   
X		Retaliate(to.shipptr) *
X		   .0001*(100-to.shipptr->rad)*(100-to.shipptr->damage));
X
X	if ((to.shipptr->is_docked && to.shipptr->whatdest==LEVEL_PLAN)
X		|| to.shipptr->whatorbits==LEVEL_PLAN) {
X		openpdata(&fire_topdata);
X		getplanet(fire_topdata,&tpl,Stars[to.snum]->planetpos[to.pnum]);
X		close_file(fire_topdata);
X	}
X
X } else if (to.level==LEVEL_PLAN) {
X
X	if (from.level==LEVEL_PLAN) {
X		if (from.snum == to.snum && from.pnum==to.pnum) {
X	        	/* same planet as firing one */
X                   /* disable the firing from planet to planet */
X	   	   sprintf(buf,"You cannot fire from a planet to a planet !\n");
X			notify(Playernum, buf);
X		   free(fpl);
X		   free(tpl);
X		   return;
X		}
X	}
X
X	if (!sameplanet) {
X		openpdata(&fire_topdata);
X		getplanet(fire_topdata,&tpl,Stars[to.snum]->planetpos[to.pnum]);
X		close(fire_topdata);
X	    }
X } else {
X	notify(Playernum, "You can't shoot at that.\n");
X	return;
X }
X
X
X
Xif(argn < 4 && from.level==LEVEL_SHIP && to.level==LEVEL_SHIP) {
X	if(from.shipptr->laser && from.shipptr->fire_laser)
X		strength = from.shipptr->fire_laser;
X	else
X		strength = from.shipptr->retaliate;
X} else
X	sscanf(args[3],"%d",&strength);
X
X	if(from.level==LEVEL_SHIP && from.shipptr->laser && from.shipptr->fire_laser)
X  		maxstrength = MIN(from.shipptr->fuel, from.shipptr->max_fuel)/2;
X	else
X  		maxstrength = (from.level==LEVEL_SHIP) ? 
X			MIN(from.shipptr->destruct,   Guns(from.shipptr) *
X		    .0001 * (100-from.shipptr->rad)*(100-from.shipptr->damage))
X		  : MIN(fpl->info[Playernum-1].destruct, PLAN_FIRE_LIM);
X
X if (strength>maxstrength) {
X		strength = maxstrength;
X		sprintf(buf,"%s set to %d\n", 
X			(from.level==LEVEL_SHIP && from.shipptr->laser && from.shipptr->fire_laser) ?
X				"Laser strength" : "Guns", strength);
X		notify(Playernum, buf);
X }
X 
X/* check to see if there is crystal overload */
X if (from.level==LEVEL_SHIP && from.shipptr->laser && from.shipptr->fire_laser) {
X		if(int_rand(0,strength) >=(int)from.shipptr->tech/2) {		/* check to see if the ship blows up */
X			notify(Playernum, "Matter-antimatter explosion from overloaded crystal!!!\n");
X			notify(Playernum, "Ship DESTROYED!!!\n");
X			kill_ship(from.shipptr->owner, from.shipptr);
X			openshdata(&fire_toshdata);
X  			putship(fire_toshdata,from.shipptr,from.shipno); 
X  			close_file(fire_toshdata);
X			strength = 0;
X		} else if(int_rand(0,strength) >= (int)from.shipptr->tech/4) {
X			notify(Playernum, "Crystal damaged from overloading.\n");
X			from.shipptr->fire_laser = 0;
X			from.shipptr->hyper_drive.mounted = 0;
X			openshdata(&fire_toshdata);
X  			putship(fire_toshdata,from.shipptr,from.shipno); 
X  			close_file(fire_toshdata);
X			strength = 0;
X		}
X}
X
X if (strength<=0) {
X   	sprintf(buf,"no attack.\n");
X		notify(Playernum, buf);
X	if(from.level==LEVEL_PLAN) free(fpl);
X	else if(from.level==LEVEL_SHIP) free(from.shipptr);
X
X	if(to.level==LEVEL_PLAN) free(tpl);
X	else if(to.level==LEVEL_SHIP) free(to.shipptr);
X
X	return;
X }
X
X
X     /* get a sector the enemy place can retaliate to. */
X
X	if(from.level==LEVEL_PLAN) {
X
X	sscanf(args[4],"%d,%d",&from_firex,&from_firey);
X
X	if((from_firex < 0) || (from_firey < 0) || (from_firex > fpl->Maxx) || (from_firey > fpl->Maxy)) {
X		sprintf(buf,"Illegal coordinates.\n");
X			notify(Playernum, buf);
X		free(fpl);
X		if(to.level==LEVEL_PLAN) free(tpl);
X		else if(to.level==LEVEL_SHIP) free(to.shipptr);
X		return;
X	} else {
X	opensectdata(&fire_sectdata);
X	getsector(fire_sectdata, &sect, fpl->sectormappos+(from_firey*fpl->Maxx+from_firex)*sizeof(sectortype));
X	close_file(fire_sectdata);
X	}
X
X      if (sect->owner!=Playernum) {	/* has to be yours */
X	   sprintf(buf,"You don't own that sector.\n");
X		notify(Playernum, buf);
X	   free(fpl);
X	if(to.level==LEVEL_PLAN) free(tpl);
X	else if(to.level==LEVEL_SHIP) free(to.shipptr);
X	free(sect);
X		return;
X		}
X    free(sect);
X		} else if(to.level==LEVEL_PLAN) {
X	sscanf(args[4],"%d,%d",&firex,&firey);
X
X	if((firex < 0) || (firey < 0) || (firex > tpl->Maxx) || (firey > tpl->Maxy)) {
X		sprintf(buf,"Illegal coordinates.\n");
X			notify(Playernum, buf);
X	if(from.level==LEVEL_PLAN) free(fpl);
X	else if(from.level==LEVEL_SHIP) free(from.shipptr);
X	free(tpl);
X			return;
X		}
X/* check to see if there are any planetary defense networks on the planet */
Xok = 1;
X	sh = tpl->ships;
X	openshdata(&fire_toshdata);
X	while(sh && ok) {
X        getship(fire_toshdata, &ship, sh);
X	ok = !(ship->is_alive && ship->type==OTYPE_PLANDEF
X	       && ship->owner != Playernum);
X	sh = ship->nextship;
X	free(ship);
X    }
X	close_file(fire_toshdata);
Xif(!ok) {
Xnotify(Playernum, "Target has planetary defense networks.\nThese have to be eliminated before you can attack sectors.\n");    
X	if(fpl) free(fpl);
X	if(tpl) free(tpl);
X	if(from.shipptr) free(from.shipptr);
X	if(to.shipptr) free(to.shipptr);
Xreturn;
X}
X
X    }
X
Xtech = 0.0;
Xif(from.level == LEVEL_SHIP)
X		tech = from.shipptr->tech;
Xelse if (from.level == LEVEL_PLAN)
X		tech = 100.0;	
X
X	/* block kill signals to foil cheaters */
X
X dam = shoot(Playernum, from, &to, Playernum, fpl, tpl, firex, firey, strength,
X	     &dist, tech, shoot_msg,1 );	/*1==get smap*/
X
X
X if (dam < 0) {
X	sprintf(buf,"Target out of range  %.2f!\n", SYSTEMSIZE);
X		notify(Playernum, buf);
X	if(from.level==LEVEL_SHIP) free(from.shipptr);
X	else if(from.level==LEVEL_PLAN) free(fpl);
X
X	if(to.level==LEVEL_SHIP) free(to.shipptr);
X	else if(to.level==LEVEL_PLAN) free(tpl);
X
X	return;
X } 
X
X
Xif(from.level==LEVEL_SHIP)
X	sprintf(telegram_buf,"%s #%u %s [%u] ",Shipnames[from.shipptr->type],
X			from.shipno,from.shipptr->name,from.shipptr->owner);
Xelse if(from.level==LEVEL_PLAN)
X	sprintf(telegram_buf,"%s ", Dispplace(Playernum, &from));
X
Xsprintf(temp, telegram_buf);
X
X if (to.level==LEVEL_SHIP)
X    sprintf(buf,"fired on %s #%u %s [%u] @ %s;\n", Shipnames[to.shipptr->type],
X			to.shipno, to.shipptr->name, to.shipptr->owner,
X			prin_ship_orbits(to.shipptr));
X else
X    sprintf(buf,"fired on %s\n",Dispplace(Playernum, &to));
X
X    
X/* notify all players that inhabit this system of the attack */
X    str_cat(temp, buf);
X    str_cat(telegram_buf, buf);
X
X for (i=1; i<=Num_races; i++) {
X    if (Nuked[i-1] && i!=Playernum) {
X	notify(i, telegram_buf);
X    } else
X	if (i!=Playernum && isset(Stars[Dir[Playernum-1].snum]->inhabited, i))
X	notify(i, temp);
X
X    push_message(TELEG_PLAYER_AUTO, i, telegram_buf, COMBAT);
X}
X
X  sprintf(buf,"BOOM!!\n%s\n", shoot_msg);
X	notify(Playernum, buf);
X
X	str_cat(telegram_buf, buf);
X
X for (i=1; i<=Num_races; i++)
X    if (Nuked[i-1] && i!=Playernum) {
X	if(!notify(i, telegram_buf))
X	    push_message(TELEG_PLAYER_AUTO, i, telegram_buf, COMBAT);
X	}
X
X if (from.level==LEVEL_SHIP) {
X	if(from.shipptr->laser && from.shipptr->fire_laser) {
X		from.shipptr-> fuel -= 2*strength;
X		from.shipptr->mass -= 2*strength*MASS_FUEL;
X	} else {
X		from.shipptr->destruct -= strength;
X		from.shipptr->mass -= strength*MASS_DESTRUCT;
X	}
X } else if (from.level==LEVEL_PLAN) 
X	fpl->info[Playernum-1].destruct -= strength;
X
X
X/* defending player retaliates if he can */
X	strength = 0;
X if ( to.level==LEVEL_SHIP && dam && to.shipptr->active
X		&& to.shipptr->protect.self) {
X	strength = tostrength;
X	if(to.shipptr->laser && to.shipptr->fire_laser) {
X
X/* check to see if there is crystal overload */
X		if(int_rand(0,strength) >=(int)to.shipptr->tech/2) {		/* check to see if the ship blows up */
X			notify(Playernum, "Matter-antimatter explosion from overloaded crystal!!!");
X			notify(Playernum, "Defending ship DESTROYED!");
X			notify(to.shipptr->owner, "Matter-antimatter explosion from overloaded crystal!!!");
X			notify(to.shipptr->owner, "Defending ship DESTROYED!");
X			kill_ship(to.shipptr->owner, to.shipptr);
X			openshdata(&fire_toshdata);
X  			putship(fire_toshdata,to.shipptr,to.shipno); 
X  			close_file(fire_toshdata);
X			strength = 0;
X		} else if(int_rand(0,strength) >=(int)to.shipptr->tech/4) {
X			notify(to.shipptr->owner, "Crystal damaged from overloading.\n");
X			to.shipptr->fire_laser = 0;
X			to.shipptr->hyper_drive.mounted = 0;
X			openshdata(&fire_toshdata);
X  			putship(fire_toshdata,to.shipptr,to.shipno); 
X  			close_file(fire_toshdata);
X			strength = 0;
X		}
X
X		to.shipptr-> fuel -= 2*strength;
X		to.shipptr->mass -= 2*strength*MASS_FUEL;
X	} else {
X		to.shipptr->destruct -= strength;
X		to.shipptr->mass -= strength*MASS_DESTRUCT;
X	}
X
X } else if (to.level==LEVEL_PLAN) {	
X/* all players owning planet retal. do not retaliate at long distances
X	since it is 'unrealistic' and easy to drain defences */
X
X int strength2;
X int fstrength;
X 
X fstrength = strength;
X
X strength = 0;
X 
X  	for (i=1; i<= Num_races; i++)
X	   if (i!=Playernum && tpl->info[i-1].numsectsowned &&
X		!(tpl->slaved_to>0 && tpl->slaved_to!=i) ) {
X
X              /* add planet defense strength */
X
X	     strength2 = tpl->info[i-1].destruct;
X	        if(strength2 > PLAN_FIRE_LIM)
X		  strength2 = PLAN_FIRE_LIM;
X
X	     tpl->info[i-1].destruct -= strength2;
X
X             strength += strength2;
X	     Numplayersretaliate++;
X	     if(strength2)
X	       {
X  sprintf(telegram_buf," BULLETIN from %s\n\n",Dispplace(Playernum, &to));
X 
X  sprintf(buf,"Planet returns fire with %d guns\n\n", strength2);
X		notify(Playernum, buf);
X		str_cat(telegram_buf, buf);
X	       }
X	   }
X}
X	dam2=0;
X
Xif (strength) {
X   	sprintf(buf,"%s retaliates with %s%d guns!!\n", Dispplace(Playernum, &to), 
X		Numplayersretaliate>1 ? "a total of " : "", strength,
X		(to.level==LEVEL_SHIP && to.shipptr->laser && to.shipptr->fire_laser) ?
X		"combat laser strength" : "guns");
X		notify(Playernum, buf);
X		str_cat(telegram_buf, buf);
X } else {
X   sprintf(buf,"%s %s does not retaliate (%d %d).\n",Dispplace(Playernum, &to),
X	(to.level==LEVEL_PLAN) ? (tpl->slaved_to ? "is enslaved and " : "") : ""
X	,dam, tostrength);
X	notify(Playernum, buf);
X	str_cat(telegram_buf, buf); 
X}
X
X
X 	if(strength)
X	{
X		tech = 0.0;
X		if(to.level == LEVEL_SHIP)
X			tech = to.shipptr->tech;
X		else if (to.level == LEVEL_PLAN)
X			tech = 100.0;	
X
X
X		dam2 = shoot(Playernum, to,&from, 
X		     (to.level==LEVEL_SHIP ? to.shipptr->owner : 1),
X		     tpl,fpl,from_firex,from_firey,strength,
X		     &dist, tech,retal_msg, 1);
X
X                if(dam2) {
X                  sprintf(buf,"BOOM!!\n%s\n", retal_msg);
X			notify(Playernum, buf);
X		str_cat(telegram_buf, buf);
X		}
X
X for (i=1; i<=Num_races; i++)
X    if (Nuked[i-1] && i!=Playernum)
X	if(!notify(i, telegram_buf))
X	    push_message(TELEG_PLAYER_AUTO, i, telegram_buf, COMBAT);
X
X	}
X
X
X/* protecting ships retaliate individually, only if damage was inflicted */
X		if( from.level==LEVEL_SHIP && dam)
X			{
X
X	sh = 0;
X		if(to.level==LEVEL_SHIP) {
X	if(to.shipptr->whatorbits==LEVEL_STAR) /* star level ships */
X		sh = Stars[to.shipptr->storbits]->ships;
X	if(to.shipptr->whatorbits==LEVEL_PLAN) /* planet level ships */
X		{
X	    openpdata(&fire_frompdata);
X	    getplanet(fire_frompdata,&tpl,Stars[to.snum]->planetpos[to.pnum]);
X	    close_file(fire_frompdata);
X		sh = tpl->ships;
X		}
X	} else if(to.level==LEVEL_PLAN) {
X		sh = tpl->ships;
X					}
X
X	while (sh && from.shipptr->is_alive) 
X			{
X	
X	sprintf(string,"#%d",sh);
X
X	 to2 = Getplace(Playernum,string,1);
X
X	if(sh != from.shipno && sh != to.shipno)
X	{
X
X	condition = 0;
X	if(to.level==LEVEL_SHIP)
X		condition = (to2.shipptr->is_alive && to2.shipptr->active
X				&& to2.shipptr->protect.on
X				&& (to2.shipptr->protect.ship == to.shipno)) ;
X	 else if (to.level==LEVEL_PLAN)
X		condition = (to2.shipptr->is_alive && to2.shipptr->active
X				&& to2.shipptr->protect.planet
X				&& (from.shipptr->owner != to2.shipptr->owner));
X				
X	if(condition) {
X	if(to2.level==LEVEL_SHIP && to2.shipptr->laser && to2.shipptr->fire_laser) {
X		to2strength = MIN((int)to2.shipptr->fuel/2, to2.shipptr->fire_laser);
X		to2.shipptr->fuel -= 2*to2strength;
X		to2.shipptr->mass -= 2*to2strength*MASS_FUEL;
X
X/* check to see if there is crystal overload */
X		if(int_rand(0,to2strength) >=(int)to2.shipptr->tech/2) {		/* check to see if the ship blows up */
X			notify(Playernum, "Matter-antimatter explosion from overloaded crystal!!!");
X			notify(Playernum, "Protecting ship DESTROYED!");
X			notify(to2.shipptr->owner, "Matter-antimatter explosion from overloaded crystal!!!");
X			notify(to2.shipptr->owner, "Protecting ship DESTROYED!");
X			kill_ship(to2.shipptr->owner, to2.shipptr);
X			to2strength = 0;
X		} else if(int_rand(0,to2strength) >= (int)to2.shipptr->tech/4) {
X			notify(to2.shipptr->owner, "Crystal damaged from overloading.\n");
X			to2.shipptr->fire_laser = 0;
X			to2.shipptr->hyper_drive.mounted = 0;
X			to2strength = 0;
X		}
X
X	} else {
X  		to2strength = MIN(to2.shipptr->destruct,   
X			Retaliate(to2.shipptr) *
X		   .0001 * (100-to2.shipptr->damage) * (100-to2.shipptr->rad));
X		to2.shipptr->destruct -= to2strength;
X		to2.shipptr->mass -= strength*MASS_DESTRUCT;
X	}
Xif (to2strength) {
X   sprintf(telegram_buf,"%s retaliates with  %s%d %s!!\n", Dispplace(Playernum, &to2), 
X		Numplayersretaliate>1 ? "a total of " : "", to2strength, 
X		(to2.level==LEVEL_SHIP && to2.shipptr->laser && to2.shipptr->fire_laser) ?
X		"combat laser strength" : "guns");
X	notify(Playernum, buf);
X	str_cat(telegram_buf, buf);
X
X	tech = to2.shipptr->tech;
X
X	dam3 = shoot(Playernum, to2,&from,to2.shipptr->owner,tpl,fpl,from_firex,from_firey,to2strength, 
X		   &dist, tech,retal_msg, 1);
X		if(dam3) {
X		sprintf(buf,"BOOM!!\n%s\n", retal_msg);
X		notify(Playernum, buf);
X		str_cat(telegram_buf, buf);
X		}
X  if(!notify(to2.shipptr->owner, telegram_buf))
X      push_message(TELEG_PLAYER_AUTO, to2.shipptr->owner, telegram_buf, COMBAT);
X
X	}
X  
X	openshdata(&fire_toshdata);
X  	putship(fire_toshdata,to2.shipptr,to2.shipno); 
X  	close_file(fire_toshdata);
X}
X
X		}
X		sh = to2.shipptr->nextship;
X	        free(to2.shipptr);
X    }
X    }
X
X
X/* end of fire/retaliation */
X
X if (from.level==LEVEL_PLAN) {
X     openpdata(&fire_frompdata);
X     putplanet(fire_frompdata,fpl,Stars[from.snum]->planetpos[from.pnum]);
X	close_file(fire_frompdata);
X
X } else if (from.level==LEVEL_SHIP) {
X     openshdata(&fire_fromshdata);
X     putship(fire_fromshdata, from.shipptr, from.shipno);
X	close_file(fire_fromshdata);
X }
X
X
X if (to.level==LEVEL_PLAN && !sameplanet) {
X     openpdata(&fire_topdata);
X     putplanet(fire_topdata,tpl,Stars[to.snum]->planetpos[to.pnum]);
X	close_file(fire_topdata);
X     free(tpl);
X } else if (to.level==LEVEL_SHIP) {
X     openshdata(&fire_toshdata);
X     putship(fire_toshdata,to.shipptr,to.shipno);
X	close_file(fire_toshdata);
X     free(to.shipptr);
X }
X
X
X
X
X
X if (from.level==LEVEL_PLAN) {
X   /* firing from planet -- deduct APs from that star */
X 	deductAPs(Playernum,APcount, from.snum, 0);
X	free(fpl);
X} else {
X		/* from.level==LEVEL_SHIP */
X	if (from.shipptr->whatorbits==LEVEL_UNIV)
X		deductAPs(Playernum,APcount, 0, 1);
X	else {
X	 	deductAPs(Playernum,APcount, from.shipptr->storbits, 0);
X	}
X	free(from.shipptr);
X    }
X
X}
X
Xdetonate(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
X
Xsscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X
X
X openshdata(&fire_shdata);
X  if (!getship(fire_shdata, &s, shipno)) {
X      notify(Playernum, "The ship wasn't found.\n");
X	close_file(fire_shdata);
X	return;
X  }
Xclose_file(fire_shdata);
X
X  if (testship(Playernum,s, shipno)) {
X      notify(Playernum, "Illegal format.\n");
X      free(s);
X      return;
X	}
X
Xif(s->type != STYPE_MINE) {
X    notify(Playernum, "That is not a mine.\n");
X    free(s);
X    return;
X} else if(!s->on) {
X    notify(Playernum, "The mine is not activated.\n");
X    free(s);
X    return;
X} else if(s->is_docked) {
X    notify(Playernum, "The mine is docked or landed.\n");
X    free(s);
X    return;
X}
X
X
Xfree(s);
X
Xdomine(shipno, 1);
X
X}
X
END_OF_FILE
if test 20116 -ne `wc -c <'server/fire.c'`; then
    echo shar: \"'server/fire.c'\" unpacked with wrong size!
fi
# end of 'server/fire.c'
if test -f 'server/map.c' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'server/map.c'\" to \"'server/map.c.orig'\"
  mv -f 'server/map.c' 'server/map.c.orig'
fi
echo shar: Extracting \"'server/map.c'\" \(5534 characters\)
sed "s/^X//" >'server/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.
X * Restrictions in GB_copyright.h.
X *
X *  map.c -- display sector map of current planet
X */
X
X#define DISP_DATA 1
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include <curses.h>
Xextern float compatibility();
Xchar desshow();
X
Xint map_racedata;
Xracetype *Race;
X
Xmap(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xregister int i;
Xint map_pdata,inv,flag;
Xplanettype *p;
Xplacetype where;
X
X   where = Getplace(Playernum, args[1],0);
X
X   if (where.err) return;
X
X   if (where.level==LEVEL_PLAN) {
X  
X  	openpdata(&map_pdata);
X  	getplanet(map_pdata,&p,Stars[where.snum]->planetpos[where.pnum]);
X  	close_file(map_pdata);
X 
X  	show_map(Playernum, where.snum, where.pnum, p, DISP_DATA, 0);	
X					/* 0 is begin iq*/
X
X  	free(p);
X
X	if (Stars[where.snum]->stability > 50)
X		notify(Playernum, "WARNING! This planet's primary is unstable.\n");
X
X   } else {
X	orbit(Playernum, APcount, argn,args);	/* make orbit map instead */
X   }
X
X}
X
X
X
Xshow_map(Playernum, snum, pnum, p, show,iq)
Xint Playernum;
Xint snum, pnum;
Xplanettype *p;
Xint show;
Xint iq;
X{
Xreg int x,y,i,f=0,address,owner, owned1;
Xboolean cap_inv;
Xint sh,map_sectdata,map_shdata;
Xshiptype *s;
Xchar shiplocs[MAX_X][MAX_Y];
Xhugestr output;
Xchar temp[1024], buf[1024];
X
X  bzero((char *)shiplocs, sizeof(shiplocs));
X
X  opensectdata(&map_sectdata);
X  getsmap(map_sectdata, Smap, p);
X  close_file(map_sectdata);
X   /* traverse ship list on planet; find out if we can look at 
X       ships here. */
X	iq |= p->info[Playernum-1].numsectsowned;
X	sh = p->ships;
X	
X  openshdata(&map_shdata);
X  	  sh = p->ships;
X	  while (sh) {
X		getship(map_shdata, &s, sh);
X		if(s->owner == Playernum && 
X			(s->popn || (s->type==OTYPE_PROBE))) iq = 1;
X      		if (s->is_alive && s->is_docked && (s->whatdest==LEVEL_PLAN)
X			&&  (s->xpos < p->Maxx) && (s->xpos >= 0.0) &&
X			(s->ypos < p->Maxy) && (s->ypos >= 0.0) )
X		  shiplocs[(int)s->xpos][(int)s->ypos] = Shipltrs[s->type];
X
X		sh = s->nextship;
X		free(s);
X	  }
X
X  close_file(map_shdata);
X
X/* report that this is a planet map */
X	sprintf(output, "$");
X
X	sprintf(buf, "%s;", Stars[snum]->pnames[pnum]);	
X	str_cat(output, buf);
X
X	sprintf(buf, "%d;%d;%d;", p->Maxx, p->Maxy,show);
X	str_cat(output, buf);
X
X	openracedata(&map_racedata);
X	getrace(map_racedata, &Race, Playernum);
X	close_file(map_racedata);
X
X/* send map data */
X for(y=0; y<p->Maxy; y++)
X     for (x=0; x<p->Maxx; x++) {
X	owner = Sector(*p, x, y).owner;
X	owned1 = (owner == Race->highlight);
X	if (shiplocs[x][y] && iq) {
X
X	if(Race->color) { 
X		sprintf(buf,"%c%c", (char)(owner+48), shiplocs[x][y]);
X	} else {
X		if(owned1 && Race->inverse)
X			sprintf(buf,"1%c", shiplocs[x][y]);
X		else
X			sprintf(buf,"0%c", shiplocs[x][y]);
X		}
X
X		} else {
X
X	if(Race->color) { 
X		sprintf(buf,"%c%c", (char)(owner+48), desshow(Playernum, p, x, y, Race));
X		} else {
X		if(owned1 && Race->inverse)
X	    		sprintf(buf,"1%c", desshow(Playernum, p,x,y, Race));
X		else
X	    		sprintf(buf,"0%c", desshow(Playernum, p,x,y, Race));
X		}
X
X		}
X	str_cat(output, buf);
X     }
X
Xnotify(Playernum, output);
X
X     if (show){
X
X	sprintf(temp, "    Sects %s: %u", Race->Thing ? "covered" : "owned", 
X			p->info[Playernum-1].numsectsowned);
X	sprintf(buf, "  Aliens:");
X	str_cat(temp, buf);
X	  if (p->is_explored || Race->tech >= TECH_EXPLORE) {
X			f=0;
X		  for (i=1; i<MAXPLAYERS; i++)
X			if (p->info[i-1].numsectsowned && i!=Playernum) {
X			   f=1;
X			   sprintf(buf, "%c%d", isset(Race->atwar,i) ? '*' : ' ', i);
X			    str_cat(temp, buf);
X			}
X		  if (!f) str_cat(temp, "(none)");
X	  } else {
X		str_cat(temp, "\?\?\?");
X	}
Xstr_cat(temp, "\n");
Xnotify(Playernum, temp);
X
X       sprintf(temp, "      Mobilization : %3d (%3d)     Compatibility: %.2f%%",
X		p->info[Playernum-1].comread,
X		p->info[Playernum-1].mob_set,
X		compatibility(p,Race));
X       if(p->conditions[TOXIC]>50) {
X	       sprintf(buf,"    (%d%% TOXIC)",p->conditions[TOXIC]);
X		str_cat(temp, buf);
X		}
X
Xstr_cat(temp, "\n");
Xnotify(Playernum, temp);
X
X       sprintf(temp, "Resource stockpile : %-9u    Fuel stockpile: %u\n",
X		p->info[Playernum-1].resource,
X		p->info[Playernum-1].fuel);
Xnotify(Playernum, temp);
X
X       sprintf(temp, "      Destruct cap : %u%26s: %u (%u/%u)\n",p->info[Playernum-1].destruct,
X				Race->Thing ? "Tons of biomass" : "Total Population", 
X		p->info[Playernum-1].popn, p->popn, 
X		round_rand(.01*(100.-p->conditions[TOXIC])*p->maxpopn) );
Xnotify(Playernum, temp);
X
X			sprintf(temp, "      %d Crystals\n", p->info[Playernum-1].crystals);
X			notify(Playernum, temp);
X
X }
Xfree(Race);
X}
X
X
X
Xchar desshow(Playernum, p,x,y,r)
Xint Playernum;
Xreg planettype *p;
Xreg int x,y;
Xracetype *r;
X{
Xreg sectortype *s;
X
Xs = &Sector(*p,x,y);
X
Xif (s->VN)
X	return Shipltrs[OTYPE_VN];
X
Xif(s->owner && (!r->geography && !r->color))
X	if(!r->inverse || s->owner != r->highlight)
X		if(!r->double_digits)
X			return s->owner %10 + '0'; 
X		else {
X			if (s->owner < 10 || x % 2)
X				return s->owner % 10 + '0';
X			else
X				return s->owner / 10 + '0';
X			}
X
X   if (s->is_wasted) 
X	return CHAR_WASTELAND;
X
X    if (s->crystals)
X	return CHAR_CRYSTAL;
X
X   switch (s->des) {
X     	case DES_SEA: return CHAR_SEA;
X     	case DES_LAND: return CHAR_LAND;
X     	case DES_MOUNT: return CHAR_MOUNT;
X     	case DES_GAS: return CHAR_GAS;
X     	case DES_PLATED: return CHAR_PLATED;
X     	case DES_ICE: return CHAR_ICE;
X     	default: return('!');
X   }
X
X
X}
X
END_OF_FILE
if test 5534 -ne `wc -c <'server/map.c'`; then
    echo shar: \"'server/map.c'\" unpacked with wrong size!
fi
# end of 'server/map.c'
echo shar: End of archive 5 \(of 9\).
cp /dev/null ark5isdone
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