1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)nova.c 8.1 (Berkeley) 05/31/93";
10 #endif /* not lint */
11
12 # include "trek.h"
13
14 /*
15 ** CAUSE A NOVA TO OCCUR
16 **
17 ** A nova occurs. It is the result of having a star hit with
18 ** a photon torpedo. There are several things which may happen.
19 ** The star may not be affected. It may go nova. It may turn
20 ** into a black hole. Any (yummy) it may go supernova.
21 **
22 ** Stars that go nova cause stars which surround them to undergo
23 ** the same probabilistic process. Klingons next to them are
24 ** destroyed. And if the starship is next to it, it gets zapped.
25 ** If the zap is too much, it gets destroyed.
26 */
27
nova(x,y)28 nova(x, y)
29 int x, y;
30 {
31 register int i, j;
32 register int se;
33
34 if (Sect[x][y] != STAR || Quad[Ship.quadx][Ship.quady].stars < 0)
35 return;
36 if (ranf(100) < 15)
37 {
38 printf("Spock: Star at %d,%d failed to nova.\n", x, y);
39 return;
40 }
41 if (ranf(100) < 5)
42 return (snova(x, y));
43 printf("Spock: Star at %d,%d gone nova\n", x, y);
44
45 if (ranf(4) != 0)
46 Sect[x][y] = EMPTY;
47 else
48 {
49 Sect[x][y] = HOLE;
50 Quad[Ship.quadx][Ship.quady].holes += 1;
51 }
52 Quad[Ship.quadx][Ship.quady].stars -= 1;
53 Game.kills += 1;
54 for (i = x - 1; i <= x + 1; i++)
55 {
56 if (i < 0 || i >= NSECTS)
57 continue;
58 for (j = y - 1; j <= y + 1; j++)
59 {
60 if (j < 0 || j >= NSECTS)
61 continue;
62 se = Sect[i][j];
63 switch (se)
64 {
65
66 case EMPTY:
67 case HOLE:
68 break;
69
70 case KLINGON:
71 killk(i, j);
72 break;
73
74 case STAR:
75 nova(i, j);
76 break;
77
78 case INHABIT:
79 kills(i, j, -1);
80 break;
81
82 case BASE:
83 killb(i, j);
84 Game.killb += 1;
85 break;
86
87 case ENTERPRISE:
88 case QUEENE:
89 se = 2000;
90 if (Ship.shldup)
91 if (Ship.shield >= se)
92 {
93 Ship.shield -= se;
94 se = 0;
95 }
96 else
97 {
98 se -= Ship.shield;
99 Ship.shield = 0;
100 }
101 Ship.energy -= se;
102 if (Ship.energy <= 0)
103 lose(L_SUICID);
104 break;
105
106 default:
107 printf("Unknown object %c at %d,%d destroyed\n",
108 se, i, j);
109 Sect[i][j] = EMPTY;
110 break;
111 }
112 }
113 }
114 return;
115 }
116