{
int ictbeam=0, ipage=0, istract=0, line, i=0, j, k, l, ixhold=0, iyhold=0;
double fintim = game.state.date + Time, datemin, xtime, repair, yank=0;
+ int radio_was_broken;
#ifdef DEBUG
if (idebug) prout("EVENTS");
#endif
- if (stdamtim == 1e30 && game.damage[DRADIO] != 0.0) {
- /* chart will no longer be updated because radio is dead */
- stdamtim = game.state.date;
- for (i=1; i <= GALSIZE ; i++)
- for (j=1; j <= GALSIZE; j++)
- if (game.starch[i][j] == 1)
- game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE;
- }
+ radio_was_broken = (game.damage[DRADIO] != 0.0);
for (;;) {
/* Select earliest extraneous event, line==0 if no events */
line = FSPY;
if (alldone) return;
datemin = fintim;
- for (l=1; l<=NEVENTS; l++)
+ for (l = 1; l < NEVENTS; l++)
if (game.future[l] < datemin) {
line = l;
datemin = game.future[l];
repair = xtime;
if (condit == IHDOCKED) repair /= docfac;
/* Don't fix Deathray here */
- for (l=1; l<=NDEVICES; l++)
+ for (l=0; l<NDEVICES; l++)
if (game.damage[l] > 0.0 && l != DDRAY)
game.damage[l] -= (game.damage[l]-repair > 0.0 ? repair : game.damage[l]);
/* If radio repaired, update star chart and attack reports */
- if (stdamtim != 1e30 && game.damage[DRADIO] == 0.0) {
- stdamtim = 1e30;
- prout("Lt. Uhura- \"Captain, the sub-space radio is working and");
+ if (radio_was_broken && game.damage[DRADIO] == 0.0) {
+1 prout("Lt. Uhura- \"Captain, the sub-space radio is working and");
prout(" surveillance reports are coming in.");
skip(1);
- for (i=1; i <= GALSIZE ; i++)
- for (j=1; j <= GALSIZE; j++)
- if (game.starch[i][j] >= SUPERNOVA_PLACE) game.starch[i][j] = 1;
if (iseenit==0) {
attakreport(0);
iseenit = 1;
}
- skip(1);
+ rechart();
prout(" The star chart is now up to date.\"");
skip(1);
}
ipage=1;
snova(0,0);
game.future[FSNOVA] = game.state.date + expran(0.5*intime);
- if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
+ if (game.state.galaxy[quadx][quady].supernova) return;
break;
case FSPY: /* Check with spy to see if S.C. should tractor beam */
if (game.state.nscrem == 0 ||
case FTBEAM: /* Tractor beam */
if (line==FTBEAM) {
if (game.state.remcom == 0) {
- game.future[FTBEAM] = 1e30;
+ game.future[FTBEAM] = FOREVER;
break;
}
i = Rand()*game.state.remcom+1.0;
/* Adjust finish time to time of tractor beaming */
fintim = game.state.date+Time;
attack(0);
- if (game.state.remcom <= 0) game.future[FTBEAM] = 1e30;
+ if (game.state.remcom <= 0) game.future[FTBEAM] = FOREVER;
else game.future[FTBEAM] = game.state.date+Time+expran(1.5*intime/game.state.remcom);
break;
case FSNAP: /* Snapshot of the universe (for time warp) */
case FBATTAK: /* Commander attacks starbase */
if (game.state.remcom==0 || game.state.rembase==0) {
/* no can do */
- game.future[FBATTAK] = game.future[FCDBAS] = 1e30;
+ game.future[FBATTAK] = game.future[FCDBAS] = FOREVER;
break;
}
i = 0;
- for (j=1; j<=game.state.rembase; j++) {
- for (k=1; k<=game.state.remcom; k++)
+ for_starbases(j) {
+ for_commanders(k)
if (game.state.baseqx[j]==game.state.cx[k] && game.state.baseqy[j]==game.state.cy[k] &&
(game.state.baseqx[j]!=quadx || game.state.baseqy[j]!=quady) &&
(game.state.baseqx[j]!=game.state.isx || game.state.baseqy[j]!=game.state.isy)) {
if (j>game.state.rembase) {
/* no match found -- try later */
game.future[FBATTAK] = game.state.date + expran(0.3*intime);
- game.future[FCDBAS] = 1e30;
+ game.future[FCDBAS] = FOREVER;
break;
}
/* commander + starbase combination found -- launch attack */
}
break;
case FSCDBAS: /* Supercommander destroys base */
- game.future[FSCDBAS] = 1e30;
+ game.future[FSCDBAS] = FOREVER;
isatb = 2;
- if (!BASES(game.state.galaxy[game.state.isx][game.state.isy]))
+ if (!game.state.galaxy[game.state.isx][game.state.isy].starbase)
break; /* WAS RETURN! */
ixhold = batx;
iyhold = baty;
baty = game.state.isy;
case FCDBAS: /* Commander succeeds in destroying base */
if (line==FCDBAS) {
- game.future[FCDBAS] = 1e30;
+ game.future[FCDBAS] = FOREVER;
/* find the lucky pair */
- for (i = 1; i <= game.state.remcom; i++)
- if (game.state.cx[i]==batx && game.state.cy[i]==baty) break;
+ for_commanders(i)
+ if (game.state.cx[i]==batx && game.state.cy[i]==baty)
+ break;
if (i > game.state.remcom || game.state.rembase == 0 ||
- !BASES(game.state.galaxy[batx][baty])) {
+ !game.state.galaxy[batx][baty].starbase) {
/* No action to take after all */
batx = baty = 0;
break;
}
/* Code merges here for any commander destroying base */
/* Not perfect, but will have to do */
- if (game.starch[batx][baty] == -1) game.starch[batx][baty] = 0;
/* Handle case where base is in same quadrant as starship */
if (batx==quadx && baty==quady) {
- if (game.starch[batx][baty] >= SUPERNOVA_PLACE) game.starch[batx][baty] -= BASE_PLACE;
+ game.state.chart[batx][baty].starbase = FALSE;
game.quad[basex][basey]= IHDOT;
basex=basey=0;
newcnd();
prout(" has been destroyed by");
if (isatb==2) prout("the Klingon Super-Commander");
else prout("a Klingon Commander");
+ game.state.chart[batx][baty].starbase = FALSE;
}
/* Remove Starbase from galaxy */
- game.state.galaxy[batx][baty] -= BASE_PLACE;
- for (i=1; i <= game.state.rembase; i++)
+ game.state.galaxy[batx][baty].starbase = FALSE;
+ for_starbases(i)
if (game.state.baseqx[i]==batx && game.state.baseqy[i]==baty) {
game.state.baseqx[i]=game.state.baseqx[game.state.rembase];
game.state.baseqy[i]=game.state.baseqy[game.state.rembase];
if (probecx != i || probecy != j) {
probecx = i;
probecy = j;
- if (i < 1 || i > GALSIZE || j < 1 || j > GALSIZE ||
- game.state.galaxy[probecx][probecy] == SUPERNOVA_PLACE) {
+ if (!VALID_QUADRANT(i, j) ||
+ game.state.galaxy[probecx][probecy].supernova) {
// Left galaxy or ran into supernova
if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) {
if (ipage==0) pause_game(1);
ipage = 1;
skip(1);
proutn("Lt. Uhura- \"The deep space probe ");
- if (i < 1 ||i > GALSIZE || j < 1 || j > GALSIZE)
+ if (!VALID_QUADRANT(j, i))
proutn("has left the galaxy");
else
proutn("is no longer transmitting");
prout(".\"");
}
- game.future[FDSPROB] = 1e30;
+ game.future[FDSPROB] = FOREVER;
break;
}
if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) {
}
/* Update star chart if Radio is working or have access to
radio. */
- if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED)
- game.starch[probecx][probecy] = game.damage[DRADIO] > 0.0 ?
- game.state.galaxy[probecx][probecy]+SUPERNOVA_PLACE : 1;
+ if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) {
+ game.state.chart[probecx][probecy].klingons = game.state.galaxy[probecx][probecy].klingons;
+ game.state.chart[probecx][probecy].starbase = game.state.galaxy[probecx][probecy].starbase;
+ game.state.chart[probecx][probecy].stars = game.state.galaxy[probecx][probecy].stars;
+ game.state.galaxy[probecx][probecy].charted = TRUE;
+ }
proben--; // One less to travel
if (proben == 0 && isarmed &&
- STARS(game.state.galaxy[probecx][probecy])) {
+ game.state.galaxy[probecx][probecy].stars) {
/* lets blow the sucker! */
snova(1,0);
- game.future[FDSPROB] = 1e30;
- if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
+ game.future[FDSPROB] = FOREVER;
+ if (game.state.galaxy[quadx][quady].supernova)
+ return;
}
break;
}
if (origTime-delay >= 9.99 && condit == IHDOCKED)
game.damage[DDRAY] = 0.0;
} while
- (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE); // leave if quadrant supernovas
+ // leave if quadrant supernovas
+ (!game.state.galaxy[quadx][quady].supernova);
resting = 0;
Time = 0;
game.quad[ix][iy] = IHDOT;
crmena(1, IHSTAR, 2, ix, iy);
prout(" novas.");
- game.state.galaxy[quadx][quady] -= 1;
+ game.state.galaxy[quadx][quady].stars--;
game.state.starkl++;
/* Set up stack to recursively trigger adjacent stars */
if (j==2 && nn== 2) continue;
ii = hits[mm][1]+nn-2;
jj = hits[mm][2]+j-2;
- if (ii < 1 || ii > QUADSIZE || jj < 1 || jj > QUADSIZE) continue;
+ if (!VALID_SECTOR(jj, ii)) continue;
iquad = game.quad[ii][jj];
switch (iquad) {
// case IHDOT: /* Empty space ends reaction
top2++;
hits[top2][1]=ii;
hits[top2][2]=jj;
- game.state.galaxy[quadx][quady] -= 1;
+ game.state.galaxy[quadx][quady].stars -= 1;
game.state.starkl++;
crmena(1, IHSTAR, 2, ii, jj);
prout(" novas.");
game.quad[ii][jj] = IHDOT;
break;
case IHP: /* Destroy planet */
- game.state.newstuf[quadx][quady] -= 1;
+ game.state.galaxy[quadx][quady].planets -= 1;
game.state.nplankl++;
crmena(1, IHP, 2, ii, jj);
prout(" destroyed.");
game.quad[ii][jj] = IHDOT;
break;
case IHB: /* Destroy base */
- game.state.galaxy[quadx][quady] -= BASE_PLACE;
- for (i = 1; i <= game.state.rembase; i++)
- if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady) break;
+ game.state.galaxy[quadx][quady].starbase = FALSE;
+ for_starbases(i)
+ if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady)
+ break;
game.state.baseqx[i] = game.state.baseqx[game.state.rembase];
game.state.baseqy[i] = game.state.baseqy[game.state.rembase];
game.state.rembase--;
case IHC: /* Damage/destroy big enemies */
case IHS:
case IHR:
- for (ll = 1; ll <= nenhere; ll++)
+ for_local_enemies(ll)
if (game.kx[ll]==ii && game.ky[ll]==jj) break;
game.kpower[ll] -= 800.0; /* If firepower is lost, die */
if (game.kpower[ll] <= 0.0) {
newcy = jj + jj - hits[mm][2];
crmena(1, iquad, 2, ii, jj);
proutn(" damaged");
- if (newcx<1 || newcx>QUADSIZE || newcy<1 || newcy>QUADSIZE) {
+ if (!VALID_SECTOR(newcx, newcy)) {
/* can't leave quadrant */
skip(1);
break;
void snova(int insx, int insy)
{
- int comdead, nqx=0, nqy=0, nsx, nsy, num, kldead, iscdead;
+ int comdead, nqx=0, nqy=0, nsx, nsy, num=0, kldead, iscdead;
int nrmdead, npdead;
int incipient=0;
/* Scheduled supernova -- select star */
/* logic changed here so that we won't favor quadrants in top
left of universe */
- for (nqx = 1; nqx<=GALSIZE; nqx++) {
- for (nqy = 1; nqy<=GALSIZE; nqy++) {
- stars += STARS(game.state.galaxy[nqx][nqy]);
+ for_quadrants(nqx) {
+ for_quadrants(nqy) {
+ stars += game.state.galaxy[nqx][nqy].stars;
}
}
if (stars == 0) return; /* nothing to supernova exists */
num = Rand()*stars + 1;
- for (nqx = 1; nqx<=GALSIZE; nqx++) {
- for (nqy = 1; nqy<=GALSIZE; nqy++) {
- num -= STARS(game.state.galaxy[nqx][nqy]);
+ for_quadrants(nqx) {
+ for_quadrants(nqy) {
+ num -= game.state.galaxy[nqx][nqy].stars;
if (num <= 0) break;
}
if (num <=0) break;
else {
/* we are in the quadrant! */
incipient = 1;
- num = Rand()* STARS(game.state.galaxy[nqx][nqy]) + 1;
- for (nsx=1; nsx < QUADSIZE; nsx++) {
- for (nsy=1; nsy < QUADSIZE; nsy++) {
+ num = Rand()* game.state.galaxy[nqx][nqy].stars + 1;
+ for_sectors(nsx) {
+ for_sectors(nsy) {
if (game.quad[nsx][nsy]==IHSTAR) {
num--;
if (num==0) break;
}
}
/* destroy any Klingons in supernovaed quadrant */
- num=game.state.galaxy[nqx][nqy];
- kldead = num/100;
+ kldead = game.state.galaxy[nqx][nqy].klingons;
+ game.state.galaxy[nqx][nqy].klingons = 0;
comdead = iscdead = 0;
if (nqx==game.state.isx && nqy == game.state.isy) {
/* did in the Supercommander! */
game.state.nscrem = game.state.isx = game.state.isy = isatb = iscate = 0;
iscdead = 1;
- game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;
+ game.future[FSCMOVE] = game.future[FSCDBAS] = FOREVER;
}
game.state.remkl -= kldead;
if (game.state.remcom) {
game.state.remcom--;
kldead--;
comdead++;
- if (game.state.remcom==0) game.future[FTBEAM] = 1e30;
+ if (game.state.remcom==0) game.future[FTBEAM] = FOREVER;
break;
}
}
}
/* destroy Romulans and planets in supernovaed quadrant */
- num = game.state.newstuf[nqx][nqy];
- game.state.newstuf[nqx][nqy] = 0;
- nrmdead = num/10;
+ nrmdead = game.state.galaxy[nqx][nqy].romulans;
+ game.state.galaxy[nqx][nqy].romulans = 0;
game.state.nromrem -= nrmdead;
npdead = num - nrmdead*10;
if (npdead) {
}
/* If starship caused supernova, tally up destruction */
if (insx) {
- num = game.state.galaxy[nqx][nqy] % 100;
- game.state.starkl += num % 10;
- game.state.basekl += num/10;
+ game.state.starkl += game.state.galaxy[nqx][nqy].stars;
+ game.state.basekl += game.state.galaxy[nqx][nqy].starbase;
game.state.killk += kldead;
game.state.killc += comdead;
game.state.nromkl += nrmdead;
if ((quadx == nqx && quady == nqy) ||
game.damage[DRADIO] == 0 ||
condit == IHDOCKED)
- game.starch[nqx][nqy] = 1;
- game.state.galaxy[nqx][nqy] = SUPERNOVA_PLACE;
+ game.state.galaxy[nqx][nqy].supernova = TRUE;
/* If supernova destroys last klingons give special message */
if (game.state.remkl==0 && (nqx != quadx || nqy != quady)) {
skip(2);