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