[comp.sources.games] v10i003: gb3 - Galactic Bloodshed, an empire-like war game [Ver. 2.0], Part03/14

billr@saab.CNA.TEK.COM (Bill Randle) (06/02/90)

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 10, Issue 3
Archive-name: gb3/Part03
Supersedes: GB2: Volume 7, Issue 44-51



#! /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 3 (of 14)."
# Contents:  Docs/vessels.doc server/doplanet.c server/order.c
#   server/ships.h
# Wrapped by billr@saab on Fri Jun  1 11:53:32 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Docs/vessels.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Docs/vessels.doc'\"
else
echo shar: Extracting \"'Docs/vessels.doc'\" \(369 characters\)
sed "s/^X//" >'Docs/vessels.doc' <<'END_OF_FILE'
XVESSELS			Galactic Bloodshed			VESSELS
X
X
XNAME
X  [0] vessels -- describe the various ships that players may
X  		build during the game.
X
XSYNTAX
X	vessels
X
XDESCRIPTION
X   This command allows users to examine the various types
Xof ships that can be built during the game. This enters the same
Xhelp facility used with the 'build' command.
X
X
XSEE ALSO
X   build, examine
X   
X   
END_OF_FILE
if test 369 -ne `wc -c <'Docs/vessels.doc'`; then
    echo shar: \"'Docs/vessels.doc'\" unpacked with wrong size!
