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