Commit | Line | Data |
---|---|---|
b6f0a7e4 DF |
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 | ||
d98c7187 | 7 | #ifndef lint |
95f51977 | 8 | static char sccsid[] = "@(#)attack.c 5.1 (Berkeley) 5/30/85"; |
d98c7187 KM |
9 | #endif not lint |
10 | ||
11 | # include "trek.h" | |
12 | ||
13 | /* | |
14 | ** Klingon Attack Routine | |
15 | ** | |
16 | ** This routine performs the Klingon attack provided that | |
17 | ** (1) Something happened this move (i.e., not free), and | |
18 | ** (2) You are not cloaked. Note that if you issue the | |
19 | ** cloak command, you are not considered cloaked until you | |
20 | ** expend some time. | |
21 | ** | |
22 | ** Klingons are permitted to move both before and after the | |
23 | ** attack. They will tend to move toward you before the | |
24 | ** attack and away from you after the attack. | |
25 | ** | |
26 | ** Under certain conditions you can get a critical hit. This | |
27 | ** sort of hit damages devices. The probability that a given | |
28 | ** device is damaged depends on the device. Well protected | |
29 | ** devices (such as the computer, which is in the core of the | |
30 | ** ship and has considerable redundancy) almost never get | |
31 | ** damaged, whereas devices which are exposed (such as the | |
32 | ** warp engines) or which are particularly delicate (such as | |
33 | ** the transporter) have a much higher probability of being | |
34 | ** damaged. | |
35 | ** | |
36 | ** The actual amount of damage (i.e., how long it takes to fix | |
37 | ** it) depends on the amount of the hit and the "damfac[]" | |
38 | ** entry for the particular device. | |
39 | ** | |
40 | ** Casualties can also occur. | |
41 | */ | |
42 | ||
43 | attack(resting) | |
44 | int resting; /* set if attack while resting */ | |
45 | { | |
46 | register int hit, i, l; | |
47 | int maxhit, tothit, shldabsb; | |
48 | double chgfac, propor, extradm; | |
49 | double dustfac, tothe; | |
50 | int cas; | |
51 | int hitflag; | |
52 | ||
53 | if (Move.free) | |
54 | return; | |
55 | if (Etc.nkling <= 0 || Quad[Ship.quadx][Ship.quady].stars < 0) | |
56 | return; | |
57 | if (Ship.cloaked && Ship.cloakgood) | |
58 | return; | |
59 | /* move before attack */ | |
60 | klmove(0); | |
61 | if (Ship.cond == DOCKED) | |
62 | { | |
63 | if (!resting) | |
64 | printf("Starbase shields protect the %s\n", Ship.shipname); | |
65 | return; | |
66 | } | |
67 | /* setup shield effectiveness */ | |
68 | chgfac = 1.0; | |
69 | if (Move.shldchg) | |
70 | chgfac = 0.25 + 0.50 * franf(); | |
71 | maxhit = tothit = 0; | |
72 | hitflag = 0; | |
73 | ||
74 | /* let each Klingon do his damndest */ | |
75 | for (i = 0; i < Etc.nkling; i++) | |
76 | { | |
77 | /* if he's low on power he won't attack */ | |
78 | if (Etc.klingon[i].power < 20) | |
79 | continue; | |
80 | if (!hitflag) | |
81 | { | |
82 | printf("\nStardate %.2f: Klingon attack:\n", | |
83 | Now.date); | |
84 | hitflag++; | |
85 | } | |
86 | /* complete the hit */ | |
87 | dustfac = 0.90 + 0.01 * franf(); | |
88 | tothe = Etc.klingon[i].avgdist; | |
89 | hit = Etc.klingon[i].power * pow(dustfac, tothe) * Param.hitfac; | |
90 | /* deplete his energy */ | |
91 | dustfac = Etc.klingon[i].power; | |
92 | Etc.klingon[i].power = dustfac * Param.phasfac * (1.0 + (franf() - 0.5) * 0.2); | |
93 | /* see how much of hit shields will absorb */ | |
94 | shldabsb = 0; | |
95 | if (Ship.shldup || Move.shldchg) | |
96 | { | |
97 | propor = Ship.shield; | |
35b95499 | 98 | propor /= Param.shield; |
d98c7187 KM |
99 | shldabsb = propor * chgfac * hit; |
100 | if (shldabsb > Ship.shield) | |
101 | shldabsb = Ship.shield; | |
35b95499 | 102 | Ship.shield -= shldabsb; |
d98c7187 KM |
103 | } |
104 | /* actually do the hit */ | |
105 | printf("\aHIT: %d units", hit); | |
106 | if (!damaged(SRSCAN)) | |
107 | printf(" from %d,%d", Etc.klingon[i].x, Etc.klingon[i].y); | |
108 | cas = (shldabsb * 100) / hit; | |
35b95499 | 109 | hit -= shldabsb; |
d98c7187 KM |
110 | if (shldabsb > 0) |
111 | printf(", shields absorb %d%%, effective hit %d\n", | |
112 | cas, hit); | |
113 | else | |
114 | printf("\n"); | |
35b95499 | 115 | tothit += hit; |
d98c7187 KM |
116 | if (hit > maxhit) |
117 | maxhit = hit; | |
35b95499 | 118 | Ship.energy -= hit; |
d98c7187 KM |
119 | /* see if damages occurred */ |
120 | if (hit >= (15 - Game.skill) * (25 - ranf(12))) | |
121 | { | |
122 | printf("\aCRITICAL HIT!!!\a\n"); | |
123 | /* select a device from probability vector */ | |
124 | cas = ranf(1000); | |
125 | for (l = 0; cas >= 0; l++) | |
35b95499 KL |
126 | cas -= Param.damprob[l]; |
127 | l -= 1; | |
d98c7187 KM |
128 | /* compute amount of damage */ |
129 | extradm = (hit * Param.damfac[l]) / (75 + ranf(25)) + 0.5; | |
130 | /* damage the device */ | |
131 | damage(l, extradm); | |
132 | if (damaged(SHIELD)) | |
133 | { | |
134 | if (Ship.shldup) | |
135 | printf("Sulu: Shields knocked down, captain.\n"); | |
136 | Ship.shldup = 0; | |
137 | Move.shldchg = 0; | |
138 | } | |
139 | } | |
140 | if (Ship.energy <= 0) | |
141 | lose(L_DSTRYD); | |
142 | } | |
143 | ||
144 | /* see what our casualities are like */ | |
145 | if (maxhit >= 200 || tothit >= 500) | |
146 | { | |
147 | cas = tothit * 0.015 * franf(); | |
148 | if (cas >= 2) | |
149 | { | |
150 | printf("McCoy: we suffered %d casualties in that attack.\n", | |
151 | cas); | |
35b95499 KL |
152 | Game.deaths += cas; |
153 | Ship.crew -= cas; | |
d98c7187 KM |
154 | } |
155 | } | |
156 | ||
157 | /* allow Klingons to move after attacking */ | |
158 | klmove(1); | |
159 | ||
160 | return; | |
161 | } |