|
|
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.