1*25992Smckusick /* 2*25992Smckusick * Copyright (c) 1980 Regents of the University of California. 3*25992Smckusick * All rights reserved. The Berkeley software License Agreement 4*25992Smckusick * specifies the terms and conditions for redistribution. 5*25992Smckusick */ 6*25992Smckusick 711679Smckusick #ifndef lint 8*25992Smckusick static char sccsid[] = "@(#)kill.c 5.1 (Berkeley) 01/29/86"; 911679Smckusick #endif not lint 1011679Smckusick 1111679Smckusick # include "trek.h" 1211679Smckusick 1311679Smckusick /* 1411679Smckusick ** KILL KILL KILL !!! 1511679Smckusick ** 1611679Smckusick ** This file handles the killing off of almost anything. 1711679Smckusick */ 1811679Smckusick 1911679Smckusick /* 2011679Smckusick ** Handle a Klingon's death 2111679Smckusick ** 2211679Smckusick ** The Klingon at the sector given by the parameters is killed 2311679Smckusick ** and removed from the Klingon list. Notice that it is not 2411679Smckusick ** removed from the event list; this is done later, when the 2511679Smckusick ** the event is to be caught. Also, the time left is recomputed, 2611679Smckusick ** and the game is won if that was the last klingon. 2711679Smckusick */ 2811679Smckusick 2911679Smckusick killk(ix, iy) 3011679Smckusick int ix, iy; 3111679Smckusick { 3211679Smckusick register int i, j; 3311679Smckusick 3411679Smckusick printf(" *** Klingon at %d,%d destroyed ***\n", ix, iy); 3511679Smckusick 3611679Smckusick /* remove the scoundrel */ 3712738Slayer Now.klings -= 1; 3811679Smckusick Sect[ix][iy] = EMPTY; 3912738Slayer Quad[Ship.quadx][Ship.quady].klings -= 1; 4011679Smckusick /* %%% IS THIS SAFE???? %%% */ 4112738Slayer Quad[Ship.quadx][Ship.quady].scanned -= 100; 4212738Slayer Game.killk += 1; 4311679Smckusick 4411679Smckusick /* find the Klingon in the Klingon list */ 4511679Smckusick for (i = 0; i < Etc.nkling; i++) 4611679Smckusick if (ix == Etc.klingon[i].x && iy == Etc.klingon[i].y) 4711679Smckusick { 4811679Smckusick /* purge him from the list */ 4912738Slayer Etc.nkling -= 1; 5011679Smckusick for (; i < Etc.nkling; i++) 5111679Smckusick bmove(&Etc.klingon[i+1], &Etc.klingon[i], sizeof Etc.klingon[i]); 5211679Smckusick break; 5311679Smckusick } 5411679Smckusick 5511679Smckusick /* find out if that was the last one */ 5611679Smckusick if (Now.klings <= 0) 5711679Smckusick win(); 5811679Smckusick 5911679Smckusick /* recompute time left */ 6011679Smckusick Now.time = Now.resource / Now.klings; 6111679Smckusick return; 6211679Smckusick } 6311679Smckusick 6411679Smckusick 6511679Smckusick /* 6611679Smckusick ** handle a starbase's death 6711679Smckusick */ 6811679Smckusick 6911679Smckusick killb(qx, qy) 7011679Smckusick int qx, qy; 7111679Smckusick { 7211679Smckusick register struct quad *q; 7311679Smckusick register struct xy *b; 7411679Smckusick 7511679Smckusick q = &Quad[qx][qy]; 7611679Smckusick 7711679Smckusick if (q->bases <= 0) 7811679Smckusick return; 7911679Smckusick if (!damaged(SSRADIO)) 8011679Smckusick /* then update starchart */ 8111679Smckusick if (q->scanned < 1000) 8212738Slayer q->scanned -= 10; 8311679Smckusick else 8411679Smckusick if (q->scanned > 1000) 8511679Smckusick q->scanned = -1; 8611679Smckusick q->bases = 0; 8712738Slayer Now.bases -= 1; 8811679Smckusick for (b = Now.base; ; b++) 8911679Smckusick if (qx == b->x && qy == b->y) 9011679Smckusick break; 9111679Smckusick bmove(&Now.base[Now.bases], b, sizeof *b); 9211679Smckusick if (qx == Ship.quadx && qy == Ship.quady) 9311679Smckusick { 9411679Smckusick Sect[Etc.starbase.x][Etc.starbase.y] = EMPTY; 9511679Smckusick if (Ship.cond == DOCKED) 9611679Smckusick undock(); 9711679Smckusick printf("Starbase at %d,%d destroyed\n", Etc.starbase.x, Etc.starbase.y); 9811679Smckusick } 9911679Smckusick else 10011679Smckusick { 10111679Smckusick if (!damaged(SSRADIO)) 10211679Smckusick { 10311679Smckusick printf("Uhura: Starfleet command reports that the starbase in\n"); 10411679Smckusick printf(" quadrant %d,%d has been destroyed\n", qx, qy); 10511679Smckusick } 10611679Smckusick else 10711679Smckusick schedule(E_KATSB | E_GHOST, 1e50, qx, qy, 0); 10811679Smckusick } 10911679Smckusick } 11011679Smckusick 11111679Smckusick 11211679Smckusick /** 11311679Smckusick ** kill an inhabited starsystem 11411679Smckusick **/ 11511679Smckusick 11611679Smckusick kills(x, y, f) 11711679Smckusick int x, y; /* quad coords if f == 0, else sector coords */ 11811679Smckusick int f; /* f != 0 -- this quad; f < 0 -- Enterprise's fault */ 11911679Smckusick { 12011679Smckusick register struct quad *q; 12111679Smckusick register struct event *e; 12211679Smckusick register char *name; 12312738Slayer char *systemname(); 12411679Smckusick 12511679Smckusick if (f) 12611679Smckusick { 12711679Smckusick /* current quadrant */ 12811679Smckusick q = &Quad[Ship.quadx][Ship.quady]; 12911679Smckusick Sect[x][y] = EMPTY; 13011679Smckusick name = systemname(q); 13111679Smckusick if (name == 0) 13211679Smckusick return; 13311679Smckusick printf("Inhabited starsystem %s at %d,%d destroyed\n", 13411679Smckusick name, x, y); 13511679Smckusick if (f < 0) 13612738Slayer Game.killinhab += 1; 13711679Smckusick } 13811679Smckusick else 13911679Smckusick { 14011679Smckusick /* different quadrant */ 14111679Smckusick q = &Quad[x][y]; 14211679Smckusick } 14312738Slayer if (q->qsystemname & Q_DISTRESSED) 14411679Smckusick { 14511679Smckusick /* distressed starsystem */ 14612738Slayer e = &Event[q->qsystemname & Q_SYSTEM]; 14711679Smckusick printf("Distress call for %s invalidated\n", 14811679Smckusick Systemname[e->systemname]); 14911679Smckusick unschedule(e); 15011679Smckusick } 15112738Slayer q->qsystemname = 0; 15212738Slayer q->stars -= 1; 15311679Smckusick } 15411679Smckusick 15511679Smckusick 15611679Smckusick /** 15711679Smckusick ** "kill" a distress call 15811679Smckusick **/ 15911679Smckusick 16011679Smckusick killd(x, y, f) 16111679Smckusick int x, y; /* quadrant coordinates */ 16211679Smckusick int f; /* set if user is to be informed */ 16311679Smckusick { 16411679Smckusick register struct event *e; 16511679Smckusick register int i; 16611679Smckusick register struct quad *q; 16711679Smckusick 16811679Smckusick q = &Quad[x][y]; 16911679Smckusick for (i = 0; i < MAXEVENTS; i++) 17011679Smckusick { 17111679Smckusick e = &Event[i]; 17211679Smckusick if (e->x != x || e->y != y) 17311679Smckusick continue; 17411679Smckusick switch (e->evcode) 17511679Smckusick { 17611679Smckusick case E_KDESB: 17711679Smckusick if (f) 17811679Smckusick { 17911679Smckusick printf("Distress call for starbase in %d,%d nullified\n", 18011679Smckusick x, y); 18111679Smckusick unschedule(e); 18211679Smckusick } 18311679Smckusick break; 18411679Smckusick 18511679Smckusick case E_ENSLV: 18611679Smckusick case E_REPRO: 18711679Smckusick if (f) 18811679Smckusick { 18911679Smckusick printf("Distress call for %s in quadrant %d,%d nullified\n", 19011679Smckusick Systemname[e->systemname], x, y); 19112738Slayer q->qsystemname = e->systemname; 19211679Smckusick unschedule(e); 19311679Smckusick } 19411679Smckusick else 19511679Smckusick { 19612738Slayer e->evcode |= E_GHOST; 19711679Smckusick } 19811679Smckusick } 19911679Smckusick } 20011679Smckusick } 201