|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 6938 (0x1b1a) Types: TextFile Names: »dosector.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Gb/dosector.c«
/* * Galactic Bloodshed (Robert Chansky, smq@b) * dosector.c * dosector() -- do spread, produce, stuff like that, on a sector. * explore() -- mark sector and surrounding sectors as having been explored. */ #include "vars.h" #include "races.h" #include "ships.h" #include "doturn.h" #include <math.h> extern int tot_resdep,tot_eff,tot_res,tot_fuel,tot_destruct, tot_captured,tot_mob; extern float avg_mob[MAXPLAYERS]; extern char sects_gained[MAXPLAYERS], sects_lost[MAXPLAYERS]; extern bool Claims; /* produce stuff in sector */ produce(planet,s) reg planettype *planet; reg sectortype *s; { reg float factor; reg int eff; reg struct plinfo *pinf; reg int new; factor = logscale(s->popn)*s->resource * races[s->owner]->metabolism; pinf = &planet->info[s->owner-1]; if (planet->type==TYPE_GASGIANT) tot_fuel = pinf->fuel = 1000000; else { pinf->fuel+=(new = round_rand(logscale(s->eff)*factor*FUEL_PRODUCTION) ); tot_fuel += new; } pinf->resource += (new = round_rand( logscale(s->eff)*factor*RESOURCE_PRODUCTION ) ); tot_res += new; /* increase mobilization to planetary quota */ if (s->mobilization < pinf->mob_set) if (pinf->resource) { s->mobilization++; pinf->resource -= round_rand(MOB_COST); tot_mob++; } pinf->destruct += (new = round_rand( logscale(s->eff)*factor*(s->mobilization/100.0)*DEST_PRODUCTION ) ); tot_destruct += new; /* deplete resources for making weapons */ tot_resdep += (new = (s->resource<=1) ? 0 : round_rand((1.1-logscale(s->eff))*factor*RESOURCE_DEPLETION) ); s->resource -= new; /* add mobilization to get average mobilization */ avg_mob[s->owner] += s->mobilization; /* do efficiency */ if (s->eff<100) { if (!s->eff) { tot_eff += s->eff = 1; } else { /*tot_eff += eff = round_rand(races[s->owner]->metabolism*s->popn*(0.95-logscale(s->eff))*EFF_PROD);*/ tot_eff += eff = round_rand(races[s->owner]->metabolism*s->popn*EFF_PROD/100.0); if (s->eff+eff >= 100) { s->eff=100; /* dont go past 100%*/ tot_eff -= s->eff+eff-100; s->des = DES_PLATED; } else s->eff += eff; } } /* add population to sector */ if (s->popn >= races[s->owner]->number_sexes) /*if (s->popn < maxsupport(s) )*/ s->popn += round_rand((float)s->popn*races[s->owner]->birthrate * Compat[s->owner]/100.0 * (50.0-planet->conditions[TOXIC])/50.0 ); /*else s->popn += round_rand((float)s->popn*races[s->owner]->overbirthrate * Compat[s->owner]/100.0 * (50.0-planet->conditions[TOXIC])/50.0 );*/ else s->popn -= round_rand(s->popn * .01); } /* * spread population to surrounding sects. * * the way people move depends on the population of the planet unless * NO_SLIDING_SCALE_AUTOMOVE is set (again for reasons of computer * power). Otherwise, the populace will automatically migrate to all * available surrounding areas if the planetary population is less than * POPN_MOVE_SCALE_1, to either north-south or east-west areas if the * population is less than POPN_MOVE_SCALE_2, and to only one adjacent * random sector if it is greater. */ spread(pl,s,x,y) reg planettype *pl; reg sectortype *s; reg int x,y; { reg int peep; /* peep == number of people who want to move */ if (peep = round_rand((float)s->popn * races[s->owner]->nonhomebodies) ) { #if NO_SLIDING_SCALE_AUTOMOVE if (pl->popn < POPN_MOVE_SCALE_1) { #endif Migrate2(pl,x+1,y,s,peep/4); Migrate2(pl,x-1,y,s,peep/4); Migrate2(pl,x,y+1,s,peep/4); Migrate2(pl,x,y-1,s,peep/4); #if NO_SLIDING_SCALE_AUTOMOVE } else if (pl->popn < POPN_MOVE_SCALE_2) { x2 = int_rand(-1,1); y2 = (!x2) ? rposneg() : 0; /* 1/3 chance of migrating n-s*/ Migrate2(pl,x+x2,y+y2,s,peep/2); Migrate2(pl,x-x2,y-y2,s,peep/2); /* migrate to destination, from source */ } else { Migrate2(pl, x + rposneg(), y + rposneg(), s, peep); } #endif } } Migrate2(planet,xd,yd,ps,people) planettype *planet; reg int xd,yd; sectortype *ps; reg int people; { reg sectortype *pd; /* attempt to migrate beyond screen */ if ((yd>=planet->Maxy) || (yd<0) || !people ) return; if (xd<0) xd=planet->Maxx-1; else if (xd>=planet->Maxx) xd=0; pd = &Sector(*planet,xd,yd); /* check for planetary compatibility */ if (float_rand()*100.0 > Compat[ps->owner] * races[ps->owner]->likes[pd->des]) { /*printf("%d,%d incomp C %.2f,l %.f-- returning\n",xd,yd,Compat[ps->owner],races[ps->owner]->likes[pd->des]);*/ return; } if ( (ps->owner==pd->owner || !pd->owner) && !pd->is_wasted) { if (!pd->owner) { printf("claiming %d,%d (%d), %d people\n",xd,yd,ps->owner,people); pd->popn += people; ps->popn -= people; /* move people */ pd->owner = ps->owner; tot_captured++; planet->info[pd->owner-1].numsectsowned++; Claims = 1; } else if (pd->owner==ps->owner) { pd->popn += people; ps->popn -= people; } else if (isset(races[ps->owner]->atwar, pd->owner) || races[ps->owner]->Thing) { /* we are at war with them; do land combat */ reg float dfac; ps->popn -= round_rand(((float)ps->popn * pd->mobilization * planet->info[pd->owner-1].comread + races[pd->owner]->fighters*20)/200.0); dfac = ( (float)pd->popn * ps->mobilization * planet->info[ps->owner-1].comread + races[pd->owner]->fighters*20)/200.0; printf(" att %d lost %g people of %d.\n",ps->owner, ((float)ps->popn * pd->mobilization * planet->info[pd->owner-1].comread + races[pd->owner]->fighters*20)/200.0, pd->popn); if (pd->popn - dfac <= 0.0) { /* the invasion was successful */ if (races[ps->owner]->Thing) { /* mesos absorb the bodies of enemies */ pd->popn += MIN(people, ps->popn); ps->popn -= MIN(people, ps->popn); } else { pd->popn = MIN(people, ps->popn); ps->popn -= MIN(people, ps->popn); } sects_lost[pd->owner]++; sects_gained[ps->owner]++; pd->owner = ps->owner; pd->eff *= 0.75; pd->mobilization *= 0.75; tot_captured++; printf(" sec %d,%d CAPTURED",xd,yd); } else pd->popn -= round_rand(dfac); printf(" def %d lost %g people of %d,",pd->owner, ((float)pd->popn * ps->mobilization * planet->info[ps->owner-1].comread + races[pd->owner]->fighters*20)/200.0, pd->popn); } } } /* mark sectors on the planet as having been "explored." for sea exploration on earthtype planets. */ explore(planet, s, x, y, p) reg planettype *planet; reg sectortype *s; reg int x,y,p; { reg int d; /* explore sectors surrounding sectors currently explored. */ if (Sectinfo[x][y].explored[p]) { Sectinfo[mod(x-1,planet->Maxx,d)][y].explored[p] = 1; Sectinfo[mod(x+1,planet->Maxx,d)][y].explored[p] = 1; if (y==0) { Sectinfo[x][1].explored[p] = 1; } else if (y==planet->Maxy-1) { Sectinfo[x][y-1].explored[p] = 1; } else { Sectinfo[x][y-1].explored[p] = Sectinfo[x][y+1].explored[p] = 1; } } else if (s->owner==p) Sectinfo[x][y].explored[p] = 1; }