[comp.sources.games] v07i045: GB2 - Galactic Bloodshed, an empire-like war game [Ver. 1.0], Part02/08

billr@saab.CNA.TEK.COM (Bill Randle) (07/19/89)

Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 7, Issue 45
Archive-name: GB2/Part02



#! /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 2 (of 8)."
# Contents:  Docs/power.doc doship.c load.c makeuniv.c orbit.c
# Wrapped by billr@saab on Thu Jul  6 07:39:48 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Docs/power.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Docs/power.doc'\"
else
echo shar: Extracting \"'Docs/power.doc'\" \(333 characters\)
sed "s/^X//" >'Docs/power.doc' <<'END_OF_FILE'
XPOWER			Galactic Bloodshed			POWER
X
X
XNAME
X  [0] power -- list empires and their approximate influence
X
XSYNOPSIS
X       power
X
XDESCRIPTION
X  
X  This command lists all players currently in the game, and their accumulated
Xtotal stockpiles, number of planets on which they have colonies, number of
Xships, and various other information.
X
END_OF_FILE
if test 333 -ne `wc -c <'Docs/power.doc'`; then
    echo shar: \"'Docs/power.doc'\" unpacked with wrong size!
fi
# end of 'Docs/power.doc'
fi
if test -f 'doship.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'doship.c'\"
else
echo shar: Extracting \"'doship.c'\" \(17771 characters\)
sed "s/^X//" >'doship.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed (Robert Chansky, smq@b)
X * doship -- do one ship turn.
X */
X
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "doturn.h"
X#include "power.h"
X#include <math.h>
X#include <strings.h>
Xextern struct power Power[];
X
X
Xdoship(shipno,ship)
Xint shipno;
Xshiptype *ship;
X{
X int sh,sh2,j,shfdata;
X char buf[300];
X
X if (!ship->is_dead && (ship->owner == 0 && ship->type != OTYPE_VN
X		&& ship->type != OTYPE_AMOEBA) )
X/* a hack by gvc to get rid of owner 0, space pod which occasionally
Xgets created for unknown reason (and consequentially causes problems) */
X	{
X	ship->is_dead = 1;
X	ship->owner = 1;
X
X} /* used to counteract bugs */
X
X if (!ship->is_dead) {
X
X		/* add ships, popn to total count to add AP's */
X	if (ship->type==OTYPE_VN)
X		Power[ship->owner].ships_owned += ship->orders.object.number;
X	else
X		Power[ship->owner].ships_owned++;
X	Power[ship->owner].resource += ship->resource;
X	Power[ship->owner].fuel += ship->fuel;
X	Power[ship->owner].destruct += ship->destruct;
X	Power[ship->owner].popn += ship->popn;
X	if (ship->whatorbits==LEVEL_UNIV) {
X		 Sdatanumships[ship->owner]++;
X		 Sdatapopns[ship->owner] += ship->popn;
X	} else {
X		starnumships[ship->storbits][ship->owner] += 
X			(ship->type==OTYPE_VN) ? ship->orders.object.number : 1;
X	         /* add popn of ships to popn */
X	        starpopns[ship->storbits][ship->owner] += ship->popn;
X		 /* set inhabited for ship */
X		setbit(Stars[ship->storbits]->inhabited, ship->owner);
X	}
X
X		/* repair radiation */
X      if (ship->rad) {
X			/* kill off some people */
X		ship->popn = round_rand(ship->popn * .90);
X		if (ship->rad > REPAIR_RATE)
X			ship->rad -= REPAIR_RATE;
X		else
X			ship->rad = 0;
X      } else {
X		/* irradiated ships are immobile.. */
X
X		/* make sure of an update if someones bombarding the planet */
X	if (can_bombard(ship) && ship->orders.o.bombard &&
X			ship->whatorbits==LEVEL_PLAN)
X		Stinfo[ship->storbits][ship->pnumorbits].inhab = 1;
X
X	Moveship(shipno, ship);
X	
X		/* repair ship by the amount of crew it has */
X	if (ship->damage && ship->popn) { reg int d;
X		if ((d = ((float)ship->popn / 
X			Shipdata[ship->type][ABIL_MAXCREW]) * REPAIR_RATE)
X			> ship->damage)
X		   ship->damage = 0;
X		else
X		   ship->damage -= d;
X	}
X
X     switch (ship->type) {
X
X      case OTYPE_CANIST:
X	   if (ship->whatorbits == LEVEL_PLAN && !ship->is_docked) { short *t;
X	      if (--ship->orders.object.number) {
X		  t = &Stinfo[ship->storbits][ship->pnumorbits].temp_add;
X		  if (*t - 10 < -120)
X			*t = -120;
X		  else
X			*t -= 10;
X	      } else {	/* timer expired; destroy canister */
X		   reg int j=0;
X		  kill_ship(ship);
X		  teleg_add("",telegram_buf);
X		  sprintf(buf,"Notice from /%s/%s\n\n", 
X			   Stars[ship->storbits]->name, 
X			   Stars[ship->storbits]->pnames[ship->pnumorbits]);
X		  teleg_add(buf,telegram_buf);
X		  teleg_add("Canister of dust previously covering this planet has dissipated.\n",telegram_buf);
X		  for (j=1; j<=Num_races; j++)
X		       if (planets[ship->storbits][ship->pnumorbits]->info[j-1].numsectsowned) 
X				teleg_send(TELEG_PLAYER_AUTO, j, telegram_buf);
X	      }
X	   }
X	   break;
X
X      case STYPE_MINE:
X		/* check around and see if we should explode. */
X	   if (ship->on) {
X		int rad=0; float xd,yd; int p;
X	     if (ship->whatorbits==LEVEL_STAR)
X	     	sh = Stars[ship->storbits]->ships;
X	     else if (ship->whatorbits==LEVEL_PLAN)
X		sh = planets[ship->storbits][ship->pnumorbits]->ships;
X	     else
X		sh = 0;	/* don't explode in interstellar space.  so what. */
X	     sh2 = sh;
X	      /* traverse the list, look for ships that 
X			are closer than the trigger radius... */
X	     while (sh) {
X		xd = ships[sh]->xpos - ship->xpos;
X		yd = ships[sh]->ypos - ship->ypos;
X		if ( (ships[sh]->type != STYPE_MINE) &&
X			(ships[sh]->owner != Playernum) && 
X			( xd*xd+yd*yd < ship->orders.object.number * ship->orders.object.number) )
X			rad = 1;
X		sh = ships[sh]->nextship;
X	     }
X	     if (rad) {
X		kill_ship(ship);
X		teleg_add("",telegram_buf);
X		sprintf(buf, "BULLETIN!\n mine #%d triggered at system /%s",shipno,Stars[ship->storbits]->name);
X		teleg_add(buf, telegram_buf);
X		teleg_send(TELEG_PLAYER_AUTO,ship->owner,telegram_buf);
X		   while (sh2) {	/* sh2=beginning of list */
X			xd = ships[sh2]->xpos - ship->xpos;
X			yd = ships[sh2]->ypos - ship->ypos;
X
X			if ( ships[sh2]->popn != 0 ) {
X				      rad = round_rand(ship->destruct
X		* (2500/(xd*xd + yd*yd + 1.)) );
X		      	      if (ships[sh2]->rad + rad > 100)
X				        ships[sh2]->rad = 100;
X				      else
X				        ships[sh2]->rad += rad;
X
X				      teleg_add("",telegram_buf);
X				      sprintf(buf, "BULLETIN!\n ship #%d irradiated by mine at system /%s - dosage %d percent", 
X	sh2, Stars[ship->storbits]->name, rad);
X				      teleg_add(buf, telegram_buf);
X				      teleg_send(TELEG_PLAYER_AUTO,ships[sh2]->owner,telegram_buf);
X				}
X			sh2 = ships[sh2]->nextship;
X		}
X	     }
X	   }
X	   break;
X
X      case STYPE_MIRROR:
X	  switch (ship->orders.aimed_at.level) {
X	   case LEVEL_SHIP: /* ship aimed at is a legal ship now */
X			  /* if in the same system */
X		   if ( (ship->whatorbits==LEVEL_STAR || ship->whatorbits==LEVEL_PLAN)
X			&& (ships[ship->orders.aimed_at.shipno]!=NULL)
X			&& (ships[ship->orders.aimed_at.shipno]->whatorbits==LEVEL_STAR ||
X			ships[ship->orders.aimed_at.shipno]->whatorbits==LEVEL_PLAN)
X			&& ship->storbits == ships[ship->orders.aimed_at.shipno]->storbits 
X			&& !ships[ship->orders.aimed_at.shipno]->is_dead )
X				ships[ship->orders.aimed_at.shipno]->damage += 10;
X		break;
X	   case LEVEL_PLAN: { reg short *t; reg int i;
X		  t = &Stinfo[ship->storbits][ship->orders.aimed_at.pnum].temp_add;
X		  i = ship->orders.aimed_at.intensity;
X		  if (*t + i > 120)
X			*t = 120;
X		  else if (*t + i < -120)
X			*t = -120;
X		  else
X			*t += i;
X		}
X		break;
X	   case LEVEL_STAR:
X		if (ship->orders.aimed_at.snum>0 && 
X			ship->orders.aimed_at.snum<Sdata.numstars)
X		    Stars[ship->orders.aimed_at.snum]->stability += random()&01;
X		break;
X	   case LEVEL_UNIV:
X		break;
X	}
X	break;
X     case STYPE_GOD:
X		/* gods have infinite power.... heh heh heh */
X	ship->fuel = Shipdata[ship->type][ABIL_FUELCAP];
X	ship->popn = Shipdata[ship->type][ABIL_MAXCREW];
X	ship->destruct = Shipdata[ship->type][ABIL_DESTCAP];
X	ship->resource = Shipdata[ship->type][ABIL_CARGO];
X	break;
X
X     case OTYPE_AP:	/* terraforming device */
X		/* if landed on planet, change conditions to be like race */
X	if (ship->is_docked && ship->whatdest==LEVEL_PLAN && ship->on) {
X		int j,d,a;planettype *p;
X		p = planets[ship->storbits][ship->pnumorbits];
X		if (ship->fuel >= 3.0) {
X			ship->fuel -= 3.0;
X			for (j=RTEMP+1; j<=OTHER; j++) {
X				if ( (d = races[ship->owner]->conditions[j] - p->conditions[j]) != 0) {
X				  a = int_rand(sgn(d)*3,-sgn(d));
X				  if (p->conditions[j] + a < 0)
X					p->conditions[j] = 0;
X				  else if (p->conditions[j] + a > 100)
X					p->conditions[j] = 100;
X				  else p->conditions[j] += a;
X				}
X			}
X		}
X	}
X	break;
X
X     case OTYPE_AMOEBA:	  /* space amoeba */
X	if (ship->orders.amoeba.dig) {
X		/* we are currently digesting a planet. */
X		if (planets[ship->storbits][ship->pnumorbits]->digested) {
X			 reg int i,s; reg bool f=0;
X			/* the planet has been digested. get rid of it. */
X			 /* move the highest-#'d planet over this one */
X			/*Stars[ship->storbits]->numplanets--;
X			Stars[ship->storbits]->planetpos[ship->pnumorbits] = 
X				Stars[ship->storbits]->planetpos[Stars[ship->storbits]->numplanets];
X			strcpy(Stars[ship->storbits]->pnames[ship->pnumorbits],
X				Stars[ship->storbits]->pnames[Stars[ship->storbits]->numplanets]);
X				/* insert into star list */
X			/*ship->nextship = Stars[ship->storbits]->ships;
X			Stars[ship->storbits]->ships = shipno;*/
X
X			 /* kill all ships here; take their stuff */
X			/*sh = planets[ship->storbits][ship->pnumorbits]->ships;
X			while (sh) {
X			   if (sh!=shipno) ) {
X				ship->destruct += ships[sh]->destruct;
X				ship->mass += ships[sh]->destruct*MASS_DESTRUCT;
X				ship->fuel += ships[sh]->fuel;
X				ship->mass += ships[sh]->fuel*MASS_FUEL;
X				kill_ship(ships[sh]);
X			   }
X			   sh = ships[sh]->nextship;
X			}
X			 /* no longer orbiting star */
X			/*ship->whatorbits = LEVEL_STAR;
X			ship->whatdest = LEVEL_UNIV;*/
X			 /* no longer digesting */
X			ship->orders.amoeba.dig = 0;
X			 /* find a new place to digest */
X			ship->orders.amoeba.dest = 0;
X		}
X	} else {
X		 /* we have a planet in mind. */
X		if (!ship->orders.amoeba.dest || ship->whatdest==LEVEL_UNIV) {
X			/* we have orders; wait to get to destination */
X			if (ship->whatdest == LEVEL_PLAN && 
X			    ship->whatorbits == LEVEL_PLAN &&
X			    ship->deststar == ship->storbits &&
X			    ship->destpnum == ship->pnumorbits) {
X				/* we just arrived at our destination. */
X			   Stinfo[ship->storbits][ship->pnumorbits].amoeba_add = 1;
X			    /* start digesting */
X			   ship->orders.amoeba.dig = 1;
X			    /* telegram people */
X			   teleg_add("", telegram_buf);
X			   teleg_add("BULLETIN!!\n\n ",telegram_buf);
X			   sprintf(buf, "%s #%d is attacking your planet /%s/%s!\n\n", 
X			      Shipnames[ship->type], 
X			      shipno, Stars[ship->storbits]->name, 
X			      Stars[ship->storbits]->pnames[ship->pnumorbits]);
X			   teleg_add(buf, telegram_buf);
X			   for (j=1; j<=Num_races; j++)
X				if (planets[ship->storbits][ship->pnumorbits]->info[j-1].numsectsowned)
X			   		teleg_send(TELEG_PLAYER_AUTO, j, telegram_buf);
X			}
X
X		} else {
X		   reg int s,min=0,min2=0,i;
X		   char expl=0,expl2=0;
X
X			/* find a yummy planet to munch on */
X		     /* find closest _explored_ star */
X		     /*  (this is the opposite method VN's use) */
X		   for (s=0; s<Sdata.numstars; s++)
X			if (s != ship->storbits &&
X				Distsq(Stars[s]->xpos,Stars[s]->ypos,ship->xpos,ship->ypos) < 
X				Distsq(Stars[min]->xpos,Stars[min]->ypos,ship->xpos,ship->ypos))
X				   min2 = min,min = s;
X		   for (i=0; i<howmanybytes(Num_races); i++) {
X			expl |= Stars[min]->inhabited[i];
X			expl2 |= Stars[min2]->inhabited[i];
X		   }
X		   if (!expl)
X		     if (!expl2)
X			   ship->deststar = int_rand(0,Sdata.numstars-1);
X		     else
X			   ship->deststar = min2;	/* 2nd closest star */
X		   else
X		         ship->deststar = min;
X			 /* find a good planet to go to */
X		   
X		   if (Stars[ship->deststar]->numplanets) {
X			ship->destpnum =
X				int_rand(0,Stars[ship->deststar]->numplanets-1);
X		 	ship->whatdest = LEVEL_PLAN;
X			ship->orders.amoeba.dest = 1;
X		   } else {
X			/* no good; find someplace else. */
X			ship->orders.amoeba.dest = 0;
X		   }
X		   ship->speed = 1;	/* amoebae are very fastidious,too */
X		   fprintf(stderr,"amoeba #%d headed for star %d, pl %d.\n",shipno,ship->deststar, ship->destpnum);
X		}
X	}
X	break;
X
X     case OTYPE_VN:	/* Von Neumann machine */
X	do_VN(ship,shipno);
X	break;
X
X     case STYPE_ASS:
X	 /* "indimidate" the planet below, for enslavement purposes. */
X	if (ship->whatorbits==LEVEL_PLAN)
X		Stinfo[ship->storbits][ship->pnumorbits].intimidated = 1;
X	break;
X
X     case OTYPE_OMCL:
X	 /* orbital mind control laser */
X	if (ship->orders.aimed_at.level==LEVEL_PLAN && ship->on &&
X	    ship->speed==1) {
X		planets[ship->orders.aimed_at.snum][ship->orders.aimed_at.pnum]
X			->is_sheep = 1;
X	}
X	break;
X
X     case STYPE_HABITAT:{ reg int add;
X	 /* habitats multiply some resources inside them. */
X	add = ship->resource *
X		((float)ship->popn / Shipdata[STYPE_HABITAT][ABIL_MAXCREW]) 
X	         * (100 - ship->damage) * 0.001;
X	if (ship->resource+add > Shipdata[STYPE_HABITAT][ABIL_CARGO])
X		add = Shipdata[STYPE_HABITAT][ABIL_CARGO] - ship->resource;
X	ship->resource += add;
X	ship->mass += add * MASS_RESOURCE;
X	add = ship->popn * races[ship->owner]->birthrate * 
X		(100 - ship->damage) * 0.005;
X	if (ship->popn+add > Shipdata[STYPE_HABITAT][ABIL_MAXCREW])
X		add = Shipdata[STYPE_HABITAT][ABIL_MAXCREW] - ship->popn;
X	ship->popn += add;
X	ship->mass += add * races[ship->owner]->mass;
X	} break;
X
X     case STYPE_POD:
X	if (ship->notified) {
X		/* we just arrived at this system -- explode */
X		/* or, we are floating in space with no fuel -- just die */
X		reg int i,f= -1;
X		kill_ship(ship);
X		if (ship->whatorbits==LEVEL_STAR) {
X		  for (i=0; f== -1 && i<Stars[ship->storbits]->numplanets; i++)
X			if (sqrt((double)Distsq(ship->xpos, ship->ypos,
X			  Stars[ship->storbits]->xpos + planets[ship->storbits][i]->xpos,
X			  Stars[ship->storbits]->ypos + planets[ship->storbits][i]->ypos))/SYSTEMSIZE < float_rand())
X				f = i;
X		  teleg_add("",telegram_buf);
X		  sprintf(buf, "Bulletin\n\nSpore pod #%d has warmed and exploded.\n",shipno);
X		  teleg_add(buf,telegram_buf);
X		  if (f != -1) {
X			sprintf(buf,"A spore has landed on planet %s.\n",Stars[ship->storbits]->pnames[f]);
X			Stinfo[ship->storbits][f].Thing_add = ship->owner;
X				/* so doplanet does not pass over it */
X			setbit(Stars[ship->storbits]->inhabited,ship->owner);
X			planets[ship->storbits][f]->info[ship->owner-1].explored = 1;
X		  } else {
X			sprintf(buf,"No spores have survived.\n");
X		  }
X		  teleg_add(buf,telegram_buf);
X		  teleg_send(TELEG_PLAYER_AUTO, ship->owner, telegram_buf);
X		  teleg_add("",telegram_buf);
X		  sprintf(buf,"BULLETIN!\n\n A spore pod has exploded in system /%s.\n",Stars[ship->storbits]->name);
X		  teleg_add(buf,telegram_buf);
X		  teleg_add("Spores may have drifted to planets here.\n",telegram_buf);
X		  for (i=1; i<=Num_races; i++)
X			if (i!=ship->owner && isset(Stars[ship->storbits]->inhabited,i))
X				teleg_send(TELEG_PLAYER_AUTO, i, telegram_buf);
X		}
X	}
X	break;
X
X     default:
X	break;
X    }
X
X   }
X
X } else if (ship->owner ==0 || !ship->notified) {
X	/* ship is dead -- add to shipfree file, remove from all lists. */
X	/* if notified, this means it's already been deleted and written. */
X	ship->notified = 1;
X	makeshipdead(shipno);
X	printf("destroyed ship #%d\n",shipno);
X }
X
X}
X
X
X
Xdo_VN(ship,shipno)
Xshiptype *ship;
Xint shipno;
X{
Xint r; 
Xplanettype *p;
Xchar buf[150];
X
X  if (ship->on) {
X
X    if (ship->whatorbits==LEVEL_PLAN)
X    	p = planets[ship->storbits][ship->pnumorbits];
X
X    if (ship->whatorbits==LEVEL_PLAN &&
X	ship->is_docked && ship->whatdest==LEVEL_PLAN) {
X		/* make sure the planet is updated */
X	Stinfo[ship->storbits][ship->pnumorbits].inhab = 1;
X	   /* try to launch it */
X	if (ship->orders.object.number2 == 0) {	/* launch if no assignment */
X	  /* steal some fuel from other players,telegram */
X		int f=0;
X		if (ship->fuel < Shipdata[OTYPE_VN][ABIL_COST]) {
X		 for (r=1; !f && r<=Num_races; r++)
X		  if (p->info[r-1].fuel >= Shipdata[OTYPE_VN][ABIL_COST])
X			f = r;
X	          if (f) {
X			ship->fuel += Shipdata[OTYPE_VN][ABIL_FUELCAP];
X		  	p->info[f-1].fuel -= Shipdata[OTYPE_VN][ABIL_FUELCAP];
X			teleg_add("",telegram_buf);
X			teleg_add("Bulletin!\n\n",telegram_buf);
X			sprintf(buf,"%d fuel stolen by %s #%d on planet /%s/%s!\n",
X			   Shipdata[OTYPE_VN][ABIL_FUELCAP],
X			   Shipnames[OTYPE_VN],
X			   shipno, Stars[ship->storbits]->name,
X			   Stars[ship->storbits]->pnames[ship->pnumorbits]);
X			teleg_add(buf,telegram_buf);
X	    		teleg_send(TELEG_PLAYER_AUTO, f, telegram_buf);
X	    
X		ship->orders.object.number2 = 0; /* no current assignment */
X		ship->xpos = Stars[ship->storbits]->xpos + planets[ship->storbits][ship->pnumorbits]->xpos + int_rand(-10,10);
X		ship->ypos = Stars[ship->storbits]->ypos + planets[ship->storbits][ship->pnumorbits]->ypos + int_rand(-10,10);
X		ship->is_docked = 0;
X		ship->whatdest = LEVEL_UNIV;
X	      }
X	     }
X	} else {
X		/* we have an assignment.  Since we are landed, this means
X		   we are engaged in building up resources/fuel. */
X		/* steal resources from other players,telegram */
X		reg int i,f; int nums[MAXPLAYERS+1];
X		  /* permute list of people to steal from */
X		for (i=1; i<=Num_races; i++)
X			nums[i] = i;
X		for (i=1; i<=Num_races; i++) {
X			f = int_rand(1,Num_races);
X			swap(nums[i], nums[f]);
X		}
X		for (f=0,i=1; i<=Num_races; i++)
X			if (p->info[nums[i]-1].resource)
X				f = nums[i];
X		if (f) {
X		  	p->info[f-1].resource -= Shipdata[OTYPE_VN][ABIL_COST];
X			ship->resource += Shipdata[OTYPE_VN][ABIL_COST];
X			ship->mass += Shipdata[OTYPE_VN][ABIL_COST] * MASS_RESOURCE;
X			teleg_add("",telegram_buf);
X			teleg_add("Bulletin!\n\n",telegram_buf);
X			sprintf(buf,"%d resources stolen by %s #%d\non planet ",
X			     Shipdata[OTYPE_VN][ABIL_COST],
X			     Shipnames[OTYPE_VN], shipno);
X			teleg_add(buf,telegram_buf);
X			sprintf(buf,"/%s/%s!\n",
X			     Stars[ship->storbits]->name,
X			     Stars[ship->storbits]->pnames[ship->pnumorbits]);
X			teleg_add(buf,telegram_buf);
X	    		teleg_send(TELEG_PLAYER_AUTO, f, telegram_buf);
X		} else {
X		 /*if no resources to steal, more will be produced in doplanet*/
X		}
X	}
X  } else {
X	/* we are not landed */
X	if (ship->orders.object.number2) {
X		/* we've arrived from somewhere -- look for a place to land.  
X		   this is done on planet turn */
X	} else {
X		/* we were just built & launched */
X		reg int s,min=0,min2=0;
X		  /* find closest unexplored star */
X		for (s=1; s<Sdata.numstars; s++)
X			if (s != ship->storbits &&
X				Distsq(Stars[s]->xpos,Stars[s]->ypos,ship->xpos,ship->ypos) < 
X				Distsq(Stars[min]->xpos,Stars[min]->ypos,ship->xpos,ship->ypos))
X				   min2 = min,min = s;
X			/* don't go there if we have a choice, 
X			   and we have VN's there already */
X		if (isset(Stars[min]->inhabited,1))
X		  if (isset(Stars[min2]->inhabited,1))
X			ship->deststar = int_rand(0,Sdata.numstars-1);
X		  else
X			ship->deststar = min2;	/* 2nd closest star */
X		else
X		      ship->deststar = min;
X		if (Stars[ship->deststar]->numplanets) {
X			ship->destpnum =
X				int_rand(0,Stars[ship->deststar]->numplanets-1);
X		 	ship->whatdest = LEVEL_PLAN;
X			ship->orders.object.number2 = 1;
X		} else {
X			/* no good; find someplace else. */
X			ship->orders.object.number2 = 0;
X		}
X		ship->speed = 1;	/* VN's are very fastidious */
X		fprintf(stderr,"VN #%d headed for star %d, pl %d.\n",shipno,ship->deststar, ship->destpnum);
X			/* we are assigned to go */
X	}
X  }
X 
X }
X
X}
END_OF_FILE
if test 17771 -ne `wc -c <'doship.c'`; then
    echo shar: \"'doship.c'\" unpacked with wrong size!
