billr@saab.CNA.TEK.COM (Bill Randle) (06/02/90)
Submitted-by: VANCLEEF@mps.ohio-state.edu
Posting-number: Volume 10, Issue 8
Archive-name: gb3/Part08
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 8 (of 14)."
# Contents: Docs/profile.doc server/dosector.c server/doturn.c
# server/files_shl.c server/makeuniv.c server/prof.c server/survey.c
# Wrapped by billr@saab on Fri Jun 1 11:53:39 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Docs/profile.doc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Docs/profile.doc'\"
else
echo shar: Extracting \"'Docs/profile.doc'\" \(2642 characters\)
sed "s/^X//" >'Docs/profile.doc' <<'END_OF_FILE'
XPROFILE Galactic Bloodshed PROFILE
X
X
XNAME
X [0] profile -- racial profile
X
XSYNTAX
X profile <race name>
X
XDESCRIPTION
X This command prints out a short summary of your race's major characteristics.
XA short explanation of the profile follows:
X
XThe Thing -- This means your race is mesomorphic, like John Carpenter's 'The
X Thing'. You will receive certain bonuses, such as a high birthrate,
X above-average fighting ability (as well as the ability to absorb your
X enemies' population), and the ability to grow and launch spore pods;
X but you will also have a very low intelligence.
X
XInfection/birth rate -- the rate at which your people reproduce themselves.
X If this value is .5, each turn (resources willing) your population
X will increase by ~1.5.
X
X# of sexes -- This is the minimum population a planetary sector must have
X before the population will increase. Colonies with fewer than this
X amount will not be successful. Example: human beings must have at
X least two members to be a successful colony, while members of the
X Cetellan race ("Literature", by Robert Chansky, in
X ~smq/public/alien.pornography) must have at least 17.
X
XTechnology -- This represents the technological achievement of your people.
X Certain types of ships cannot be built without the appropriate
X technology. This number increases in proportion to your race's
X intelligence and the technological investment they make.
X
XAvg Intelligence -- This is the average IQ (human standard scale) of the
X members of your race.
X
XMass -- The average weight of individual members of your race (in Standard
X Units). This is used in mass exchanges in ships (i.e., a heavier
X ship moves more slowly for the same amount of fuel).
X
XMetabolism -- The speed at which your race ``operates''. A higher metabolism
X means your race produces commodities at a correspondingly higher
X rate.
X
XAdventurists -- This has to do with migration of your race across the
X face of a planet. It represents the percentage of the population
X that wish to move elsewhere. More sedentary races will have
X a lower value, while energetic, conquering races (like 'The Thing')
X will have a higher value.
X
Xdefault scope -- The scope changed to when the user types ``cs''.
X
Xplanetary conditions -- This is a list of the atmospheric and temperature
X conditions perferred by your race. A planet that deviates from
X these conditions by a sufficient amount will be unlivable by your
X race. Planetary conditions are displayed with the ``survey'' command.
X
Xsector preferences -- The sector types your race prefers, in numerical
X proportion.
X
X
X
X
XSEE ALSO
X build, load, cs, survey, declare, relation
X
END_OF_FILE
if test 2642 -ne `wc -c <'Docs/profile.doc'`; then
echo shar: \"'Docs/profile.doc'\" unpacked with wrong size!
fi
# end of 'Docs/profile.doc'
fi
if test -f 'server/dosector.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/dosector.c'\"
else
echo shar: Extracting \"'server/dosector.c'\" \(8008 characters\)
sed "s/^X//" >'server/dosector.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, enroll.dat.
X * Restrictions in GB_copyright.h.
X * dosector.c
X * produce() -- produce, stuff like that, on a sector.
X * spread() -- spread population around.
X * explore() -- mark sector and surrounding sectors as having been explored.
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "races.h"
X#include "ships.h"
X#include "doturn.h"
X#include <math.h>
X
X /* produce stuff in sector */
Xproduce(planet,s)
Xreg planettype *planet;
Xreg sectortype *s;
X{
Xreg int fac;
Xint ss;
Xint maxsup;
Xint pfuel, pdes, pres;
X
Xreg float factor;
Xreg int eff,resdep;
Xreg struct plinfo *pinf;
Xreg int new;
X
Xif(s->resource < 0)
X s->resource = -s->resource;
X
X check(planet,20);
X factor = .4 * log10(1.0+(double)s->eff) * s->resource
X * races[s->owner-1]->metabolism;
X pinf = &planet->info[s->owner-1];
X
X
X pfuel = round_rand( factor * FUEL_PRODUCTION
X * (100 - s->mobilization) * ((s->des==DES_GAS)+1) );
X prod_fuel[s->owner-1] += pfuel;
X
X pres = round_rand( factor * RESOURCE_PRODUCTION
X * (100 - s->mobilization) );
X prod_res[s->owner-1] += pres;
X
X pdes = round_rand( factor * DEST_PRODUCTION
X * s->mobilization );
X prod_destruct[s->owner-1] += pdes;
X
X /* increase mobilization to planetary quota */
X if (s->mobilization < pinf->mob_set) {
X if (pinf->resource + prod_res[s->owner-1] > 0) {
X s->mobilization++;
X prod_res[s->owner-1] -= round_rand(MOB_COST);
X prod_mob++;
X }
X check(planet,202);
X } else if (s->mobilization > pinf->mob_set) {
X s->mobilization--;
X prod_mob--;
X check(planet,203);
X }
X
X
X
X /* add mobilization to get average mobilization */
X avg_mob[s->owner-1] += s->mobilization;
X
X
X /* do efficiency */
X if (s->eff == 0)
X s->eff = 1;
X else if (s->eff<100)
X s->eff +=
X round_rand(races[s->owner-1]->metabolism * float_rand());
X else
X s->des = DES_PLATED;
X
Xcheck(planet,204);
X
X if (s->is_wasted)
X s->popn = round_rand(s->popn * 0.10);
X else if (s->popn >= races[s->owner-1]->number_sexes) {
X
X maxsup=maxsupport(races[s->owner-1],s,
X Compat[s->owner-1],planet->conditions[TOXIC]);
X
X ss = round_rand( ((float)maxsup-(float)s->popn) * races[s->owner-1]->birthrate);
X
X s->popn = MAX(0, MIN(MAX_SECT_POPN,s->popn + ss));
X /* keep the result nonnegative and below MAX */
X
X } else {
X s->popn = round_rand(s->popn * .097);
X }
X
X
X if (s->popn == 0)
X s->owner=0;
X
X check(planet,21);
X}
X
X
X/*
X * spread population to surrounding sects.
X *
X * the way people move depends on the population of the planet unless
X * NO_SLIDING_SCALE_AUTOMOVE is set (again for reasons of computer
X * power). Otherwise, the populace will automatically migrate to all
X * available surrounding areas if the planetary population is less than
X * POPN_MOVE_SCALE_1, to either north-south or east-west areas if the
X * population is less than POPN_MOVE_SCALE_2, and to only one adjacent
X * random sector if it is greater.
X */
X
X
Xspread(pl,s,x,y)
Xreg planettype *pl;
Xreg sectortype *s;
Xreg int x,y;
X{
Xint peep;
X
Xif(s->owner == 0) return; /* gvc hack sometimes owned sectors
X have no owner - causes bus error !
X (someone has to figure this out) */
X
X check(pl,22);
Xif (pl->is_sheep || (pl->slaved_to!=0 && pl->slaved_to!=s->owner))
X return; /* no one wants to go anywhere */
X
X /* peep == number of people who want to move - at least one family wants to move*/
X
X peep = MAX(MIN(races[s->owner-1]->number_sexes, s->popn),
X round_rand((float)s->popn * races[s->owner-1]->adventurism));
X
Xif (peep) {
X /*if (pl->type==TYPE_GASGIANT && s->des==DES_GAS && !int_rand(0,20)) {
X /* random 'wind' sweeps people in this sector, somewhere else */
X reg int x2,y2;
X sectortype *s2,s3;
X /* huh. For some reason, this seems to mess up the next planet's
X sector map. */
X /*x2 = int_rand(0,pl->Maxx-1);
X y2 = int_rand(1,pl->Maxy-2);
X printf(" wind: %d,%d to %d,%d\n",x,y,x2,y2);
X s2 = &Sector(*pl,x2,y2);
X if (s2->des==DES_GAS) {
X s3 = *s2;
X *s2 = *s;
X *s = s3;
X }*/
X /*} else {*/
X
X#if NO_SLIDING_SCALE_AUTOMOVE
X if (pl->popn < POPN_MOVE_SCALE_1) {
X#endif
X Migrate2(pl,x+1,y,s,peep/4);
X Migrate2(pl,x-1,y,s,peep/4);
X Migrate2(pl,x,y+1,s,peep/4);
X Migrate2(pl,x,y-1,s,peep/4);
X check(pl,23);
X#if NO_SLIDING_SCALE_AUTOMOVE
X }
X else if (pl->popn < POPN_MOVE_SCALE_2) {
X x2 = int_rand(-1,1);
X y2 = (!x2) ? rposneg() : 0; /* 1/3 chance of migrating n-s*/
X Migrate2(pl,x+x2,y+y2,s,peep/2);
X Migrate2(pl,x-x2,y-y2,s,peep/2);
X /* migrate to destination, from source */
X } else {
X Migrate2(pl, x + rposneg(), y + rposneg(), s, peep);
X }
X
X#endif
X /*}*/
X}
X
X}
X
X
X
XMigrate2(planet,xd,yd,ps,people)
Xplanettype *planet;
Xreg int xd,yd;
Xsectortype *ps;
Xreg int people;
X{
Xreg sectortype *pd;
X
X /* attempt to migrate beyond screen, or too many people */
X if (ps->popn <= people || (yd>=planet->Maxy) || (yd<0) )
X return;
X
X if (xd<0)
X xd=planet->Maxx-1;
X else if (xd>=planet->Maxx)
X xd=0;
X
X pd = &Sector(*planet,xd,yd);
X
X {
X
X /* check for planetary compatibility */
X if (pd->is_wasted ||
X people < races[ps->owner-1]->number_sexes ||
X float_rand()*100.0 > Compat[ps->owner-1] * races[ps->owner-1]->likes[pd->des]) {
X return;
X
X }
X
X
X if (!pd->owner) {
X/* printf("claiming %d,%d (%d): %d\n",xd,yd,ps->owner,people);*/
X pd->popn += people;
X ps->popn -= people;
X pd->owner = ps->owner;
X tot_captured++;
X if (Sectinfo[xd][yd].done)
X planet->info[pd->owner-1].numsectsowned++;
X Claims = 1;
X
X } else if (pd->owner==ps->owner) {
X pd->popn += people;
X ps->popn -= people;
X
X } else if (isset(races[ps->owner-1]->atwar, pd->owner)) {
X /* we are at war with them; do land combat */
X reg float ofac,dfac;
X
X ofac = (float)MAX_SECT_POPN/(ps->popn+people) *
X (ps->mobilization+1) *
X planet->info[ps->owner-1].comread/10000 *
X races[ps->owner-1]->fighters/10
X + races[ps->owner-1]->tech/500.0;
X/* printf(" %d,%d (before MIN) ofac %.2f -- ",xd,yd,ofac);*/
X ofac = MIN(ofac, 1.0);
X dfac = (float)MAX_SECT_POPN/pd->popn *
X (pd->mobilization+1) *
X planet->info[pd->owner-1].comread/10000 *
X races[pd->owner-1]->fighters/10
X + races[pd->owner-1]->tech/500;
X/* printf(" dfac %.2f",dfac);*/
X dfac = MIN(dfac, 1.0);
X {reg int od,os;
X od=pd->popn;os=ps->popn;
X pd->popn *= 1. - ofac;
X ps->popn *= 1. - dfac;
X/* printf("def cas %d (of %d), off cas %d (of %d)\n",
X od-pd->popn,od,os-ps->popn,os); */
X }
X if (pd->popn <= 0) {
X /* the invasion was successful */
X if (races[ps->owner-1]->Thing) {
X /* mesos absorb the bodies of enemies */
X pd->popn += MIN(people, ps->popn);
X ps->popn -= MIN(people, ps->popn);
X } else {
X pd->popn = MIN(people, ps->popn);
X ps->popn -= MIN(people, ps->popn);
X }
X sects_lost[pd->owner-1]++;
X sects_gained[ps->owner-1]++;
X pd->owner = ps->owner;
X pd->eff *= 0.75;
X pd->mobilization *= 0.75;
X tot_captured++;
X/* printf(" sec %d,%d CAPTURED\n",xd,yd); */
X } else
X pd->popn -= round_rand(dfac);
X
X } else {
X /* exchange prisoners */
X if (races[pd->owner-1]->captured_prisoners[ps->owner-1]<100)
X races[pd->owner-1]->captured_prisoners[ps->owner-1]++;
X if (races[ps->owner-1]->captured_prisoners[pd->owner-1]<100)
X races[ps->owner-1]->captured_prisoners[pd->owner-1]++;
X }
X }
X
X check(planet,23);
X}
X
X
X/* mark sectors on the planet as having been "explored." for sea exploration
X on earthtype planets. */
X
Xexplore(planet, s, x, y, p)
Xreg planettype *planet;
Xreg sectortype *s;
Xreg int x,y,p;
X{
Xreg int d;
X
X /* explore sectors surrounding sectors currently explored. */
X if (Sectinfo[x][y].explored) {
X Sectinfo[mod(x-1,planet->Maxx,d)][y].explored = p;
X Sectinfo[mod(x+1,planet->Maxx,d)][y].explored = p;
X if (y==0) {
X Sectinfo[x][1].explored = p;
X } else if (y==planet->Maxy-1) {
X Sectinfo[x][y-1].explored = p;
X } else {
X Sectinfo[x][y-1].explored = Sectinfo[x][y+1].explored = p;
X }
X
X } else if (s->owner==p)
X Sectinfo[x][y].explored = p;
X
X}
END_OF_FILE
if test 8008 -ne `wc -c <'server/dosector.c'`; then
echo shar: \"'server/dosector.c'\" unpacked with wrong size!
fi
# end of 'server/dosector.c'
fi
if test -f 'server/doturn.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/doturn.c'\"
else
echo shar: Extracting \"'server/doturn.c'\" \(8195 characters\)
sed "s/^X//" >'server/doturn.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 * doturn -- does one turn.
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "doturn.h"
X#include "power.h"
X#include "buffers.h"
X#include <math.h>
Xint doturn_racedata;
X
Xdo_turn()
X{
X int star,i,j,fd, x, y;
X int shdata,stardata,pdata,sectdata;
X boolean err=0;
X shiptype *ship;
X sectortype *p;
X char t_buf[200];
Xint dummy;
X
X /* make all 0 for first iteration of doplanet */
X bzero((char *)starpopns, sizeof(starpopns));
X bzero((char *)starnumships, sizeof(starnumships));
X bzero((char *)Sdatanumships, sizeof(Sdatanumships));
X bzero((char *)Stinfo, sizeof(Stinfo));
X bzero((char *)StarsInhab, sizeof(StarsInhab));
X bzero((char *)Power, sizeof(Power));
X
Xopenshdata(&shdata);
XNum_ships = Numships(shdata);
Xprintf("Num ships = %d\n", Num_ships);
X
X ships = (shiptype **)malloc(sizeof(shiptype *) * (Num_ships + 1));
X
Xfor(i=1; i<=Num_ships;i++)
X getship(shdata,&ships[i], i);
X
Xclose_file(shdata);
X
X/* get all stars and planets */
X openstardata(&stardata);
X getsdata(stardata,&Sdata);
X openpdata(&pdata);
X for (star=0; star<Sdata.numstars; star++) {
X free(Stars[star]);
X getstar(stardata, &Stars[star], star);
X fix_stability(Stars[star]); /* nova */
X for (i=0; i<Stars[star]->numplanets; i++) {
X free(planets[star][i]);
X getplanet(pdata,&planets[star][i],Stars[star]->planetpos[i]);
X /* move planets in orbit; also sets StarsInhab[] */
X moveplanet(star, planets[star][i], i);
X if(Stars[star]->pnames[i]=='\0')
X sprintf(Stars[star]->pnames[i], "NULL-%d", i);
X }
X if(Stars[star]->name[0]=='\0')
X sprintf(Stars[star]->name, "NULL-%d", star);
X
X putstar(stardata, Stars[star], star);
X}
Xclose_file(stardata);
Xclose_file(pdata);
X
X/*printf("doing VN_brain\n");*/
XVN_brain.Most_mad = 0; /* not mad at anyone for starts */
X
Xopenracedata(&doturn_racedata);
XNum_races = Numraces();
Xprintf("Num_races = %d\n",Num_races);
X
Xfor (i=1; i<=Num_races; i++) {
X
X getrace(doturn_racedata, &(races[i-1]),i);
X /* increase tech; change to something else */
X races[i-1]->tech += (float)races[i-1]->IQ / 100.0;
X
X /* add VN program */
X VN_brain.Total_mad += Sdata.VN_hitlist[i-1];
X /* find out who they're most mad at */
X if (Sdata.VN_hitlist[VN_brain.Most_mad-1] <= Sdata.VN_hitlist[i-1])
X VN_brain.Most_mad = i;
X
X}
X close_file(doturn_racedata);
X
X
X
X /* do all ships one turn */
X for (i=1; i<=Num_ships; i++) {
X/* printf("ship %d\n",i);*/
X doship(i,ships[i]);
X }
X/* erase next ship pointers - reset in insert_sh_... */
X for (i=1; i<Num_ships;i++)
X ships[i]->nextship=0;
X
X /* clear ship list for insertion */
X Sdata.ships = 0;
X for (star=0; star<Sdata.numstars; star++) {
X Stars[star]->ships = 0;
X for (i=0; i<Stars[star]->numplanets; i++) {
X planets[star][i]->ships = 0;
X }
X }
X
X /* insert ship into the list of wherever it might be */
X openshdata(&shdata);
X for (i=Num_ships; i>=1; i--) {
X if(ships[i]->is_alive && !(ships[i]->type == STYPE_FIGHTER &&
X ships[i]->object.number4) ) {
X switch(ships[i]->whatorbits) {
X case LEVEL_UNIV:
X insert_sh_univ(&Sdata, ships[i], i);
X break;
X case LEVEL_STAR:
X insert_sh_star(Stars[ships[i]->storbits], ships[i],i);
X break;
X case LEVEL_PLAN:
X insert_sh_plan(planets[ships[i]->storbits][ships[i]->pnumorbits], ships[i],i);
X break;
X default:
X break;
X }
X }
X putship(shdata,ships[i],i);
X }
X close_file(shdata);
X
X
X
X /* add APs to sdata for ea. player */
X for (i=1; i<=Num_races; i++) {
X int a;
X if ( (a = Sdata.AP[i-1] + APadd((int)Sdatanumships[i-1], (int)Sdatapopns[i],races[i-1]) + 1) > LIMIT_APs)
X Sdata.AP[i-1] = LIMIT_APs;
X else
X Sdata.AP[i-1] = a;
X }
X
X
X for (star=0; star<Sdata.numstars; star++) {
X
X for (i=0; i<Stars[star]->numplanets; i++) {
X/* printf("%s %d\n",Stars[star]->name,i); */
X if (doplanet(star, planets[star][i], i)) {
X /* save smap gotten & altered by doplanet only if the planet is expl*/
X opensectdata(§data);
X putsmap(sectdata,Smap,planets[star][i]);
X close_file(sectdata);
X }
X
Xopenpdata(&pdata);
X putplanet(pdata,planets[star][i],Stars[star]->planetpos[i]);
Xclose_file(pdata);
X }
X
X /* do AP's for ea. player */
X for (i=1; i<=Num_races; i++) {
X if (isset(Stars[star]->explored, i) ) {
X if ((j = Stars[star]->AP[i-1] + APadd((int)starnumships[star][i-1], (int)starpopns[star][i-1], races[i-1]) + 1) > LIMIT_APs)
X Stars[star]->AP[i-1] = LIMIT_APs;
X else
X Stars[star]->AP[i-1] = j;
X }
X
X if (starpopns[star][i-1])
X setbit(Stars[star]->inhabited,i);
X else
X clrbit(Stars[star]->inhabited,i);
X }
X openstardata(&stardata);
X putstar(stardata, Stars[star], star);
X close_file(stardata);
X}
X
Xopenstardata(&stardata);
X putsdata(stardata,&Sdata);
X close_file(stardata);
X
X
X openshdata(&shdata);
X for (i=1; i<=Num_ships; i++)
X putship(shdata,ships[i],i);
X
X close_file(shdata);
X
X
Xopenracedata(&doturn_racedata);
Xfor (i=1; i<=Num_races; i++) {
X putrace(doturn_racedata, races[i-1]);
X free(races[i-1]);
X }
X close_file(doturn_racedata);
X
Xfree(ships);
X
XPutpower(Power);
X
X/* compute alliance block power */
X for (i=1; i<=Num_races; i++) {
X dummy=(Blocks[i-1].invite & Blocks[i-1].pledge);
X if(isset(dummy, j)){
X Power_blocks.members[i-1] = 0;
X Power_blocks.sectors_owned[i-1] = 0;
X Power_blocks.popn[i-1] = 0;
X Power_blocks.ships_owned[i-1] = 0;
X Power_blocks.planets_owned[i-1] = 0;
X Power_blocks.resource[i-1] = 0;
X Power_blocks.fuel[i-1] = 0;
X Power_blocks.destruct[i-1] = 0;
X Power_blocks.VPs[i-1] = 0;
X for(j=1; j<=Num_races; j++)
X if(isset(dummy, j)){
X Power_blocks.members[i-1] += 1;
X Power_blocks.sectors_owned[i-1] += Power[j-1].sectors_owned;
X Power_blocks.popn[i-1] += Power[j-1].popn;
X Power_blocks.ships_owned[i-1] += Power[j-1].ships_owned;
X Power_blocks.planets_owned[i-1] += Power[j-1].planets_owned;
X Power_blocks.resource[i-1] += Power[j-1].resource;
X Power_blocks.fuel[i-1] += Power[j-1].fuel;
X Power_blocks.destruct[i-1] += Power[j-1].destruct;
X Power_blocks.VPs[i-1] += Blocks[j-1].VPs;
X }
X }
X}
X
X for (i=1; i<=Num_races; i++)
X notify(i, "Finished with update.\n");
X printf("Finished.\n");
X}
X
X
X
X /* routine for number of AP's to add to each player in ea. system,scaled
X by amount of crew in their palace */
X
Xint APadd(sh, popn, race)
Xint sh, popn;
Xracetype *race;
X{
X if (race->Gov_ship>0 && race->Gov_ship <= Num_ships &&
X ships[race->Gov_ship] != NULL &&
X ships[(int)(race->Gov_ship)]->is_alive &&
X ships[(int)(race->Gov_ship)]->is_docked &&
X ships[(int)(race->Gov_ship)]->whatdest==LEVEL_PLAN)
X return
X round_rand( ((float)sh / 10.0 + (float)log10(1.0+popn))
X * ((float)ships[(int)(race->Gov_ship)]->popn/Shipdata[OTYPE_GOV][ABIL_MAXCREW])
X * .01 * (100.0 - (float)ships[(int)(race->Gov_ship)]->damage) );
X else
X return 0;
X/* maybe we should give at least 1 AP? */
X}
X
X
X
X /* fix stability for stars */
Xfix_stability(s)
Xstartype *s;
X{
Xchar buf[100];
Xint a,i;
X
X
X if (s->nova_stage > 0) {
X if (s->nova_stage > 14) {
X s->stability = 20;
X s->nova_stage = 0;
X sprintf(telegram_buf, "Notice\n");
X sprintf(buf,"\n Scientists report that star %s\n", s->name);
X str_cat(telegram_buf, buf);
X sprintf(buf, "is no longer undergoing nova.\n");
X str_cat(telegram_buf, buf);
X for (i=1; i<=Num_races; i++)
X push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X
X /* telegram everyone when nova over? */
X } else
X s->nova_stage++;
X
X } else if (s->stability > 50) {
X a = int_rand(-1,3);
X /* nova just starting; notify everyone */
X if ( (s->stability + a) > 100) {
X s->stability = 100;
X s->nova_stage = 1;
X sprintf(telegram_buf, "***** BULLETIN! ******\n");
X sprintf(buf,"\n Scientists report that star %s\n", s->name);
X str_cat(telegram_buf, buf);
X sprintf(buf, "is undergoing nova.\n");
X str_cat(telegram_buf, buf);
X for (i=1; i<=Num_races; i++)
X push_message(TELEG_PLAYER_AUTO, i, telegram_buf);
X } else
X s->stability += a;
X } else
X a = int_rand(-2,int_rand(0,int_rand(0,1) ) );
X if ( (s->stability + a) < 0)
X s->stability = 0;
X else
X s->stability += a;
X}
X
X
X
END_OF_FILE
if test 8195 -ne `wc -c <'server/doturn.c'`; then
echo shar: \"'server/doturn.c'\" unpacked with wrong size!
fi
# end of 'server/doturn.c'
fi
if test -f 'server/files_shl.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/files_shl.c'\"
else
echo shar: Extracting \"'server/files_shl.c'\" \(8096 characters\)
sed "s/^X//" >'server/files_shl.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 * disk input/output routines & msc stuff
X * all read routines lock the data they just accessed (the file is not
X * closed). write routines close and thus unlock that area.
X *
X * openstardata(&fd),openpdata(&fd),openshdata(&fd),opensectdata(&fd)
X * -- open different files, return file descriptors
X * getsdata(fd,&Sdata) -- get root dir for univ
X * getrace(**racetype,racenum) -- get race from disk
X * getstar(fd,**startype,starnum) -- gets star from disk
X * getplanet(fd,**planettype,filepos) -- gets planet from disk
X * getsector(fd,**sectortype,filepos) -- gets 1 sect from disk
X * getsmap(fd,*sectortype,planet) -- gets sector map from disk
X * getship(fd,**shiptype,shipnum) -- gets ship from disk
X * putsdata(fd,&Sdata) -- put root dir for univ
X * putrace(*racetype) -- put race to disk
X * putstar(fd,*startype,starnum) -- put star to disk
X * putplanet(fd,*planettype,filepos) -- put planet to disk
X * putsector(fd,*sectortype,filepos) -- write sector to disk
X * putsmap(fd,*sectortype,*planet) -- put smap to disk
X * putship(fd,*shiptype,shipnum) -- put ship to disk
X * int Numships(fd) -- return highest ship # from file
X * getdeadship(fd, &filepos) -- filepos of next dead ship from shipfreedatafile
X * makeshipdead(shipnum) -- kill a ship
X * int Getracenum(char *) -- return race # from login list
X * int Numraces() -- return # of races that exist right now
X * Putpower() -- puts Power struct to disk for power command
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 "power.h"
X#include <strings.h>
X#include <sys/stat.h>
X#include <signal.h>
X#include <errno.h>
Xextern int errno;
Xint sys_nerr;
Xextern char *sys_errlist[];
X
X
Xopenstardata(fd)
Xint *fd;
X{
X /*printf(" openstardata\n");*/
X if ( (*fd = open(STARDATAFL, O_RDWR, 0777)) < 0) {
X perror("openstardata");
X printf("unable to open %s\n",STARDATAFL);
X exit(-1);
X }
X}
X
X
Xopenshdata(fd)
Xint *fd;
X{
Xif ( (*fd = open(SHIPDATAFL, O_RDWR, 0777)) < 0) {
X perror("openshdata");
X printf("unable to open %s\n",SHIPDATAFL);
X exit(-1);
X }
X}
X
X
Xopenpdata(fd)
Xint *fd;
X{
Xif ( (*fd = open(PLANETDATAFL, O_RDWR, 0777)) < 0) {
X perror("openpdata");
X printf("unable to open %s\n",PLANETDATAFL);
X exit(-1);
X }
X}
X
X
Xopensectdata(fd)
Xint *fd;
X{
X if ( (*fd = open(SECTORDATAFL, O_RDWR, 0777)) < 0) {
X perror("opensectdata");
X printf("unable to open %s\n",SECTORDATAFL);
X exit(-1);
X }
X}
X
Xopenracedata(fd)
Xint *fd;
X{
X if ( (*fd = open(RACEDATAFL, O_RDWR, 0777)) < 0) {
X perror("openrdata");
X printf("unable to open %s\n",RACEDATAFL);
X exit(-1);
X }
X}
X
X
Xgetsdata(fd,S)
Xint fd;
Xstruct stardata *S;
X{
X Fileread(fd,(char *)S, sizeof(struct stardata), STARDATAFL, 0);
X}
X
X
Xgetrace(fd, r,rnum)
Xint fd;
Xracetype **r;
Xint rnum;
X{
X *r = (racetype *)malloc(sizeof(racetype));
X Fileread(fd, (char *)*r, sizeof(racetype), RACEDATAFL,
X (rnum-1)*sizeof(racetype) );
X}
X
Xgetstar(fd,s,star)
Xint fd;
Xstartype **s;
Xint star;
X{
X *s = (startype *)malloc(sizeof(startype));
X Fileread(fd,(char *)*s, sizeof(startype), STARDATAFL,
X (int)(sizeof(Sdata)+star*sizeof(startype)) );
X}
X
X
Xgetplanet(fd,p,filepos)
Xint fd;
Xplanettype **p;
Xint filepos;
X{
X *p = (planettype *)malloc(sizeof(planettype));
X Fileread(fd,(char *)*p, sizeof(planettype), PLANETDATAFL, filepos );
X}
X
X
Xgetsector(fd,s,filepos)
Xint fd;
Xsectortype **s;
Xint filepos;
X{
X *s = (sectortype *)malloc(sizeof(sectortype));
X Fileread(fd,(char *)*s, sizeof(sectortype), SECTORDATAFL, filepos);
X}
X
X
Xgetsmap(fd,map,p)
Xint fd;
Xsectortype *map;
Xplanettype *p;
X{
X Fileread(fd,(char *)map, p->Maxx * p->Maxy * sizeof(sectortype),
X SECTORDATAFL, p->sectormappos);
X}
X
X
Xint getship(fd,s,shipnum)
Xint fd;
Xshiptype **s;
Xint shipnum;
X{
X struct stat buf;
X
X if ((*s = (shiptype *)malloc(sizeof(shiptype)))==NULL)
X printf("getship:Malloc() error \n"), exit();
X
X fstat(fd,&buf);
X if (buf.st_size / sizeof(shiptype) < shipnum) {
X (*s)->is_alive = 0;
X return 0;
X } else {
X
X Fileread(fd, (char *)*s, sizeof(shiptype), SHIPDATAFL,
X (shipnum-1)*sizeof(shiptype) );
X return 1;
X }
X}
X
X/* gets the ship # listed in the top of the file SHIPFREEDATAFL. this
X** might have no other uses besides build().
X** also locks the fd in shipdata.
X*/
Xint getdeadship()
X{
X struct stat buf;
X short shnum;
X int fd,lerr;
X int abort;
X
X if ( (fd = open(SHIPFREEDATAFL, O_RDWR, 0777)) < 0) {
X perror("getdeadship");
X printf("unable to open %s\n",SHIPFREEDATAFL);
X exit(-1);
X }
X abort = 1;
X fstat(fd,&buf);
X
X if (buf.st_size && (abort ==1)) {
X /* put topmost entry in fpos */
X Fileread(fd, (char *)&shnum, sizeof(short), SHIPFREEDATAFL,
X buf.st_size - sizeof(short) );
X /* erase that entry, since it will now be filled */
X ftruncate(fd, (long)(buf.st_size-sizeof(short)) );
X close_file(fd);
X return (int)shnum;
X } else
Xclose_file(fd);
X return -1;
X}
X
X
X
Xputsdata(fd,S)
Xint fd;
Xstruct stardata *S;
X{
X Filewrite(fd,(char *)S, sizeof(struct stardata), STARDATAFL, 0 );
X}
X
X
Xputrace(fd, r)
Xint fd;
Xracetype *r;
X{
X
X Filewrite(fd,(char *)r, sizeof(racetype), RACEDATAFL,
X (r->Playernum-1)*sizeof(racetype) );
X }
X
X
Xputstar(fd,s,snum)
Xint fd;
Xstartype *s;
Xint snum;
X{
X Filewrite(fd,(char *)s, sizeof(startype), STARDATAFL,
X (int)(sizeof(Sdata)+snum*sizeof(startype)) );
X}
X
Xputplanet(fd,p,filepos)
Xint fd;
Xplanettype *p;
Xint filepos;
X{
X Filewrite(fd,(char *)p, sizeof(planettype), PLANETDATAFL, filepos );
X}
X
Xputsector(fd,s,filepos)
Xint fd;
Xsectortype *s;
Xint filepos;
X{
X Filewrite(fd,(char *)s, sizeof(sectortype), SECTORDATAFL, filepos );
X}
X
X
Xputsmap(fd,map,p)
Xint fd;
Xsectortype *map;
Xplanettype *p;
X{
X Filewrite(fd, (char *)map,
X p->Maxx * p->Maxy * sizeof(sectortype), SECTORDATAFL, p->sectormappos);
X}
X
Xputship(fd,s,shipnum)
Xint fd;
Xshiptype *s;
Xint shipnum;
X{
X Filewrite(fd,(char *)s, sizeof(shiptype), SHIPDATAFL,
X (shipnum-1)*sizeof(shiptype) );
X}
X
X
Xint Numraces()
X{
X struct stat buf;
X
X stat(RACEDATAFL,&buf);
X return( (int)(buf.st_size / sizeof(racetype)) );
X}
X
X
X
Xint Numships(fd) /* return number of ships */
Xint fd;
X{
X struct stat buf;
X
Xfstat(fd,&buf);
X
X/* printf("numships %d\n",(int)(buf.st_size / sizeof(shiptype)) ); */
Xreturn( (int)(buf.st_size / sizeof(shiptype)) );
X}
X
X
X
X
X/*
X** writes the ship to the dead ship file at its end.
X*/
Xmakeshipdead(shipnum)
Xint shipnum;
X{
X int fd;
X us shipno;
X struct stat buf;
X
X shipno = shipnum; /* conv to u_short */
X
X if(shipno == 0)return;
X
X if ( (fd = open(SHIPFREEDATAFL, O_WRONLY, 0777)) < 0) {
X printf("fd = %d \n",fd);
X printf("errno = %d \n",errno);
X perror("openshfdata");
X printf("unable to open %s\n",SHIPFREEDATAFL);
X exit(-1);
X }
X
X printf("ship #%u destroyed.\n", shipno);
X /* write the ship # at the very end of SHIPFREEDATAFL */
X fstat(fd,&buf);
X Filewrite(fd,(char *)&shipno, sizeof(shipno), SHIPFREEDATAFL, buf.st_size );
X close_file(fd);
X}
X
XPutpower(p)
Xstruct power p[MAXPLAYERS];
X{
Xint power_fd;
X
X if ( (power_fd = open(POWFL, O_RDWR, 0777)) < 0) {
X perror("open power data");
X printf("unable to open %s\n",POWFL);
X return;
X }
X write(power_fd, (char *)p, sizeof(*p)*MAXPLAYERS );
X close_file(power_fd);
X}
X
XGetpower(p)
Xstruct power p[MAXPLAYERS];
X{
Xint power_fd;
X
X if ( (power_fd = open(POWFL, O_RDONLY, 0777)) < 0) {
X perror("open power data");
X printf("unable to open %s\n",POWFL);
X return;
X} else {
X read(power_fd, (char *)p, sizeof(*p)*MAXPLAYERS);
X close_file(power_fd);
X }
X}
X
XPutblock(b)
Xstruct block b[MAXPLAYERS];
X{
Xint block_fd;
X
X if ( (block_fd = open(BLOCKDATAFL, O_RDWR, 0777)) < 0) {
X perror("open block data");
X printf("unable to open %s\n", BLOCKDATAFL);
X return;
X }
X write(block_fd, (char *)b, sizeof(*b)*MAXPLAYERS );
X close_file(block_fd);
X}
X
XGetblock(b)
Xstruct block b[MAXPLAYERS];
X{
Xint block_fd;
X
X if ( (block_fd = open(BLOCKDATAFL, O_RDONLY, 0777)) < 0) {
X perror("open block data");
X printf("unable to open %s\n", BLOCKDATAFL);
X return;
X} else {
X read(block_fd, (char *)b, sizeof(*b)*MAXPLAYERS);
X close_file(block_fd);
X }
X}
X
END_OF_FILE
if test 8096 -ne `wc -c <'server/files_shl.c'`; then
echo shar: \"'server/files_shl.c'\" unpacked with wrong size!
fi
# end of 'server/files_shl.c'
fi
if test -f 'server/makeuniv.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/makeuniv.c'\"
else
echo shar: Extracting \"'server/makeuniv.c'\" \(8050 characters\)
sed "s/^X//" >'server/makeuniv.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 * makeuniv.c -- make data files for the game
X */
X
X#include "GB_copyright.h"
X#define EXTERN
X#include "vars.h"
X#include "ships.h"
X#include "races.h"
X#include "power.h" /* (for power) */
X#include <math.h>
X
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, roll, temperature;
Xregister int i,y,x;
Xchar str[200];
Xfloat att,xspeed[NUMSTARS],yspeed[NUMSTARS], dist, dummy;
Xfloat xpos, ypos;
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);
X scanf("%d",&lowp);
X printf("hi # of planets (%d-%d):",lowp,MAXPLANETS);
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, int_rand(lowp, hip));
X Star->temperature=int_rand(0, 4)+int_rand(1, 5);
X /* heat of the star */
X Star->gravity = int_rand(10000,100000) / 100.0;
X printf("[%d] name of star (%d planets):",star, Star->numplanets);
X for (i=0; i<NAMESIZE-4; i++)
X putchr('.');
X for (i=0; i<NAMESIZE-4; i++)
X putchr('\010'); /* ^H */
X scanf("%14[^\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 dist = -1.0;
X while (dist >= SYSTEMSIZE || dist <= 100.0) {
X xpos=(float)int_rand(-SYSTEMSIZE,SYSTEMSIZE);
X ypos=(float)int_rand(-SYSTEMSIZE,SYSTEMSIZE);
X dist = sqrt(Distsq(xpos, ypos, 0, 0));
X }
X roll=int_rand(0,100);
X temperature = Temperature(dist, Star->temperature);
X
X if(temperature > 200) {
X if(roll<=25)
X type = TYPE_AIRLESS;
X else
X type = TYPE_ASTEROID;
X } else if(temperature > 100 && temperature <=200) {
X if(roll<=50)
X type = TYPE_ASTEROID;
X else
X type = TYPE_AIRLESS;
X } else if(temperature > 30 && temperature <= 100) {
X if(roll<=25)
X type = TYPE_ASTEROID;
X else if(roll > 25 && roll <=50)
X type = TYPE_AIRLESS;
X else if(roll > 50 && roll <=75)
X type = TYPE_EARTH;
X else
X type = TYPE_WATER;
X } else if(temperature > -10 && temperature <= 30) {
X if(roll <=25)
X type = TYPE_ASTEROID;
X else if(roll > 25 && roll <=50)
X type = TYPE_AIRLESS;
X else if(roll > 50 && roll <=75)
X type = TYPE_EARTH;
X else
X type = TYPE_WATER;
X } else if(temperature > -50 && temperature <= -10) {
X if(roll <=25)
X type = TYPE_ASTEROID;
X else if(roll>25 && roll <=50)
X type = TYPE_AIRLESS;
X else if(roll>50 && roll <=75)
X type = TYPE_ICEBALL;
X else
X type = TYPE_EARTH;
X } else if(temperature <= -50) {
X if(roll<=25)
X type = TYPE_ASTEROID;
X else if(roll>25 && roll <=50)
X type = TYPE_AIRLESS;
X else if(roll >50 && roll <=75)
X type = TYPE_ICEBALL;
X else
X type = TYPE_GASGIANT;
X }
X
X
X planet = Makeplanet(dist, Star->temperature, type);
X planet.xpos = xpos;
X planet.ypos = ypos;
X
X
X if (argc==2 && (argv[1][1]=='v' || argv[1][1]=='a'))
X printf("planet %s is type %u\n",Star->pnames[i],planet.type);
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(%dx%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 { shiptype s;
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);
X }
X
X { short s=1;
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
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 {
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 {
X struct block p[MAXPLAYERS];
X bzero((char *)p, sizeof(p));
X if ((racedata = fopen(BLOCKDATAFL,"w+"))==NULL) {
X printf(" unable to open %s\n",BLOCKDATAFL);
X exit(-1);
X }
X fwrite(p,sizeof(p),1,racedata);
X fchmod(racedata,00660);
X fclose(racedata); /* touch block 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}
END_OF_FILE
if test 8050 -ne `wc -c <'server/makeuniv.c'`; then
echo shar: \"'server/makeuniv.c'\" unpacked with wrong size!
fi
# end of 'server/makeuniv.c'
fi
if test -f 'server/prof.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/prof.c'\"
else
echo shar: Extracting \"'server/prof.c'\" \(8213 characters\)
sed "s/^X//" >'server/prof.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 * prof.c -- print out racial profile
X */
X
X#include "GB_copyright.h"
X#define EXTERN extern
X#include "vars.h"
X#include "races.h"
X#include "ships.h"
X#include "buffers.h"
X
Xextern char *Desnames[];
Xint prof_racedata;
Xchar *Estimate_f(), *Estimate_i();
X
Xwhois(Playernum, APcount, argn, args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint i, j, numraces;
X
Xif(argn <= 1) {
X notify(Playernum, "You must give a list of player numbers.\n");
X return;
X }
Xnumraces = Numraces();
X
Xfor(i=1; i<=argn-1; i++) {
X j=atoi(args[i]);
X if(!(j<1 || j>numraces)) {
Xfree(Race);
Xopenracedata(&prof_racedata);
Xgetrace(prof_racedata, &Race, j);
Xclose_file(prof_racedata);
X sprintf(buf, "[%2d] %s\n", j, Race->name);
X notify(Playernum, buf);
X }
X }
X
X}
X
Xprofile(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
X int i, p, numraces;
X racetype *r;
X
Xfree(Race);
Xopenracedata(&prof_racedata);
Xgetrace(prof_racedata, &Race,Playernum);
Xclose_file(prof_racedata);
X
Xif(argn==1) {
X sprintf(buf,"---==** Racial profile for %s (player %d) **==---\n",Race->name,
X Race->Playernum);
X notify(Playernum, buf);
Xif(Race->God) {
X sprintf(buf, " *** Diety Status ***\n");
X notify(Playernum, buf);
X }
X
Xsprintf(buf," (default scope /%s/%s)\n\n",Stars[Race->homesystem]->name,
X Stars[Race->homesystem]->pnames[Race->homeplanetnum] );
X notify(Playernum, buf);
X sprintf(buf," %10srate: %.1f\n",Race->Thing ? "Infection " : "Birth",Race->birthrate);
X notify(Playernum, buf);
Xsprintf(buf," Technology: %.1f\n",Race->tech);
X notify(Playernum, buf);
Xsprintf(buf," Avg Intelligence: %u\n",Race->IQ);
X notify(Playernum, buf);
Xsprintf(buf," mass: %.2f\n",Race->mass);
X notify(Playernum, buf);
Xsprintf(buf," metabolism: %.1f\n",Race->metabolism);
X notify(Playernum, buf);
Xsprintf(buf," adventurists: %.2f%%\n",Race->adventurism*100.0);
X notify(Playernum, buf);
Xsprintf(buf," fighting ability: %d\n",Race->fighters);
X notify(Playernum, buf);
Xsprintf(buf," # of sexes: %d\n", Race->number_sexes);
X notify(Playernum, buf);
X if (Race->Thing) {
Xsprintf(buf,"Mesomorphic race (like \"The Thing\").\n");
X notify(Playernum, buf);
X }
X sprintf(buf,"planetary conditions preferred by %s:\n", Race->name);
X notify(Playernum, buf);
Xsprintf(buf," temperature: %d\n", Temp(Race->conditions[TEMP]) );
X notify(Playernum, buf);
Xsprintf(buf," atmosphere concentrations:\n");
X notify(Playernum, buf);
Xsprintf(buf," methane %02d%% oxygen %02d%%\n",
X Race->conditions[METHANE], Race->conditions[OXYGEN] );
X notify(Playernum, buf);
Xsprintf(buf," CO2 %02d%% hydrogen %02d%%\n",
X Race->conditions[CO2], Race->conditions[HYDROGEN] );
X notify(Playernum, buf);
Xsprintf(buf," nitrogen %02d%% sulfur %02d%%\n",
X Race->conditions[NITROGEN], Race->conditions[SULFUR] );
X notify(Playernum, buf);
Xsprintf(buf," helium %02d%% other %02d%%\n",
X Race->conditions[HELIUM], Race->conditions[OTHER]);
X notify(Playernum, buf);
Xsprintf(buf,"Sector type preferences:\n");
X notify(Playernum, buf);
Xsprintf(buf," %c (%11s) %3.2f%% %c (%11s) %3.2f%%\n",
X CHAR_SEA, Desnames[DES_SEA], Race->likes[DES_SEA]*100,
X CHAR_GAS, Desnames[DES_GAS], Race->likes[DES_GAS]*100);
X notify(Playernum, buf);
Xsprintf(buf," %c (%11s) %3.2f%% %c (%11s) %3.2f%%\n",
X CHAR_MOUNT, Desnames[DES_MOUNT], Race->likes[DES_MOUNT]*100,
X CHAR_LAND, Desnames[DES_LAND], Race->likes[DES_LAND]*100);
X notify(Playernum, buf);
Xsprintf(buf," %c (%11s) %3.2f%% %c (%11s) %3.2f%%\n",
X CHAR_ICE, Desnames[DES_ICE], Race->likes[DES_ICE]*100,
X CHAR_PLATED, Desnames[DES_PLATED], Race->likes[DES_PLATED]*100);
X notify(Playernum, buf);
X if (Race->Gov_ship==0) {
X sprintf(buf,"\nNo designated capitol!!\n");
X notify(Playernum, buf);
X} else {
X sprintf(buf,"\nDesignated capitol: #%d\n", Race->Gov_ship);
X notify(Playernum, buf);
X }
X sprintf(buf,"\nTelescope ranges: ground: %.0f, space: %.0f\n",
X tele_range(OTYPE_GTELE,Race->tech), tele_range(OTYPE_STELE,Race->tech) );
X notify(Playernum, buf);
X sprintf(buf,"Gun range: %.0f\n", gun_range(Race, NULL) );
X notify(Playernum, buf);
X} else {
X
X GetPlayer(args[1], &p, &r);
X
X if (p== -1) {
X sprintf(buf,"Player does not exist.\n");
X notify(Playernum, buf);
X return;
X }
X
X sprintf(buf,"------ Race report on %s (%d) ------\n", r->name, p);
X notify(Playernum, buf);
X if(Race->God) {
Xif(r->God) {
X sprintf(buf, " *** Diety Status ***\n");
X notify(Playernum, buf);
X }
X
Xsprintf(buf," (default scope /%s/%s)\n\n",Stars[r->homesystem]->name,
X Stars[r->homesystem]->pnames[r->homeplanetnum] );
X notify(Playernum, buf);
X }
X if (Race->translate[p-1]>50) {
X sprintf(buf,"\nType: %s\n", r->Thing ? "Mesomorphic" : "Normal");
X notify(Playernum, buf);
X sprintf(buf," %10srate: %s%%\n", r->Thing ? "Infection " : "Birth",
X Estimate_f(r->birthrate*100.0,Race,p) );
X notify(Playernum, buf);
X } else {
X sprintf(buf,"\nType (mesomorphic or normal): ?\n");
X notify(Playernum, buf);
X sprintf(buf," Approx. expansion rate: %s\n", Estimate_f(r->birthrate,Race,p) );
X notify(Playernum, buf);
X }
X sprintf(buf," Technology: %s\n", Estimate_f(r->tech,Race,p) );
X notify(Playernum, buf);
X sprintf(buf," Avg Intelligence: %s\n", Estimate_i((int)r->IQ, Race,p) );
X notify(Playernum, buf);
X sprintf(buf," mass: %s\n", Estimate_f(r->mass,Race,p) );
X notify(Playernum, buf);
X sprintf(buf," metabolism: %s\n", Estimate_f(r->metabolism,Race,p) );
X notify(Playernum, buf);
X sprintf(buf," adventurists: %s%%\n", Estimate_f(r->adventurism*100.0, Race,p) );
X notify(Playernum, buf);
Xsprintf(buf," fighting ability: %s\n", Estimate_i((int)r->fighters, Race,p) );
X notify(Playernum, buf);
X sprintf(buf," # of sexes: %s\n", Estimate_i((int)r->number_sexes, Race,p) );
X notify(Playernum, buf);
X
X sprintf(buf,"planetary conditions preferred by %s:\n", r->name);
X notify(Playernum, buf);
X sprintf(buf," temperature: %s\n",
X Estimate_i((int)Temp(r->conditions[TEMP]),Race,p) );
X notify(Playernum, buf);
X sprintf(buf," atmosphere concentrations:\n");
X notify(Playernum, buf);
X sprintf(buf," Methane %2s%% Oxygen %2s%%\n",
X Estimate_i((int)r->conditions[METHANE],Race,p),
X Estimate_i((int)r->conditions[OXYGEN],Race,p) );
X notify(Playernum, buf);
X sprintf(buf," CO2 %2s%% Hydrogen %2s%%\n",
X Estimate_i((int)r->conditions[CO2],Race,p),
X Estimate_i((int)r->conditions[HYDROGEN],Race,p) );
X notify(Playernum, buf);
X sprintf(buf," Nitrogen %2s%% Sulfur %2s%%\n",
X Estimate_i((int)r->conditions[NITROGEN],Race,p),
X Estimate_i((int)r->conditions[SULFUR],Race,p) );
X notify(Playernum, buf);
X sprintf(buf," Helium %2s%% Other %2s%%\n",
X Estimate_i((int)r->conditions[HELIUM],Race,p),
X Estimate_i((int)r->conditions[OTHER],Race,p) );
X
X notify(Playernum, buf);
X sprintf(buf,"Sector type preference : %s\n",
X Race->translate[p-1]>80 ? Desnames[r->likesbest] : " ? " );
X notify(Playernum, buf);
X
X sprintf(buf,"\nTelescope ranges: ground: %s, space: %s\n",
X Estimate_f(tele_range(OTYPE_GTELE,r->tech), Race,p),
X Estimate_f(tele_range(OTYPE_STELE,r->tech), Race,p) );
X notify(Playernum, buf);
X sprintf(buf,"Gun range: %s\n",
X Estimate_f(gun_range(r, NULL), Race,p) );
X notify(Playernum, buf);
X
X }
X
X}
X
Xstatic char est_buf[20];
X
Xchar *Estimate_f(data, r, p)
Xfloat data;
Xracetype *r;
Xint p;
X{
X
Xsprintf(est_buf, "?");
X
X if (r->translate[p-1]>10)
X sprintf(est_buf, "%d", round_perc((int)data, r,p) );
X
X return est_buf;
X
X}
X
Xchar *Estimate_i(data, r, p)
Xint data;
Xracetype *r;
Xint p;
X{
X
Xsprintf(est_buf, "?");
X
X if (r->translate[p-1]>10)
X sprintf(est_buf, "%2d", round_perc((int)data, r,p) );
X
X return est_buf;
X}
X
X
Xint round_perc(data, r,p)
Xint data;
Xracetype *r;
Xint p;
X{
X int k;
X
X k = 101 - MIN(r->translate[p-1] + r->captured_prisoners[p-1], 100);
X
Xreturn ((data/k)*k);
X
X}
END_OF_FILE
if test 8213 -ne `wc -c <'server/prof.c'`; then
echo shar: \"'server/prof.c'\" unpacked with wrong size!
fi
# end of 'server/prof.c'
fi
if test -f 'server/survey.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'server/survey.c'\"
else
echo shar: Extracting \"'server/survey.c'\" \(6864 characters\)
sed "s/^X//" >'server/survey.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 * survey.c -- print out survey for planets
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 <string.h>
X#include <ctype.h>
Xextern float compatibility();
Xextern char desshow();
Xextern char *Desnames[];
X /* user's guide to toxicity */
Xchar *Tox[] = {
X "Stage 0, mild",
X "Stage 1, mild",
X "Stage 2, semi-mild",
X "Stage 3, semi-semi mild",
X "Stage 4, ecologically unsound",
X "Stage 5: ecologically unsound",
X "Stage 6: below birth threshold",
X "Stage 7: ecologically unstable--below birth threshold",
X "Stage 8: ecologically poisonous --below birth threshold",
X "Stage 9: WARNING: nearing 100% toxicity",
X "Stage 10: WARNING: COMPLETELY TOXIC!!!",
X "???"
X};
Xint survey_racedata;
X
X
Xsurvey(Playernum,APcount, argn,args)
Xint Playernum;
Xint APcount;
Xint argn;
Xchar args[MAXARGS][COMMANDSIZE];
X{
Xint lowx,hix,lowy,hiy,x2;
Xchar d;
Xsectortype *s;
Xplanettype *p;
Xint tindex,survey_pdata,survey_sectdata;
Xplacetype where;
Xfloat compat;
X
Xif (argn==1) { /* no args */
X
X where.level = Dir[Playernum-1].level;
X where.snum = Dir[Playernum-1].snum;
X where.pnum = Dir[Playernum-1].pnum;
X
X} else {
X
X /* they are surveying a sector */
X if (isdigit(args[1][0]) && index(args[1],',')!=NULL) {
X if (Dir[Playernum-1].level!=LEVEL_PLAN) {
X sprintf(buf,"There are no sectors here.\n");
X notify(Playernum, buf);
X return;
X } else {
X where.level = LEVEL_PLAN;
X where.snum = Dir[Playernum-1].snum;
X where.pnum = Dir[Playernum-1].pnum;
X }
X } else {
X where = Getplace(Playernum,args[1],0);
X if (where.err)
X return;
X }
X
X}
X
Xfree(Race);
Xopenracedata(&survey_racedata);
Xgetrace(survey_racedata, &Race, Playernum);
Xclose_file(survey_racedata);
X
Xif (where.level==LEVEL_PLAN) {
X
X
X openpdata(&survey_pdata);
X getplanet(survey_pdata,&p,Stars[where.snum]->planetpos[where.pnum]);
X close_file(survey_pdata);
X
X compat = compatibility(p,Race);
X
X
X if (isdigit(args[1][0]) && index(args[1],',')!=NULL) {
X
X opensectdata(&survey_sectdata);
X getsmap(survey_sectdata,Smap,p);
X close_file(survey_sectdata);
X
X get4args(args[1],&x2,&hix,&lowy,&hiy);
X /* ^^^ translate from lowx:hix,lowy:hiy */
X x2 = MAX(0, x2);
X hix = MIN(hix, p->Maxx-1);
X lowy = MAX(0, lowy);
X hiy = MIN(hiy, p->Maxy-1);
X
X sprintf(buf," x,y des ( type ) owner eff mob frt res popn ^popn\n");
X notify(Playernum, buf);
X
X for (; lowy<=hiy; lowy++)
X for (lowx=x2; lowx<=hix; lowx++) {
X s = &Sector(*p, lowx, lowy);
X /*if (s->owner==Playernum)*/
X sprintf(buf,"%2d,%-2d ", lowx, lowy);
X notify(Playernum, buf);
X if ( (d = desshow(Playernum, p, lowx, lowy, Race))==CHAR_CLOAKED) {
X sprintf(buf,"? ( ? )\n");
X notify(Playernum, buf);
X } else {
X sprintf(buf,"%c (%11s) %6u%4u%4u%4u%4u%5u%6d\n",
X d, Desnames[s->des], s->owner, s->eff,
X s->mobilization, s->fert, s->resource, s->popn,
X maxsupport(Race,s,compat,p->conditions[TOXIC]) );
X notify(Playernum, buf);
X }
X }
X free(p);
X
X } else {
X
X /* survey of planet */
X
X sprintf(buf,"%s:\n",Stars[where.snum]->pnames[where.pnum]);
X notify(Playernum, buf);
X sprintf(buf,"gravity x,y absolute x,y relative to %s\n",Stars[where.snum]->name);
X notify(Playernum, buf);
X sprintf(buf,"%7.2f %7.1f,%7.1f %8.1f,%8.1f\n",
X gravity(p),
X p->xpos + Stars[where.snum]->xpos,
X p->ypos + Stars[where.snum]->ypos,
X p->xpos, p->ypos );
X
X notify(Playernum, buf);
X sprintf(buf,"======== Planetary conditions: ========\n");
X notify(Playernum, buf);
X sprintf(buf,"atmosphere concentrations:\n");
X notify(Playernum, buf);
X sprintf(buf," methane %02d%%(%02d%%) oxygen %02d%%(%02d%%)\n",
X p->conditions[METHANE], Race->conditions[METHANE],
X p->conditions[OXYGEN], Race->conditions[OXYGEN] );
X notify(Playernum, buf);
X sprintf(buf," CO2 %02d%%(%02d%%) hydrogen %02d%%(%02d%%) temperature: %3d (%3d)\n",
X p->conditions[CO2], Race->conditions[CO2],
X p->conditions[HYDROGEN], Race->conditions[HYDROGEN],
X Temp(p->conditions[TEMP]), Temp(Race->conditions[TEMP]) );
X notify(Playernum, buf);
X sprintf(buf," nitrogen %02d%%(%02d%%) sulfur %02d%%(%02d%%) normal: %3d\n",
X p->conditions[NITROGEN], Race->conditions[NITROGEN],
X p->conditions[SULFUR], Race->conditions[SULFUR],
X Temp(p->conditions[RTEMP]) );
X notify(Playernum, buf);
X sprintf(buf," helium %02d%%(%02d%%) other %02d%%(%02d%%)\n",
X p->conditions[HELIUM], Race->conditions[HELIUM],
X p->conditions[OTHER], Race->conditions[OTHER]);
X notify(Playernum, buf);
X if ((tindex = p->conditions[TOXIC]/10) < 0)
X tindex = 0;
X else if (tindex > 10)
X tindex = 11;
X sprintf(buf," Toxicity: %d%% (%s)\n",
X p->conditions[TOXIC], Tox[tindex] );
X notify(Playernum, buf);
X sprintf(buf,"Total planetary compatibility: %.2f%%\n", compatibility(p, Race) );
X notify(Playernum, buf);
X
X sprintf(buf,"fuel_stock resource_stock dest_pot. %s ^%s\n",
X Race->Thing ? "biomass" : "popltn",
X Race->Thing ? "biomass" : "popltn");
X notify(Playernum, buf);
X sprintf(buf,"%10lu %14lu %9lu %7lu%11lu\n", p->info[Playernum-1].fuel,
X p->info[Playernum-1].resource,
X p->info[Playernum-1].destruct,
X p->popn, p->maxpopn);
X notify(Playernum, buf);
X if (p->slaved_to) {
X sprintf(buf,"This planet ENSLAVED to player %d!\n", p->slaved_to);
X notify(Playernum, buf);
X }
X free(p);
X
X }
X
X } else if (where.level==LEVEL_STAR) {
X
X sprintf(buf,"Star %s\n",Stars[where.snum]->name);
X notify(Playernum, buf);
X sprintf(buf,"locn: %f,%f\n",Stars[where.snum]->xpos,Stars[where.snum]->ypos);
X notify(Playernum, buf);
X sprintf(buf,"gravity: %.2f\tstability: ", Stars[where.snum]->gravity);
X notify(Playernum, buf);
X sprintf(buf,"temperature class (1->10) %d\n", Stars[where.snum]->temperature);
X notify(Playernum, buf);
Xif (Race->tech >= TECH_SEE_STABILITY) {
X sprintf(buf,"%d%% (%s)\n",
X Stars[where.snum]->stability,
X Stars[where.snum]->stability<20 ? "stable" :
X Stars[where.snum]->stability<40 ? "unstable" :
X Stars[where.snum]->stability<60 ? "dangerous" :
X Stars[where.snum]->stability<100 ? "WARNING! nova iminent!" :
X "undergoing nova" );
X notify(Playernum, buf);
X } else {
X sprintf(buf,"(cannot determine)\n");
X notify(Playernum, buf);
X }
X sprintf(buf,"%d planets are ",Stars[where.snum]->numplanets);
X notify(Playernum, buf);
X for (x2=0; x2<Stars[where.snum]->numplanets; x2++) {
X sprintf(buf,"%s ", Stars[where.snum]->pnames[x2]);
X notify(Playernum, buf);
X }
X sprintf(buf,"\n");
X notify(Playernum, buf);
X
X } else if (where.level==LEVEL_UNIV) {
X sprintf(buf,"It's just _there_, you know?\n");
X notify(Playernum, buf);
X
X} else {
X sprintf(buf,"scope must be a planet.\n");
X notify(Playernum, buf);
X }
X}
END_OF_FILE
if test 6864 -ne `wc -c <'server/survey.c'`; then
echo shar: \"'server/survey.c'\" unpacked with wrong size!
fi
# end of 'server/survey.c'
fi
echo shar: End of archive 8 \(of 14\).
cp /dev/null ark8isdone
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