DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T d

⟦0f6986a2f⟧ TextFile

    Length: 15830 (0x3dd6)
    Types: TextFile
    Names: »doplanet.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Gb/doplanet.c« 

TextFile

/*
 * Galactic Bloodshed (Robert Chansky, smq@b)
 *  doplanet.c -- do one turn on a planet.
 */ 

#include "vars.h"
#include "ships.h"
#include "races.h"
#include "doturn.h"
#include "power.h"
extern struct power Power[];
#include <math.h>
extern bool Nuked[];

extern int Ignore_lockfile;

char telegram_buf[AUTO_TELEG_SIZE];

int tot_resdep,tot_eff,tot_res,tot_fuel,tot_destruct,tot_captured,tot_mob;
float avg_mob[MAXPLAYERS];

char sects_gained[MAXPLAYERS], sects_lost[MAXPLAYERS];
float Compat[MAXPLAYERS];
bool Claims;


int doplanet(starnum,planet, planetnum, command)
int starnum;
planettype *planet;
int planetnum;
int command;
{
int inhab=0,x,y;
reg int i;
int shipno,o=0,j;
sectortype *p;
shiptype *ship;
double att;
float xadd,yadd,dist,t,madd,fadd;
int sectdata,timer=20;
int oldplanetpopn, oldplanetmaxpopn, allmod=0,allexp=0;
char buf[200]; 


for (i=1; i<=Num_races; i++) {
	o |= isset(Stars[starnum]->inhabited,i);
	inhab |= planet->info[i-1].numsectsowned;
}
if (!o)
	return 0;	/* no one's explored the star yet */

if (inhab) {
	printf(" getting sectmap pos %d\n",planet->sectormappos);
	opensectdata(&sectdata);
	getsmap(sectdata,Smap,planet->sectormappos,planet->Maxx*planet->Maxy);
	close(sectdata);

	PermuteSects(planet);
	bzero((char *)Sectinfo, sizeof(Sectinfo) );
}



dist = hypot((double)planet->ypos, (double)planet->xpos);
	/* closer planets orbit faster */
t = atan2((double)planet->ypos, (double)planet->xpos) - SYSTEMGRAVCONST * SYSTEMSIZE / dist;
xadd = planet->xpos - dist * cos(t);
yadd = planet->ypos - dist * sin(t);


printf("xadd %g yadd %g \n", xadd, yadd);

	   /* adjust ships in orbit around the planet */

for (shipno=0; shipno<MAXPSHIPS; shipno++)
	if (planet->shipnums[shipno] && ((ship=ships[planet->shipnums[shipno]])!=NULL) && !ship->is_dead && !ship->rad) {
	   if ( !(ship->is_docked && ship->whatdest==LEVEL_PLAN)) {
		/* adjust fuel, orbit for ships that are not landed */
		ship->xpos += xadd;
		ship->ypos += yadd;
		 /* add fuel to ships orbiting gas giants */
		if (planet->type == TYPE_GASGIANT && !is_object(ship)) {
		 if (ship->type == STYPE_TANKER) {
		    fadd = FUEL_GAS_ADD_TANKER;
		    madd = FUEL_GAS_ADD_TANKER*MASS_FUEL;
		 } else if (ship->type == STYPE_STATION) {
		    fadd = FUEL_GAS_ADD_STATION;
		    madd = FUEL_GAS_ADD_STATION*MASS_FUEL;
		 } else {
		    fadd = FUEL_GAS_ADD;
		    madd = FUEL_GAS_ADD*MASS_FUEL;
		 }
		 if (ship->fuel + fadd > Shipdata[ship->type][ABIL_FUELCAP]) {
		    madd -= (Shipdata[ship->type][ABIL_FUELCAP] - (ship->fuel+fadd))*MASS_FUEL;
		    fadd = Shipdata[ship->type][ABIL_FUELCAP]-(ship->fuel+fadd);
		 }
		 ship->fuel += fadd;
		 ship->mass += madd;
		}
	   }

	   if ( (is_object(ship) && !ship->orders.object.on) || !is_object(ship)) {
	    if (ship->type == OTYPE_VN) {
			/* Von Neumann machine */
	     if (ship->is_docked && ship->whatdest==LEVEL_PLAN) {
		if (ship->orders.object.number2) {
			/* we are currently trying to construct another
			   machine */
		  reg int x,y,a,dum;
		  for (i=1; i<253 && i<=ship->orders.object.number; i++) {
		    a = round_rand(sqrt((double)ship->orders.object.number));
		    x = mod(int_rand((int)(ship->xpos-a),(int)(ship->xpos+a)),(int)planet->xpos,dum);
		    y = mod(int_rand((int)(ship->ypos-a),(int)(ship->ypos+a)),(int)planet->ypos,dum);
		    Sectinfo[x][y].VN= 1;
		  }
		  if (ship->resource >= Shipdata[OTYPE_VN][ABIL_COST]) {
		   ship->resource -= Shipdata[OTYPE_VN][ABIL_COST];
		   ship->mass -= Shipdata[OTYPE_VN][ABIL_COST]*MASS_RESOURCE;
		   if (ship->orders.object.number > int_rand(5,50)) {
			/* enough to start a new VN 'herd'. build another
			   ship. */
		    for (i=0; i<MAXPSHIPS && planet->shipnums[i]; i++) ;
		    if (i<MAXPSHIPS) {
			shiptype *s2;
			Num_ships++;
			fprintf(stderr,"VN #%d constructed VN #%d.\n",shipno,Num_ships);
			planet->shipnums[i] = Num_ships;
			ships[Num_ships] = (shiptype *)malloc(sizeof(shiptype));
			s2 = ships[Num_ships];
			bzero((char *)s2,sizeof(shiptype));
			s2->whatorbits = LEVEL_PLAN;
			s2->storbits = ship->storbits;
			s2->pnumorbits = ship->pnumorbits;
			s2->xpos = ((int)ship->xpos + int_rand(-9,9)) % planet->Maxx;
			s2->xpos = abs(s2->xpos);
			s2->ypos = ((int)ship->ypos + int_rand(-4,4)) % planet->Maxy;
			s2->ypos = abs(s2->ypos);
			s2->is_docked = 1;
			s2->whatdest = ship->whatdest;
			s2->deststar = ship->deststar;
			s2->destpnum = ship->destpnum;
			s2->type = OTYPE_VN;
			s2->mass = Shipdata[OTYPE_VN][ABIL_MASS];
			s2->owner = 1;
			s2->orders.object.number = 1;
				/* is not building any VN's */
				/* no assignment now */
			ship->orders.object.number2 = 0;
		  } else
			fprintf(stderr,"#%d can't slot insert new VN!!\n",shipno);
		 } else {
			/* we don't have too many in this herd, so make 
			   some more */
			ship->orders.object.number++;
		 }
		} else {
			/* if there are no players to steal from, try
			   and make some resources by ourselves */
			reg int i,f=0;
			for (i=Num_races-1; !f && i>0; i--)
				if (planet->info[i-1].resource)
					f=i;
			if (!f) {
				/* nobody here */
/*#			    ifdef UV_4.3*/
				sectortype tmp;
				int tmp2;
				tmp = Sector(*planet,(int)(ship->xpos), (int)(ship->ypos));
				tmp2 = tmp.resource /5;
				ship->resource += tmp2;
				/*ship->resource += (Sector(*planet,(int)(ship->xpos), (int)(ship->ypos)).resource) / 5;
				ship->mass += ((Sector(*planet,(int)(ship->xpos), (int)(ship->ypos)).resource) / 5) * MASS_RESOURCE;*/
/*#			    else
				ship->resource += 7;
				ship->mass += 7 * MASS_RESOURCE;
#			    endif*/
			}
		}
	       } else {
		/* we have no assignment -- we must launch. taken care of
		   in doship */
	       }
	      } else {	/* orbiting a planet */
		if (ship->orders.object.number2) {
		 if (ship->whatdest==LEVEL_PLAN && ship->deststar==starnum && 
			ship->destpnum==planetnum) {
				/* we just arrived from somewhere */
		    if (planet->type==TYPE_GASGIANT) {
		      if (ship->fuel >= Shipdata[OTYPE_VN][ABIL_FUELCAP])
			ship->orders.object.number2 = 0;
				/* gas giants are of no use to us;
				   doship() will head us somewhere else */
		    } else {
			/* find a place on the planet to land */
			int x,y; reg int d;		/* auto vars for & */
			printf(" VN finding a place to land\n");
			Getxysect(planet,&x,&y,1);
			while ((d=Getxysect(planet,&x,&y,0)) && 
					Sector(*planet,x,y).des!=DES_LAND &&
					Sector(*planet,x,y).des!=DES_MOUNT &&
					Sector(*planet,x,y).resource==0)
					 ;
			if (d) {
				printf(" VN landed.\n");
				ship->is_docked = 1;
				ship->whatdest = LEVEL_PLAN;
				ship->deststar = ship->storbits;
				ship->destpnum = ship->pnumorbits;
				ship->xpos = x;
				ship->ypos = y;
				ship->orders.object.number2 = 1;
				/* number2 means we are currently
				   busy here */
			} else
				 /* head somewhere else */
				ship->orders.object.number2 = 0;
				printf("turning off; can't find place 2land\n");
		    }
		 } else {
			/* we just launched from this planet -- pick
			   someplace to go to (taken care of in doship) */
		 }
		} else {
			/* okay, we don't know what the hell we are doing here. 
			   wait for doship to give further orders. */
		}
	      }
	    }
	   }

			/* bombard the planet */
	   if (!is_object(ship) && ship->orders.o.bombard
			&& ship->whatorbits==LEVEL_PLAN
			&& ship->whatdest==LEVEL_PLAN
			&& ship->storbits==ship->deststar
			&& ship->pnumorbits==ship->destpnum)
		Bombard(ship,shipno,planet);	 /* ship bombards planet */

		if (ship==NULL) {
			fprintf(stderr,"null ship #%d slot %d .\n",planet->shipnums[shipno],shipno);
			planet->shipnums[shipno] = 0;
		}
	}
planet->xpos += xadd;
planet->ypos += yadd;
if (planet->xpos>SYSTEMSIZE) planet->xpos *= .5;
else if (planet->xpos< -SYSTEMSIZE) planet->xpos *= .5;
if (planet->ypos>SYSTEMSIZE) planet->ypos *= .5;
else if (planet->ypos< -SYSTEMSIZE) planet->ypos *= .5;

if (!inhab && !Stinfo[starnum][planetnum].Thing_add)
	return 0;	/* (no one's explored the planet) */

	/* check for space mirrors (among other things) warming the planet */
	/* if a change in any artificial warming/cooling trends */
if (Stinfo[starnum][planetnum].temp_add)
	planet->conditions[TEMP] = planet->conditions[RTEMP] +
			Stinfo[starnum][planetnum].temp_add + int_rand(-2,2);
else
	planet->conditions[TEMP] = planet->conditions[RTEMP] + int_rand(-2,2);


bzero((char *)avg_mob, sizeof(avg_mob) );
bzero((char *)sects_gained, sizeof(sects_gained) );
bzero((char *)sects_lost, sizeof(sects_lost) );
Claims = 0;

if (Stinfo[starnum][planetnum].Thing_add) {
	 /* start a meso colony */
	x = int_rand(0,planet->Maxx-1);
	y = int_rand(0,planet->Maxy-1);
	Sector(*planet,x,y).des = 
			races[Stinfo[starnum][planetnum].Thing_add]->likesbest;
	Sector(*planet,x,y).popn = 1;
	Sector(*planet,x,y).owner = Stinfo[starnum][planetnum].Thing_add;
}
tot_resdep=tot_eff=tot_res=tot_fuel=tot_destruct=tot_mob=tot_captured=0;

oldplanetmaxpopn = planet->maxpopn;
planet->maxpopn = 0; 

oldplanetpopn = planet->popn;
planet->popn = 0;	/* initialize population for recount */ 
for (i=1; i<=Num_races; i++) {
	Compat[i] = compatibility(planet, races[i]);
	planet->info[i-1].numsectsowned = 0;
}

printf(" while %d\n",Getxysect(planet, &x, &y, 1));	/* reset */
while (Getxysect(planet, &x, &y, 0)) {
       p = &Sector(*planet,x,y);
       if (p->owner) {
		/* (all modified; sectors belonging to that player modified) */
	    allmod = 1;	
	    if (!p->popn ) {
		  p->owner=0;	/* make wasted/unowned sects go to player 0 */
	    } else {
	      planet->info[p->owner-1].numsectsowned++;
	      if (!Stars[starnum]->nova_stage) {
	       		/* spread excess popn to surrounding sects */
	      		spread(planet,p,x,y);	
	      		produce(planet,p);	/* produce stuff there */
			planet->popn += p->popn;
		   	Power[p->owner].popn += p->popn;
		   	Power[p->owner].sum_eff += p->eff;
		   	starpopns[starnum][p->owner] += p->popn;
	      } else {
			/* damage sector from supernova */
			p->resource++;
			if (p->fert)
				--p->fert;
			if (Stars[starnum]->nova_stage == 14)
				p->popn = 0;
			else
				p->popn *= .80;
	      }
	    }
       }

       planet->maxpopn += maxsupport(p);

       if (Sectinfo[x][y].VN)
	       p->VN = 1;
       else
	       p->VN = 0;
       if (p->is_wasted) {
	 	if (x>1 && x<planet->Maxx-2) {
			if (p->des==DES_SEA || p->des==DES_GAS) {
				/* don't reclaim pole sectors */
		  		if ( y>1 && y<planet->Maxy-2 && 
					(!(p-1)->is_wasted || !(p+1)->is_wasted)
					&& !random()%5)
					p->is_wasted = 0;
	      		} else if (p->des==DES_LAND || p->des==DES_MOUNT || p->des==DES_ICE) {
				if ( y>1 && y<planet->Maxy-2 && 
				   ((p-1)->popn || (p+1)->popn)
				   && !random()%10)
					p->is_wasted = 0;
      			}
		}
       }

	 /* evaporate the oceans on novae */
     if (Stars[starnum]->nova_stage)
       if (p->des==DES_ICE)
	   p->des = DES_LAND;
       else if (p->des==DES_SEA)

	  if ( (x>0 && (p-1)->des==DES_LAND) ||
	     (x<planet->Maxx-1 && (p+1)->des==DES_LAND) || 
	     (y>0 && (p-planet->Maxx)->des==DES_LAND) ||
	     (y<planet->Maxy-1 && (p+planet->Maxx)->des==DES_LAND ) ) {
	       p->des = DES_LAND;
	       p->popn = p->owner = 0;
	       p->resource += 3;
	       p->fert = int_rand(1,4);
	       printf("sect %d,%d evaporated.\n",x,y);
	}
}

if (allmod) {	/* ( >= 1 inhabited sector on the planet) */

	 if (planet->expltimer >= 1)
		planet->expltimer--;
	 if (!Stars[starnum]->nova_stage && !planet->expltimer) {
	  if (!planet->expltimer)
		planet->expltimer = 5;
	   for (i=1; !Claims && !allexp && i<=Num_races; i++) {
	     printf("pl %d numsectsowned %d Claims %d allexp %d compat %f\n",i,planet->info[i-1].numsectsowned,Claims,allexp,Compat[i]);
		 /* sectors have been modified for this player*/
		 /* & planet is compatible enough */
	     if (planet->info[i-1].numsectsowned && Compat[i] > 40.0)
	      while (!Claims && !allexp && --timer) {
		 printf("exploring ... timer=%d\n",timer);
		o = 1;
		Getxysect(planet, &x, &y, 1);
		while (!Claims && Getxysect(planet, &x, &y, 0)) {
			  /* find out if all sectors have been explored */
			o &= Sectinfo[x][y].explored[i];
			p = &Sector(*planet,x,y);
			if (!p->owner && !p->is_wasted && p->des==races[i]->likesbest && Sectinfo[x][y].explored[i]) {
				 /*  explorations have found an island */
				printf("found island @ %d,%d\n",x,y);
				Claims = i;
				 /* give them some free people there */
				p->popn = races[i]->number_sexes;
				tot_captured = 1;
			} else
				explore(planet, p, x, y, i);
		}
		allexp |= o;	/* all sectors explored for this player */

	       }
           }
	 }
	if (allexp)
		planet->expltimer = 5;


	for (i=1; i<=Num_races; i++)
	 if (planet->info[i-1].autorep) {

	  planet->info[i-1].autorep--;
	  teleg_add("",telegram_buf);	/* clear buf */
	  sprintf(buf,"****** Report: Planet /%s/%s ******\n", 
		Stars[starnum]->name, Stars[starnum]->pnames[planetnum] );
	  teleg_add(buf,telegram_buf);
	  if (Stinfo[starnum][planetnum].temp_add) {
		sprintf(buf,"\nGlobal temperature alteration: %d to %d.\n\n", 
			Temp(planet->conditions[RTEMP]), Temp(planet->conditions[TEMP]));
		teleg_add(buf,telegram_buf);
	  }
	  teleg_add("resource prod.  fuel prod.  weapons prod. mob.pt prod.\n",telegram_buf);
	  sprintf(buf,"%12d%12d%15d%13d\n", tot_res, tot_fuel, tot_destruct,tot_mob);
	  teleg_add(buf,telegram_buf);
	  if (tot_resdep) {
		  sprintf(buf,"resource deposit depletion: %d\n", tot_resdep);
		  teleg_add(buf,telegram_buf);
	  }
	  teleg_add("total births  (%%)    growth of max popn support  (%%)\n",telegram_buf);
	  sprintf(buf,"%9d      (%.2f%%)%23d   (%.2f%%)\n", 
		    planet->popn - oldplanetpopn, 
		    ((float)planet->popn-oldplanetpopn)/oldplanetpopn,
		    planet->maxpopn - oldplanetmaxpopn, 
		    ((float)planet->maxpopn-oldplanetmaxpopn)/oldplanetmaxpopn);
	  teleg_add(buf,telegram_buf);
	  sprintf(buf,"sectors owned on this planet: %d.\n", tot_captured);
	  teleg_add(buf,telegram_buf);
	  if (sects_gained[i] || sects_lost[i]) {
		  teleg_add("\nWAR STATUS: ",telegram_buf);
		  sprintf(buf,"%d sectors gained, %d sectors lost.\n",
					sects_gained[i],sects_lost[i]);
		  teleg_add(buf,telegram_buf);
	  }
	  if (Stars[starnum]->nova_stage) {
		sprintf(buf,"\nThis planet's primary is in a Stage %d nova.", Stars[starnum]->nova_stage);
		teleg_add(buf,telegram_buf);
	  }

	  teleg_send(TELEG_PLAYER_AUTO, i, telegram_buf);

	}

	   /* find out who is on this planet, for nova notification */
	if (Stars[starnum]->nova_stage == 1) {
	     teleg_add("",telegram_buf);	/* initialize telegram counter */
	     sprintf(buf,"BULLETIN from /%s/%s\n", Stars[starnum]->name, Stars[starnum]->pnames[planetnum]);
	     teleg_add(buf,telegram_buf);
	     sprintf(buf,"\nStar %s is undergoing nova.\n", Stars[starnum]->name);
	     teleg_add(buf,telegram_buf);
	     if (planet->type==TYPE_EARTH)
		teleg_add("Seas and rivers are boiling!\n",telegram_buf);
	     sprintf(buf, "This planet must be evacuated immediately!\n%c", TELEG_DELIM);
     	     teleg_add(buf,telegram_buf);
     	     for (i=1; i<=Num_races; i++)
		if (planet->info[i-1].numsectsowned)
	    		teleg_send(TELEG_PLAYER_AUTO, i, telegram_buf);
  	}


   for (i=1; i<=Num_races; i++) {
	Power[i].resource += planet->info[i-1].resource;
	Power[i].destruct += planet->info[i-1].destruct;
	Power[i].fuel += planet->info[i-1].fuel;
	Power[i].planets_owned += !!planet->info[i-1].numsectsowned;
	if (planet->info[i-1].numsectsowned) {
		Power[i].sectors_owned += planet->info[i-1].numsectsowned;
		Power[i].sum_mob += avg_mob[i];
	  /* combat readiness naturally moves towards the avg mobilization */
		avg_mob[i] /= planet->info[i-1].numsectsowned;
		planet->info[i-1].comread += 
			    sgn(avg_mob[i] - planet->info[i-1].comread);
 	}
   }
   planet->conditions[TOXIC] = (planet->conditions[TOXIC]*30 + 
		     100.0 * planet->popn / planet->maxpopn) / 31.0;

 }
 return allmod;
}