fi
# end of 'Docs/vessels.doc'
fi
if test -f 'server/doplanet.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'server/doplanet.c'\"
else
echo shar: Extracting \"'server/doplanet.c'\" \(21893 characters\)
sed "s/^X//" >'server/doplanet.c' <<'END_OF_FILE'
Xint Sectormappos;
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 *  doplanet.c -- do one turn on a 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 "doturn.h"
X#include "power.h"
X#include "buffers.h"
X#include <math.h>
X
Xextern float compatibility();
X
X	/* types of accidents that can occur on a toxic planet. */
Xchar *Accidents_uninhab[] = {
X	 /* on water sectors */
X	"Widespread waste spill",
X	"Ecological instability",
X	 /* on land sectors */
X	"Massive volcanic eruptions",
X	"Ecological instability",
X	 /* on mountain sectors */
X	"Massive volcanic eruptions",
X	"Ecological instability",
X	 /* gas sectors */
X	"Lethal toxin concentration",
X	"Ecological instability",
X	 /* ice */
X	"Leak in isolated chemical plant",
X	"Continental warming cause glacial melting",
X	 /* plate */
X	"Nuclear accident",
X	"Untended nuclear plant explodes"
X};
X
Xchar *Accidents_inhab[] = {
X	"Nuclear accident",
X	"Terrorists trigger nuclear weapon",
X	"Release of toxic waste",
X	"Weapons dump explosion",
X	"Massive starvation",
X	"Virus epidemic",
X	"famine",
X	"starvation",
X	"Widespread cultist suicide",
X	"Atomic experiment gone wrong",
X	"Great Hrung collapse"
X};
X
X
Xint doplanet(starnum,planet, planetnum)
Xint starnum;
Xplanettype *planet;
Xint planetnum;
X{
Xint shipno,x,y,nukex,nukey;
Xint o=0,j;
Xchar *nukem;
Xreg int i;
Xsectortype *p;
Xshiptype *ship;
Xfloat madd,fadd;
Xint sectdata,timer=20;
Xint oldplanetpopn, oldplanetmaxpopn;
Xboolean allmod=0,allexp=0;
Xchar buf[200]; 
X
XSectormappos = planet->sectormappos;
Xcheck(planet,0);
Xif (!StarsInhab[starnum])
X	return 0;	/* no one's here now */
X
Xif (Stinfo[starnum][planetnum].inhab) {
X/*	printf(" getting sectmap pos %d\n",planet->sectormappos); */
X	opensectdata(&sectdata);
X	getsmap(sectdata,Smap,planet);
X	close_file(sectdata);
X
X	PermuteSects(planet);
X	bzero((char *)Sectinfo, sizeof(Sectinfo) );
X}
X
X
X
Xcheck(planet,1);
X  shipno = planet->ships;
X
X  while (shipno) {
X
X	if ( ((ship = ships[shipno])!=NULL) && ship->is_alive && !ship->rad) {
X
X	   if ( !(ship->is_docked && ship->whatdest==LEVEL_PLAN)) {
X		 /* add fuel to ships orbiting gas giants */
X		if (planet->type == TYPE_GASGIANT) {
X		 if (ship->type == STYPE_TANKER) {
X		    fadd = FUEL_GAS_ADD_TANKER;
X		    madd = FUEL_GAS_ADD_TANKER*MASS_FUEL;
X		 } else if (ship->type == STYPE_HABITAT) {
X		    fadd = FUEL_GAS_ADD_HABITAT;
X		    madd = FUEL_GAS_ADD_HABITAT*MASS_FUEL;
X		 } else {
X		    fadd = FUEL_GAS_ADD;
X		    madd = FUEL_GAS_ADD*MASS_FUEL;
X		 }
X		 if (ship->fuel + fadd > Max_fuel(ship)) {
X		    madd -= (Max_fuel(ship) - (ship->fuel+fadd))*MASS_FUEL;
X		    fadd = Max_fuel(ship)-(ship->fuel+fadd);
X		 }
X		 ship->fuel += fadd;
X		 ship->mass += madd;
X		}
X	   }
X
X	    if (ship->type == OTYPE_VN || (ship->type==OTYPE_BERS && !ship->destruct)) {		 
X										/* Von Neumann machine/unarmed Berserker */
X	     	planet_doVN(ship,shipno,planet);
X	    } else if (ship->type == OTYPE_TERRA) {	 /* terraforming device. */
X
X		 if (ship->fuel >= (float)FUEL_COST_TERRA) { 
X
X		if (ship->on && 
X		    ((ship->whatdest == LEVEL_PLAN) && ship->is_docked)) {
X
X		   /* move, and then terraform. */
X
X		 if (ship->xpos >= (planet->Maxx-1) && ship->object.number > 0)
X		   ship->xpos = 0.0;
X		 else if (ship->xpos <= 0.0 && ship->object.number < 0)
X		   ship->xpos = (planet->Maxx-1);
X		 else
X		   ship->xpos += ship->object.number;
X
X		 if (ship->ypos <= 0.0 && ship->object.number2 < 0)
X			ship->object.number2 = -ship->object.number2;
X		 else if (ship->ypos >= (planet->Maxy-1) && ship->object.number2 > 0)
X			ship->object.number2 = -ship->object.number2;
X		 
X		ship->ypos += ship->object.number2;
X
X		   {
X		    sectortype *s;
X		    s = &Sector(*planet,(int)ship->xpos,(int)ship->ypos);
X		    if (s->des != DES_GAS && 
X			(int_rand(1,100) <= (((100-ship->damage) * 
X				  ship->popn)/Max_crew(ship)))) {
X			  /* gas sectors can't be terraformed. */
X		 	s->des = races[ship->owner-1]->likesbest;
X		 	s->eff *= 0.5;
X		 	s->mobilization *= 0.5;
X		 	s->resource *= 0.7;
X		 	/*s->popn *= 0.5;*/	/* ?? not sure bout this */
X			s->popn = 0;
X			s->owner = 0;/* i AM sure about this :) */
X		 	ship->fuel -= (float)FUEL_COST_TERRA;
X		 	ship->mass -= FUEL_COST_TERRA*MASS_FUEL;
X			if (planet->conditions[TOXIC]<100)
X				planet->conditions[TOXIC] += random()&01;
X		      }
X		 } 
X
X	       }
X	      } else if (!ship->notified) {  
X		char teleg2_buf[1000];
X	        ship->notified = 1;
X		msg_OOF(ship, shipno, teleg2_buf);
X	      }
X
X	 } else if (ship->type==OTYPE_BERS && ship->destruct) {
X	    if (ship->bombard && ship->whatorbits==LEVEL_PLAN &&
X	     ship->whatdest==LEVEL_PLAN &&
X	     ship->storbits==ship->deststar &&
X	     ship->pnumorbits==ship->destpnum &&
X	     !ship->is_docked)
X		if (!Bombard(ship, shipno, planets[ship->storbits][ship->pnumorbits],
X				races[ship->owner-1])) {
X			/* we killed everyone here; go somewhere else */
X		   ship->destpnum = int_rand(0,Stars[ship->storbits]->numplanets);
X		} else {
X			/* exact revenge */
X		   if (Sdata.VN_hitlist[ship->object.number-1]>0)
X			   Sdata.VN_hitlist[ship->object.number-1]--;
X		}
X	 } else if (can_bombard(ship) && ship->bombard &&
X	     ship->whatorbits==LEVEL_PLAN &&
X	     ship->whatdest==LEVEL_PLAN &&
X	     ship->storbits==ship->deststar &&
X	     ship->pnumorbits==ship->destpnum &&
X	     !ship->is_docked)
X		Bombard(ship, shipno, planets[ship->storbits][ship->pnumorbits], races[ship->owner-1]);
X
X
X	}
X  	shipno = ship->nextship;
Xcheck(planet,2);
X  }
X
X
X if (!Stinfo[starnum][planetnum].inhab && 
X     !Stinfo[starnum][planetnum].Thing_add)
X	return 0;	/* (no one's explored the planet) */
X
X
X	/* check for space mirrors (among other things) warming the planet */
X	/* if a change in any artificial warming/cooling trends */
X if (Stinfo[starnum][planetnum].temp_add != 0) {
X	int final_temp;
X
X	final_temp = planet->conditions[RTEMP] +
X			 Stinfo[starnum][planetnum].temp_add + int_rand(-5,5);
X
X	planet->conditions[TEMP] = final_temp;
X }
X else planet->conditions[TEMP] = planet->conditions[RTEMP] + int_rand(-5,5);
X
X if (planet->slaved_to)
X	planet->is_sheep = 1;	/* this is set to 0 at the end of ea. turn */
X
X check(planet,3);
X
X if (Stinfo[starnum][planetnum].Thing_add>0) {
X	 /* start a meso colony */
X	int p;
X/*	printf(" getting sectmap pos %d\n",planet->sectormappos); */
X	opensectdata(&sectdata);
X	getsmap(sectdata,Smap,planet);
X	close_file(sectdata);
X
X	PermuteSects(planet);
X	bzero((char *)Sectinfo, sizeof(Sectinfo) );
X	x = int_rand(0,planet->Maxx-1);
X	y = int_rand(0,planet->Maxy-1);
X	p = Stinfo[starnum][planetnum].Thing_add;
X/*	printf("spore landed st %d, plan %d, play %d.\n", starnum,planetnum,p);*/
X	planet->info[p-1].numsectsowned = 1;
X
X	planet->info[p-1].explored = 1;
X	Sector(*planet,x,y).popn = 1;
X	Sector(*planet,x,y).owner = p;
X	Sector(*planet,x,y).is_wasted = 0;
X}
X
Xbzero((char *)avg_mob, sizeof(avg_mob) );
Xbzero((char *)sects_gained, sizeof(sects_gained) );
Xbzero((char *)sects_lost, sizeof(sects_lost) );
Xbzero((char *)populations, sizeof(populations) );
Xbzero((char *)prod_res, sizeof(prod_res) );
Xbzero((char *)prod_fuel, sizeof(prod_fuel) );
Xbzero((char *)prod_destruct, sizeof(prod_destruct) );
X
Xtot_resdep = prod_eff= prod_mob = tot_captured = 0;
XClaims = 0;
X
Xoldplanetmaxpopn = planet->maxpopn;
Xplanet->maxpopn = 0; 
X
Xoldplanetpopn = planet->popn;
Xplanet->popn = 0;	/* initialize population for recount */ 
X
X/* reset global variables */
Xfor (i=1; i<=Num_races; i++) {
X	Compat[i-1] = compatibility(planet, races[i-1]);
X	planet->info[i-1].numsectsowned = 0;
X	populations[i-1] = 0;
X	prod_fuel[i-1] = 0;
X	prod_destruct[i-1] = 0;
X	prod_res[i-1] = 0;
X	avg_mob[i-1] = 0.0;
X}
X
XGetxysect(planet, &x, &y, 1);
X/*printf(" while %d\n",Getxysect(planet, &x, &y, 1));	/* reset */
X
Xcheck(planet,4);
Xwhile (Getxysect(planet, &x, &y, 0)) {
X       p = &Sector(*planet,x,y);
X	 if (p->owner) {
X		/* (all modified; sectors belonging to that player modified) */
X	    allmod = 1;	
X	    if (p->popn == 0) {
X		  p->owner=0;	/* make wasted/unowned sects go to player 0 */
X	    } else {
X	      if (!Stars[starnum]->nova_stage) {
X	       		/* spread excess popn to surrounding sects */
X	      		produce(planet,p);	/* >produce stuff there */
X	      		spread(planet,p,x,y);	
X	      } else {
X			/* damage sector from supernova */
X			p->resource++;
X			p->fert *= 0.95;
X			if (Stars[starnum]->nova_stage == 14)
X				p->popn = p->owner = 0;
X			else
X				p->popn = round_rand((float)p->popn * .50);
X	      }
X
X	    }
X
X	      Sectinfo[x][y].done = 1;
X
X	  }
X
X
X       	if (p->owner) {
X	      planet->info[p->owner-1].numsectsowned++;
X	      planet->popn += p->popn;
X	      Power[p->owner-1].popn += p->popn;
X	      Power[p->owner-1].sum_eff += p->eff;
X               Power[p->owner-1].sum_mob += p->mobilization;
X	      starpopns[starnum][p->owner-1] += populations[p->owner-1] += p->popn;
X	      planet->maxpopn += maxsupport(races[p->owner-1],p,
X				  Compat[p->owner-1],planet->conditions[TOXIC]);
X	}
X
X
X
X         if (p->is_wasted) {
X	 	if (x>1 && x<planet->Maxx-2) {
X			if (p->des==DES_SEA || p->des==DES_GAS) {
X				/* don't reclaim pole sectors */
X		  		if ( y>1 && y<planet->Maxy-2 && 
X					(!(p-1)->is_wasted || !(p+1)->is_wasted)
X					&& !random()%5)
X					p->is_wasted = 0;
X	      		} else if (p->des==DES_LAND || p->des==DES_MOUNT || p->des==DES_ICE) {
X				if ( y>1 && y<planet->Maxy-2 && 
X				   ((p-1)->popn || (p+1)->popn)
X				   && !random()%10)
X					p->is_wasted = 0;
X      			}
X		}
X         }
X
X	 /* evaporate the oceans on novae */
X     if (Stars[starnum]->nova_stage) {
X       if (p->des==DES_ICE)
X	   p->des = DES_LAND;
X       else if (p->des==DES_SEA)
X
X	  if ( (x>0 && (p-1)->des==DES_LAND) ||
X	     (x<planet->Maxx-1 && (p+1)->des==DES_LAND) || 
X	     (y>0 && (p-planet->Maxx)->des==DES_LAND) ||
X	     (y<planet->Maxy-1 && (p+planet->Maxx)->des==DES_LAND ) ) {
X	       p->des = DES_LAND;
X	       p->popn = p->owner = 0;
X	       p->resource += 3;
X	       p->fert = int_rand(1,4);
X/*	       printf("sect %d,%d evaporated.\n",x,y); */
X	}
X     }
X
X}
Xcheck(planet,5);
X
Xif (allmod) {	/* ( >= 1 inhabited sector on the planet) */
X
Xcheck(planet,51);
X	 if (planet->expltimer >= 1)
X		planet->expltimer--;
X	 if (!Stars[starnum]->nova_stage && !planet->expltimer) {
X	  if (!planet->expltimer)
X		planet->expltimer = 5;
X	   for (i=1; !Claims && !allexp && i<=Num_races; i++) {
Xcheck(planet,6);
X		 /* sectors have been modified for this player*/
X
X	     if (planet->info[i-1].numsectsowned)
X	      while (!Claims && !allexp && timer>0) {
X		timer -= 1;
X		o = 1;
X		Getxysect(planet, &x, &y, 1);
X		while (!Claims && Getxysect(planet, &x, &y, 0)) {
X			  /* find out if all sectors have been explored */
X			o &= Sectinfo[x][y].explored;
X			p = &Sector(*planet,x,y);
X			if (( (Sectinfo[x][y].explored==i) && !(random()&02) ) 
X			    && (!p->owner && !p->is_wasted && p->des==races[i-1]->likesbest) ) {
X				 /*  explorations have found an island */
X/*				printf("found island @ %d,%d\n",x,y);*/
X				Claims = i;
X				 /* give them some free people there */
X				p->popn = races[i-1]->number_sexes;
X				p->owner = i;
X				tot_captured = 1;
X			} else {
X
X				explore(planet, p, x, y, i);
X				check(planet,63);
X				}
X		}
X		allexp |= o;	/* all sectors explored for this player */
X
X	       }
X           }
X	 }
X	if (allexp)
X		planet->expltimer = 5;
X
Xcheck(planet,7);
X		/* environment nukes a random sector */
X   if (planet->conditions[TOXIC] > ENVIR_DAMAGE_TOX) {
X	nukex = int_rand(0,planet->Maxx-1);
X	nukey = int_rand(0,planet->Maxy-1);
X	p = &Sector(*planet,nukex,nukey);
X	if (p->owner)
X		planet->info[p->owner-1].numsectsowned--;
X	p->is_wasted = 1;
X		/* index into accident type array */
X	nukem = p->popn ? 
X			/* random disaster */
X		Accidents_inhab[int_rand(0,sizeof(Accidents_inhab)/sizeof(char *))]
X				/* random of two disasters for that sec type*/
X		: Accidents_uninhab[p->des * 2 + (random()&01)];
X	p->popn = p->owner = 0;
X   }
X
X	for (i=1; i<=Num_races; i++)
X	  if (sects_gained[i-1] || sects_lost[i-1]) {
X	  sprintf(telegram_buf,"****** Report: Planet /%s/%s ******\n", 
X		Stars[starnum]->name, Stars[starnum]->pnames[planetnum] );
X		  sprintf(buf," \nWAR STATUS: %d sectors gained, %d sectors lost.\n", sects_gained[i-1],sects_lost[i-1]);
X	str_cat(telegram_buf, buf);
X	push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X	  }
X
X	for (i=1; i<=Num_races; i++)
X	 if (planet->info[i-1].autorep) {
X
Xcheck(planet,8);
X/*	  planet->info[i-1].autorep = planet->info[i-1].autorep - 1; */
Xcheck(planet,85);
X	  sprintf(telegram_buf,"\nFrom /%s/%s\n", 
X		Stars[starnum]->name, Stars[starnum]->pnames[planetnum] );
X	  if (Stinfo[starnum][planetnum].temp_add) {
X		sprintf(buf,"Temp: %d to %d\n", 
X			Temp(planet->conditions[RTEMP]), Temp(planet->conditions[TEMP]));
X		str_cat(telegram_buf, buf);
X	  }
X	  sprintf(buf, "Total      Prod: %dr %df %dd\n", prod_res[i-1], prod_fuel[i-1],
X			prod_destruct[i-1]);
X	str_cat(telegram_buf, buf);
X
X	if(tot_captured) {
X	  sprintf(buf,"%d sectors captured\n", tot_captured);
X	str_cat(telegram_buf, buf);
X		}
X
X	  if (Stars[starnum]->nova_stage) {
X		sprintf(buf,"This planet's primary is in a Stage %d nova.\n", 
X			Stars[starnum]->nova_stage);
X		str_cat(telegram_buf, buf);
X	  }
X
X		/* remind the player that he should clean up the environment. */
X	  if (planet->conditions[TOXIC] > ENVIR_DAMAGE_TOX) {
X		sprintf(buf,"Environmental damage on sector %d,%d\n", nukex, nukey);
X		str_cat(telegram_buf, buf);
X	  }
X
X	  if (planet->slaved_to) {
X		sprintf(buf, "ENSLAVED to player %d\n", planet->slaved_to);
X		str_cat(telegram_buf, buf);
X	  }
X
X push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X
X	}
Xcheck(planet,9);
X
X	   /* find out who is on this planet, for nova notification */
X	if (Stars[starnum]->nova_stage == 1) {
X	     sprintf(telegram_buf,"BULLETIN from /%s/%s\n", Stars[starnum]->name, Stars[starnum]->pnames[planetnum]);
X	     sprintf(buf,"\nStar %s is undergoing nova.\n", Stars[starnum]->name);
X	str_cat(telegram_buf, buf);
X	     if (planet->type==TYPE_EARTH) {
X		sprintf(buf,"Seas and rivers are boiling!\n",telegram_buf,0);
X		str_cat(telegram_buf, buf);
X		}
X	     sprintf(buf, "This planet must be evacuated immediately!\n%c", TELEG_DELIM);
X		str_cat(telegram_buf, buf);
X     	     for (i=1; i<=Num_races; i++)
X		if (planet->info[i-1].numsectsowned) {
X		push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X		}
X 	}
X
X
Xcheck(planet,10);
X   for (i=1; i<=Num_races; i++) {
X
X/* check to see if your guys steal all alien resources on the planet,
X	this requires that you be the only one inhabiting the planet */
X
X	if (planet->info[i-1].numsectsowned > 0) {
X		int aliensects=0,stolenres=0,stolendes=0,stolenfuel=0;
X		int stuff=0;
X
X
X		for (j=2; j<=Num_races; j++)  
X			if(j!=i)
X			{
X			aliensects += planet->info[j-1].numsectsowned;
X			if(planet->info[j-1].resource >0 ||
X			   planet->info[j-1].destruct >0 ||
X			   planet->info[j-1].fuel > 0.0) stuff=1;
X			}
X
X		if(!aliensects && stuff)
X			{
X		for (j=1; j<=Num_races; j++)
X			if(j!=i)
X			{
X			  stolenres += planet->info[j-1].resource;
X			  stolendes += planet->info[j-1].destruct;
X			  stolenfuel += planet->info[j-1].fuel;
X			  planet->info[j-1].resource = 0;
X			  planet->info[j-1].destruct = 0;
X			  planet->info[j-1].fuel = 0;
X			}
X		planet->info[i-1].resource += stolenres;
X		planet->info[i-1].destruct += stolendes;
X		planet->info[i-1].fuel += stolenfuel;
X/* notify player of recovered stockpiles */
X	  sprintf(telegram_buf,"****** Report: Planet /%s/%s ******\n\n", 
X		Stars[starnum]->name, Stars[starnum]->pnames[planetnum] );
X	  sprintf(buf," %d resources \n %d destruct \n %d fuel recovered from alien stock piles",stolenres,stolendes,stolenfuel);
X	str_cat(telegram_buf, buf);
X	push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X			} /*aliensect==0*/
X		}
X
X	if (planet->info[i-1].numsectsowned) {
X	  /* combat readiness naturally moves towards the avg mobilization */
X		avg_mob[i-1] /= planet->info[i-1].numsectsowned;
X		planet->info[i-1].comread += 
X			    sgn(avg_mob[i-1] - planet->info[i-1].comread);
X 	}
X   }
X
X	if (planet->maxpopn > 0 && planet->conditions[TOXIC]<100)
X 	   planet->conditions[TOXIC] += 
X/* 		     round_rand(MIN((float)(planet->popn / 
X				    (float)planet->maxpopn),2.0)); */
X				    planet->popn/planet->maxpopn;
X                     /* Rob, this is a better idea, or toxic go wild
X			    other effects can make this happen
X			    keeps waste containers down too -
X			    playtesting has proved this to us at OSU */
X
X	if (planet->conditions[TOXIC] > 100)
X	   planet->conditions[TOXIC] = 100;
X	else if (planet->conditions[TOXIC] < 0)
X	   planet->conditions[TOXIC] = 0;
X
X	/* deal with enslaved planets */
X   if (planet->slaved_to) {
X	if (populations[planet->slaved_to-1] >= planet->popn * 0.001 ||
X		(Stinfo[starnum][planetnum].intimidated && random()&01) ) {
X/*		 printf("enslaved!\n"); */
X		for (i=1; i<=Num_races; i++)
X		    /* add production to slave holder of planet */
X		  if (planet->info[i-1].numsectsowned) {
X			planet->info[planet->slaved_to-1].resource += 
X					prod_res[i-1];
X			prod_res[i-1] = 0;
X			planet->info[planet->slaved_to-1].fuel += 
X					prod_fuel[i-1];
X			prod_fuel[i-1] = 0;
X			planet->info[planet->slaved_to-1].destruct += 
X					prod_destruct[i-1];
X			prod_destruct[i-1] = 0;
X		  }
X	} else {
X		 /* slave revolt! */
X/*	printf("slave revolt!\n"); */
X		 /* first nuke some random sectors from the revolt */
X		i = planet->popn / 1000 + 1;
X/*	printf("i %d  Maxx %d  Maxy %d\n",i,planet->Maxx,planet->Maxy); */
X		while (--i) {
X			p = &Sector(*planet,int_rand(0,planet->Maxx-1),
X					int_rand(0,planet->Maxy-1));
X			if (p->popn) {
X				p->owner = p->popn = 0;
X				p->is_wasted = 1;
X			}
X		}
X		 /* now nuke all sectors belonging to former master */
X		Getxysect(planet, &x, &y, 1);
X		while (Getxysect(planet, &x, &y, 0)) {
X			if (Stinfo[starnum][planetnum].intimidated && random()&01) {
X			   p =  &Sector(*planet,x,y);
X			   if (p->owner==planet->slaved_to) {
X				p->owner = 0;
X				p->popn = 0;
X				p->is_wasted = 1;
X			   }
X			}
X		}
X		sprintf(telegram_buf,"NOTICE from planet /%s/%s!\n",
X				Stars[starnum]->name,
X				Stars[starnum]->pnames[planetnum]);
X		sprintf(buf,"\nThere has been a SLAVE REVOLT on this planet!\n");
X			str_cat(telegram_buf, buf);
X		sprintf(buf,"All population belonging to player #%d on the planet have been killed!\n",planet->slaved_to);
X			str_cat(telegram_buf, buf);
X		sprintf(buf,"Productions now go to their rightful owners.\n");
X			str_cat(telegram_buf, buf);
X		for (i=1; i<=Num_races; i++)
X		  if (planet->info[i-1].numsectsowned && i!=planet->slaved_to) {
X			push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X			}
X		 /* send to previous slave holder */
X	push_message(TELEG_PLAYER_AUTO, planet->slaved_to, telegram_buf);
X
X		planet->slaved_to = 0;
X		planet->is_sheep = 0;
X	}
X
X   } else {
X	 /* add production to all people here */
X	for (i=1; i<=Num_races; i++) {
X
X	  if (planet->info[i-1].numsectsowned) {
X
X	 	if (planet->info[i-1].fuel + prod_fuel[i-1] > 100000)
X		  planet->info[i-1].fuel = 100000;
X		else
X		  planet->info[i-1].fuel += prod_fuel[i-1];
X
X	 	if (planet->info[i-1].resource + prod_res[i-1] > 100000)
X		  planet->info[i-1].resource = 100000;
X		else
X		  planet->info[i-1].resource += prod_res[i-1];
X
X	 	if (planet->info[i-1].destruct + prod_destruct[i-1] > 100000)
X		  planet->info[i-1].destruct = 100000;
X		else
X		  planet->info[i-1].destruct += prod_destruct[i-1];
X
X 	   /* do tech investments */
X 	  if (planet->info[i-1].resource >= planet->info[i-1].tech_invest) {
X 		races[i-1]->tech += 
X 		   log10(1.0+(double)planet->info[i-1].tech_invest) * TECH_INVEST;
X 		planet->info[i-1].resource -= planet->info[i-1].tech_invest;
X 	  }
X
X	   /* build wc's if it's been ordered */
X	  if (planet->info[i-1].tox_thresh>0 &&
X	      planet->conditions[TOXIC] >= planet->info[i-1].tox_thresh &&
X	      planet->info[i-1].resource >= Shipdata[OTYPE_TOXWC][ABIL_COST]) {
X	          shiptype *s2; reg int t;
X		++Num_ships;
X		ships = (shiptype **)realloc(ships, (unsigned)((Num_ships+1)*sizeof(shiptype*)));
X		s2 = ships[Num_ships] = Malloc(shiptype);
X/*		printf("planet /%s/%s made Tox wc #%d.\n",Stars[starnum]->name,
X			Stars[starnum]->pnames[planetnum],Num_ships); */
X		bzero((char *)s2,sizeof(shiptype));
X		s2->type = OTYPE_TOXWC;
X
X		s2->armor = Shipdata[OTYPE_TOXWC][ABIL_ARMOR];
X		s2->guns = Shipdata[OTYPE_TOXWC][ABIL_GUNS];
X		s2->size = Shipdata[OTYPE_TOXWC][ABIL_TARGET];
X		s2->max_crew = Shipdata[OTYPE_TOXWC][ABIL_MAXCREW];
X		s2->max_resource = Shipdata[OTYPE_TOXWC][ABIL_CARGO];
X		s2->max_fuel = Shipdata[OTYPE_TOXWC][ABIL_FUELCAP];
X		s2->max_destruct = Shipdata[OTYPE_TOXWC][ABIL_DESTCAP];
X		s2->max_speed = Shipdata[OTYPE_TOXWC][ABIL_SPEED];
X		s2->base_mass = getmass(s2);
X		s2->mass = s2->base_mass;
X 		s2->is_alive = 1;
X		sprintf(s2->name,"Scum%04d",Num_ships);
X
X		insert_sh_plan(planet,s2,Num_ships);
X
X		s2->whatorbits = LEVEL_PLAN;
X		s2->storbits = starnum;
X		s2->pnumorbits = planetnum;
X		s2->is_docked = 1;
X		s2->xpos = int_rand(0,planet->Maxx-1);
X		s2->ypos = int_rand(0,planet->Maxy-1);
X		s2->whatdest = LEVEL_PLAN;
X		s2->deststar = starnum;
X		s2->destpnum = planetnum;
X		s2->owner = i;
X		t = MIN(TOXMAX,planet->conditions[TOXIC]);	/* amt of tox */
X		planet->conditions[TOXIC] -= t;
X		s2->object.number = t;
X	}
X     } 	/* (if numsectsowned[i]) */
X
X   } /* (for i=1 to Num_races) */
X
X  }  /* (else (if slaved_to)) */
X
X
X   planet->is_sheep = 0;
X
X }
X
X for (i=1; i<=Num_races; i++) {
X	Power[i-1].resource += planet->info[i-1].resource;
X	Power[i-1].destruct += planet->info[i-1].destruct;
X	Power[i-1].fuel += planet->info[i-1].fuel;
X	Power[i-1].planets_owned += !!planet->info[i-1].numsectsowned;
X	Power[i-1].sectors_owned += planet->info[i-1].numsectsowned;
X/*	Power[i-1].sum_mob += avg_mob[i-1]; */
X }
X
Xcheck(planet,12);
X return allmod;
X}
X
X
Xcheck(p,n)
Xplanettype *p;
Xint n;
X{
X if (p->sectormappos != Sectormappos)
X	fprintf(stderr," WHOA! sectormappos %d != %d (%d)\n",
X		p->sectormappos, Sectormappos, n);
X /*else
X	fprintf(stderr, "OK (%d)\n",n);*/
X}
END_OF_FILE
if test 21893 -ne `wc -c <'server/doplanet.c'`; then
    echo shar: \"'server/doplanet.c'\" unpacked with wrong size!
