1 /* $NetBSD: attack.c,v 1.4 1997/10/12 21:24:26 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1980, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 #ifndef lint 38 #if 0 39 static char sccsid[] = "@(#)attack.c 8.1 (Berkeley) 5/31/93"; 40 #else 41 __RCSID("$NetBSD: attack.c,v 1.4 1997/10/12 21:24:26 christos Exp $"); 42 #endif 43 #endif /* not lint */ 44 45 #include <stdio.h> 46 #include <math.h> 47 #include "trek.h" 48 49 /* 50 ** Klingon Attack Routine 51 ** 52 ** This routine performs the Klingon attack provided that 53 ** (1) Something happened this move (i.e., not free), and 54 ** (2) You are not cloaked. Note that if you issue the 55 ** cloak command, you are not considered cloaked until you 56 ** expend some time. 57 ** 58 ** Klingons are permitted to move both before and after the 59 ** attack. They will tend to move toward you before the 60 ** attack and away from you after the attack. 61 ** 62 ** Under certain conditions you can get a critical hit. This 63 ** sort of hit damages devices. The probability that a given 64 ** device is damaged depends on the device. Well protected 65 ** devices (such as the computer, which is in the core of the 66 ** ship and has considerable redundancy) almost never get 67 ** damaged, whereas devices which are exposed (such as the 68 ** warp engines) or which are particularly delicate (such as 69 ** the transporter) have a much higher probability of being 70 ** damaged. 71 ** 72 ** The actual amount of damage (i.e., how long it takes to fix 73 ** it) depends on the amount of the hit and the "damfac[]" 74 ** entry for the particular device. 75 ** 76 ** Casualties can also occur. 77 */ 78 79 void 80 attack(resting) 81 int resting; /* set if attack while resting */ 82 { 83 int hit, i, l; 84 int maxhit, tothit, shldabsb; 85 double chgfac, propor, extradm; 86 double dustfac, tothe; 87 int cas; 88 int hitflag; 89 90 if (Move.free) 91 return; 92 if (Etc.nkling <= 0 || Quad[Ship.quadx][Ship.quady].stars < 0) 93 return; 94 if (Ship.cloaked && Ship.cloakgood) 95 return; 96 /* move before attack */ 97 klmove(0); 98 if (Ship.cond == DOCKED) 99 { 100 if (!resting) 101 printf("Starbase shields protect the %s\n", Ship.shipname); 102 return; 103 } 104 /* setup shield effectiveness */ 105 chgfac = 1.0; 106 if (Move.shldchg) 107 chgfac = 0.25 + 0.50 * franf(); 108 maxhit = tothit = 0; 109 hitflag = 0; 110 111 /* let each Klingon do his damndest */ 112 for (i = 0; i < Etc.nkling; i++) 113 { 114 /* if he's low on power he won't attack */ 115 if (Etc.klingon[i].power < 20) 116 continue; 117 if (!hitflag) 118 { 119 printf("\nStardate %.2f: Klingon attack:\n", 120 Now.date); 121 hitflag++; 122 } 123 /* complete the hit */ 124 dustfac = 0.90 + 0.01 * franf(); 125 tothe = Etc.klingon[i].avgdist; 126 hit = Etc.klingon[i].power * pow(dustfac, tothe) * Param.hitfac; 127 /* deplete his energy */ 128 dustfac = Etc.klingon[i].power; 129 Etc.klingon[i].power = dustfac * Param.phasfac * (1.0 + (franf() - 0.5) * 0.2); 130 /* see how much of hit shields will absorb */ 131 shldabsb = 0; 132 if (Ship.shldup || Move.shldchg) 133 { 134 propor = Ship.shield; 135 propor /= Param.shield; 136 shldabsb = propor * chgfac * hit; 137 if (shldabsb > Ship.shield) 138 shldabsb = Ship.shield; 139 Ship.shield -= shldabsb; 140 } 141 /* actually do the hit */ 142 printf("HIT: %d units", hit); 143 if (!damaged(SRSCAN)) 144 printf(" from %d,%d", Etc.klingon[i].x, Etc.klingon[i].y); 145 cas = (shldabsb * 100) / hit; 146 hit -= shldabsb; 147 if (shldabsb > 0) 148 printf(", shields absorb %d%%, effective hit %d\n", 149 cas, hit); 150 else 151 printf("\n"); 152 tothit += hit; 153 if (hit > maxhit) 154 maxhit = hit; 155 Ship.energy -= hit; 156 /* see if damages occurred */ 157 if (hit >= (15 - Game.skill) * (25 - ranf(12))) 158 { 159 printf("CRITICAL HIT!!!\n"); 160 /* select a device from probability vector */ 161 cas = ranf(1000); 162 for (l = 0; cas >= 0; l++) 163 cas -= Param.damprob[l]; 164 l -= 1; 165 /* compute amount of damage */ 166 extradm = (hit * Param.damfac[l]) / (75 + ranf(25)) + 0.5; 167 /* damage the device */ 168 damage(l, extradm); 169 if (damaged(SHIELD)) 170 { 171 if (Ship.shldup) 172 printf("Sulu: Shields knocked down, captain.\n"); 173 Ship.shldup = 0; 174 Move.shldchg = 0; 175 } 176 } 177 if (Ship.energy <= 0) 178 lose(L_DSTRYD); 179 } 180 181 /* see what our casualities are like */ 182 if (maxhit >= 200 || tothit >= 500) 183 { 184 cas = tothit * 0.015 * franf(); 185 if (cas >= 2) 186 { 187 printf("McCoy: we suffered %d casualties in that attack.\n", 188 cas); 189 Game.deaths += cas; 190 Ship.crew -= cas; 191 } 192 } 193 194 /* allow Klingons to move after attacking */ 195 klmove(1); 196 197 return; 198 } 199