fi
# end of 'doship.c'
fi
if test -f 'load.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'load.c'\"
else
echo shar: Extracting \"'load.c'\" \(12762 characters\)
sed "s/^X//" >'load.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed (Robert Chansky, smq@b)
X *  load.c -- load/unload stuff
X */
X
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include <signal.h>
X#include <setjmp.h>
Xextern jmp_buf main_jenv;
Xextern char telegram_buf[AUTO_TELEG_SIZE];
Xint load_shdata,load_pdata,load_sectdata;
X
X
Xload(APcount, argn,args)
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xbool jett=0,sh=0;
Xint first=1,proc,Mod=0,lolim,uplim, shipno,amt;
Xfloat flolim,fuplim, famt;
Xchar commod, buf[100],bufr[70],bufd[70],buff[70],bufc[70];
Xshiptype *s,*s2;
Xplanettype *p;
Xsectortype *sect;
Xint load_handler();
X
X    load_shdata = load_pdata = load_sectdata = NEUTRAL_FD;
X    signal(SIGINT, load_handler);
X
X    if (argn==1) {
X      printf("ship #");
X      scanf("%d",&shipno);
X      getchr();
X    } else 
X	sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno);
X
X    openshdata(&load_shdata);
X    if (!getship(load_shdata,&s,shipno)) {
X	load_handler();
X    }
X    if (s->owner!=Playernum || s->is_dead) {
X	DontOwnErr(shipno);
X	printf("(%d)\n",s->owner);
X	free(s);
X	load_handler();
X    }
X    if (s->rad) {
X	printf("%s #%d is irradiated and inactive.\n", Shipnames[s->type],shipno);
X	free(s);
X	load_handler();
X    }
X    if (s->whatorbits==LEVEL_UNIV) {
X    	if (!enufAP(Sdata.AP, APcount))
X		load_handler();
X    } else 
X	if (!enufAP(Stars[s->storbits]->AP, APcount))
X		load_handler();
X
X
X   do {
X
X    proc = 0;
X
X    if (s->type == OTYPE_TRANSDEV && s->orders.object.number > 0) {
X	Locks(1);
X	if (!getship(load_shdata,&s2, s->orders.object.number)) {
X		printf("The hopper seems to be blocked.\n");
X		load_handler();
X	}
X	Locks(0);
X
X	if (s2->is_dead) {
X		printf("The target device does not exist.\n");
X		load_handler();
X	}
X	if (s2->type!=OTYPE_TRANSDEV || !s2->on) {
X	printf("s2->type = %d\n",s2->type);
X	printf("OTYPE_TRANSDEV = %d\n",OTYPE_TRANSDEV);
X
X	printf("s2->on = %d\n",s2->on);
X		printf("The target device is not receiving.\n");
X		load_handler();
X	}
X    } else if (!s->is_docked) {
X	if (s->type==OTYPE_TRANSDEV) {
X		printf("It does not seem to work in zero-g environments.\n");
X		load_handler();
X	}
X	printf("%s #%d is not landed.\n",is_object(s)?"object":"ship",shipno);
X      	tty_on();
X	printf("  jettison into open space (y/n)?");
X	jett = 1;
X      	commod=getchr();
X      	tty_off();
X      	if (commod!='y')
X		load_handler();
X    } else {
X	if (s->whatdest==LEVEL_PLAN)
X		printf("Ship #%d at %.0f,%.0f\n", shipno,s->xpos, s->ypos);
X	else {
X		Locks(1);
X		if (!getship(load_shdata, &s2, s->destshipno) || s2->is_dead ||
X			!(s2->is_docked && s2->whatdest==LEVEL_SHIP 
X			  && s2->destshipno==shipno) ) {
X				/* the ship it was docked with died or
X				   undocked with it or something. */
X			s->is_docked = 0;
X			s->whatdest = LEVEL_UNIV;
X			putship(load_shdata, s, shipno);
X			close(load_shdata);
X			free(s);
X			printf("ship #%u is not docked.\n", s->destshipno);
X			load_handler();
X		}
X		Locks(0);
X		printf("Ship #%d docked with %s #%d\n", shipno, 
X				Shipnames[s2->type], s->destshipno);
X		sh = 1;
X	}
X    }
X
X
X    if (!jett && !sh) {
X    	openpdata(&load_pdata);
X    	getplanet(load_pdata,&p,Stars[Dir.snum]->planetpos[Dir.pnum]);
X    }
X
X
X
X   do {
X
X    tty_on();
X    printf("%s #%d:(rfdc? q) >", Shipnames[s->type], shipno);
X    commod = getchr();
X    putchr('\n');
X    tty_off();
X
X    if (!jett && !sh && commod=='c') {
X    	opensectdata(&load_sectdata);
X    	getsector(load_sectdata,&sect,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
X    }
X
X    switch (commod) {
X
X	case 'c': if (jett) {
X			uplim = 0;
X			lolim = - s->popn;
X		  } else
X		    if (sh) {
X		    	uplim = MIN(s2->popn, 
X				  Shipdata[s->type][ABIL_MAXCREW] - s->popn);
X			lolim = - MIN(s->popn, 
X				  Shipdata[s2->type][ABIL_MAXCREW] - s2->popn);
X		    } else {
X		    	uplim = MIN(sect->popn, 
X				  Shipdata[s->type][ABIL_MAXCREW] - s->popn);
X			lolim = - s->popn;
X		    }
X		  proc = 1;
X		  break;
X
X	case 'd': if (jett) {
X			uplim = 0;
X			lolim = - s->destruct;
X		  } else
X		    if (sh) {
X		    	uplim = MIN(s2->destruct, 
X				 Shipdata[s->type][ABIL_DESTCAP] - s->destruct);
X			lolim = - MIN(s->destruct, 
X				 Shipdata[s2->type][ABIL_DESTCAP]-s2->destruct);
X		    } else {
X		    	uplim = MIN(p->info[Playernum-1].destruct,
X				 Shipdata[s->type][ABIL_DESTCAP]-s->destruct);
X			lolim = - s->destruct;
X		    }
X		  proc = 1;
X		  break;
X
X	case 'f': if (jett) {
X			fuplim = 0.0;
X			flolim = - s->fuel;
X		  } else
X		    if (sh) {
X		    	fuplim = MIN(s2->fuel, 
X				 Shipdata[s->type][ABIL_FUELCAP] - s->fuel);
X			flolim = - MIN(s->fuel, 
X				 Shipdata[s2->type][ABIL_FUELCAP] - s2->fuel);
X		    } else {
X		    	fuplim = MIN(p->info[Playernum-1].fuel,
X				 Shipdata[s->type][ABIL_FUELCAP]- s->fuel);
X			flolim = - s->fuel;
X		    }
X		  proc = 1;
X		  break;
X
X	case 'r': if (jett) {
X			uplim = 0;
X			lolim = - s->resource;
X		  } else
X		    if (sh) {
X		    	if (s->type==STYPE_SHUTTLE)
X			  uplim = s2->resource;
X			else
X			  uplim = MIN(s2->resource, 
X				   Shipdata[s->type][ABIL_CARGO] - s->resource);
X			if (s2->type==STYPE_SHUTTLE)
X			  lolim = - s->resource;
X			else
X			  lolim = - MIN(s->resource, 
X				   Shipdata[s2->type][ABIL_CARGO]-s2->resource);
X		    } else {
X		    	uplim = MIN(p->info[Playernum-1].resource,
X				 Shipdata[s->type][ABIL_CARGO]-s->resource);
X			lolim = - s->resource;
X		    }
X		  proc = 1;
X		  break;
X
X	case '?': printf("\n%s #%3d:\n", Shipnames[s->type], shipno);
X		  printf("        res:%7u  (%d)\n", s->resource,
X					Shipdata[s->type][ABIL_CARGO]);
X		  printf("       fuel:%7.1f  (%d)\n",s->fuel,
X					Shipdata[s->type][ABIL_FUELCAP]);
X		  printf("       crew:%7u  (%d)\n", s->popn,
X					Shipdata[s->type][ABIL_MAXCREW]);
X		  printf("       dest:%7u  (%d)\n", s->destruct,
X					Shipdata[s->type][ABIL_DESTCAP]);
X		  printf("       mass:%7.1f  (%.1f)\n",s->mass,
X			   (float)Shipdata[s->type][ABIL_MASS] +
X			   Shipdata[s->type][ABIL_FUELCAP] * MASS_FUEL +
X			   Shipdata[s->type][ABIL_CARGO] * MASS_RESOURCE +
X			   Shipdata[s->type][ABIL_MAXCREW] * Race->mass);
X		  if (sh) {
X			printf("docked with %s #%d:\n",Shipnames[s2->type],
X					s->destshipno);
X			printf("        res:%7u  (%d)\n", s2->resource,
X					Shipdata[s2->type][ABIL_CARGO]);
X			printf("       fuel:%7.1f  (%d)\n", s2->fuel,
X					Shipdata[s2->type][ABIL_FUELCAP]);
X			printf("       crew:%7u  (%d)\n", s2->popn,
X					Shipdata[s2->type][ABIL_MAXCREW]);
X			printf("       dest:%7u  (%d)\n", s2->destruct,
X					Shipdata[s2->type][ABIL_DESTCAP]);
X			printf("       mass:7%.1f  (%.1f)\n",s2->mass,
X			   (float)Shipdata[s2->type][ABIL_MASS] +
X			   Shipdata[s2->type][ABIL_FUELCAP] * MASS_FUEL +
X			   Shipdata[s2->type][ABIL_CARGO] * MASS_RESOURCE +
X			   Shipdata[s2->type][ABIL_MAXCREW] * Race->mass);
X		  }
X		  printf("commands:\n r -- transfer resources\n");
X		  printf(" f -- transfer fuel\n");
X		  printf(" c -- transfer crew members\n");
X		  printf(" d -- transfer destruct\n");
X		  printf("' ',q -- quit\n");
X		  proc = 0;
X		  break;
X	case 'q':
X	case ' ':
X		  load_handler();
X		  break;
X	default:  printf("%c not valid.\n",commod);
X		  proc = 0;
X		  load_handler();
X      }
X     } while (!proc);
X
X      tty_off();
X
X      if (commod=='f') {
X      	famt = fuplim + 1.0;
X      	while (famt<flolim || famt>fuplim) {
X	  printf("      amount (%.2f to %.2f) ",flolim,fuplim);
X	  if (scanf("%f",&famt)!=1) 
X		famt=fuplim+1.0;	/* force error */
X	  getchr();
X      	}
X      } else {
X      	amt = uplim + 1;
X      	while (amt<lolim || amt>uplim) {
X	  printf("      amount (%d to %d) ",lolim,uplim);
X	  if (scanf("%d",&amt)!=1) 
X		amt=uplim+1;	/* force error */
X	  getchr();
X      	}
X      }
X
X    switch (commod) {
X	case 'c': if (!jett) {
X			if (sh) {
X				s2->popn -= amt;
X				s2->mass -= amt*Race->mass;
X			} else {
X		  	   if (sect->popn==0 && amt<0) {
X				p->info[Playernum-1].numsectsowned++;
X				sect->owner = Playernum;
X				printf("sector %.0f,%.0f COLONIZED.\n",s->xpos,s->ypos);
X		  	   }
X		  	   sect->popn -= amt;
X		  	   p->popn -= amt;
X		  	   if (sect->popn==0) {
X				p->info[Playernum-1].numsectsowned--;
X				sect->owner = 0;
X				printf("sector %.0f,%.0f evacuated.\n",s->xpos,s->ypos);
X		  	   }
X			}
X		  }
X		  printf("crew complement of ship #%d is now %u.\n", 
X			shipno, s->popn+amt);
X		  s->popn += amt;
X		  s->mass += amt*Race->mass;
X		  Mod = 1;
X		  break;
X
X	case 'd': s->destruct += amt;
X		  s->mass += amt*MASS_DESTRUCT;
X
X		  if (sh) {
X			s2->destruct -= amt;
X			s2->mass -= amt*MASS_DESTRUCT;
X		  } else if (!jett)
X		  	p->info[Playernum-1].destruct -= amt;
X
X		  Mod = 1;
X		  break;
X
X	case 'f': s->fuel += famt;
X		  s->mass += famt*MASS_FUEL;
X
X		  if (sh) {
X			s2->fuel -= famt;
X			s2->mass -= famt*MASS_FUEL;
X		  } else if (!jett)
X		  	p->info[Playernum-1].fuel -= famt;
X
X		  Mod = 1;
X		  break;
X
X	case 'r': s->resource += amt;
X		  s->mass += amt*MASS_RESOURCE;
X
X		  if (sh) {
X			s2->resource -= amt;
X			s2->mass -= amt*MASS_RESOURCE;
X		  } else if (!jett)
X		  	p->info[Playernum-1].resource -= amt;
X
X		  Mod = 1;
X		  break;
X
X	case 'q':
X	case ' ':
X	case '?':
X	default:
X		break;
X    }
X
X    putship(load_shdata,s,shipno);
X
X    	if (s->type==OTYPE_TRANSDEV && s->orders.object.number > 0) {
X
X	   printf("Zap\007!\n");
X
X	   	/* send stuff to other ship (could be transport device) */
X	   if (s->resource ) {
X		s2->mass += s->resource * MASS_RESOURCE;
X		s2->resource += s->resource;
X
X		printf("%d resources transferred.\n", s->resource);
X		sprintf(bufr, "%d Resources\n",s->resource);
X
X		s->mass -= s->resource * MASS_RESOURCE;
X		s->resource  -= s->resource;
X	   } else
X		bufr[0] = '\0';
X	   if (s->fuel) {
X		s2->fuel += s->fuel;
X		s2->mass += s->fuel * MASS_FUEL;
X
X		printf("%g fuel transferred.\n", s->fuel);
X		sprintf(buff, "%g Fuel\n",s->fuel);
X
X		s->mass -= s->fuel * MASS_FUEL;
X		s->fuel -= s->fuel;
X	   } else
X		buff[0] = '\0';
X	   if (s->destruct) {
X		s2->mass += s->destruct * MASS_DESTRUCT;
X		s2->destruct += s->destruct;
X
X		printf("%d destruct transferred.\n", s->destruct);
X		sprintf(bufd, "%d Destruct\n",s->destruct);
X
X		s->mass -= s->destruct * MASS_DESTRUCT;
X		s->destruct -= s->destruct;
X	   } else
X		bufd[0] = '\0';
X	   if (s->popn) {
X		s2->mass += s->popn * Race->mass;
X		s2->popn += s->popn;
X
X		printf("%d popn transferred.\n", s->popn);
X		sprintf(bufc, "%d %s\n",s->destruct,Race->Thing?"tons of biomass" : "population");
X
X		s->mass -= s->popn * Race->mass;
X		s->popn -= s->popn;
X	   } else
X		bufc[0] = '\0';
X
X         if (s2->owner!=s->owner) {
X	   teleg_add("", telegram_buf);
X	   teleg_add("BULLETIN!\n\n Audio-vibatory-physio-molecular transport device #",telegram_buf);
X	   sprintf(buf,"%d just gave your ship #%d the following:\n", shipno, s->orders.object.number);
X	   teleg_add(buf,telegram_buf);
X	   teleg_add(bufr,telegram_buf);
X	   teleg_add(bufd,telegram_buf);
X	   teleg_add(buff,telegram_buf);
X	   teleg_add(bufc,telegram_buf);
X	   teleg_send(TELEG_PLAYER_AUTO, s2->owner, telegram_buf);
X         }
X
X	    putship(load_shdata,s,shipno);
X	   putship(load_shdata, s2, s->orders.object.number);
X
X
X    } else if (sh) {
X		/* ship to ship transfer, non-transport device */
X	putship(load_shdata,s2,s->destshipno);
X	buff[0] = bufr[0] = bufd[0] = bufc[0] = '\0';
X	switch (commod) {
X		case 'r':
X			printf("%d resources transferred.\n", amt);
X			sprintf(bufr, "%d Resources\n",amt);
X			break;
X		case 'f':
X			printf("%.2f fuel transferred.\n", famt);
X			sprintf(buff, "%d.2f Fuel\n",famt);
X			break;
X		case 'd':
X			printf("%d destruct transferred.\n", amt);
X			sprintf(bufd, "%d Destruct\n",amt);
X			break;
X		case 'c':
X			printf("%d popn transferred.\n", amt);
X			sprintf(bufc, "%d %s\n",amt,Race->Thing?"tons of biomass" : "population");
X			break;
X		default:
X			break;
X	 }
X
X
X         if (s2->owner!=s->owner) {
X	   teleg_add("", telegram_buf);
X	   teleg_add("BULLETIN!\n\n Audio-vibatory-physio-molecular transport device #",telegram_buf);
X	   sprintf(buf,"%d just gave your ship #%d the following:\n", shipno, s->orders.object.number);
X	   teleg_add(buf,telegram_buf);
X	   teleg_add(bufr,telegram_buf);
X	   teleg_add(bufd,telegram_buf);
X	   teleg_add(buff,telegram_buf);
X	   teleg_add(bufc,telegram_buf);
X	   teleg_send(TELEG_PLAYER_AUTO, s2->owner, telegram_buf);
X         }
X     }
X
X    if (!jett && !sh) {
X
X      if (commod=='c') {
X	putsector(load_sectdata,sect,p->sectormappos + ( (int)s->ypos*p->Maxx+(int)s->xpos) * sizeof(sectortype) );
X    	close(load_sectdata);
X	free(sect);
X       }
X
X       putplanet(load_pdata,p,Stars[Dir.snum]->planetpos[Dir.pnum]);
X       close(load_pdata);
X       free(p);
X     }
X
X    if (Mod && first) {
X         first = 0;
X         if (s->whatorbits==LEVEL_UNIV)
X		deductAPs(APcount, 0, 1);	/* ded from sdata */
X         else 
X		deductAPs(APcount, s->storbits, 0);
X
X    }
X
X   } while (1);
X
X
X}
X
X
X
Xload_handler()
X{
X tty_off();
X close(load_shdata);
X close(load_pdata);
X close(load_sectdata);
X longjmp(main_jenv,1);
X}
X
X
END_OF_FILE
if test 12762 -ne `wc -c <'load.c'`; then
    echo shar: \"'load.c'\" unpacked with wrong size!
