1*11679Smckusick #ifndef lint 2*11679Smckusick static char sccsid[] = "@(#)kill.c 4.1 (Berkeley) 03/23/83"; 3*11679Smckusick #endif not lint 4*11679Smckusick 5*11679Smckusick # include "trek.h" 6*11679Smckusick 7*11679Smckusick /* 8*11679Smckusick ** KILL KILL KILL !!! 9*11679Smckusick ** 10*11679Smckusick ** This file handles the killing off of almost anything. 11*11679Smckusick */ 12*11679Smckusick 13*11679Smckusick /* 14*11679Smckusick ** Handle a Klingon's death 15*11679Smckusick ** 16*11679Smckusick ** The Klingon at the sector given by the parameters is killed 17*11679Smckusick ** and removed from the Klingon list. Notice that it is not 18*11679Smckusick ** removed from the event list; this is done later, when the 19*11679Smckusick ** the event is to be caught. Also, the time left is recomputed, 20*11679Smckusick ** and the game is won if that was the last klingon. 21*11679Smckusick */ 22*11679Smckusick 23*11679Smckusick killk(ix, iy) 24*11679Smckusick int ix, iy; 25*11679Smckusick { 26*11679Smckusick register int i, j; 27*11679Smckusick 28*11679Smckusick printf(" *** Klingon at %d,%d destroyed ***\n", ix, iy); 29*11679Smckusick 30*11679Smckusick /* remove the scoundrel */ 31*11679Smckusick Now.klings =- 1; 32*11679Smckusick Sect[ix][iy] = EMPTY; 33*11679Smckusick Quad[Ship.quadx][Ship.quady].klings =- 1; 34*11679Smckusick /* %%% IS THIS SAFE???? %%% */ 35*11679Smckusick Quad[Ship.quadx][Ship.quady].scanned =- 100; 36*11679Smckusick Game.killk =+ 1; 37*11679Smckusick 38*11679Smckusick /* find the Klingon in the Klingon list */ 39*11679Smckusick for (i = 0; i < Etc.nkling; i++) 40*11679Smckusick if (ix == Etc.klingon[i].x && iy == Etc.klingon[i].y) 41*11679Smckusick { 42*11679Smckusick /* purge him from the list */ 43*11679Smckusick Etc.nkling =- 1; 44*11679Smckusick for (; i < Etc.nkling; i++) 45*11679Smckusick bmove(&Etc.klingon[i+1], &Etc.klingon[i], sizeof Etc.klingon[i]); 46*11679Smckusick break; 47*11679Smckusick } 48*11679Smckusick 49*11679Smckusick /* find out if that was the last one */ 50*11679Smckusick if (Now.klings <= 0) 51*11679Smckusick win(); 52*11679Smckusick 53*11679Smckusick /* recompute time left */ 54*11679Smckusick Now.time = Now.resource / Now.klings; 55*11679Smckusick return; 56*11679Smckusick } 57*11679Smckusick 58*11679Smckusick 59*11679Smckusick /* 60*11679Smckusick ** handle a starbase's death 61*11679Smckusick */ 62*11679Smckusick 63*11679Smckusick killb(qx, qy) 64*11679Smckusick int qx, qy; 65*11679Smckusick { 66*11679Smckusick register struct quad *q; 67*11679Smckusick register struct xy *b; 68*11679Smckusick 69*11679Smckusick q = &Quad[qx][qy]; 70*11679Smckusick 71*11679Smckusick if (q->bases <= 0) 72*11679Smckusick return; 73*11679Smckusick if (!damaged(SSRADIO)) 74*11679Smckusick /* then update starchart */ 75*11679Smckusick if (q->scanned < 1000) 76*11679Smckusick q->scanned =- 10; 77*11679Smckusick else 78*11679Smckusick if (q->scanned > 1000) 79*11679Smckusick q->scanned = -1; 80*11679Smckusick q->bases = 0; 81*11679Smckusick Now.bases =- 1; 82*11679Smckusick for (b = Now.base; ; b++) 83*11679Smckusick if (qx == b->x && qy == b->y) 84*11679Smckusick break; 85*11679Smckusick bmove(&Now.base[Now.bases], b, sizeof *b); 86*11679Smckusick if (qx == Ship.quadx && qy == Ship.quady) 87*11679Smckusick { 88*11679Smckusick Sect[Etc.starbase.x][Etc.starbase.y] = EMPTY; 89*11679Smckusick if (Ship.cond == DOCKED) 90*11679Smckusick undock(); 91*11679Smckusick printf("Starbase at %d,%d destroyed\n", Etc.starbase.x, Etc.starbase.y); 92*11679Smckusick } 93*11679Smckusick else 94*11679Smckusick { 95*11679Smckusick if (!damaged(SSRADIO)) 96*11679Smckusick { 97*11679Smckusick printf("Uhura: Starfleet command reports that the starbase in\n"); 98*11679Smckusick printf(" quadrant %d,%d has been destroyed\n", qx, qy); 99*11679Smckusick } 100*11679Smckusick else 101*11679Smckusick schedule(E_KATSB | E_GHOST, 1e50, qx, qy, 0); 102*11679Smckusick } 103*11679Smckusick } 104*11679Smckusick 105*11679Smckusick 106*11679Smckusick /** 107*11679Smckusick ** kill an inhabited starsystem 108*11679Smckusick **/ 109*11679Smckusick 110*11679Smckusick kills(x, y, f) 111*11679Smckusick int x, y; /* quad coords if f == 0, else sector coords */ 112*11679Smckusick int f; /* f != 0 -- this quad; f < 0 -- Enterprise's fault */ 113*11679Smckusick { 114*11679Smckusick register struct quad *q; 115*11679Smckusick register struct event *e; 116*11679Smckusick register char *name; 117*11679Smckusick 118*11679Smckusick if (f) 119*11679Smckusick { 120*11679Smckusick /* current quadrant */ 121*11679Smckusick q = &Quad[Ship.quadx][Ship.quady]; 122*11679Smckusick Sect[x][y] = EMPTY; 123*11679Smckusick name = systemname(q); 124*11679Smckusick if (name == 0) 125*11679Smckusick return; 126*11679Smckusick printf("Inhabited starsystem %s at %d,%d destroyed\n", 127*11679Smckusick name, x, y); 128*11679Smckusick if (f < 0) 129*11679Smckusick Game.killinhab =+ 1; 130*11679Smckusick } 131*11679Smckusick else 132*11679Smckusick { 133*11679Smckusick /* different quadrant */ 134*11679Smckusick q = &Quad[x][y]; 135*11679Smckusick } 136*11679Smckusick if (q->systemname & Q_DISTRESSED) 137*11679Smckusick { 138*11679Smckusick /* distressed starsystem */ 139*11679Smckusick e = &Event[q->systemname & Q_SYSTEM]; 140*11679Smckusick printf("Distress call for %s invalidated\n", 141*11679Smckusick Systemname[e->systemname]); 142*11679Smckusick unschedule(e); 143*11679Smckusick } 144*11679Smckusick q->systemname = 0; 145*11679Smckusick q->stars =- 1; 146*11679Smckusick } 147*11679Smckusick 148*11679Smckusick 149*11679Smckusick /** 150*11679Smckusick ** "kill" a distress call 151*11679Smckusick **/ 152*11679Smckusick 153*11679Smckusick killd(x, y, f) 154*11679Smckusick int x, y; /* quadrant coordinates */ 155*11679Smckusick int f; /* set if user is to be informed */ 156*11679Smckusick { 157*11679Smckusick register struct event *e; 158*11679Smckusick register int i; 159*11679Smckusick register struct quad *q; 160*11679Smckusick 161*11679Smckusick q = &Quad[x][y]; 162*11679Smckusick for (i = 0; i < MAXEVENTS; i++) 163*11679Smckusick { 164*11679Smckusick e = &Event[i]; 165*11679Smckusick if (e->x != x || e->y != y) 166*11679Smckusick continue; 167*11679Smckusick switch (e->evcode) 168*11679Smckusick { 169*11679Smckusick case E_KDESB: 170*11679Smckusick if (f) 171*11679Smckusick { 172*11679Smckusick printf("Distress call for starbase in %d,%d nullified\n", 173*11679Smckusick x, y); 174*11679Smckusick unschedule(e); 175*11679Smckusick } 176*11679Smckusick break; 177*11679Smckusick 178*11679Smckusick case E_ENSLV: 179*11679Smckusick case E_REPRO: 180*11679Smckusick if (f) 181*11679Smckusick { 182*11679Smckusick printf("Distress call for %s in quadrant %d,%d nullified\n", 183*11679Smckusick Systemname[e->systemname], x, y); 184*11679Smckusick q->systemname = e->systemname; 185*11679Smckusick unschedule(e); 186*11679Smckusick } 187*11679Smckusick else 188*11679Smckusick { 189*11679Smckusick e->evcode =| E_GHOST; 190*11679Smckusick } 191*11679Smckusick } 192*11679Smckusick } 193*11679Smckusick } 194