for (;;) {
/* position next to base by trial and error */
game.quad[sectx][secty] = IHDOT;
- for (l = 1; l <= QUADSIZE; l++) {
+ for_sectors(l) {
sectx = 3.0*Rand() - 1.0 + basex;
secty = 3.0*Rand() - 1.0 + basey;
- if (sectx >= 1 && sectx <= QUADSIZE &&
- secty >= 1 && secty <= QUADSIZE &&
+ if (VALID_SECTOR(sectx, secty) &&
game.quad[sectx][secty] == IHDOT) break;
}
if (l < QUADSIZE+1) break; /* found a spot */
iscraft=0; /* Gallileo disappears */
/* Resupply ship */
condit=IHDOCKED;
- for (l = 1; l <= NDEVICES; l++) game.damage[l] = 0.0;
+ for (l = 0; l < NDEVICES; l++)
+ game.damage[l] = 0.0;
game.damage[DSHUTTL] = -1;
energy = inenrg = 3000.0;
shield = inshld = 1250.0;
nprobes = (int)(3.0*Rand() + 2.0); /* Give them 2-4 of these wonders */
warpfac = 5.0;
wfacsq = warpfac * warpfac;
- for (i=0; i <= NDEVICES; i++) game.damage[i] = 0.0;
+ for (i=0; i < NDEVICES; i++)
+ game.damage[i] = 0.0;
// Set up assorted game parameters
batx = baty = 0;
game.state.date = indate = 100.0*(int)(31.0*Rand()+20.0);
landed = -1;
alive = 1;
docfac = 0.25;
- for (i = 1; i <= GALSIZE; i++)
- for (j = 1; j <= GALSIZE; j++) game.state.newstuf[i][j] = game.starch[i][j] = 0;
+ for_quadrants(i)
+ for_quadrants(j) {
+ game.state.galaxy[i][j].charted = 0;
+ game.state.galaxy[i][j].planets = 0;
+ game.state.galaxy[i][j].romulans = 0;
+ }
// Initialize times for extraneous events
game.future[FSNOVA] = game.state.date + expran(0.5 * intime);
game.future[FTBEAM] = game.state.date + expran(1.5 * (intime / game.state.remcom));
stdamtim = 1e30;
// Put stars in the galaxy
instar = 0;
- for (i=1; i<=GALSIZE; i++)
- for (j=1; j<=GALSIZE; j++) {
+ for_quadrants(i)
+ for_quadrants(j) {
int k = Rand()*9.0 + 1.0;
instar += k;
- game.state.galaxy[i][j] = k * STAR_PLACE;
+ game.state.galaxy[i][j].stars = k;
}
// Locate star bases in galaxy
for (i = 1; i <= inbase; i++) {
int contflag;
do {
do iran(GALSIZE, &ix, &iy);
- while (BASES(game.state.galaxy[ix][iy]));
+ while (game.state.galaxy[ix][iy].starbase);
contflag = FALSE;
for (j = i-1; j > 0; j--) {
/* Improved placement algorithm to spread out bases */
double distq = square(ix-game.state.baseqx[j]) + square(iy-game.state.baseqy[j]);
- if (distq < 6.0*(BASEMAX-inbase) && Rand() < 0.75) {
+ if (distq < 6.0*(BASEMAX+1-inbase) && Rand() < 0.75) {
contflag = TRUE;
#ifdef DEBUG
proutn("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);
break;
}
#ifdef DEBUG
- else if (distq < 6.0 * (BASEMAX-inbase)) {
+ else if (distq < 6.0 * (BASEMAX+1-inbase)) {
proutn("DEBUG: saving base #%d, close to #%d\n", i, j);
}
#endif
game.state.baseqx[i] = ix;
game.state.baseqy[i] = iy;
- game.starch[ix][iy] = CHART_UNKNOWN;
- game.state.galaxy[ix][iy] += BASE_PLACE;
+ game.state.galaxy[ix][iy].starbase = 1;
+ game.state.chart[ix][iy].starbase = 1;
}
// Position ordinary Klingon Battle Cruisers
krem = inkling - incom - game.state.nscrem;
int klump = (1.0 - r*r)*klumper;
if (klump > krem) klump = krem;
krem -= klump;
- klump *= KLINGON_PLACE;
- do iran(GALSIZE, &ix, &iy);
- while (game.state.galaxy[ix][iy] + klump >= SUPERNOVA_PLACE);
- game.state.galaxy[ix][iy] += klump;
+ do iran(GALSIZE,&ix,&iy); while (game.state.galaxy[ix][iy].supernova);
+ game.state.galaxy[ix][iy].klingons += klump;
} while (krem > 0);
// Position Klingon Commander Ships
#ifdef DEBUG
#endif
iran(GALSIZE, &ix, &iy);
}
- while ((game.state.galaxy[ix][iy] <= KLINGON_PLACE && Rand() < 0.75)||
- NOEXIT(game.state.galaxy[ix][iy]));
+ while ((!game.state.galaxy[ix][iy].klingons && Rand() < 0.75)||
+ game.state.galaxy[ix][iy].supernova||
+ game.state.galaxy[ix][iy].klingons > 8);
// check for duplicate
for (j = 1; j < i; j++)
if (game.state.cx[j]==ix && game.state.cy[j]==iy) break;
} while (j < i);
- game.state.galaxy[ix][iy] += KLINGON_PLACE;
+ game.state.galaxy[ix][iy].klingons++;
game.state.cx[i] = ix;
game.state.cy[i] = iy;
}
// Locate planets in galaxy
for (i = 0; i < inplan; i++) {
- do iran(GALSIZE, &ix, &iy);
- while (game.state.newstuf[ix][iy] > 0);
- game.state.newstuf[ix][iy] = 1;
+ do iran(GALSIZE, &ix, &iy); while (game.state.galaxy[ix][iy].planets);
+ game.state.galaxy[ix][iy].planets = 1;
game.state.plnets[i].x = ix;
game.state.plnets[i].y = iy;
game.state.plnets[i].pclass = Rand()*3.0; // Planet class M N or O
// Locate Romulans
for (i = 1; i <= game.state.nromrem; i++) {
iran(GALSIZE, &ix, &iy);
- game.state.newstuf[ix][iy] += ROMULAN_PLACE;
+ game.state.galaxy[ix][iy].romulans = 1;
}
// Locate the Super Commander
if (game.state.nscrem > 0) {
do iran(GALSIZE, &ix, &iy);
- while (game.state.galaxy[ix][iy] >= 900);
+ while (game.state.galaxy[ix][iy].supernova || game.state.galaxy[ix][iy].klingons > 8);
game.state.isx = ix;
game.state.isy = iy;
- game.state.galaxy[ix][iy] += KLINGON_PLACE;
+ game.state.galaxy[ix][iy].klingons++;
}
// Place thing (in tournament game, thingx == -1, don't want one!)
if (thingx != -1) {
// Use parameters to generate initial values of things
damfac = 0.5 * skill;
- game.state.rembase = 3.0*Rand()+2.0;
+ game.state.rembase = 2.0 + Rand()*(BASEMAX-2.0);
inbase = game.state.rembase;
if (game.options & OPTION_PLANETS)
inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();
{
condit = IHGREEN;
if (energy < 1000.0) condit = IHYELLOW;
- if (game.state.galaxy[quadx][quady] >= KLINGON_PLACE || game.state.newstuf[quadx][quady] >= ROMULAN_PLACE)
+ if (game.state.galaxy[quadx][quady].klingons || game.state.galaxy[quadx][quady].romulans)
condit = IHRED;
if (!alive) condit=IHDEAD;
}
void newqad(int shutup)
{
- int quadnum = game.state.galaxy[quadx][quady];
- int newnum = game.state.newstuf[quadx][quady];
int i, j, ix, iy, nplan;
iattak = 1;
ientesc = 1;
}
// Clear quadrant
- for (i=1; i <= QUADSIZE; i++)
- for (j=1; j <= QUADSIZE; j++) game.quad[i][j] = IHDOT;
+ for_sectors(i)
+ for_sectors(j)
+ game.quad[i][j] = IHDOT;
// cope with supernova
- if (quadnum >= SUPERNOVA_PLACE) {
+ if (game.state.galaxy[quadx][quady].supernova)
return;
- }
- klhere = KLINGONS(quadnum);
- irhere = ROMULANS(newnum);
- nplan = newnum%10;
+ klhere = game.state.galaxy[quadx][quady].klingons;
+ irhere = game.state.galaxy[quadx][quady].romulans;
+ nplan = game.state.galaxy[quadx][quady].planets;
nenhere = klhere + irhere;
// Position Starship
game.quad[sectx][secty] = ship;
- if (quadnum >= KLINGON_PLACE) {
+ if (game.state.galaxy[quadx][quady].klingons) {
// Position ordinary Klingons
- quadnum -= KLINGON_PLACE*klhere;
for (i = 1; i <= klhere; i++) {
dropin(IHK, &ix, &iy);
game.kx[i] = ix;
game.kpower[i] = Rand()*150.0 +300.0 +25.0*skill;
}
// If we need a commander, promote a Klingon
- for (i = 1; i <= game.state.remcom ; i++)
+ for_commanders(i)
if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;
if (i <= game.state.remcom) {
game.kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;
}
// If quadrant needs a starbase, put it in
- if (quadnum >= BASE_PLACE) {
- quadnum -= BASE_PLACE;
+ if (game.state.galaxy[quadx][quady].starbase)
dropin(IHB, &basex, &basey);
- }
if (nplan) {
// If quadrant needs a planet, put it in
// Check for condition
newcnd();
// And finally the stars
- for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);
+ for (i = 1; i <= game.state.galaxy[quadx][quady].stars; i++)
+ dropin(IHSTAR, &ix, &iy);
// Check for RNZ
if (irhere > 0 && klhere == 0) {
// Put in a few black holes
for (i = 1; i <= 3; i++)
- if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);
+ if (Rand() > 0.5)
+ dropin(IHBLANK, &ix, &iy);
// Take out X's in corners if Tholian present
if (ithere) {