X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fevents.c;h=95a3c44517c1e37650a296e2321a4dec87c1f765;hp=7d4392109697e2fdcf6ab88b1b1ecf3be2d601ca;hb=ad1478c7cc24b761592a1e355015b44b243aeeda;hpb=dc45b3ccf42344c238ddb146d79dc62086624848 diff --git a/src/events.c b/src/events.c index 7d43921..95a3c44 100644 --- a/src/events.c +++ b/src/events.c @@ -1,3 +1,11 @@ +/* + * 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 @@ -34,11 +42,12 @@ void postpone(int evtype, double offset) } 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()) { + if (ja() == true) { game.resting = false; game.optime = 0.0; return true; @@ -49,13 +58,14 @@ static bool cancelrest(void) } 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 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, istract = 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); @@ -81,18 +91,18 @@ void events(void) } } - 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", line); + prout("== Event %d fires", evcode); datemin = game.future[l].date; } xtime = datemin-game.state.date; @@ -104,8 +114,13 @@ void events(void) 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; @@ -121,46 +136,46 @@ void events(void) 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; - snova(0,0); + if (!ipage) pause_game(1); + ipage=true; + snova(false, NULL); schedule(FSNOVA, expran(0.5*game.intime)); if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) return; break; case FSPY: /* Check with spy to see if S.C. should tractor beam */ if (game.state.nscrem == 0 || - ictbeam+istract > 0 || + ictbeam || istract || 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; + istract = true; yank = square(game.state.kscmdr.x-game.quadrant.x) + square(game.state.kscmdr.y-game.quadrant.y); /********* fall through to FTBEAM code ***********/ } else return; case FTBEAM: /* Tractor beam */ - if (line==FTBEAM) { + if (evcode==FTBEAM) { if (game.state.remcom == 0) { unschedule(FTBEAM); break; @@ -176,8 +191,8 @@ void events(void) } /* 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); @@ -185,9 +200,9 @@ void events(void) 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? */ + if (game.icraft) { /* Caught in Galileo? */ finish(FSTRACTOR); return; } @@ -204,7 +219,7 @@ void events(void) prout(_("Galileo, left on the planet surface, is well hidden.")); } } - if (line==0) + if (evcode==0) game.quadrant = game.state.kscmdr; else game.quadrant = game.state.kcmdr[i]; @@ -219,13 +234,13 @@ void events(void) game.resting = false; } if (!game.shldup) { - if (game.damage[DSHIELD]==0 && game.shield > 0) { + 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); @@ -268,11 +283,11 @@ void events(void) 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)); @@ -288,12 +303,11 @@ void events(void) 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; + 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) @@ -318,10 +332,10 @@ void events(void) 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 ")); @@ -340,8 +354,7 @@ void events(void) 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 { @@ -350,9 +363,9 @@ void events(void) break; case FSCMOVE: /* Supercommander moves */ schedule(FSCMOVE, 0.2777); - if (game.ientesc+istract==0 && - game.isatb != 1 && - (game.iscate != 1 || !game.justin)) scom(&ipage); + if (!game.ientesc && !istract && game.isatb != 1 && + (game.iscate != 1 || !game.justin)) + scom(&ipage); break; case FDSPROB: /* Move deep space probe */ schedule(FDSPROB, 0.01); @@ -366,7 +379,7 @@ void events(void) 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); @@ -380,7 +393,7 @@ void events(void) 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); @@ -392,7 +405,7 @@ void events(void) 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; @@ -403,14 +416,14 @@ void events(void) game.proben--; // One less to travel if (game.proben == 0 && game.isarmed && pdest->stars) { /* lets blow the sucker! */ - snova(1,0); + snova(true, &game.probec); unschedule(FDSPROB); if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) return; } 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 */ i = 100; do { @@ -434,19 +447,18 @@ void events(void) ev = schedule(FENSLV, expran(game.intime)); ev->quadrant = w; q->status = distressed; - if (idebug) - prout("=== Distress call set at %d, %d.", w.x, w.y); /* 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]; @@ -457,17 +469,22 @@ void events(void) 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)); } break; - case FREPRO: /* Klingon reproduces */ + 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]; @@ -475,28 +492,30 @@ void events(void) 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->supernova) - 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++; @@ -506,6 +525,19 @@ void events(void) /* 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; } } @@ -513,11 +545,12 @@ void events(void) 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; @@ -532,7 +565,7 @@ void wait(void) 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 */ @@ -554,7 +587,7 @@ void wait(void) 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 */ @@ -568,24 +601,24 @@ void wait(void) game.optime = 0; } -void nova(int ix, int iy) +void nova(coord nov) +/* 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}; int bot, top, top2, hits[QUADSIZE+1][3], kount, icx, icy, mm, nn, j; int iquad, iquad1, i, ll; - coord newc, nov, scratch; + coord newc, scratch; - nov.x = ix; nov.y = iy; if (Rand() < 0.05) { /* Wow! We've supernova'ed */ - snova(ix, iy); + snova(false, &nov); return; } /* handle initial nova */ - game.quad[ix][iy] = IHDOT; - crmena(1, IHSTAR, 2, nov); + game.quad[nov.x][nov.y] = IHDOT; + crmena(false, IHSTAR, sector, nov); prout(_(" novas.")); game.state.galaxy[game.quadrant.x][game.quadrant.y].stars--; game.state.starkl++; @@ -594,8 +627,8 @@ void nova(int ix, int iy) bot = top = top2 = 1; kount = 0; icx = icy = 0; - hits[1][1] = ix; - hits[1][2] = iy; + hits[1][1] = nov.x; + hits[1][2] = nov.y; while (1) { for (mm = bot; mm <= top; mm++) for (nn = 1; nn <= 3; nn++) /* nn,j represents coordinates around current */ @@ -616,7 +649,7 @@ void nova(int ix, int iy) case IHSTAR: /* Affect another star */ if (Rand() < 0.05) { /* This star supernovas */ - snova(scratch.x,scratch.y); + snova(false, &scratch); return; } top2++; @@ -624,14 +657,14 @@ void nova(int ix, int iy) 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; @@ -644,14 +677,14 @@ void nova(int ix, int iy) case IHB: /* Destroy base */ game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase = false; for_starbases(i) - if (game.state.baseq[i].x==game.quadrant.x && game.state.baseq[i].y==game.quadrant.y) + if (same(game.state.baseq[i], game.quadrant)) break; game.state.baseq[i] = game.state.baseq[game.state.rembase]; game.state.rembase--; 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; @@ -686,7 +719,7 @@ void nova(int ix, int iy) case IHS: case IHR: for_local_enemies(ll) - if (game.ks[ll].x==scratch.x && game.ks[ll].y==scratch.y) break; + if (same(game.ks[ll], scratch)) break; game.kpower[ll] -= 800.0; /* If firepower is lost, die */ if (game.kpower[ll] <= 0.0) { deadkl(scratch, iquad, scratch.x, scratch.y); @@ -694,7 +727,7 @@ void nova(int ix, int iy) } 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 */ @@ -704,7 +737,7 @@ void nova(int ix, int iy) 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; @@ -718,8 +751,7 @@ void nova(int ix, int iy) proutn(cramlc(sector, newc)); game.quad[scratch.x][scratch.y] = IHDOT; game.quad[newc.x][newc.y] = iquad; - game.ks[ll].x = newc.x; - game.ks[ll].y = newc.y; + game.ks[ll] = newc; game.kavgd[ll] = sqrt(square(game.sector.x-newc.x)+square(game.sector.y-newc.y)); game.kdist[ll] = game.kavgd[ll]; skip(1); @@ -751,86 +783,68 @@ void nova(int ix, int iy) } -void snova(int insx, int insy) +void snova(bool induced, coord *w) +/* star goes supernova */ { - int comdead, nsx, nsy, num=0, kldead, iscdead; - int nrmdead, npdead; - int incipient=0; + int num = 0, nrmdead, npdead, kldead; coord nq; - nq.x = nq.y = 0; - nsx = insy; - nsy = insy; - - if (insy== 0) { - if (insx == 1) - /* NOVAMAX being used */ - nq = game.probec; - else { - int stars = 0; - /* Scheduled supernova -- select star */ - /* logic changed here so that we won't favor quadrants in top - left of universe */ - for_quadrants(nq.x) { - for_quadrants(nq.y) { - stars += game.state.galaxy[nq.x][nq.y].stars; - } - } - if (stars == 0) return; /* nothing to supernova exists */ - num = Rand()*stars + 1; - for_quadrants(nq.x) { - for_quadrants(nq.y) { - num -= game.state.galaxy[nq.x][nq.y].stars; - if (num <= 0) break; - } - if (num <=0) break; - } - if (idebug) { - proutn("=== Super nova here?"); - if (ja()==1) { - nq.x = game.quadrant.x; - nq.y = game.quadrant.y; - } + if (w != NULL) + nq = *w; + else { + int stars = 0; + /* Scheduled supernova -- select star */ + /* logic changed here so that we won't favor quadrants in top + left of universe */ + for_quadrants(nq.x) { + for_quadrants(nq.y) { + stars += game.state.galaxy[nq.x][nq.y].stars; } } + if (stars == 0) return; /* nothing to supernova exists */ + num = Rand()*stars + 1; + for_quadrants(nq.x) { + for_quadrants(nq.y) { + num -= game.state.galaxy[nq.x][nq.y].stars; + if (num <= 0) break; + } + if (num <=0) break; + } + if (idebug) { + proutn("=== Super nova here?"); + if (ja() == true) + nq = game.quadrant; + } + } - 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) { - skip(1); - prout(_("Message from Starfleet Command Stardate %.2f"), game.state.date); - prout(_(" Supernova in %s; caution advised."), - cramlc(quadrant, nq)); - } + if (!same(nq, game.quadrant) || game.justin) { + /* it isn't here, or we just entered (treat as enroute) */ + if (!damaged(DRADIO) || game.condit == IHDOCKED) { + skip(1); + prout(_("Message from Starfleet Command Stardate %.2f"), game.state.date); + prout(_(" Supernova in %s; caution advised."), + cramlc(quadrant, nq)); } - else { - /* we are in the quadrant! */ - incipient = 1; - num = Rand()* game.state.galaxy[nq.x][nq.y].stars + 1; - for_sectors(nsx) { - for_sectors(nsy) { - if (game.quad[nsx][nsy]==IHSTAR) { - num--; - if (num==0) break; - } + } + else { + coord ns; + /* we are in the quadrant! */ + num = Rand()* game.state.galaxy[nq.x][nq.y].stars + 1; + for_sectors(ns.x) { + for_sectors(ns.y) { + if (game.quad[ns.x][ns.y]==IHSTAR) { + num--; + if (num==0) break; } - if (num==0) break; } + if (num==0) break; } - } - else { - incipient = 1; - } - if (incipient) { - coord nd; skip(1); prouts(_("***RED ALERT! RED ALERT!")); skip(1); - nd.x = nsx; nd.y = nsy; - prout(_("***Incipient supernova detected at "), cramlc(sector, nd)); - nq = game.quadrant; - if (square(nsx-game.sector.x) + square(nsy-game.sector.y) <= 2.1) { + prout(_("***Incipient supernova detected at "), cramlc(sector, ns)); + if (square(ns.x-game.sector.x) + square(ns.y-game.sector.y) <= 2.1) { proutn(_("Emergency override attempts t")); prouts("***************"); skip(1); @@ -838,14 +852,13 @@ void snova(int insx, int insy) game.alldone=1; } } + /* destroy any Klingons in supernovaed quadrant */ kldead = game.state.galaxy[nq.x][nq.y].klingons; game.state.galaxy[nq.x][nq.y].klingons = 0; - comdead = iscdead = 0; if (same(nq, game.state.kscmdr)) { /* did in the Supercommander! */ game.state.nscrem = game.state.kscmdr.x = game.state.kscmdr.y = game.isatb = game.iscate = 0; - iscdead = 1; unschedule(FSCMOVE); unschedule(FSCDBAS); } @@ -857,7 +870,6 @@ void snova(int insx, int insy) game.state.kcmdr[game.state.remcom].x = game.state.kcmdr[game.state.remcom].y = 0; game.state.remcom--; kldead--; - comdead++; if (game.state.remcom==0) unschedule(FTBEAM); break; } @@ -870,38 +882,36 @@ void snova(int insx, int insy) 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; } } /* If starship caused supernova, tally up destruction */ - if (insx) { + if (induced) { game.state.starkl += game.state.galaxy[nq.x][nq.y].stars; game.state.basekl += game.state.galaxy[nq.x][nq.y].starbase; 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!")); + if (!induced) prout(_("Lucky you!")); proutn(_("A supernova in %s has just destroyed the last Klingons."), cramlc(quadrant, nq)); finish(FWON); @@ -911,5 +921,3 @@ void snova(int insx, int insy) if (game.alldone) finish(FSNOVAED); return; } - -