+/*
+ * events.c -- event-queue handling
+ *
+ * This isn't a real event queue a la BSD Trek yet -- you can only have one
+ * event of each type active at any given time. Mostly these means we can
+ * only have one FDISTR/FENSLV/FREPRO sequence going at any given time;
+ * BSD Trek, from which we swiped the idea, can have up to 5.
+ */
#include "sst.h"
#include <math.h>
}
static bool cancelrest(void)
+/* rest period is interrupted by event */
{
if (game.resting) {
skip(1);
proutn(_("Mr. Spock- \"Captain, shall we cancel the rest period?\""));
- if (ja()) {
- game.resting = 0;
+ if (ja() == true) {
+ game.resting = false;
game.optime = 0.0;
return true;
}
}
void events(void)
+/* run through the event queue looking for things to do */
{
- int ictbeam=0, ipage=0, istract=0, line, i=0, j, k, l, ixhold=0, iyhold=0;
+ int istract=0, evcode, i=0, j, k, l;
double fintim = game.state.date + game.optime, datemin, xtime, repair, yank=0;
- int radio_was_broken;
+ bool radio_was_broken, ictbeam = false, ipage = false;
struct quadrant *pdest, *q;
coord w, hold;
- event *ev;
+ event *ev, *ev2;
+
+ if (idebug) {
+ prout("=== EVENTS from %.2f to %.2f:", game.state.date, fintim);
+ for (i = 1; i < NEVENTS; i++) {
+ switch (i) {
+ case FSNOVA: proutn("=== Supernova "); break;
+ case FTBEAM: proutn("=== T Beam "); break;
+ case FSNAP: proutn("=== Snapshot "); break;
+ case FBATTAK: proutn("=== Base Attack "); break;
+ case FCDBAS: proutn("=== Base Destroy "); break;
+ case FSCMOVE: proutn("=== SC Move "); break;
+ case FSCDBAS: proutn("=== SC Base Destroy "); break;
+ case FDSPROB: proutn("=== Probe Move "); break;
+ case FDISTR: proutn("=== Distress Call "); break;
+ case FENSLV: proutn("=== Enlavement "); break;
+ case FREPRO: proutn("=== Klingon Build "); break;
+ }
+ if (is_scheduled(i))
+ prout("%.2f", scheduled(i));
+ else
+ prout("never");
- if (idebug) prout("=== EVENTS");
+ }
+ }
- radio_was_broken = (game.damage[DRADIO] != 0.0);
+ radio_was_broken = damaged(DRADIO);
for (;;) {
- /* Select earliest extraneous event, line==0 if no events */
- line = FSPY;
+ /* Select earliest extraneous event, evcode==0 if no events */
+ evcode = FSPY;
if (game.alldone) return;
datemin = fintim;
for (l = 1; l < NEVENTS; l++)
if (game.future[l].date < datemin) {
- line = l;
+ evcode = l;
+ if (idebug)
+ prout("== Event %d fires", evcode);
datemin = game.future[l].date;
}
xtime = datemin-game.state.date;
finish(FDEPLETE);
return;
}
+ /* Any crew left alive? */
+ if (game.state.crew <=0) {
+ finish(FCREW);
+ return;
+ }
/* Is life support adequate? */
- if (game.damage[DLIFSUP] && game.condit != IHDOCKED) {
+ if (damaged(DLIFSUP) && game.condit != IHDOCKED) {
if (game.lsupres < xtime && game.damage[DLIFSUP] > game.lsupres) {
finish(FLIFESUP);
return;
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 (radio_was_broken && game.damage[DRADIO] == 0.0) {
+ if (radio_was_broken && !damaged(DRADIO)) {
prout(_("Lt. Uhura- \"Captain, the sub-space radio is working and"));
prout(_(" surveillance reports are coming in."));
skip(1);
if (game.iseenit==0) {
- attakreport(0);
+ attakreport(false);
game.iseenit = 1;
}
rechart();
prout(_(" The star chart is now up to date.\""));
skip(1);
}
- /* Cause extraneous event LINE to occur */
+ /* Cause extraneous event EVCODE to occur */
game.optime -= xtime;
- switch (line) {
+ switch (evcode) {
case FSNOVA: /* Supernova */
- if (ipage==0) pause_game(1);
- ipage=1;
+ if (!ipage) pause_game(1);
+ ipage=true;
snova(0,0);
schedule(FSNOVA, expran(0.5*game.intime));
if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) return;
game.condit==IHDOCKED || game.isatb==1 || game.iscate==1) return;
if (game.ientesc ||
(game.energy < 2000 && game.torps < 4 && game.shield < 1250) ||
- (game.damage[DPHASER]>0 && (game.damage[DPHOTON]>0 || game.torps < 4)) ||
- (game.damage[DSHIELD] > 0 &&
- (game.energy < 2500 || game.damage[DPHASER] > 0) &&
- (game.torps < 5 || game.damage[DPHOTON] > 0))) {
+ (damaged(DPHASER) && (damaged(DPHOTON) || game.torps < 4)) ||
+ (damaged(DSHIELD) &&
+ (game.energy < 2500 || damaged(DPHASER)) &&
+ (game.torps < 5 || damaged(DPHOTON)))) {
/* Tractor-beam her! */
istract=1;
yank = square(game.state.kscmdr.x-game.quadrant.x) + square(game.state.kscmdr.y-game.quadrant.y);
}
else return;
case FTBEAM: /* Tractor beam */
- if (line==FTBEAM) {
+ if (evcode==FTBEAM) {
if (game.state.remcom == 0) {
unschedule(FTBEAM);
break;
}
/* tractor beaming cases merge here */
yank = sqrt(yank);
- if (ipage==0) pause_game(1);
- ipage=1;
+ if (!ipage) pause_game(1);
+ ipage=true;
game.optime = (10.0/(7.5*7.5))*yank; /* 7.5 is yank rate (warp 7.5) */
ictbeam = 1;
skip(1);
crmshp();
prout(_(" caught in long range tractor beam--"));
/* If Kirk & Co. screwing around on planet, handle */
- atover(1); /* atover(1) is Grab */
+ atover(true); /* atover(true) is Grab */
if (game.alldone) return;
if (game.icraft == 1) { /* Caught in Galileo? */
finish(FSTRACTOR);
prout(_("Galileo, left on the planet surface, is well hidden."));
}
}
- if (line==0) {
- game.quadrant.x = game.state.kscmdr.x;
- game.quadrant.y = game.state.kscmdr.y;
- }
- else {
- game.quadrant.x = game.state.kcmdr[i].x;
- game.quadrant.y = game.state.kcmdr[i].y;
- }
+ if (evcode==0)
+ game.quadrant = game.state.kscmdr;
+ else
+ game.quadrant = game.state.kcmdr[i];
iran(QUADSIZE, &game.sector.x, &game.sector.y);
crmshp();
proutn(_(" is pulled to "));
prout(cramlc(sector, game.sector));
if (game.resting) {
prout(_("(Remainder of rest/repair period cancelled.)"));
- game.resting = 0;
+ game.resting = false;
}
- if (game.shldup==0) {
- if (game.damage[DSHIELD]==0 && game.shield > 0) {
+ if (!game.shldup) {
+ if (!damaged(DSHIELD) && game.shield > 0) {
doshield(2); /* Shldsup */
game.shldchg=0;
}
else prout(_("(Shields not currently useable.)"));
}
- newqad(0);
+ newqad(false);
/* Adjust finish time to time of tractor beaming */
fintim = game.state.date+game.optime;
attack(0);
i = 0;
for_starbases(j) {
for_commanders(k)
- if (game.state.baseq[j].x==game.state.kcmdr[k].x && game.state.baseq[j].y==game.state.kcmdr[k].y &&
- (game.state.baseq[j].x!=game.quadrant.x || game.state.baseq[j].y!=game.quadrant.y) &&
- (game.state.baseq[j].x!=game.state.kscmdr.x || game.state.baseq[j].y!=game.state.kscmdr.y)) {
+ if (same(game.state.baseq[j], game.state.kcmdr[k]) &&
+ !same(game.state.baseq[j], game.quadrant) &&
+ !same(game.state.baseq[j], game.state.kscmdr)) {
i = 1;
break;
}
break;
}
/* commander + starbase combination found -- launch attack */
- game.battle.x = game.state.baseq[j].x;
- game.battle.y = game.state.baseq[j].y;
+ game.battle = game.state.baseq[j];
schedule(FCDBAS, 1.0+3.0*Rand());
if (game.isatb) /* extra time if SC already attacking */
postpone(FCDBAS, scheduled(FSCDBAS)-game.state.date);
game.future[FBATTAK].date = game.future[FCDBAS].date + expran(0.3*game.intime);
game.iseenit = 0;
- if (game.damage[DRADIO] != 0.0 && game.condit != IHDOCKED)
+ if (!damaged(DRADIO) && game.condit != IHDOCKED)
break; /* No warning :-( */
game.iseenit = 1;
- if (ipage==0) pause_game(1);
- ipage = 1;
+ if (!ipage) pause_game(1);
+ ipage = true;
skip(1);
proutn(_("Lt. Uhura- \"Captain, the starbase in "));
prout(cramlc(quadrant, game.battle));
game.isatb = 2;
if (!game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].starbase)
break; /* WAS RETURN! */
- ixhold = game.battle.x;
- iyhold = game.battle.y;
- game.battle.x = game.state.kscmdr.x;
- game.battle.y = game.state.kscmdr.y;
+ hold = game.battle;
+ game.battle = game.state.kscmdr;
+ /* FALL THROUGH */
case FCDBAS: /* Commander succeeds in destroying base */
- if (line==FCDBAS) {
+ if (evcode==FCDBAS) {
unschedule(FCDBAS);
/* find the lucky pair */
for_commanders(i)
- if (game.state.kcmdr[i].x==game.battle.x && game.state.kcmdr[i].y==game.battle.y)
+ if (same(game.state.kcmdr[i], game.battle))
break;
if (i > game.state.remcom || game.state.rembase == 0 ||
!game.state.galaxy[game.battle.x][game.battle.y].starbase) {
/* Code merges here for any commander destroying base */
/* Not perfect, but will have to do */
/* Handle case where base is in same quadrant as starship */
- if (game.battle.x==game.quadrant.x && game.battle.y==game.quadrant.y) {
+ if (same(game.battle, game.quadrant)) {
game.state.chart[game.battle.x][game.battle.y].starbase = false;
game.quad[game.base.x][game.base.y] = IHDOT;
game.base.x=game.base.y=0;
prout(_("Spock- \"Captain, I believe the starbase has been destroyed.\""));
}
else if (game.state.rembase != 1 &&
- (game.damage[DRADIO] <= 0.0 || game.condit == IHDOCKED)) {
+ (!damaged(DRADIO) || game.condit == IHDOCKED)) {
/* Get word via subspace radio */
- if (ipage==0) pause_game(1);
- ipage = 1;
+ if (!ipage) pause_game(1);
+ ipage = true;
skip(1);
prout(_("Lt. Uhura- \"Captain, Starfleet Command reports that"));
proutn(_(" the starbase in "));
/* Remove Starbase from galaxy */
game.state.galaxy[game.battle.x][game.battle.y].starbase = false;
for_starbases(i)
- if (game.state.baseq[i].x==game.battle.x && game.state.baseq[i].y==game.battle.y) {
- game.state.baseq[i].x=game.state.baseq[game.state.rembase].x;
- game.state.baseq[i].y=game.state.baseq[game.state.rembase].y;
- }
+ if (same(game.state.baseq[i], game.battle))
+ game.state.baseq[i] = game.state.baseq[game.state.rembase];
game.state.rembase--;
if (game.isatb == 2) {
/* reinstate a commander's base attack */
- game.battle.x = ixhold;
- game.battle.y = iyhold;
+ game.battle = hold;
game.isatb = 0;
}
else {
if (!VALID_QUADRANT(i, j) ||
game.state.galaxy[game.probec.x][game.probec.y].supernova) {
// Left galaxy or ran into supernova
- if (game.damage[DRADIO]==0.0 || game.condit == IHDOCKED) {
+ if (!damaged(DRADIO) || game.condit == IHDOCKED) {
if (ipage==0) pause_game(1);
ipage = 1;
skip(1);
unschedule(FDSPROB);
break;
}
- if (game.damage[DRADIO]==0.0 || game.condit == IHDOCKED) {
+ if (!damaged(DRADIO) || game.condit == IHDOCKED) {
if (ipage==0) pause_game(1);
ipage = 1;
skip(1);
pdest = &game.state.galaxy[game.probec.x][game.probec.y];
/* Update star chart if Radio is working or have access to
radio. */
- if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED) {
+ if (!damaged(DRADIO) || game.condit == IHDOCKED) {
struct page *chp = &game.state.chart[game.probec.x][game.probec.y];
chp->klingons = pdest->klingons;
}
break;
case FDISTR: /* inhabited system issues distress call */
- schedule(FDISTR, expran(0.5*game.intime));
+ unschedule(FDISTR);
/* try a whole bunch of times to find something suitable */
- for (i = 0; i < 100; i++) {
- iran(GALSIZE, &w.x, &w.y);
- q = &game.state.galaxy[game.quadrant.x][game.quadrant.y];
+ i = 100;
+ do {
/* need a quadrant which is not the current one,
which has some stars which are inhabited and
not already under attack, which is not
supernova'ed, and which has some Klingons in it */
- if (!(same(game.quadrant, w) || q->stars<=0 ||
- q->supernova || q->status != secure || q->klingons <= 0))
- break;
- }
- if (i >= 100)
+ iran(GALSIZE, &w.x, &w.y);
+ q = &game.state.galaxy[w.x][w.y];
+ } while (--i &&
+ (same(game.quadrant, w) || q->planet == NOPLANET ||
+ q->supernova || q->status!=secure || q->klingons<=0));
+ if (i == 0) {
/* can't seem to find one; ignore this call */
+ if (idebug)
+ prout("=== Couldn't find location for distress event.");
break;
+ }
/* got one!! Schedule its enslavement */
ev = schedule(FENSLV, expran(game.intime));
q->status = distressed;
/* tell the captain about it if we can */
- if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED)
+ if (!damaged(DRADIO) || game.condit == IHDOCKED)
{
- prout("Uhura: Captain, starsystem %s in quadrant %d - %d is under attack.",
- systemname(q->planet), w.x, w.y);
+ prout("Uhura- Captain, %s in %s reports it is under attack",
+ systemname(q->planet), cramlc(quadrant, w));
+ prout("by a Klingon invasion fleet.");
if (cancelrest())
return;
}
break;
- case FENSLV: /* starsystem is enslaved */
+ case FENSLV: /* starsystem is enslaved */
ev = unschedule(FENSLV);
/* see if current distress call still active */
q = &game.state.galaxy[ev->quadrant.x][ev->quadrant.y];
q->status = enslaved;
/* play stork and schedule the first baby */
- ev = schedule(FREPRO, expran(2.0 * game.intime));
+ ev2 = schedule(FREPRO, expran(2.0 * game.intime));
+ ev2->quadrant = ev->quadrant;
/* report the disaster if we can */
- if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED)
+ if (!damaged(DRADIO) || game.condit == IHDOCKED)
{
- prout("\nUhura: We've lost contact with starsystem %s\n",
+ prout("Uhura- We've lost contact with starsystem %s",
systemname(q->planet));
- prout(" in quadrant %d,%d.\n", ev->quadrant.x,ev->quadrant.y);
+ prout("in %s.\n", cramlc(quadrant, ev->quadrant));
}
- case FREPRO: /* Klingon reproduces */
+ break;
+ case FREPRO: /* Klingon reproduces */
+ /*
+ * If we ever switch to a real event queue, we'll need to
+ * explicitly retrieve and restore the x and y.
+ */
ev = schedule(FREPRO, expran(1.0 * game.intime));
/* see if current distress call still active */
q = &game.state.galaxy[ev->quadrant.x][ev->quadrant.y];
q->status = secure;
break;
}
- /* reproduce one Klingon */
- w = ev->quadrant;
if (game.state.remkl >=MAXKLGAME)
break; /* full right now */
- /* this quadrant not ok, pick an adjacent one */
- for (i = w.x - 1; i <= w.x + 1; i++)
- {
- for (j = w.y - 1; j <= w.y + 1; j++)
+ /* reproduce one Klingon */
+ w = ev->quadrant;
+ if (game.klhere >= MAXKLQUAD) {
+ /* this quadrant not ok, pick an adjacent one */
+ for (i = w.x - 1; i <= w.x + 1; i++)
{
- if (!VALID_QUADRANT(i, j))
- continue;
- q = &game.state.galaxy[w.x][w.y];
- /* check for this quad ok (not full & no snova) */
- if (q->klingons >= MAXKLQUAD || q->stars < 0)
- continue;
- goto foundit;
+ for (j = w.y - 1; j <= w.y + 1; j++)
+ {
+ if (!VALID_QUADRANT(i, j))
+ continue;
+ q = &game.state.galaxy[w.x][w.y];
+ /* check for this quad ok (not full & no snova) */
+ if (q->klingons >= MAXKLQUAD || q->supernova)
+ continue;
+ goto foundit;
+ }
}
+ break; /* search for eligible quadrant failed */
+ foundit:
+ w.x = i;
+ w.y = j;
}
- break; /* search for eligible quadrant failed */
- foundit:
- w.x = i;
- w.y = j;
/* deliver the child */
game.state.remkl++;
+ q->klingons++;
if (same(game.quadrant, w))
newkling(++game.klhere, &hold);
/* recompute time left */
game.state.remtime = game.state.remres/(game.state.remkl+4*game.state.remcom);
+ /* report the disaster if we can */
+ if (!damaged(DRADIO) || game.condit == IHDOCKED)
+ {
+ if (same(game.quadrant, w)) {
+ prout("Spock- sensors indicate the Klingons have");
+ prout("launched a warship from %s.",systemname(q->planet));
+ } else {
+ prout("Uhura- Starfleet reports increased Klingon activity");
+ if (q->planet != NOPLANET)
+ proutn("near %s", systemname(q->planet));
+ prout("in %s.\n", cramlc(quadrant, w));
+ }
+ }
break;
}
}
void wait(void)
+/* wait on events */
{
int key;
double temp, delay, origTime;
- game.ididit = 0;
+ game.ididit = false;
for (;;) {
key = scan();
if (key != IHEOL) break;
if (delay <= 0.0) return;
if (delay >= game.state.remtime || game.nenhere != 0) {
proutn(_("Are you sure? "));
- if (ja() == 0) return;
+ if (ja() == false) return;
}
/* Alternate resting periods (events) with attacks */
- game.resting = 1;
+ game.resting = true;
do {
- if (delay <= 0) game.resting = 0;
- if (game.resting == 0) {
+ if (delay <= 0) game.resting = false;
+ if (!game.resting) {
prout(_("%d stardates left."), (int)game.state.remtime);
return;
}
if (game.optime < delay) attack(0);
if (game.alldone) return;
events();
- game.ididit = 1;
+ game.ididit = true;
if (game.alldone) return;
delay -= temp;
/* Repair Deathray if long rest at starbase */
// leave if quadrant supernovas
(!game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova);
- game.resting = 0;
+ game.resting = false;
game.optime = 0;
}
void nova(int ix, int iy)
+/* star goes nova */
{
static double course[] =
{0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5};
/* handle initial nova */
game.quad[ix][iy] = IHDOT;
- crmena(1, IHSTAR, 2, nov);
+ crmena(false, IHSTAR, sector, nov);
prout(_(" novas."));
game.state.galaxy[game.quadrant.x][game.quadrant.y].stars--;
game.state.starkl++;
hits[top2][2]=scratch.y;
game.state.galaxy[game.quadrant.x][game.quadrant.y].stars -= 1;
game.state.starkl++;
- crmena(1, IHSTAR, 2, scratch);
+ crmena(true, IHSTAR, sector, scratch);
prout(_(" novas."));
game.quad[scratch.x][scratch.y] = IHDOT;
break;
case IHP: /* Destroy planet */
game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = NOPLANET;
game.state.nplankl++;
- crmena(1, IHP, 2, scratch);
+ crmena(true, IHP, sector, scratch);
prout(_(" destroyed."));
DESTROY(&game.state.plnets[game.iplnet]);
game.iplnet = game.plnet.x = game.plnet.y = 0;
game.base.x = game.base.y = 0;
game.state.basekl++;
newcnd();
- crmena(1, IHB, 2, scratch);
+ crmena(true, IHB, sector, scratch);
prout(_(" destroyed."));
game.quad[scratch.x][scratch.y] = IHDOT;
break;
double diff = 2000.0 - game.shield;
game.energy -= diff;
game.shield = 0.0;
- game.shldup = 0;
+ game.shldup = false;
prout(_("***Shields knocked out."));
game.damage[DSHIELD] += 0.005*game.damfac*Rand()*diff;
}
}
newc.x = scratch.x + scratch.x - hits[mm][1];
newc.y = scratch.y + scratch.y - hits[mm][2];
- crmena(1, iquad, 2, scratch);
+ crmena(true, iquad, sector, scratch);
proutn(_(" damaged"));
if (!VALID_SECTOR(newc.x, newc.y)) {
/* can't leave quadrant */
iquad1 = game.quad[newc.x][newc.y];
if (iquad1 == IHBLANK) {
proutn(_(", blasted into "));
- crmena(0, IHBLANK, 2, newc);
+ crmena(false, IHBLANK, sector, newc);
skip(1);
deadkl(scratch, iquad, newc.x, newc.y);
break;
void snova(int insx, int insy)
+/* star goes supernova */
{
int comdead, nsx, nsy, num=0, kldead, iscdead;
int nrmdead, npdead;
- int incipient=0;
+ bool incipient = false;
coord nq;
nq.x = nq.y = 0;
}
if (idebug) {
proutn("=== Super nova here?");
- if (ja()==1) {
+ if (ja() == true) {
nq.x = game.quadrant.x;
nq.y = game.quadrant.y;
}
if (nq.x != game.quadrant.y || nq.y != game.quadrant.y || game.justin != 0) {
/* it isn't here, or we just entered (treat as inroute) */
- if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED) {
+ if (!damaged(DRADIO) || game.condit == IHDOCKED) {
skip(1);
prout(_("Message from Starfleet Command Stardate %.2f"), game.state.date);
prout(_(" Supernova in %s; caution advised."),
}
else {
/* we are in the quadrant! */
- incipient = 1;
+ incipient = true;
num = Rand()* game.state.galaxy[nq.x][nq.y].stars + 1;
for_sectors(nsx) {
for_sectors(nsy) {
}
}
else {
- incipient = 1;
+ incipient = true;
}
if (incipient) {
game.state.nromrem -= nrmdead;
npdead = num - nrmdead*10;
if (npdead) {
- int l;
- for (l = 0; l < game.inplan; l++)
- if (same(game.state.plnets[l].w, nq)) {
- DESTROY(&game.state.plnets[l]);
+ int loop;
+ for (loop = 0; loop < game.inplan; loop++)
+ if (same(game.state.plnets[loop].w, nq)) {
+ DESTROY(&game.state.plnets[loop]);
}
}
/* Destroy any base in supernovaed quadrant */
if (game.state.rembase) {
- int maxloop = game.state.rembase, l;
- for (l = 1; l <= maxloop; l++)
- if (same(game.state.baseq[l], nq)) {
- game.state.baseq[l] = game.state.baseq[game.state.rembase];
+ int maxloop = game.state.rembase, loop;
+ for (loop = 1; loop <= maxloop; loop++)
+ if (same(game.state.baseq[loop], nq)) {
+ game.state.baseq[loop] = game.state.baseq[game.state.rembase];
game.state.baseq[game.state.rembase].x = game.state.baseq[game.state.rembase].y = 0;
game.state.rembase--;
break;
game.state.nplankl += npdead;
}
/* mark supernova in galaxy and in star chart */
- if ((game.quadrant.x == nq.x && game.quadrant.y == nq.y) ||
- game.damage[DRADIO] == 0 ||
- game.condit == IHDOCKED)
+ if (same(game.quadrant, nq) || !damaged(DRADIO) || game.condit == IHDOCKED)
game.state.galaxy[nq.x][nq.y].supernova = true;
- /* If supernova destroys last klingons give special message */
- if (KLINGREM==0 && (nq.x != game.quadrant.x || nq.y != game.quadrant.y)) {
+ /* If supernova destroys last Klingons give special message */
+ if (KLINGREM==0 && !same(nq, game.quadrant)) {
skip(2);
if (insx == 0) prout(_("Lucky you!"));
proutn(_("A supernova in %s has just destroyed the last Klingons."),