fi
# end of 'load.c'
fi
if test -f 'makeuniv.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makeuniv.c'\"
else
echo shar: Extracting \"'makeuniv.c'\" \(6157 characters\)
sed "s/^X//" >'makeuniv.c' <<'END_OF_FILE'
X/* 
X * Galactic Bloodshed (Robert Chansky, smq@b)
X * makeuniv.c -- make data files for the game
X */
X
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "power.h"	/* (for power) */
X#include <math.h>
X
XFILE *fopen();
Xplanettype Makeplanet();
Xchar *Numbers[] = { "1","2","3","4","5","6","7","8","9","10","11",
X		      "12","13","14","15" };	/* for planet naming*/
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
XFILE *teledata,*racedata,*stardata,*planetdata,*sectordata,*shipdata;
Xplanettype planet;
Xstartype *Star;
Xint star,e,e2,type,lowp,hip;
Xregister int i,y,x;
Xchar str[200];
Xfloat att,xspeed[NUMSTARS],yspeed[NUMSTARS];
X
X srandom(getpid());
X
X Bzero(Sdata);
X printf("# of stars(1-%d):",NUMSTARS-1);
X scanf("%d",&(Sdata.numstars));
X printf("low # of planets (1-%d):",MAXPLANETS-1);
X scanf("%d",&lowp);
X printf("hi # of planets (%d-%d):",lowp,MAXPLANETS-1);
X scanf("%d",&hip);
X getchr();
X
X sprintf(str, "/bin/mkdir %s", DATADIR );
X system(str);
X
X if ( (planetdata = fopen(PLANETDATAFL,"w+"))==NULL) {
X	printf("unable to open %s\n",PLANETDATAFL);
X	exit(-1);
X }
X if ( (sectordata = fopen(SECTORDATAFL,"w+")) == NULL ) {
X	printf("unable to open %s\n",SECTORDATAFL);
X	exit(-1);
X }
X
X  /* get names, positions of stars first */
X for (star=0; star<Sdata.numstars; star++) {
X 	Stars[star]=(startype *)malloc(sizeof(startype));
X 	Bzero(*Stars[star]);
X 	Star = Stars[star];
X 	Star->numplanets=int_rand(lowp,hip);
X 	Star->gravity = int_rand(10000,100000) / 100.0;
X 	printf("name of star (%d planets):",Star->numplanets);
X	for (i=0; i<NAMESIZE-4; i++)
X	   putchr('.');
X	for (i=0; i<NAMESIZE-4; i++)
X	   putchr('\010');
X 	scanf("%10[^\n]",Star->name);
X	  getchr();
X 	Star->xpos=(float)int_rand(-UNIVSIZE,UNIVSIZE);
X	xspeed[star] = 0;
X 	Star->ypos=(float)int_rand(-UNIVSIZE,UNIVSIZE);
X	yspeed[star] = 0;
X }
X
X for (star=0; star<Sdata.numstars; star++) {
X
X  Star = Stars[star];
X
X  for (i=0; i<Star->numplanets; i++)  {
X	sprintf(Star->pnames[i],"%s",Numbers[i]);
X
X	planet = Makeplanet(int_rand(TYPE_EARTH,TYPE_GASGIANT));
X
X	if (argc==2 && argv[1][1]=='v')
X		printf("planet %s is type %u\n",Star->pnames[i],planet.type);
X
X	do {
X	  planet.xpos=(float)int_rand(-SYSTEMSIZE,SYSTEMSIZE);
X	  planet.ypos=(float)int_rand(-SYSTEMSIZE,SYSTEMSIZE);
X	} while ( sqrt(Distsq( planet.xpos, planet.ypos, 0, 0)) >= SYSTEMSIZE );
X
X	if (argc==2 && argv[1][1]=='v') {
X	  printf("at %f,%f relative to %s.\n",planet.xpos,planet.ypos,Star->name);
X	  printf("sect map(%d X %d):\n",planet.Maxx,planet.Maxy);
X	  for (y=0; y<planet.Maxy; y++) {
X	   for (x=0; x<planet.Maxx; x++) {
X	      switch (Sector(planet,x,y).des) {
X		case DES_LAND: putchr(CHAR_LAND); break;
X		case DES_SEA: putchr(CHAR_SEA); break;
X		case DES_MOUNT: putchr(CHAR_MOUNT); break;
X		case DES_ICE: putchr(CHAR_ICE); break;
X		case DES_GAS: putchr(CHAR_GAS); break;
X		default: putchr('?'); break;
X	      }
X	   }
X	   putchr('\n');
X	  }
X	}
X    	Star->planetpos[i] = (int)ftell(planetdata); 
X				/* posn of file-last write*/
X    	planet.sectormappos = (int)ftell(sectordata); /* sector map pos */
X    	fwrite(&planet,sizeof(planettype),1,planetdata); /* write planet */
X	 /* write each sector row */
X     	for (y=0; y < planet.Maxy; y++)
X       	  	fwrite( &Sector(planet,0,y), 
X				sizeof(sectortype),planet.Maxx,sectordata);
X  }
X }
X fchmod(planetdata,00660);	/* change data files to group readwrite */
X fclose(planetdata);
X fchmod(sectordata,00660);
X fclose(sectordata);
X
X  /* get rid of this */
X if ((stardata = fopen("data.starB","w+"))==NULL) {
X	printf(" unable to open %s\n","data.starB");
X	exit(-1);
X }
X fwrite(&(Sdata),sizeof(Sdata),1,stardata);
X for (star=0; star<Sdata.numstars; star++) {
X   fwrite(Stars[star],sizeof(startype),1,stardata);
X }
X fchmod(stardata,00660);
X fclose(stardata);
X
X  /* try to (more or less) evenly space the stars */
X for (i=0; i<CREAT_UNIV_ITERAT; i++)
X   for (star=0; star<Sdata.numstars; star++) {
X     for (x=0; x<Sdata.numstars; x++)	/* star2 */
X	if (x!=star) {
X		/* find inverse of distance squared */
X	   att = 10*UNIVSIZE / Distsq(Stars[star]->xpos, Stars[star]->ypos, Stars[x]->xpos, Stars[x]->ypos);
X	   xspeed[star] += att * (Stars[star]->xpos - Stars[x]->xpos);
X	   if (Stars[star]->xpos>UNIVSIZE || Stars[star]->xpos< -UNIVSIZE)
X		xspeed[star] *= -1;
X	   yspeed[star] += att * (Stars[star]->ypos - Stars[x]->ypos);
X	   if (Stars[star]->ypos>UNIVSIZE || Stars[star]->ypos< -UNIVSIZE)
X		yspeed[star] *= -1;
X        }
X    Stars[star]->xpos += xspeed[star];
X    Stars[star]->ypos += yspeed[star];
X    }
X
X if ((stardata = fopen(STARDATAFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",STARDATAFL);
X	exit(-1);
X }
X fwrite(&(Sdata),sizeof(Sdata),1,stardata);
X for (star=0; star<Sdata.numstars; star++) {
X   fwrite(Stars[star],sizeof(startype),1,stardata);
X }
X fchmod(stardata,00660);
X fclose(stardata);
X
X if ((shipdata = fopen(SHIPDATAFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",SHIPDATAFL);
X	exit(-1);
X }
X fchmod(shipdata,00660);
X fclose(shipdata);   /* put top ship # in front of ship data file */
X
X if ((shipdata = fopen(SHIPFREEDATAFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",SHIPFREEDATAFL);
X	exit(-1);
X }
X fchmod(shipdata,00660);
X fclose(shipdata);	/* touch ship free position file */
X
X if ((shipdata = fopen(PLAYERDATAFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",PLAYERDATAFL);
X	exit(-1);
X }
X fchmod(shipdata,00660);
X fclose(shipdata);	/* touch player file */
X
X if ((racedata = fopen(RACEDATAFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",RACEDATAFL);
X	exit(-1);
X }
X fchmod(racedata,00660);
X fclose(racedata);	/* touch race data file */
X
X { struct power p[MAXPLAYERS];
X bzero((char *)p, sizeof(p));
X if ((racedata = fopen(POWFL,"w+"))==NULL) {
X	printf(" unable to open %s\n",POWFL);
X	exit(-1);
X }
X fwrite(p,sizeof(p),1,racedata);
X fchmod(racedata,00660);
X fclose(racedata);	/* touch power data file */
X }
X
X sprintf(str, "/bin/mkdir %s", TELEGRAMDIR );
X system(str);
X chmod(TELEGRAMDIR, 00770);
X
X	/* make telegram files for each player */
X for (i=1; i<=MAXPLAYERS; i++) {
X 	sprintf(str, "%s.%d", TELEGRAMFL, i );
X 	if ((teledata = fopen(str, "w+"))==NULL) {
X		printf(" unable to open %s\n",str);
X	} else {
X		fchmod(teledata,00660);
X		fclose(teledata);
X	}
X }
X
X}
END_OF_FILE
if test 6157 -ne `wc -c <'makeuniv.c'`; then
    echo shar: \"'makeuniv.c'\" unpacked with wrong size!
fi
# end of 'makeuniv.c'
fi
if test -f 'orbit.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'orbit.c'\"
else
echo shar: Extracting \"'orbit.c'\" \(13727 characters\)
sed "s/^X//" >'orbit.c' <<'END_OF_FILE'
X/*
X * Galactic Bloodshed (Robert Chansky, smq@b)
X *  orbit.c -- display orbits of planets (graphic representation)
X *
X * OPTIONS
X *  -p : If this option is set, ``orbit'' will not display planet names.
X *
X *  -S : Do not display star names.
X *
X *  -s : Do not display ships.
X *
X *  -(number) : Do not display that #'d ship or planet (in case it obstructs
X * 		the view of another object)
X */
X
X
X#define S_X  (stdscr->_maxx - NAMESIZE)
X#define S_Y  (stdscr->_maxy - 1)
X#define Midx ((S_X - NAMESIZE)/2.0)
X#define Midy (S_Y /2.0)
X
X#include "vars.h"
X#include "ships.h"
X#include <curses.h>
Xextern char Shipltrs[];
Xfloat Lastx, Lasty, Zoom;
Xextern int God;
X
X
Xorbit(APcount, argn,args)
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xregister int sh,i,iq;
Xint DontDispNum= -1, t, flag;
Xplanettype *p;
Xshiptype *s;
Xplacetype where,shipwhere;
Xbool err, DontDispPlanets, DontDispShips, DontDispStars;
Xchar str[PLACENAMESIZE];
Xint orbit_shdata,orbit_pdata,orbit_stardata;
X
X DontDispPlanets = DontDispShips = DontDispStars = 0;
X
X  /* find options, set flags accordingly */
X for (flag=1; flag<=argn-1; flag++)
X    if (*args[flag]=='-') {
X      for (i=1; args[flag][i]!='\0'; i++)
X	 switch (args[flag][i]) {
X	    case 's': DontDispShips = 1;
X		      break;
X	    case 'S': DontDispStars = 1;
X		      break;
X	    case 'p': DontDispPlanets = 1;
X		      break;
X       	    default : if (sscanf(args[flag]+1,"%d",&DontDispNum)!=1) {
X			printf("Bad number %s.\n",args[flag]+1);
X			DontDispNum = -1;
X		      }
X		      if (DontDispNum)
X		        DontDispNum--;	/* make a '1' into a '0' */
X		      break;
X	  }
X    }
X
X if (argn==1) {
X   where = Getplace(":",0);
X   Lastx = Dir.lastx;
X   Lasty = Dir.lasty;
X   Zoom = Dir.zoom;
X } else {
X   where = Getplace(args[argn-1],0);
X   Lastx = Lasty = 0.0;
X   Zoom = 1.0;
X }
X
X if (where.err) {
X   printf("orbit: error in args.\n");
X   return;
X }
X
X
X  clear();
X
X  switch (where.level) {
X    case LEVEL_UNIV:
X      for (i=0; i<Sdata.numstars; i++)
X	 if (DontDispNum!=i)
X	   DispStar(LEVEL_UNIV,Stars[i],DontDispStars);
X
X      if (!DontDispShips && (sh = Sdata.ships)) {
X       openshdata(&orbit_shdata);
X
X       while (sh) {
X	   Locks(1);
X	   (void)getship(orbit_shdata, &s, sh);
X	   Locks(0);
X	   if (DontDispNum != sh)
X	     DispShip(&where, s, sh, NULL );
X	   sh = s->nextship;
X	   free(s);
X       }
X
X       close(orbit_shdata);
X      }
X      break;
X
X   case LEVEL_STAR:
X      DispStar(LEVEL_STAR, Stars[where.snum], DontDispStars);
X
X      openpdata(&orbit_pdata);
X
X
X      for (i=0; i<Stars[where.snum]->numplanets; i++) {
X	 if (DontDispNum!=i) {
X	   Locks(1);
X	   getplanet(orbit_pdata,&p,Stars[where.snum]->planetpos[i]);
X	   Locks(0);
X	   DispPlanet(LEVEL_STAR,p,Stars[where.snum]->pnames[i],DontDispPlanets);
X	   free(p);
X	 }
X      }
X      close(orbit_pdata);
X
X/* check to see if you have ships at orbiting the star, if so you can
Xsee enemy ships */
X	iq = 0;
X	if(sh = Stars[where.snum]->ships){
X	openshdata(&orbit_shdata);
X	while (sh) {
X	   Locks(1);
X	   (void)getship(orbit_shdata, &s, sh);
X	   Locks(0);
X		if(s->owner == Playernum && s->popn) 
X			iq = 1; /* you are there to sight, need a crew */
X		sh = s->nextship;
X		free(s);
X		}
X       close(orbit_shdata);
X	}
X
X
X      if (!DontDispShips && (sh = Stars[where.snum]->ships)) {
X       openshdata(&orbit_shdata);
X
X       while (sh) {
X	   Locks(1);
X	   (void)getship(orbit_shdata, &s, sh);
X	   Locks(0);
X	   if (DontDispNum != sh && !(s->owner != Playernum && s->type == STYPE_MINE) ) {
X
X		if((s->owner == Playernum) || (iq == 1))
X	     DispShip(&where, s, sh, NULL );
X		}
X	   sh = s->nextship;
X	   free(s);
X       }
X       close(orbit_shdata);
X      }
X      break;
X
X   case LEVEL_PLAN:
X
X      openpdata(&orbit_pdata);
X      Locks(1);
X      getplanet(orbit_pdata,&p,Stars[where.snum]->planetpos[where.pnum]);
X      Locks(0);
X      close(orbit_pdata);
X      DispPlanet(LEVEL_PLAN, p, Stars[where.snum]->pnames[where.pnum], DontDispPlanets);
X
X/* check to see if you have ships at landed or
X	orbiting the planet, if so you can see orbiting enemy ships */
X	iq = 0;
X
X	if(sh = p->ships){
X	openshdata(&orbit_shdata);
X	while (sh) {
X	   Locks(1);
X	   (void)getship(orbit_shdata, &s, sh);
X	   Locks(0);
X		if(s->owner == Playernum && s->popn)
X			iq = 1; /* you are there to sight, need a crew */
X		sh = s->nextship;
X		free(s);
X		}
X       close(orbit_shdata);
X	}
X
X/* end check */
X
X      if (!DontDispShips && (sh = p->ships)) {
X       openshdata(&orbit_shdata);
X       while (sh) {
X	   Locks(1);
X	   (void)getship(orbit_shdata, &s, sh);
X	   Locks(0);
X	   if (DontDispNum != sh) {
X	     	if( !(s->is_docked && s->whatdest==LEVEL_PLAN) ) {
X		if((s->owner == Playernum) || (iq ==1))
X	 		    DispShip(&where, s, sh, p);
X			}
X		}
X	   sh = s->nextship;
X	   free(s);
X       }
X       close(orbit_shdata);
X      }
X      free(p);
X      break;
X
X   case LEVEL_SHIP: {
X	char gs[MAXARGS][COMMANDSIZE];
X	shipwhere.level = where.shipptr->whatorbits;
X	shipwhere.snum = where.shipptr->storbits;
X	shipwhere.pnum = where.shipptr->pnumorbits;
X	sprintf(gs[1],"%s",Dispplace(&shipwhere) );
X	orbit(0,2,gs);
X	} break;
X
X   default:
X      printf("bleah!!!\n");
X      exit(-1);
X  }
X   /* move to bottom of screen and draw */
X  move(S_Y,0);
X  refresh();
X
X}
X
Xchar *Novae[16][7] = {
X	"           ",
X	"           ",
X	"           ",
X	"    %*     ",
X	"           ",
X	"           ",
X	"           ",
X
X	"           ",
X	"           ",
X	"     %     ",
X	"    %*%    ",
X	"     %     ",
X	"           ",
X	"           ",
X
X	"           ",
X	"           ",
X	"     %%    ",
X	"   %%*%%   ",
X	"    %%     ",
X	"           ",
X	"           ",
X
X	"           ",
X	"           ",
X	"     %%%   ",
X	"    %*%%%  ",
X	"     %%%   ",
X	"           ",
X	"           ",
X
X	"           ",
X	"           ",
X	"    %%%    ",
X	"   %%*%%%  ",
X	"    %%%%   ",
X	"           ",
X	"           ",
X
X	"           ",
X	"     %     ",
X	"   %%%%    ",
X	"  %%%*%%%  ",
X	"   %%%%%   ",
X	"           ",
X	"           ",
X
X	"           ",
X	"     %     ",
X	"   %%%%%   ",
X	"  %% *%%%  ",
X	"   %%%%%   ",
X	"     %     ",
X	"           ",
X
X	"           ",
X	"     %     ",
X	"  %%%%%%%  ",
X	" %%% * %%% ",
X	"   %%%%%   ",
X	"     %%    ",
X	"           ",
X
X	"           ",
X	"    %%%    ",
X	"  %%%%%%%  ",
X	" %%% * %%% ",
X	"  %%% %%%  ",
X	"    %%%    ",
X	"           ",
X
X	"           ",
X	"    %%%%   ",
X	"  %%% %%%  ",
X	" %%% * %%% ",
X	"  %%% %%%% ",
X	"   %%%%%%  ",
X	"     %%    ",
X
X	"           ",
X	"    %%%%   ",
X	"  %%% %%%  ",
X	" %%% * %%% ",
X	"  %%%  %%% ",
X	"   %%%%%%  ",
X	"     %%    ",
X
X	"     %%    ",
X	"   %%%%%%  ",
X	"  %%   %%% ",
X	" %%% *  %%%",
X	" %%%%  %%% ",
X	"  %%%%%%%% ",
X	"     %%%   ",
X
X	"    %%%%   ",
X	"  %%%%%%%% ",
X	" %%%  % %%%",
X	" %%  *   %%",
X	" %%%    %%%",
X	"  %%%%%% % ",
X	"   % %%%   ",
X
X	"   %%% %%  ",
X	" %%% %% %% ",
X	"%%      %%%",
X	"%%%  * % %%",
X	" % %     %%",
X	" %%% % % % ",
X	"  %%%%%%%  ",
X
X	"%  % % %%  ",
X	"      %  % ",
X	"%%      % %",
X	"%    *   % ",
X	" %        %",
X	" %     % % ",
X	"  % %%%    ",
X
X	"    %  %   ",
X	"          %",
X	"%          ",
X	"     *    %",
X	"%          ",
X	" %        %",
X	"   %   % % "
X};
X
X
X
XDispStar(level, star, DontDispStars)
Xint level;
Xstartype *star;
Xint DontDispStars;
X{
X int x,y;
X register int x2,y2;
X float fac;
X char *c;
X
X if (level==LEVEL_UNIV) {
X   fac = 1.0;
X   x = (int)(Midx+(star->xpos-Lastx)*(Midx/UNIVSIZE) / Zoom)*1.1;
X   y = (int)(Midy+(star->ypos-Lasty)*(Midy/UNIVSIZE) / Zoom);
X } else if (level==LEVEL_STAR) {
X   fac = 1000.0;
X   x = (int)(Midx+(-Lastx)*(Midx/SYSTEMSIZE) / Zoom);
X   y = (int)(Midy+(-Lasty)*(Midy/SYSTEMSIZE) / Zoom);
X }
X if (star->nova_stage)
X	DispArray(x, y, 11,7, Novae[star->nova_stage-1], fac);
X else if (y>=0 && y<=S_Y && x>=0 && x<=S_X) {
X	move(y,x);
X	addch('*');
X	if (!DontDispStars) {
X		move(y, x+2);
X		addstr(star->name);
X	}
X }
X
X}
X
X
XDispPlanet(level, p, name, DontDispPlanets)
Xint level;
Xplanettype *p;
Xchar *name;
Xint DontDispPlanets;
X{
Xint x,y;
X
X if (level==LEVEL_STAR) {
X   y = (int)(Midy +(p->ypos-Lasty)*(Midy/SYSTEMSIZE) / Zoom);
X   x = (int)(Midx +(p->xpos-Lastx)*(Midx/SYSTEMSIZE) / Zoom);
X } else if (level==LEVEL_PLAN) {
X   y = (int)(Midy +(-Lasty)*(Midy/PLORBITSIZE) / Zoom);
X   x = (int)(Midx +(-Lastx)*(Midx/PLORBITSIZE) / Zoom);
X }
X if (x>=0 && x<=S_X && y>=0 && y<=S_Y) {
X	   mvaddch(y,x,'@');
X	   if (!DontDispPlanets) {
X	     addch(' ');
X	     addstr(name);
X	   }
X }
X}
X
X
Xchar *Amoeba[] = {
X	"     &&  ",
X	" &  &&&& ",
X	" &&&@&&  ",
X	"  &&&&   ",
X	"  &&     ",
X};
X
Xchar *Mirror[8][5] = {
X
X	"         ",
X	"         ",
X	"\\===m===/",
X	"         ",
X	"         ",
X
X	"  |      ",
X	"  \\\\     ",
X	"    m    ",
X	"    \\\\   ",
X	"      \\__",
X
X	"     /   ",
X	"    ||   ",
X	"    m    ",
X	"    ||   ",
X	"     \\   ",
X
X	"       __",
X	"     //  ",
X	"    m    ",
X	"   //    ",
X	"   |     ",
X
X	"         ",
X	"         ",
X	"/===m===\\",	/* cc thinks this is a quoted " w/o the \ */
X	"         ",
X	"         ",
X
X	"__       ",
X	"  \\\\     ",	/* weird stuff again */
X	"    m    ",
X	"     \\\\  ",
X	"      |  ",
X
X	"   \\     ",
X	"   ||    ",
X	"    m    ",
X	"   ||    ",
X	"   /     ",
X
X	"      |  ",
X	"     //  ",
X	"    m    ",
X	"__//     ",
X	"         "
X};
X
X
XDispShip(where, ship, shipno, pl )
Xplacetype *where;
Xshiptype *ship;
Xint shipno;
Xplanettype *pl;		/* orbits planet */
X{
X int x,y,x2,y2,wm,pdata,shipdata;
X shiptype *aship;
X planettype *apl;
X float xt,yt,slope;
X char *c;
X
X if (ship->is_dead)
X	return;
X
X switch (where->level) {
X	case LEVEL_PLAN:
X		x = Midx + (ship->xpos-(Stars[where->snum]->xpos+pl->xpos) - Lastx)*(Midx/PLORBITSIZE) / Zoom;
X		y = Midy + (ship->ypos-(Stars[where->snum]->ypos+pl->ypos) - Lasty)*(Midy/PLORBITSIZE) / Zoom;
X		break;
X	case LEVEL_STAR:
X		x = Midx + (ship->xpos-Stars[where->snum]->xpos - Lastx)*(Midx/SYSTEMSIZE) / Zoom;
X		y = Midy + (ship->ypos-Stars[where->snum]->ypos - Lasty)*(Midy/SYSTEMSIZE) / Zoom;
X		break;
X	case LEVEL_UNIV:
X	     	x = Midx + (ship->xpos-Lastx)*(Midx/UNIVSIZE) / Zoom;
X		y = Midy + (ship->ypos-Lasty)*(Midy/UNIVSIZE) / Zoom;
X		break;
X	default:
X		printf("WHOA! error.\n");
X		exit(-1);
X }
X
X switch (ship->type) {
X
X  case STYPE_MIRROR:
X    if (ship->orders.aimed_at.level==LEVEL_STAR) {
X	xt = Stars[ship->orders.aimed_at.snum]->xpos;
X	yt = Stars[ship->orders.aimed_at.snum]->ypos;
X    } else if (ship->orders.aimed_at.level==LEVEL_PLAN) {
X	if (where->level==LEVEL_PLAN && 
X			ship->orders.aimed_at.pnum == where->pnum) {  
X				/* same planet */
X		xt = Stars[ship->orders.aimed_at.snum]->xpos + pl->xpos;
X		yt = Stars[ship->orders.aimed_at.snum]->ypos + pl->ypos;
X	} else {	/* different planet */
X		openpdata(&pdata);
X		getplanet(pdata,&apl,Stars[where->snum]->planetpos[where->pnum]);
X		close(pdata);
X		xt = Stars[ship->orders.aimed_at.snum]->xpos + apl->xpos;
X		yt = Stars[ship->orders.aimed_at.snum]->ypos + apl->ypos;
X		free(apl);
X	}
X    } else if (ship->orders.aimed_at.level==LEVEL_SHIP) {
X	openshdata(&shipdata);
X	if (getship(shipdata,&aship,ship->orders.aimed_at.shipno)) {
X		xt = aship->xpos;
X		yt = aship->ypos;
X	} else
X		xt = yt = 0.0;
X	close(shipdata);
X	free(aship);
X    } else
X	xt = yt = 0.0;
X
X    slope = (xt - ship->xpos) / (yt - ship->ypos);
X
X    if (yt - ship->ypos > 0) {
X	if (slope > 0) {
X	   if (slope > 1) {
X		if (slope > 2)
X			wm = 0;
X		else
X			wm = 1;
X	   } else {
X		if (slope > .5)
X			wm = 1;
X		else
X			wm = 2;
X	   }
X	} else {
X	   if (slope < -1) {
X		if (slope < -2)
X			wm = 0;
X		else
X			wm = 7;
X	   } else {
X		if (slope < .5)
X			wm = 7;
X		else
X			wm = 6;
X	   }
X    	}
X    } else {
X	if (slope > 0) {
X	   if (slope > 1) {
X		if (slope > 2)
X			wm = 4;
X		else
X			wm = 5;
X	   } else {
X		if (slope > .5)
X			wm = 5;
X		else
X			wm = 6;
X	   }
X	} else {
X	   if (slope < -1) {
X		if (slope < -2)
X			wm = 4;
X		else
X			wm = 3;
X	   } else {
X		if (slope < .5)
X			wm = 3;
X		else
X			wm = 2;
X	   }
X	}
X    }
X
X    DispArray(x,y, 9,5, Mirror[wm], 
X			ship->whatorbits==LEVEL_UNIV ? (float)100.0 :
X			(ship->whatorbits==LEVEL_STAR ? (float)10.0 :
X			(ship->whatorbits==LEVEL_PLAN ? (float)1.0 :0)));
X				/* (magnification) */
X    if (x>=0 && x<=S_X && y>=0 && y<=S_Y) {
X	    move(y,x+1);
X	    printw("%d",shipno);
X    }
X    break;
X
X  case OTYPE_CANIST:
X    break;
X
X  case OTYPE_AMOEBA:
X    DispArray(x,y, 9,5, Amoeba,
X			ship->whatorbits==LEVEL_UNIV ? (float)100.0 :
X			(ship->whatorbits==LEVEL_STAR ? (float)10.0 :
X			(ship->whatorbits==LEVEL_PLAN ? (float)1.0 :0)));
X    move(y,x+1);
X    printw("%d", shipno);
X    break;
X
X  case OTYPE_VN: { register int n,xa,ya;
X		   register float fac;
X	/* make a cloud of Von Neumann machines */
X    if (ship->whatorbits!=LEVEL_UNIV || (ship->owner == Playernum || God)) {
X	fac = ship->orders.object.number / 
X		((ship->whatorbits==LEVEL_UNIV ? 100.0 : 
X		(ship->whatorbits==LEVEL_STAR ? 30.0 : 4.0)) * Zoom);
X	for (n=1; n<=ship->orders.object.number && n<267; n++) {
X		xa = int_rand(x - (int)fac, x + (int)fac);
X		ya = int_rand(y - (int)(fac*S_Y/S_X),
X			      y + (int)(fac*S_Y/S_X));
X		if (xa>=0 && xa<=S_X && ya>=0 && ya<=S_Y) {
X			mvaddch(ya,xa, Shipltrs[ship->type]);
X			printw("%d",shipno);
X		}
X     	}
X    }
X   }
X   break;
X
X  default:
X	/* other ships can only be seen when in system */
X    if (ship->whatorbits!=LEVEL_UNIV || (ship->owner == Playernum || God))
X       if (x>=0 && x<=S_X && y>=0 && y<=S_Y) {
X	    mvaddch(y,x, Shipltrs[ship->type]);
X	    printw("%d",shipno);
X       }
X    break;
X }
X
X
X}
X
X
X
X/* display array on screen.  at the moment magnification is not 
X *   implemented.
X */
XDispArray(x, y, maxx,maxy, array, mag)
Xint x,y;
Xint maxx,maxy;
Xchar *array[];
Xfloat mag;
X{
Xregister int x2,y2,curx,cury, Cx,Cy,cx,cy;
X
X  for (cury=y-maxy/2,y2=0; y2<maxy; cury++) {
X   if (cury >= 0 && cury <= S_Y) {
X	move(cury, curx = x - maxx / 2 );
X	for (x2=0; x2<maxx; curx++) {
X		if (curx>=0 && curx <= S_X)
X		   if (inch()==' ')
X			addch( array[y2][x2] );
X		   else
X			move(cury, curx);	/* one to right */
X			x2++;
X	}
X   }
X	y2++;
X  }
X
X}
END_OF_FILE
if test 13727 -ne `wc -c <'orbit.c'`; then
    echo shar: \"'orbit.c'\" unpacked with wrong size!
fi
# end of 'orbit.c'
fi
echo shar: End of archive 2 \(of 8\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 8 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0