void stars(void) { prouts("******************************************************"); skip(1); }
void snova(int insx, int insy) { int comdead, nqx, nqy, nsx, nsy, num, kldead, iscdead; int nrmdead, npdead; int insipient=0; nsx = insy; nsy = insy; if (insy== 0) { if (insx == 1) { /* NOVAMAX being used */ nqx = probecx; nqy = probecy; } else { int stars = 0; /* Scheduled supernova -- select star */ /* logic changed here so that we won't favor quadrants in top left of universe */ for (nqx = 1; nqx<=8; nqx++) { for (nqy = 1; nqy<=8; nqy++) { stars += d.galaxy[nqx][nqy] % 10; } } if (stars == 0) return; /* nothing to supernova exists */ num = Rand()*stars + 1; for (nqx = 1; nqx<=8; nqx++) { for (nqy = 1; nqy<=8; nqy++) { num -= d.galaxy[nqx][nqy] % 10; if (num <= 0) break; } if (num <=0) break; } #ifdef DEBUG if (idebug) { proutn("Super nova here?"); if (ja()==1) { nqx = quadx; nqy = quady; } } #endif } if (nqx != quady || nqy != quady || justin != 0) { /* it isn't here, or we just entered (treat as inroute) */ if (damage[DRADIO] == 0.0 || condit == IHDOCKED) { skip(1); proutn("Message from Starfleet Command Stardate "); cramf(d.date, 0, 1); skip(1); proutn(" Supernova in"); cramlc(1, nqx, nqy); prout("; caution advised."); } } else { /* we are in the quadrant! */ insipient = 1; num = Rand()* (d.galaxy[nqx][nqy]%10) + 1; for (nsx=1; nsx < 10; nsx++) { for (nsy=1; nsy < 10; nsy++) { if (quad[nsx][nsy]==IHSTAR) { num--; if (num==0) break; } } if (num==0) break; } } } else { insipient = 1; } if (insipient) { skip(1); prouts("***RED ALERT! RED ALERT!"); skip(1); proutn("***Incipient supernova detected at"); cramlc(2, nsx, nsy); skip(1); nqx = quadx; nqy = quady; if (square(nsx-sectx) + square(nsy-secty) <= 2.1) { proutn("Emergency override attempts t"); prouts("***************"); skip(1); stars(); alldone=1; } } /* destroy any Klingons in supernovaed quadrant */ num=d.galaxy[nqx][nqy]; kldead = num/100; comdead = iscdead = 0; if (nqx==d.isx && nqy == d.isy) { /* did in the Supercommander! */ d.nscrem = d.isx = d.isy = isatb = iscate = 0; iscdead = 1; future[FSCMOVE] = future[FSCDBAS] = 1e30; } d.remkl -= kldead; if (d.remcom) { int maxloop = d.remcom, l; for (l = 1; l <= maxloop; l++) { if (d.cx[l] == nqx && d.cy[l] == nqy) { d.cx[l] = d.cx[d.remcom]; d.cy[l] = d.cy[d.remcom]; d.cx[d.remcom] = d.cy[d.remcom] = 0; d.remcom--; kldead--; comdead++; if (d.remcom==0) future[FTBEAM] = 1e30; break; } } } /* destroy Romulans and planets in supernovaed quadrant */ num = d.newstuf[nqx][nqy]; d.newstuf[nqx][nqy] = 0; nrmdead = num/10; d.nromrem -= nrmdead; npdead = num - nrmdead*10; if (npdead) { int l; for (l = 1; l <= inplan; l++) if (d.plnets[l].x == nqx && d.plnets[l].y == nqy) { d.plnets[l] = nulplanet; } } /* Destroy any base in supernovaed quadrant */ if (d.rembase) { int maxloop = d.rembase, l; for (l = 1; l <= maxloop; l++) if (d.baseqx[l]==nqx && d.baseqy[l]==nqy) { d.baseqx[l] = d.baseqx[d.rembase]; d.baseqy[l] = d.baseqy[d.rembase]; d.baseqx[d.rembase] = d.baseqy[d.rembase] = 0; d.rembase--; break; } } /* If starship caused supernova, tally up destruction */ if (insx) { num = d.galaxy[nqx][nqy] % 100; d.starkl += num % 10; d.basekl += num/10; d.killk += kldead; d.killc += comdead; d.nromkl += nrmdead; d.nplankl += npdead; d.nsckill += iscdead; } /* mark supernova in galaxy and in star chart */ if ((quadx == nqx && quady == nqy) || damage[DRADIO] == 0 || condit == IHDOCKED) starch[nqx][nqy] = 1; d.galaxy[nqx][nqy] = 1000; /* If supernova destroys last klingons give special message */ if (d.remkl==0 && (nqx != quadx || nqy != quady)) { skip(2); if (insx == 0) prout("Lucky you!"); proutn("A supernova in"); cramlc(1, nqx, nqy); prout(" has just destroyed the last Klingons."); finish(FWON); return; } /* if some Klingons remain, continue or die in supernova */ if (alldone) finish(FSNOVAED); return; }