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