fi
# end of 'server/doplanet.c'
fi
if test -f 'server/order.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'server/order.c'\"
else
echo shar: Extracting \"'server/order.c'\" \(21412 characters\)
sed "s/^X//" >'server/order.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 *  order.c -- give orders to ship
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 <curses.h>
X#include <ctype.h>
X#include <signal.h>
X#include <math.h>
X
Xchar *prin_aimed_at(), *prin_ship_dest();
X
Xint order_shdata,order_pdata,order_stardata;
Xint n_ships;
Xstatic boolean first,prerror,was_obj = 0;
Xboolean Order_types[NUMSTYPES];
X
Xorder(Playernum, APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint shipno, i;
Xint order_shdata = NEUTRAL_FD;
Xint sh, pdata;
Xplanettype *p; 
X
Xfor (i=0; i<NUMSTYPES; i++) Order_types[i]=0;
X
Xif(argn==1) {	/* display all ship orders */
X		switch(Dir[Playernum-1].level) {
X			case LEVEL_UNIV:
X      				sh = Sdata.ships;
X					DispOrdersHeader(Playernum);
X       					while (sh)
X						DispOrders(Playernum, sh, &sh, 0);
X				break;
X			case LEVEL_STAR:
X      				sh = Stars[Dir[Playernum-1].snum]->ships;
X					DispOrdersHeader(Playernum);
X       					while (sh)
X						DispOrders(Playernum, sh, &sh, 0);
X				break;
X			case LEVEL_PLAN:
X 				openpdata(&pdata);
X 				getplanet(pdata,&p,
X					Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X 				close_file(pdata);
X				sh = p->ships;
X					DispOrdersHeader(Playernum);
X       					while (sh)
X						DispOrders(Playernum, sh, &sh, 0);
X				free(p);
X				break;
X			case LEVEL_SHIP:
X				sh = Dir[Playernum-1].shipno;
X					DispOrdersHeader(Playernum);
X					DispOrders(Playernum, sh, &sh, 0);
X				break;
X			default:
X				notify(Playernum, "Bad scope.\n");
X				break;
X		}
X				
X} else if (argn>=2) {		/* display one ship's orders (if argn==2), otherwise assigne orders */
X
X	if(*args[1] == '#' || isdigit(*args[1])) {
X	sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X
X openshdata(&order_shdata);
X n_ships = Numships(order_shdata);
Xclose_file(order_shdata);
X
X	if(shipno <=0 || shipno >  n_ships) {
X		sprintf(buf, "Illegal ship number %d.\n", shipno);
X		notify(Playernum, buf);
X		return;		
X		}
X
X	if(argn > 2)
X		   give_orders(Playernum, APcount, argn, args, shipno, 0);
X
X/* display the orders anyway */
X	DispOrdersHeader(Playernum);
X	DispOrders(Playernum, shipno, &sh, 0);
X	} else {		/* you want to order all types on this level */
X		int l;
X		l = strlen(args[1]);
X
X		while (l--) {
X	   		i = NUMSTYPES;
X	   		while (--i && Shipltrs[i]!=args[1][l]);
X		   if (Shipltrs[i]!=args[1][l]) {
X			sprintf(buf,"'%c' -- no such ship letter\n",args[1][l]);
X			notify(Playernum, buf);
X		   } else
X			Order_types[i] = 1;
X	}
X		
X
Xswitch(Dir[Playernum-1].level) { 
X  case LEVEL_PLAN:
X 	openpdata(&pdata);
X 	getplanet(pdata,&p,
X	Stars[Dir[Playernum-1].snum]->planetpos[Dir[Playernum-1].pnum]);
X 	close_file(pdata);
X      	shipno = p->ships;
X	      break; 
X   case LEVEL_STAR:
X      	shipno = Stars[Dir[Playernum-1].snum]->ships;
X	      break; 
X   default:
X	notify(Playernum, "You can't do multiple orders from this level. Must be planet of star.\n");
X		return;		
X		}
X
X	DispOrdersHeader(Playernum);
X       	while (shipno) {
X		if(argn > 2)
X		give_orders(Playernum, APcount, argn, args, shipno, 1);
X		DispOrders(Playernum, shipno, &shipno, 1);
X					}
X
X
X	   }
X	} else
X		notify(Playernum, "I don't understand what you mean.\n");
X		
X}
X
X
Xint give_orders(Playernum, APcount, argn, args, shipno, check)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
Xint shipno;
Xint check;
X{
X boolean Mod=0,q=0,redraw=1;
X placetype where,pl;
X int i = 0, j=0, in_list=0;
X shiptype *ship, *oldship, ship2;
X char c,s[PLACENAMESIZE];
X planettype *planet;
X
X openshdata(&order_shdata);
X if (!getship(order_shdata,&ship,shipno)) {
X	notify(Playernum, "order:error in getship.\n");
X	return;
X }
Xclose_file(order_shdata);
Xif(ship->type == OTYPE_CANIST)
X  i=1;
X
Xif(check) {
X	in_list = 0;
X	for(j=0; j<NUMSTYPES; j++) {
X		if(Order_types[j] && ship->type==j) in_list = 1;
X		}
X	if(!in_list) {
X			free(ship);
X			return;
X			}
X		}
X
X if (ship->owner==Playernum) {
X 
X    if (!ship->is_alive) {
X	sprintf(buf, "%s #%d has been destroyed.\n", Shipnames[ship->type], shipno);
X	notify(Playernum, buf);
X	free(ship);
X	return;
X    } else {
X
X      if (!ship->active) {
X	sprintf(buf, "%s #%d is irradiated (%d); it cannot be give orders.\n", 
X			Shipnames[ship->type], shipno,ship->rad);
X	notify(Playernum, buf);
X	free(ship);
X	return;
X      }
X      if (ship->type != OTYPE_TRANSDEV && !ship->popn && 
X	  Max_crew(ship)) {
X	sprintf(buf, "%s #%d has no crew and is not a robotic ship.\n",
X		Shipnames[ship->type], shipno);
X	notify(Playernum, buf);
X	free(ship);
X	return;
X      }
X
X    }
X
X	i=strlen(args[2]);
X
X       if (!strncmp(args[2],"defense",i)) {
X		if (can_bombard(ship) || ship->type == OTYPE_GR) {
X			if(!strncmp(args[3],"off", strlen(args[3]))) {
X				ship->protect.planet = 0;
X				notify(Playernum, "Planetary defense canceled.\n");
X			} else {
X				ship->protect.planet = 1;
X				notify(Playernum, "Ship assigned to planetary defense.\n");
X			}
X		} else {
X				notify(Playernum, "That ship cannot be assigned those orders.\n");
X				free(ship);
X				return;
X		}
X         } else if (!strncmp(args[2],"jump",i)) {
X		if(Shipdata[ship->type][ABIL_JUMP]) {
X			if(!strncmp(args[3],"off", strlen(args[3]))) {
X				ship->hyper_drive.on = 0;
X				notify(Playernum, "Hyper drive turned off.\n");
X				} else {
X				if(ship->whatdest != LEVEL_STAR) {
X				notify(Playernum, "Destination must be star.\n");
X				free(ship);
X				return;
X						}
X				ship->hyper_drive.on = 1;
X				ship->navigate.on = 0;
X				notify(Playernum, "Hyper drive engine's activated.\n");
X/* estimate how much fuel it will cost for this ship to get there */
X				}
X			} else {
X		notify(Playernum, "This ship does not have hyper drive capability.\n");
X		free(ship);
X		return;
X			}
X
X         } else if (!strncmp(args[2],"protect",i)) {
X
X	sscanf(args[3]+(args[3][0]=='#'),"%d",&j);
X
X		if(j < 0 || j > n_ships || j==shipno) {
X				notify(Playernum, "You can't protect that!\n");
X				free(ship);
X				return;
X			}
X		  if (can_bombard(ship) || ship->type==OTYPE_GR) {
X				if(!j) {
X					ship->protect.on = 0;
X					notify(Playernum, "Protection orders halted.\n");
X				} else {
X					ship->protect.on = 1;
X					ship->protect.ship = j;
X					sprintf(buf, "Protecting ship #%d.\n", j);
X					notify(Playernum, buf);
X					}
X
X			} else {
X				notify(Playernum, "That ship cannot protect.\n");
X				free(ship);
X				return;
X			}
X       } else if (!strncmp(args[2],"navigate",i)) {
X		if(argn >= 5) {
X			ship->navigate.on = 1;
X			ship->navigate.bearing = atoi(args[3]);
X			ship->navigate.turns = atoi(args[4]);
X			sprintf(buf, "Navigating %d degrees for %d turns.\n",
X				ship->navigate.bearing, ship->navigate.turns);
X			notify(Playernum, buf);
X		} else {
X			ship->navigate.on = 0;		
X			}
X		if(ship->hyper_drive.on) {
X			ship->hyper_drive.on = 0;
X			notify(Playernum, "Hyper drive turned off.\n");
X			}
X       } else if (!strncmp(args[2],"switch",i)) {
X		if(has_switch(ship)) {
X			ship->on = !ship->on;
X		} else {
X			sprintf(buf, "That ship does not have an on/off setting.\n");
X			notify(Playernum, buf);
X			free(ship);
X			return;
X			}
X		if(ship->on) {
X			notify(Playernum, "Turned on.\n");
X			      switch (ship->type) {
X				case STYPE_MINE:
X					notify(Playernum, "Mine armed and ready.\n");
X					break;
X				case OTYPE_TRANSDEV:
X					notify(Playernum, "Transporter ready to receive.\n");
X					break;
X				default: break;
X			      }
X		} else {
X			notify(Playernum, "Turned off.\n");
X			      switch (ship->type) {
X				case STYPE_MINE:
X					notify(Playernum, "Mine disarmed.\n");
X					break;
X				case OTYPE_TRANSDEV:
X					notify(Playernum, "No longer receiving.\n");
X					break;
X				default: break;
X			      }
X		}
X       } else if (!strncmp(args[2],"destination",i)) {
X		    if (speed_rating(ship)) {
X      			if (ship->is_docked) {
X			    notify(Playernum, "That ship is docked; use undock or launch first.\n");
X			free(ship);
X			return;
X      			} 
X			where = Getplace(Playernum, args[3], 1);
X		      if (!where.err) {
X			if (where.level==LEVEL_SHIP) {
X			    	ship->destshipno = where.shipno;
X				ship->whatdest = LEVEL_SHIP;
X			} else {
X			    ship->whatdest = where.level;
X			    ship->deststar = where.snum;
X			    ship->destpnum = where.pnum;
X			}
X		      } else {
X			notify(Playernum, "Illegal destination.\n");
X			free(ship);
X			return;			
X			}
X
X		     sprintf(buf, "Ship's destination set to %*s\n", -PLACENAMESIZE, 
X			prin_ship_dest(Playernum, ship) );
X			notify(Playernum, buf);			
X
X			} else {
X				notify(Playernum, "That ship cannot be launched.\n");
X				free(ship);
X				return;
X			}
X       } else if (!strncmp(args[2],"evade",i)) {
X		    if (Max_crew(ship) && Max_speed(ship)) {
X		if(!strlen(args[3],"on",strlen(args[3]))) {
X			ship->protect.evade = 1;
X			notify(Playernum, "Ship is undergoing evasive maneuvers.\n");
X		} else {
X			ship->protect.evade = 0;
X			notify(Playernum, "Ship no longer undergoing evasive maneuvers.\n");
X		}
X		} else {
X			notify(Playernum, "You can't make this type of ship do this.\n");
X			free(ship);
X			return;
X			}
X
X       } else if (!strncmp(args[2],"bombard",i)) {
X		if (ship->type!=OTYPE_OMCL) {
X		    if (can_bombard(ship)) {
X			if(!strncmp(args[3],"off",strlen(args[3]))) {
X				ship->bombard = 0;
X				notify(Playernum, "Bombardment option turned off.\n");				
X			} else {
X				ship->bombard = 1;
X				notify(Playernum, "Ship will bombard upon reaching its destination.\n");
X			}
X
X		    } else {
X			notify(Playernum, "This type of ship cannot be set to retaliate.\n");
X			}
X		}
X       } else if (!strncmp(args[2],"retaliate",i)) {
X		if (ship->type!=OTYPE_OMCL) {
X		    if (can_bombard(ship) || ship->type==OTYPE_GR) {
X			if(!strncmp(args[3],"off",strlen(args[3]))) {
X				ship->protect.self = 0;
X				notify(Playernum, "Retaliation option turned off.\n");				
X			} else {
X				ship->protect.self = 1;
X				notify(Playernum, "Ship will retaliate if attacked and damaged.\n");
X			}
X
X		    } else {
X			notify(Playernum, "This type of ship cannot be set to retaliate.\n");
X			}
X		}
X       } else if (!strncmp(args[2],"speed",i)) {
X		if (speed_rating(ship)) {
X			j = atoi(args[3]);			
X			if(j < 0) {
X				notify(Playernum, "Specify a positive speed.\n");
X				free(ship);
X				return;
X			} else {
X				if(j > speed_rating(ship)) j = speed_rating(ship);
X				ship->speed = j;
X				sprintf(buf, "Ship speed set to %d.\n", j);
X				notify(Playernum, buf);
X			}
X
X		} else {
X			notify(Playernum, "This ship does not have a speed rating.\n");
X			free(ship);
X			return;
X		}
X
X      } else if(!strncmp(args[2], "explosive", i)) {
X		if(ship->type==STYPE_MINE) {
X			ship->mine.mode = 1;
X			notify(Playernum, "This mine is set for explosive mode.\n");
X		} else {
X			notify(Playernum, "This ship cannot be set for this.\n");
X			free(ship);
X			return;
X		}
X      } else if(!strncmp(args[2], "radiative", i)) {
X		if(ship->type==STYPE_MINE) {
X			ship->mine.mode = 0;
X			notify(Playernum, "This mine is set for radiation mode.\n");
X		} else {
X			notify(Playernum, "This ship cannot be set for this.\n");
X			free(ship);
X			return;
X		}
X      } else if(!strncmp(args[2], "move", i)) {
X		if (ship->type==OTYPE_TERRA) {
X			ship->object.number = atoi(args[3]);
X			ship->object.number2 = atoi(args[4]);
X			if(ship->object.number != 0)
X				ship->object.number = sgn(ship->object.number);
X			if(ship->object.number2 != 0)
X				ship->object.number2 = sgn(ship->object.number2); 
X			sprintf(buf, "Terraformer moving in direction %d,%d\n",
X				ship->object.number,ship->object.number2);
X			notify(Playernum, buf);
X		    } else {
X			notify(Playernum, "That ship is not a terraformer.\n");
X			free(ship);
X			return;
X		}
X      } else if(!strncmp(args[2], "trigger", i)) {
X		    if (ship->type==STYPE_MINE) {
X				ship->object.number = atoi(args[3]);
X			if (ship->object.number < 0)
X				ship->object.number = 0;
X			sprintf(buf, "Trigger radius set to %3d\n",ship->object.number); 
X			notify(Playernum, buf);
X		    } else {
X			notify(Playernum, "This ship cannot be assigned a trigger radius.\n");
X			free(ship);
X			return;
X			}
X      } else if(!strncmp(args[2], "transport", i)) {
X 		if (ship->type==OTYPE_TRANSDEV) {
X			ship->object.number = atoi(args[3]);
X			if(ship->object.number < 0 || ship->object.number > n_ships)
X				ship->object.number = 0;
X			sprintf(buf, "Target ship is %d.\n",ship->object.number);
X			notify(Playernum, buf);
X		    } else {
X			notify(Playernum, "This ship is not a transporter.\n");
X			free(ship);
X			return;
X			}
X      } else if(!strncmp(args[2], "aim", i)) {
X		    if (can_aim(ship)) {
X		      if (ship->type==OTYPE_GTELE || ship->type==OTYPE_TRACT 
X				  || ship->fuel>=FUEL_MANEUVER) {
X      			if (ship->type==STYPE_MIRROR && ship->is_docked) {
X			    sprintf(buf, "docked; use undock or launch first.\n");
X				notify(Playernum, buf);
X				free(ship);
X				return;
X      			}
X			  pl = Getplace(Playernum, args[3],1);
X			  if (pl.err) {
X				notify(Playernum, "Error in destination.\n");
X				free(ship);
X				return;
X			  } else {
X				ship->aimed_at.level = pl.level;
X				ship->aimed_at.pnum = pl.pnum;
X				ship->aimed_at.snum = pl.snum;
X				ship->aimed_at.shipno = pl.shipno;
X				if (ship->type!=OTYPE_TRACT && 
X						ship->type!=OTYPE_GTELE)
X					ship->fuel -= FUEL_MANEUVER;
X				if (ship->type==OTYPE_GTELE || 
X						ship->type==OTYPE_STELE)
X					mk_expl_aimed_at(Playernum, ship);
X		        sprintf(buf, "Aimed at %s\n", prin_aimed_at(Playernum, ship) );
X			notify(Playernum, buf);
X			}
X		      } else {
X			sprintf(buf, "Not enough maneuvering fuel (%.2f).\n",FUEL_MANEUVER);
X			notify(Playernum, buf);
X			free(ship);
X			return;
X		      }
X
X
X		    } else {
X			notify(Playernum, "You can't aim that kind of ship.\n");
X			free(ship);
X			return;
X			}
X     } else if(!strncmp(args[2], "intensity", i)) {
X		    if (ship->type==STYPE_MIRROR) { 
X			      ship->aimed_at.intensity = atoi(args[3]);
X			      if (ship->aimed_at.intensity>100)
X				  ship->aimed_at.intensity=100;
X			      else if (ship->aimed_at.intensity<0)
X				  ship->aimed_at.intensity=0;
X			    sprintf(buf, "Mirror intensisty set to %3d\n",ship->aimed_at.intensity); 
X				notify(Playernum, buf);
X		    } else {
X				notify(Playernum, "You can't do that with this kind of ship.\n");
X			}
X } else if(!strncmp(args[2], "on", i)) {
X
X     if(ship->type==OTYPE_FACTORY) {
X     if(ship->on) {
X	 notify(Playernum, "It's already online.\n");
X	 free(ship);
X	 return;
X		     }
X/* check to see if player has enough resources to activate the factory */
X     		openpdata(&order_pdata);
X     		getplanet(order_pdata,&planet, Stars[ship->deststar]->planetpos[ship->destpnum]);
X		close_file(order_pdata);
X
X	if(planet->info[Playernum-1].resource < 2*ship->build_cost) {
X		sprintf(buf, "You don't have %s resources on the planet to activate this factory.\n",
X				2*ship->build_cost);
X		notify(Playernum, buf);
X		free(ship);
X		free(planet);
X		return;
X			} else {
X		planet->info[Playernum-1].resource -= 2*ship->build_cost;
X
X     		openpdata(&order_pdata);
X		putplanet(order_pdata, planet, Stars[ship->deststar]->planetpos[ship->destpnum]);
X		close_file(order_pdata);
X		free(planet);
X		sprintf(buf, "Factory activated at a cost of %d resources.\n",
X			2*ship->build_cost);
X		notify(Playernum, buf);
X			}
X
X	}     
X                ship->on = 1;
X		notify(Playernum, "Activated.\n");
X } else if(!strncmp(args[2], "off", i)) {
X
X     if(ship->type==OTYPE_FACTORY && ship->on) {
X	 notify(Playernum, "You can't deactivate a factory once it's online. Consider using 'scrap'.\n");
X	 free(ship);
X	 return;
X     }
X     
X                ship->on = 0;
X		notify(Playernum, "Deactivated.\n");
X} else {
X		notify(Playernum, "I don't understand what you mean.\n");
X }
X
X	       ship->notified = 0;
X    openshdata(&order_shdata);
X    putship(order_shdata, ship, shipno);
X    close_file(order_shdata);
X } else {
X	notify(Playernum, "You don't own that ship!\n");
X	}
X
X free(ship);
X}
X
X
X
X/* 
X * return what the ship is aimed at, if it's a mirror 
X */
Xchar *prin_aimed_at(Playernum, ship)
Xint Playernum;
Xshiptype *ship;
X{
X placetype targ;
X
X  targ.level = ship->aimed_at.level;
X  targ.snum = ship->aimed_at.snum;
X  targ.pnum = ship->aimed_at.pnum;
X  targ.shipno = ship->aimed_at.shipno;
X  return Dispplace(Playernum, &targ);
X}
X
Xchar *prin_ship_dest(Playernum, ship)
Xint Playernum;
Xshiptype *ship;
X{
X placetype dest;
X
X  dest.level = ship->whatdest;
X  dest.snum = ship->deststar;
X  dest.pnum = ship->destpnum;
X  dest.shipno = ship->destshipno;
X  return Dispplace(Playernum, &dest);
X}
X
X
X/* 
X * mark wherever the ship is aimed at, as explored by the owning player.
X */
Xmk_expl_aimed_at(Playernum, s)
Xint Playernum;
Xshiptype *s;
X{
Xdouble dist;
Xstartype *str;
Xplanettype *p;
Xint sdata,pdata;
Xfloat xf,yf;
X
X str = Stars[s->aimed_at.snum];
X
X if (s->is_docked && s->whatdest==LEVEL_PLAN) {
X	openpdata(&pdata);
X	getplanet(pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]);
X	close_file(pdata);
X	xf = Stars[s->storbits]->xpos + p->xpos + s->xpos;
X	yf = Stars[s->storbits]->ypos + p->ypos + s->ypos;
X	free(p);
X } else {
X	xf = s->xpos;
X	yf = s->ypos;
X }
X
X switch (s->aimed_at.level) {
X	case LEVEL_UNIV:
X		sprintf(buf, "There is nothing out here to aim at.");
X		notify(Playernum, buf);
X		break;
X	case LEVEL_STAR:
X		sprintf(buf, "Star %s ", prin_aimed_at(Playernum, s));
X		notify(Playernum, buf);
X		if ((dist=sqrt(Distsq(xf, yf, str->xpos, str->ypos))) <= tele_range(s->type, s->tech) ) {
X			openstardata(&sdata);
X			getstar(sdata, &str, s->aimed_at.snum);
X			 setbit(str->explored,Playernum);
X			putstar(sdata, str, s->aimed_at.snum);
X			close_file(sdata);	/* don't need to care about Stars */
X			sprintf(buf, "Surveyed, distance %g.\n",dist);
X			notify(Playernum, buf);
X		} else {
X			sprintf(buf, "Too far to see (%g, max %g).\n", 
X						dist, tele_range(s->type, s->tech) );
X			notify(Playernum, buf);
X		}
X		break;
X	case LEVEL_PLAN:
X		sprintf(buf, "Planet %s ", prin_aimed_at(Playernum, s));
X		notify(Playernum, buf);
X		openpdata(&pdata);
X		getplanet(pdata, &p, str->planetpos[s->aimed_at.pnum]);
X		close_file(pdata);
X		if ((dist=sqrt(Distsq(xf, yf, str->xpos+p->xpos, str->ypos+p->ypos))) <= tele_range(s->type,s->tech) ) {
X			setbit(str->explored,Playernum);
X			p->info[Playernum-1].explored = 1;
X			openpdata(&pdata);
X			putplanet(pdata, p, str->planetpos[s->aimed_at.pnum]);
X		close_file(pdata);
X			free(p);
X			sprintf(buf, "Surveyed, distance %g.\n", dist);
X			notify(Playernum, buf);
X		} else {
X			sprintf(buf, "Too far to see (%g, max %g).\n", 
X						dist, tele_range(s->type, s->tech) );
X			notify(Playernum, buf);
X		}
X		break;
X	case LEVEL_SHIP:
X		sprintf(buf, "You can't see anything of use there.\n");
X		notify(Playernum, buf);
X		break;
X }
X}
X
XDispOrdersHeader(Playernum)
Xint Playernum;
X{
Xnotify(Playernum, "            name          destination     orbits     spd   options\n"); 
X}
X
XDispOrders(Playernum, sh, next, check)
Xint Playernum;
Xint sh;
Xint *next;
Xint check;
X{
Xint order_shdata, in_list;
Xshiptype *ship;
Xchar temp[128];
X
Xopenshdata(&order_shdata);
X if (!getship(order_shdata,&ship, sh)) {
X	sprintf(buf, "order:error in getship.\n");
X	notify(Playernum, buf);
X	*next = 0;
X	return; 
X}
Xclose_file(order_shdata);
X
X*next = ship->nextship;
X
Xif(ship->owner != Playernum || !ship->is_alive) { /* cant look at other ships */
X	free(ship);
X	return;
X	}
X
Xif(check) {
X	int j;
X	in_list = 0;
X	for(j=0; j<NUMSTYPES; j++)
X		if(Order_types[j] && ship->type==j) in_list = 1;
X	if(!in_list) {
X		free(ship);
X		return;
X		}
X		}
X
X	sprintf(buf, "%4d %c %14s %15s %15s %1d ", sh, Shipltrs[ship->type], ship->name, 
X		prin_ship_dest(Playernum, ship), prin_ship_orbits(ship),  ship->speed);
X
Xif(ship->hyper_drive.on) {
X	sprintf(temp, "/jump %s %d", (ship->hyper_drive.ready ? "ready" : "charging"),
X		ship->hyper_drive.charge);
X	strcat(buf, temp);
X	}
Xif(ship->protect.self) strcat(buf, "/retal");
Xif(ship->protect.planet) strcat(buf, "/defense");
Xif(ship->protect.on) {
X		sprintf(temp, "/prot %d", ship->protect.ship);
X		strcat(buf, temp);
X		}
Xif(ship->navigate.on) {
X	sprintf(temp, "/nav %d (%d)", ship->navigate.bearing, ship->navigate.turns);
X	strcat(buf, temp);
X	}
Xif(has_switch(ship)) {
X	if(ship->on) strcat(buf, "/on");
X	else strcat(buf, "/off");
X	}
Xif(ship->protect.evade) strcat(buf, "/evade");
Xif(ship->bombard) strcat(buf, "/bomb");
Xif(ship->type==STYPE_MINE) {
X	if(ship->mine.mode) strcat(buf, "/explode");
X	else strcat(buf, "/radiate");
X	}
Xif(ship->type==OTYPE_TERRA) {
X	sprintf(temp, "/(%d, %d)", ship->object.number, ship->object.number2);
X	strcat(buf, temp);
X	}
Xif(ship->type==STYPE_MINE) {
X	sprintf(temp, "/trigger %d", ship->object.number);
X	strcat(buf, temp);
X	}
Xif(ship->type==OTYPE_TRANSDEV) {
X	sprintf(temp, "/target %d", ship->object.number);
X	strcat(buf, temp);
X	}
Xif(ship->type == STYPE_MIRROR) {
X	sprintf(temp, "/aim %s/int %d", prin_aimed_at(Playernum, ship), ship->aimed_at.intensity);
X	strcat(buf, temp);
X	}
X
Xstrcat(buf, "\n");
Xnotify(Playernum, buf);
X/* if hyper space is on estimate how much fuel it will cost to get to the destination */
X	if(ship->hyper_drive.on) {
X	double dist, fuse;
X
X	 dist = sqrt( Distsq(ship->xpos, ship->ypos, Stars[ship->deststar]->xpos, 
X				Stars[ship->deststar]->ypos));
X	 fuse = HYPER_DRIVE_FUEL_USE * ship->mass 
X			* (dist/HYPER_DIST_FACTOR) * (dist/HYPER_DIST_FACTOR);
X			sprintf(buf, "	*** jump will cost %.1ff ***\n", fuse);
X			notify(Playernum, buf);
X	if(ship->max_fuel < fuse)
X			notify(Playernum, "Your ship cannot carry enough fuel to do this jump.\n");
X		}
X
Xfree(ship);
X}
X
X
END_OF_FILE
if test 21412 -ne `wc -c <'server/order.c'`; then
    echo shar: \"'server/order.c'\" unpacked with wrong size!
