checkcond() { register int i, j; /* see if we are still alive and well */ if (Ship.reserves < 0.0) lose(L_NOLIFE); if (Ship.energy <= 0) lose(L_NOENGY); if (Ship.crew <= 0) lose(L_NOCREW); /* if in auto override mode, ignore the rest */ if (Etc.nkling < 0) return; /* call in automatic override if appropriate */ if (Quad[Ship.quadx][Ship.quady].stars < 0) autover(); if (Quad[Ship.quadx][Ship.quady].stars < 0) lose(L_SNOVA); /* nullify distress call if appropriate */ if (Etc.nkling <= 0) killd(Ship.quadx, Ship.quady, 1); /* set condition code */ if (Ship.cond == DOCKED) return; if (Etc.nkling > 0) { Ship.cond = RED; return; } if (Ship.energy < Param.energylow) { Ship.cond = YELLOW; return; } Ship.cond = GREEN; return; }
void snova(int x, int y) { int qx, qy; int ix, iy = 0; int f, n; int dx, dy; struct quad *q; f = 0; ix = x; if (ix < 0) { /* choose a quadrant */ while (1) { qx = ranf(NQUADS); qy = ranf(NQUADS); q = &Quad[qx][qy]; if (q->stars > 0) break; } if (Ship.quadx == qx && Ship.quady == qy) { /* select a particular star */ n = ranf(q->stars); for (ix = 0; ix < NSECTS; ix++) { for (iy = 0; iy < NSECTS; iy++) if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT) if ((n -= 1) <= 0) break; if (n <= 0) break; } f = 1; } } else { /* current quadrant */ iy = y; qx = Ship.quadx; qy = Ship.quady; q = &Quad[qx][qy]; f = 1; } if (f) { /* supernova is in same quadrant as Enterprise */ printf("\a\nRED ALERT: supernova occuring at %d,%d\n", ix, iy); dx = ix - Ship.sectx; dy = iy - Ship.secty; if (dx * dx + dy * dy <= 2) { printf("*** Emergency override attem"); sleep(1); printf("\n"); lose(L_SNOVA); } q->scanned = 1000; } else { if (!damaged(SSRADIO)) { q->scanned = 1000; printf("\nUhura: Captain, Starfleet Command reports a supernova\n"); printf(" in quadrant %d,%d. Caution is advised\n", qx, qy); } } /* clear out the supernova'ed quadrant */ dx = q->klings; dy = q->stars; Now.klings -= dx; if (x >= 0) { /* Enterprise caused supernova */ Game.kills += dy; if (q->bases) killb(qx, qy); Game.killk += dx; } else if (q->bases) killb(qx, qy); killd(qx, qy, (x >= 0)); q->stars = -1; q->klings = 0; if (Now.klings <= 0) { printf("Lucky devil, that supernova destroyed the last klingon\n"); win(); } }