X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fevents.c;h=3362fddf818368d526d4ceb6372207c797ac8502;hp=1e04dd0e2c8f3e09bf6465194be75b352ff2dc9f;hb=c873e794bf5a029fef3a5ee5385cc0fec6220fa0;hpb=093f7d420e9cf92fbaf751f57a199c56562ae4b5 diff --git a/src/events.c b/src/events.c index 1e04dd0..3362fdd 100644 --- a/src/events.c +++ b/src/events.c @@ -22,7 +22,7 @@ int is_scheduled(int evtype) return game.future[evtype].date != FOREVER; } -extern double scheduled(int evtype) +double scheduled(int evtype) /* when will this event happen? */ { return game.future[evtype].date; @@ -36,7 +36,7 @@ event *schedule(int evtype, double offset) } void postpone(int evtype, double offset) -/* poistpone a scheduled event */ +/* postpone a scheduled event */ { game.future[evtype].date += offset; } @@ -62,10 +62,11 @@ void events(void) { int evcode, i=0, j, k, l; double fintim = game.state.date + game.optime, datemin, xtime, repair, yank=0; - bool radio_was_broken, ictbeam = false, ipage = false, istract = false; + bool ictbeam = false, istract = false; struct quadrant *pdest, *q; coord w, hold; event *ev, *ev2; + bool fixed_dev[NDEVICES]; if (idebug) { prout("=== EVENTS from %.2f to %.2f:", game.state.date, fintim); @@ -80,7 +81,7 @@ void events(void) 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 FENSLV: proutn("=== Enslavement "); break; case FREPRO: proutn("=== Klingon Build "); break; } if (is_scheduled(i)) @@ -91,13 +92,12 @@ void events(void) } } - radio_was_broken = damaged(DRADIO); - hold.x = hold.y = 0; for (;;) { /* Select earliest extraneous event, evcode==0 if no events */ evcode = FSPY; - if (game.alldone) return; + if (game.alldone) + return; datemin = fintim; for (l = 1; l < NEVENTS; l++) if (game.future[l].date < datemin) { @@ -110,7 +110,8 @@ void events(void) game.state.date = datemin; /* Decrement Federation resources and recompute remaining time */ game.state.remres -= (game.state.remkl+4*game.state.remcom)*xtime; - game.state.remtime = game.state.remres/(game.state.remkl+4*game.state.remcom); + game.state.remtime = game.state.remkl + game.state.remcom > 0 ? + game.state.remres/(game.state.remkl + 4*game.state.remcom) : 99; if (game.state.remtime <=0) { finish(FDEPLETE); return; @@ -121,48 +122,59 @@ void events(void) return; } /* Is life support adequate? */ - if (damaged(DLIFSUP) && game.condit != IHDOCKED) { + if (damaged(DLIFSUP) && game.condition != docked) { if (game.lsupres < xtime && game.damage[DLIFSUP] > game.lsupres) { finish(FLIFESUP); return; } game.lsupres -= xtime; - if (game.damage[DLIFSUP] <= xtime) game.lsupres = game.inlsr; + if (game.damage[DLIFSUP] <= xtime) + game.lsupres = game.inlsr; } /* Fix devices */ repair = xtime; - if (game.condit == IHDOCKED) repair /= game.docfac; + if (game.condition == docked) + repair /= game.docfac; /* Don't fix Deathray here */ - for (l=0; l 0.0 && l != DDRAY) - game.damage[l] -= (game.damage[l]-repair > 0.0 ? repair : game.damage[l]); + for (l=0; l 0.0 && l != DDRAY) { + double reminder = (game.damage[l] > repair ? + game.damage[l] - repair : .0); + game.damage[l] = reminder; + if (!(reminder > 0)) + fixed_dev[l] = true; + } + } /* If radio repaired, update star chart and attack reports */ - if (radio_was_broken && !damaged(DRADIO)) { + if (fixed_dev[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(false); - game.iseenit = 1; + if (!game.iseenit) { + attackreport(false); + game.iseenit = true; } - rechart(); prout(_(" The star chart is now up to date.\"")); skip(1); } + if (fixed_dev[DRADIO] || fixed_dev[DLRSENS] || fixed_dev[DSRSENS]) + rechart(); /* Cause extraneous event EVCODE to occur */ game.optime -= xtime; switch (evcode) { case FSNOVA: /* Supernova */ - if (!ipage) pause_game(1); - ipage=true; - snova(false, NULL); + announce(); + supernova(false, NULL); schedule(FSNOVA, expran(0.5*game.intime)); - if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) return; + 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 || - game.condit==IHDOCKED || game.isatb==1 || game.iscate==1) return; + game.condition==docked || game.isatb==1 || game.iscate) + return; if (game.ientesc || (game.energy < 2000 && game.torps < 4 && game.shield < 1250) || (damaged(DPHASER) && (damaged(DPHOTON) || game.torps < 4)) || @@ -171,10 +183,11 @@ void events(void) (game.torps < 5 || damaged(DPHOTON)))) { /* Tractor-beam her! */ istract = true; - yank = square(game.state.kscmdr.x-game.quadrant.x) + square(game.state.kscmdr.y-game.quadrant.y); + yank = distance(game.state.kscmdr, game.quadrant); /********* fall through to FTBEAM code ***********/ } - else return; + else + return; case FTBEAM: /* Tractor beam */ if (evcode==FTBEAM) { if (game.state.remcom == 0) { @@ -183,7 +196,7 @@ void events(void) } i = Rand()*game.state.remcom+1.0; yank = square(game.state.kcmdr[i].x-game.quadrant.x) + square(game.state.kcmdr[i].y-game.quadrant.y); - if (istract || game.condit == IHDOCKED || yank == 0) { + if (istract || game.condition == docked || yank == 0) { /* Drats! Have to reschedule */ schedule(FTBEAM, game.optime + expran(1.5*game.intime/game.state.remcom)); @@ -192,29 +205,29 @@ void events(void) } /* tractor beaming cases merge here */ yank = sqrt(yank); - if (!ipage) pause_game(1); - ipage=true; + announce(); game.optime = (10.0/(7.5*7.5))*yank; /* 7.5 is yank rate (warp 7.5) */ - ictbeam = 1; + ictbeam = true; skip(1); proutn("***"); crmshp(); prout(_(" caught in long range tractor beam--")); /* If Kirk & Co. screwing around on planet, handle */ atover(true); /* atover(true) is Grab */ - if (game.alldone) return; + if (game.alldone) + return; if (game.icraft) { /* Caught in Galileo? */ finish(FSTRACTOR); return; } /* Check to see if shuttle is aboard */ - if (game.iscraft==0) { + if (game.iscraft == offship) { skip(1); if (Rand() > 0.5) { prout(_("Galileo, left on the planet surface, is captured")); prout(_("by aliens and made into a flying McDonald's.")); game.damage[DSHUTTL] = -10; - game.iscraft = -1; + game.iscraft = removed; } else { prout(_("Galileo, left on the planet surface, is well hidden.")); @@ -224,7 +237,7 @@ void events(void) game.quadrant = game.state.kscmdr; else game.quadrant = game.state.kcmdr[i]; - game.sector = iran(QUADSIZE); + game.sector = randplace(QUADSIZE); crmshp(); proutn(_(" is pulled to ")); proutn(cramlc(quadrant, game.quadrant)); @@ -236,21 +249,24 @@ void events(void) } if (!game.shldup) { if (!damaged(DSHIELD) && game.shield > 0) { - doshield(2); /* Shldsup */ - game.shldchg=0; + doshield(true); /* raise shields */ + game.shldchg=false; } - else prout(_("(Shields not currently useable.)")); + else + prout(_("(Shields not currently useable.)")); } newqad(false); /* Adjust finish time to time of tractor beaming */ fintim = game.state.date+game.optime; - attack(0); - if (game.state.remcom <= 0) unschedule(FTBEAM); - else schedule(FTBEAM, game.optime+expran(1.5*game.intime/game.state.remcom)); + attack(false); + if (game.state.remcom <= 0) + unschedule(FTBEAM); + else + schedule(FTBEAM, game.optime+expran(1.5*game.intime/game.state.remcom)); break; case FSNAP: /* Snapshot of the universe (for time warp) */ game.snapsht = game.state; - game.state.snap = 1; + game.state.snap = true; schedule(FSNAP, expran(0.5 * game.intime)); break; case FBATTAK: /* Commander attacks starbase */ @@ -261,15 +277,16 @@ void events(void) break; } i = 0; - for_starbases(j) { - for_commanders(k) + for (j = 1; j <= game.state.rembase; j++) { + for (k = 1; k <= game.state.remcom; k++) 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; } - if (i == 1) break; + if (i == 1) + break; } if (j>game.state.rembase) { /* no match found -- try later */ @@ -283,12 +300,11 @@ void events(void) 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 (!damaged(DRADIO) && game.condit != IHDOCKED) + game.iseenit = false; + if (!damaged(DRADIO) && game.condition != docked) break; /* No warning :-( */ - game.iseenit = 1; - if (!ipage) pause_game(1); - ipage = true; + game.iseenit = true; + announce(); skip(1); proutn(_("Lt. Uhura- \"Captain, the starbase in ")); prout(cramlc(quadrant, game.battle)); @@ -311,13 +327,13 @@ void events(void) if (evcode==FCDBAS) { unschedule(FCDBAS); /* find the lucky pair */ - for_commanders(i) + for (i = 1; i <= game.state.remcom; i++) 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) { /* No action to take after all */ - game.battle.x = game.battle.y = 0; + invalidate(game.battle); break; } } @@ -333,10 +349,9 @@ void events(void) prout(_("Spock- \"Captain, I believe the starbase has been destroyed.\"")); } else if (game.state.rembase != 1 && - (!damaged(DRADIO) || game.condit == IHDOCKED)) { + (!damaged(DRADIO) || game.condition == docked)) { /* Get word via subspace radio */ - if (!ipage) pause_game(1); - ipage = true; + announce(); skip(1); prout(_("Lt. Uhura- \"Captain, Starfleet Command reports that")); proutn(_(" the starbase in ")); @@ -344,12 +359,13 @@ void events(void) prout(_(" has been destroyed by")); if (game.isatb == 2) prout(_("the Klingon Super-Commander")); - else prout(_("a Klingon Commander")); + else + prout(_("a Klingon Commander")); game.state.chart[game.battle.x][game.battle.y].starbase = false; } /* Remove Starbase from galaxy */ game.state.galaxy[game.battle.x][game.battle.y].starbase = false; - for_starbases(i) + for (i = 1; i <= game.state.rembase; i++) if (same(game.state.baseq[i], game.battle)) game.state.baseq[i] = game.state.baseq[game.state.rembase]; game.state.rembase--; @@ -358,15 +374,14 @@ void events(void) game.battle = hold; game.isatb = 0; } - else { - game.battle.x = game.battle.y = 0; - } + else + invalidate(game.battle); break; case FSCMOVE: /* Supercommander moves */ schedule(FSCMOVE, 0.2777); if (!game.ientesc && !istract && game.isatb != 1 && - (game.iscate != 1 || !game.justin)) - scom(&ipage); + (!game.iscate || !game.justin)) + supercommander(); break; case FDSPROB: /* Move deep space probe */ schedule(FDSPROB, 0.01); @@ -380,9 +395,8 @@ 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 (!damaged(DRADIO) || game.condit == IHDOCKED) { - if (ipage==0) pause_game(1); - ipage = 1; + if (!damaged(DRADIO) || game.condition == docked) { + announce(); skip(1); proutn(_("Lt. Uhura- \"The deep space probe ")); if (!VALID_QUADRANT(j, i)) @@ -394,9 +408,8 @@ void events(void) unschedule(FDSPROB); break; } - if (!damaged(DRADIO) || game.condit == IHDOCKED) { - if (ipage==0) pause_game(1); - ipage = 1; + if (!damaged(DRADIO) || game.condition == docked) { + announce(); skip(1); proutn(_("Lt. Uhura- \"The deep space probe is now in ")); proutn(cramlc(quadrant, game.probec)); @@ -406,7 +419,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 (!damaged(DRADIO) || game.condit == IHDOCKED) { + if (!damaged(DRADIO) || game.condition == docked) { struct page *chp = &game.state.chart[game.probec.x][game.probec.y]; chp->klingons = pdest->klingons; @@ -417,7 +430,7 @@ void events(void) game.proben--; // One less to travel if (game.proben == 0 && game.isarmed && pdest->stars) { /* lets blow the sucker! */ - snova(true, &game.probec); + supernova(true, &game.probec); unschedule(FDSPROB); if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) return; @@ -428,14 +441,15 @@ void events(void) /* try a whole bunch of times to find something suitable */ 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 */ - w = iran(GALSIZE); + // 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 + w = randplace(GALSIZE); q = &game.state.galaxy[w.x][w.y]; } while (--i && (same(game.quadrant, w) || q->planet == NOPLANET || + game.state.planets[q->planet].inhabited == UNINHABITED || q->supernova || q->status!=secure || q->klingons<=0)); if (i == 0) { /* can't seem to find one; ignore this call */ @@ -450,11 +464,11 @@ void events(void) q->status = distressed; /* tell the captain about it if we can */ - if (!damaged(DRADIO) || game.condit == IHDOCKED) + if (!damaged(DRADIO) || game.condition == docked) { - prout("Uhura- Captain, %s in %s reports it is under attack", - systemname(q->planet), cramlc(quadrant, w)); - prout("by a Klingon invasion fleet."); + prout(_("Uhura- Captain, %s in %s reports it is under attack"), + systnames[q->planet], cramlc(quadrant, w)); + prout(_("by a Klingon invasion fleet.")); if (cancelrest()) return; } @@ -474,18 +488,16 @@ void events(void) ev2->quadrant = ev->quadrant; /* report the disaster if we can */ - if (!damaged(DRADIO) || game.condit == IHDOCKED) + if (!damaged(DRADIO) || game.condition == docked) { - prout("Uhura- We've lost contact with starsystem %s", - systemname(q->planet)); - prout("in %s.\n", cramlc(quadrant, ev->quadrant)); + prout(_("Uhura- We've lost contact with starsystem %s"), + systnames[q->planet]); + prout(_("in %s.\n"), cramlc(quadrant, ev->quadrant)); } 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. - */ + // 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]; @@ -525,18 +537,19 @@ void events(void) newkling(++game.klhere); /* recompute time left */ - game.state.remtime = game.state.remres/(game.state.remkl+4*game.state.remcom); + game.state.remtime = game.state.remkl + game.state.remcom > 0 ? + game.state.remres/(game.state.remkl + 4*game.state.remcom) : 99; /* report the disaster if we can */ - if (!damaged(DRADIO) || game.condit == IHDOCKED) + if (!damaged(DRADIO) || game.condition == docked) { if (same(game.quadrant, w)) { - prout("Spock- sensors indicate the Klingons have"); - prout("launched a warship from %s.",systemname(q->planet)); + prout(_("Spock- sensors indicate the Klingons have")); + prout(_("launched a warship from %s."), systnames[q->planet]); } else { - prout("Uhura- Starfleet reports increased Klingon activity"); + prout(_("Uhura- Starfleet reports increased Klingon activity")); if (q->planet != NOPLANET) - proutn("near %s", systemname(q->planet)); - prout("in %s.\n", cramlc(quadrant, w)); + proutn(_("near %s "), systnames[q->planet]); + prout(_("in %s.\n"), cramlc(quadrant, w)); } } break; @@ -554,7 +567,8 @@ void wait(void) game.ididit = false; for (;;) { key = scan(); - if (key != IHEOL) break; + if (key != IHEOL) + break; proutn(_("How long? ")); } chew(); @@ -563,17 +577,20 @@ void wait(void) return; } origTime = delay = aaitem; - if (delay <= 0.0) return; + if (delay <= 0.0) + return; if (delay >= game.state.remtime || game.nenhere != 0) { proutn(_("Are you sure? ")); - if (ja() == false) return; + if (ja() == false) + return; } /* Alternate resting periods (events) with attacks */ game.resting = true; do { - if (delay <= 0) game.resting = false; + if (delay <= 0) + game.resting = false; if (!game.resting) { prout(_("%d stardates left."), (int)game.state.remtime); return; @@ -582,17 +599,21 @@ void wait(void) if (game.nenhere) { double rtime = 1.0 + Rand(); - if (rtime < temp) temp = rtime; + if (rtime < temp) + temp = rtime; game.optime = temp; } - if (game.optime < delay) attack(0); - if (game.alldone) return; + if (game.optime < delay) + attack(false); + if (game.alldone) + return; events(); game.ididit = true; - if (game.alldone) return; + if (game.alldone) + return; delay -= temp; /* Repair Deathray if long rest at starbase */ - if (origTime-delay >= 9.99 && game.condit == IHDOCKED) + if (origTime-delay >= 9.99 && game.condition == docked) game.damage[DDRAY] = 0.0; } while // leave if quadrant supernovas @@ -602,6 +623,14 @@ void wait(void) game.optime = 0; } +/* + * A nova occurs. It is the result of having a star hit with a + * photon torpedo, or possibly of a probe warhead going off. + * Stars that go nova cause stars which surround them to undergo + * the same probabilistic process. Klingons next to them are + * destroyed. And if the starship is next to it, it gets zapped. + * If the zap is too much, it gets destroyed. + */ void nova(coord nov) /* star goes nova */ { @@ -613,7 +642,7 @@ void nova(coord nov) if (Rand() < 0.05) { /* Wow! We've supernova'ed */ - snova(false, &nov); + supernova(false, &nov); return; } @@ -634,10 +663,12 @@ void nova(coord nov) for (mm = bot; mm <= top; mm++) for (nn = 1; nn <= 3; nn++) /* nn,j represents coordinates around current */ for (j = 1; j <= 3; j++) { - if (j==2 && nn== 2) continue; + if (j==2 && nn== 2) + continue; scratch.x = hits[mm][1]+nn-2; scratch.y = hits[mm][2]+j-2; - if (!VALID_SECTOR(scratch.y, scratch.x)) continue; + if (!VALID_SECTOR(scratch.y, scratch.x)) + continue; iquad = game.quad[scratch.x][scratch.y]; switch (iquad) { // case IHDOT: /* Empty space ends reaction @@ -650,7 +681,7 @@ void nova(coord nov) case IHSTAR: /* Affect another star */ if (Rand() < 0.05) { /* This star supernovas */ - snova(false, &scratch); + supernova(false, &scratch); return; } top2++; @@ -667,9 +698,10 @@ void nova(coord nov) game.state.nplankl++; crmena(true, IHP, sector, scratch); prout(_(" destroyed.")); - DESTROY(&game.state.plnets[game.iplnet]); - game.iplnet = game.plnet.x = game.plnet.y = 0; - if (game.landed == 1) { + game.state.planets[game.iplnet].pclass = destroyed; + game.iplnet = 0; + invalidate(game.plnet); + if (game.landed) { finish(FPNOVA); return; } @@ -677,12 +709,12 @@ void nova(coord nov) break; case IHB: /* Destroy base */ game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase = false; - for_starbases(i) + for (i = 1; i <= game.state.rembase; i++) 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; + invalidate(game.base); game.state.basekl++; newcnd(); crmena(true, IHB, sector, scratch); @@ -693,7 +725,8 @@ void nova(coord nov) case IHF: prout(_("***Starship buffeted by nova.")); if (game.shldup) { - if (game.shield >= 2000.0) game.shield -= 2000.0; + if (game.shield >= 2000.0) + game.shield -= 2000.0; else { double diff = 2000.0 - game.shield; game.energy -= diff; @@ -703,7 +736,8 @@ void nova(coord nov) game.damage[DSHIELD] += 0.005*game.damfac*Rand()*diff; } } - else game.energy -= 2000.0; + else + game.energy -= 2000.0; if (game.energy <= 0) { finish(FNOVA); return; @@ -714,16 +748,17 @@ void nova(coord nov) kount++; break; case IHK: /* kill klingon */ - deadkl(scratch,iquad, scratch.x, scratch.y); + deadkl(scratch,iquad, scratch); break; case IHC: /* Damage/destroy big enemies */ case IHS: case IHR: - for_local_enemies(ll) - if (same(game.ks[ll], scratch)) break; + for (ll = 1; ll <= game.nenhere; ll++) + 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); + deadkl(scratch, iquad, scratch); break; } newc.x = scratch.x + scratch.x - hits[mm][1]; @@ -740,7 +775,7 @@ void nova(coord nov) proutn(_(", blasted into ")); crmena(false, IHBLANK, sector, newc); skip(1); - deadkl(scratch, iquad, newc.x, newc.y); + deadkl(scratch, iquad, newc); break; } if (iquad1 != IHDOT) { @@ -768,25 +803,28 @@ void nova(coord nov) /* Starship affected by nova -- kick it away. */ game.dist = kount*0.1; - if (icx) icx = (icx < 0 ? -1 : 1); - if (icy) icy = (icy < 0 ? -1 : 1); + if (icx) + icx = (icx < 0 ? -1 : 1); + if (icy) + icy = (icy < 0 ? -1 : 1); game.direc = course[3*(icx+1)+icy+2]; - if (game.direc == 0.0) game.dist = 0.0; - if (game.dist == 0.0) return; + if (game.direc == 0.0) + game.dist = 0.0; + if (game.dist == 0.0) + return; game.optime = 10.0*game.dist/16.0; skip(1); prout(_("Force of nova displaces starship.")); - game.iattak=2; /* Eliminates recursion problem */ - imove(); + imove(true); game.optime = 10.0*game.dist/16.0; return; } -void snova(bool induced, coord *w) +void supernova(bool induced, coord *w) /* star goes supernova */ { - int num = 0, nrmdead, npdead, kldead; + int num = 0, nrmdead, npdead = 0, kldead, loop; coord nq; if (w != NULL) @@ -796,19 +834,20 @@ void snova(bool induced, coord *w) /* 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) { + for (nq.x = 1; nq.x <= GALSIZE; nq.x++) + for (nq.y = 1; nq.y <= GALSIZE; nq.y++) stars += game.state.galaxy[nq.x][nq.y].stars; - } - } - if (stars == 0) return; /* nothing to supernova exists */ + if (stars == 0) + return; /* nothing to supernova exists */ num = Rand()*stars + 1; - for_quadrants(nq.x) { - for_quadrants(nq.y) { + for (nq.x = 1; nq.x <= GALSIZE; nq.x++) { + for (nq.y = 1; nq.y <= GALSIZE; nq.y++) { num -= game.state.galaxy[nq.x][nq.y].stars; - if (num <= 0) break; + if (num <= 0) + break; } - if (num <=0) break; + if (num <=0) + break; } if (idebug) { proutn("=== Super nova here?"); @@ -819,7 +858,7 @@ void snova(bool induced, coord *w) if (!same(nq, game.quadrant) || game.justin) { /* it isn't here, or we just entered (treat as enroute) */ - if (!damaged(DRADIO) || game.condit == IHDOCKED) { + if (!damaged(DRADIO) || game.condition == docked) { skip(1); prout(_("Message from Starfleet Command Stardate %.2f"), game.state.date); prout(_(" Supernova in %s; caution advised."), @@ -830,20 +869,22 @@ void snova(bool induced, coord *w) 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) { + for (ns.x = 1; ns.x <= QUADSIZE; ns.x++) { + for (ns.y = 1; ns.y <= QUADSIZE; ns.y++) { if (game.quad[ns.x][ns.y]==IHSTAR) { num--; - if (num==0) break; + if (num==0) + break; } } - if (num==0) break; + if (num==0) + break; } skip(1); prouts(_("***RED ALERT! RED ALERT!")); skip(1); - prout(_("***Incipient supernova detected at "), cramlc(sector, ns)); + prout(_("***Incipient supernova detected at %s"), cramlc(sector, ns)); if (square(ns.x-game.sector.x) + square(ns.y-game.sector.y) <= 2.1) { proutn(_("Emergency override attempts t")); prouts("***************"); @@ -858,19 +899,25 @@ void snova(bool induced, coord *w) game.state.galaxy[nq.x][nq.y].klingons = 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; + game.state.nscrem = game.state.kscmdr.x = game.state.kscmdr.y = game.isatb = 0; + game.iscate = false; unschedule(FSCMOVE); + } + if (same(nq, game.battle)) { unschedule(FSCDBAS); + unschedule(FCDBAS); + invalidate(game.battle); } if (game.state.remcom) { int maxloop = game.state.remcom, l; for (l = 1; l <= maxloop; l++) { if (same(game.state.kcmdr[l], nq)) { game.state.kcmdr[l] = game.state.kcmdr[game.state.remcom]; - game.state.kcmdr[game.state.remcom].x = game.state.kcmdr[game.state.remcom].y = 0; + invalidate(game.state.kcmdr[game.state.remcom]); game.state.remcom--; kldead--; - if (game.state.remcom==0) unschedule(FTBEAM); + if (game.state.remcom==0) + unschedule(FTBEAM); break; } } @@ -880,13 +927,12 @@ void snova(bool induced, coord *w) nrmdead = game.state.galaxy[nq.x][nq.y].romulans; game.state.galaxy[nq.x][nq.y].romulans = 0; game.state.nromrem -= nrmdead; - npdead = num - nrmdead*10; - if (npdead) { - int loop; - for (loop = 0; loop < game.inplan; loop++) - if (same(game.state.plnets[loop].w, nq)) { - DESTROY(&game.state.plnets[loop]); - } + /* Destroy planets */ + for (loop = 0; loop < game.inplan; loop++) { + if (same(game.state.planets[loop].w, nq)) { + game.state.planets[loop].pclass = destroyed; + npdead++; + } } /* Destroy any base in supernovaed quadrant */ if (game.state.rembase) { @@ -894,7 +940,7 @@ void snova(bool induced, coord *w) 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; + invalidate(game.state.baseq[game.state.rembase]); game.state.rembase--; break; } @@ -906,18 +952,20 @@ void snova(bool induced, coord *w) game.state.nplankl += npdead; } /* mark supernova in galaxy and in star chart */ - if (same(game.quadrant, nq) || !damaged(DRADIO) || game.condit == IHDOCKED) + if (same(game.quadrant, nq) || !damaged(DRADIO) || game.condition == docked) game.state.galaxy[nq.x][nq.y].supernova = true; /* If supernova destroys last Klingons give special message */ - if (KLINGREM==0 && !same(nq, game.quadrant)) { + if ((game.state.remkl + game.state.remcom + game.state.nscrem)==0 && !same(nq, game.quadrant)) { skip(2); - if (!induced) prout(_("Lucky you!")); + if (!induced) + prout(_("Lucky you!")); proutn(_("A supernova in %s has just destroyed the last Klingons."), cramlc(quadrant, nq)); finish(FWON); return; } /* if some Klingons remain, continue or die in supernova */ - if (game.alldone) finish(FSNOVAED); + if (game.alldone) + finish(FSNOVAED); return; }