fi
# end of 'server/order.c'
fi
if test -f 'server/ships.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'server/ships.h'\"
else
echo shar: Extracting \"'server/ships.h'\" \(7417 characters\)
sed "s/^X//" >'server/ships.h' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, 
X * smq@ucscb.ucsc.edu, mods by people in GB.c, enroll.dat.
X * Restrictions in GB.c.
X */
X
X
X#define STYPE_POD	0
X#define STYPE_SHUTTLE 	1
X#define STYPE_CARRIER   2
X#define STYPE_DREADNT	3
X#define STYPE_BATTLE 	4
X#define STYPE_INTCPT	5
X#define STYPE_CRUISER	6
X#define STYPE_DESTROYER 7
X#define STYPE_FIGHTER 	8
X#define STYPE_EXPLORER 	9
X#define STYPE_HABITAT 	10
X#define STYPE_STATION	11
X#define STYPE_ASS	12
X#define STYPE_CARGO 	13
X#define STYPE_TANKER 	14
X#define STYPE_GOD	15
X#define STYPE_MINE	16
X#define STYPE_MIRROR	17
X
X#define OTYPE_STELE	18
X#define OTYPE_GTELE	19
X#define OTYPE_TRACT	20
X#define OTYPE_AP	21
X#define OTYPE_CANIST	22
X#define OTYPE_VN	23
X#define OTYPE_BERS	24
X#define OTYPE_GOV	25
X#define OTYPE_OMCL	26
X#define OTYPE_TOXWC	27
X#define OTYPE_PROBE	28
X#define OTYPE_GR	29
X#define OTYPE_FACTORY	30
X#define OTYPE_TERRA	31
X#define OTYPE_BERSCTLC	32
X#define OTYPE_AUTOFAC	33
X#define OTYPE_TRANSDEV	34
X#define OTYPE_REPAIR	35
X#define OTYPE_PLANDEF	36
X
X#define ABIL_CARGO 	0
X#define ABIL_DESTCAP 	1
X#define ABIL_GUNS 	2
X#define ABIL_FUELCAP 	3
X#define ABIL_TECH 	4
X#define ABIL_MAXCREW 	5
X#define ABIL_ARMOR 	6
X#define ABIL_TARGET	7
X#define ABIL_COST 	8
X#define ABIL_JUMP 	9
X#define ABIL_CANLAND	10
X#define ABIL_HASSWITCH	11
X#define ABIL_SPEED	12
X#define ABIL_DAMAGE	13
X#define ABIL_BUILD	14
X#define ABIL_CONSTRUCT	15
X#define ABIL_SIGHT	16
X#define ABIL_PROGRAMMED 17
X
X#define NUMSTYPES 	(OTYPE_PLANDEF+1)
X#define NUMABILS 	(ABIL_PROGRAMMED+1)
X
X#define SHIP_NAMESIZE	18
X
X
X
Xtypedef struct ship shiptype;
Xtypedef struct ship_new shiptype_new;
Xtypedef struct place placetype;
X
X
Xstruct ship {
X    float xpos,ypos;
X    float fuel,mass;
X    char name[SHIP_NAMESIZE];		/* name of ship (optional) */
X    char class[SHIP_NAMESIZE];		/* class of ship - designated by players */
X    percent morale;			/* morale of the crew */
X    unsigned short command;		/* captain+staff leadership value */
X
X    unsigned short destshipno;		/* destination ship # */
X    unsigned short nextship;		/* next ship in linked list */
X
X    unsigned bombard : 1;	/* bombard planet we're orbiting */
X
X    percent armor;
X    percent guns;
X    percent size;
X
X    unsigned short max_crew;
X    unsigned short max_resource;
X    unsigned short max_destruct;
X    unsigned short max_fuel;
X    unsigned short max_speed;
X    unsigned short build_type;	/* for factories - type of ship it makes */
X    unsigned short build_cost; /* how much it cost to build the ship - into VPs too? */
X
X    float base_mass;
X    float tech;		/* technology rating */
X
X	struct a {		/* if the ship is a Space Mirror */
X		unsigned short shipno;	/* aimed at what ship */
X		char snum;		/* aimed at what star */
X		percent intensity;		/* intensity of aiming */
X		unsigned pnum : BITS_MAXPLANETS;  /* aimed at what planet */
X		unsigned level : 2;	/* aimed at what level */
X	} aimed_at;
X	
X	struct o2 {
X		short number;	/* for misc functions */
X		short number2;	/* again */
X		short number3;
X		short number4;  /* again */
X	} object;
X	
X	struct m {
X		unsigned mode : 1; /* 0 for radiation, 1 for damage */
X	} mine;
X	
X	struct nv {
X		unsigned on : 1;    /* toggles navigate mode */
X		unsigned speed : 3; /* speed for navigate command */
X		unsigned turns : 16;/* number turns left in maneuver */
X		unsigned bearing : 9; /* course */
X	} navigate;
X	
X	struct prot {
X		float maxrng;	       /* maximum range for autoshoot */
X		unsigned on	 :  1; /* toggle on/off */
X		unsigned planet  :  1; /* planet defender */
X 		unsigned self	 :  1; /* retaliate if attacked */
X 		unsigned evade	 :  1; /* evasive action */
X 		unsigned ship	 : 14; /* ship it is protecting */
X	} protect;
X
X    struct hd {
X    unsigned char charge;
X    unsigned ready : 1;
X    unsigned on : 1;
X    unsigned dummy : 6;  /* dummy bits for development */
X	} hyper_drive;
X
X    char storbits;		/* what star # orbits */
X    char deststar;		/* destination star */
X    unsigned destpnum : BITS_MAXPLANETS;	/* destination planet */
X    unsigned pnumorbits : BITS_MAXPLANETS;	/* # of planet if orbiting */
X    unsigned damage : 7;		/* amt of damage */
X    unsigned rad : 7;			/* radiation level */
X    unsigned active: 1;			/* tells whether the ship is active */
X    unsigned short destruct;	 	/* stuff it's carrying */
X    unsigned short resource;
X    unsigned short popn;			/* crew */
X    unsigned owner : BITS_MAXPLAYERS;	/* owner of ship */
X    unsigned speed : 4;		/* what speed to travel at 0-9 */
X    unsigned whatdest : 2;	/* where going (same as Dir) */
X    unsigned whatorbits : 2;	/* where orbited (same as Dir) */
X    unsigned type : 6;		/* what type ship is */
X    unsigned is_cloaked : 1;	/* 1 bit: is cloaked ship */
X    unsigned is_sheep : 1;	/* 1 bit: is under influence of mind control */
X    unsigned is_docked : 1;	/* 1 bit: is landed on a planet or docked */
X    unsigned notified : 1; 	/* 1bit: has been notified of something */
X    unsigned is_alive : 1;	/* 1 bit: ship is alive */
X    unsigned is_examined : 1;	/* 1 bit: has been examined */
X    unsigned on : 1;		/* on or off */
X};
X
X
Xstruct place {		/* used in function return for finding place */
X    char snum;
X    char pnum;
X    short shipno;
X    shiptype *shipptr;
X    unsigned level : 2;	/* .level: same as Dir */
X    unsigned err : 1;		/* if error */
X};
X
X /* whether ship is an object or not */
X#define is_object(s) ((s)->type > STYPE_MIRROR)
X
X /* can takeoff & land, is mobile, etc. */
X#define speed_rating(s) (Shipdata[(s)->type][ABIL_SPEED])
X
X /* has an on/off switch */
X#define has_switch(s) (Shipdata[(s)->type][ABIL_HASSWITCH])
X
X /* can bombard planets */
X#define can_bombard(s) \
X	(Shipdata[(s)->type][ABIL_GUNS] && ((s)->type != STYPE_MINE))
X
X/* can navigate */
X#define can_navigate(s) (Shipdata[(s)->type][ABIL_SPEED] > 0 && (s)->type != OTYPE_TERRA && (s)->type != OTYPE_VN)
X
X /* can aim at things. */
X#define can_aim(s) ((s)->type>=STYPE_MIRROR && (s)->type<=OTYPE_TRACT)
X
X /* macro for killing a ship.  !notified means we have not yet written it
X    to the dead_ship file.  */
X#define kill_ship(s) ((s)->is_alive = 0, (s)->damage = 100, (s)->notified = 0)
X
X/* macros to get ship stats */
X#define Armor(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_ARMOR] : (s)->armor)
X#define Guns(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_GUNS] : (s)->guns)
X#define Size(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_TARGET] : (s)->size)
X#define Max_crew(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_MAXCREW] : (s)->max_crew)
X#define Max_resource(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_CARGO] : (s)->max_resource)
X#define Max_fuel(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_FUELCAP] : (s)->max_fuel)
X#define Max_destruct(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_DESTCAP] : (s)->max_destruct)
X#define Max_speed(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_SPEED] : (s)->max_speed)
X#define Cost(s) ( ((s)->type==OTYPE_FACTORY) ? Shipdata[(s)->type][ABIL_COST ] : (s)->build_cost)
X#define Mass(s) ( ((s)->type==OTYPE_FACTORY) ? (s)->mass : (s)->base_mass)
X
Xextern placetype Getplace();
Xextern char *Dispplace(),*Dispshiporbits(),*prin_ship_orbits(),
X	*prin_aimed_at(), *prin_ship_dest();
Xextern int Shipdata[NUMSTYPES][NUMABILS];
Xextern char Shipltrs[];
Xextern char *Shipnames[];
Xextern float tele_range(), gun_range();
X
XEXTERN shiptype **ships;
XEXTERN shiptype *shipptr;
END_OF_FILE
if test 7417 -ne `wc -c <'server/ships.h'`; then
    echo shar: \"'server/ships.h'\" unpacked with wrong size!
fi
# end of 'server/ships.h'
fi
echo shar: End of archive 3 \(of 14\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 14 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