|
|
1.1 root 1: # include "trek.h"
2:
3: /**
4: ** phaser control
5: **/
6:
7: CVNTAB Matab[]
8: {
9: "a", "utomatic",
10: "m", "anual",
11: 0
12: };
13:
14: phaser()
15: {
16: register int i, k;
17: int manual, flag, units, extra;
18: int hit, reqd, n;
19: double tot;
20: int hits[MAXKLQUAD], hitreqd[MAXKLQUAD];
21: double dustfac, tothe;
22:
23: if (Status.cond == DOCKED) {
24: printf("Phasers cannot fire through starbase shields.\n");
25: return;
26: }
27: if (Damage[PHASER]) {
28: printf("Phaser control damaged.\n");
29: return;
30: }
31: if (Status.shldup) {
32: printf("Scotty: we will have to divert power from the shields.\n");
33: if(!getynpar("Is that wise"))
34: return;
35: Move.shldchg = 1;
36: }
37: if (Status.cloaked) {
38: printf("Sulu: Captain, you know that we cannot fire while cloaked.\n");
39: return;
40: }
41: manual = 0;
42: if (Damage[COMPUTER])
43: if(lineended()) {
44: printf("Computer damaged, manual mode selected\n");
45: manual = 1;
46: }
47:
48: if (!manual)
49: {
50: if((manual=(getcodpar("Manual or automatic", Matab))) < 0) return;
51: }
52: if (!manual && Damage[COMPUTER])
53: {
54: printf("Computer damaged, manual selected\n");
55: newline();
56: manual = 1;
57: }
58:
59: /* set up hits[] with amount for each klingon */
60: flag = 1;
61: n = Nkling;
62: if (manual)
63: {
64: while (flag)
65: {
66: printf("%d units available\n", Status.energy);
67: extra = 0;
68: for (i = 0; i < n; i++)
69: {
70: printf("Klingon at %d,%d:",
71: Kling[i].x, Kling[i].y);
72: if(getintpar(" units to fire", &units)==0 || units < 0) return;
73: hits[i] = units;
74: extra =+ units;
75: if (extra > Status.energy)
76: {
77: printf("Available energy exceeded. ");
78: newline();
79: break;
80: }
81: }
82: flag = i < n;
83: if (extra <= 0)
84: return;
85: }
86: Status.energy =- extra;
87: extra = 0;
88: }
89: else
90: {
91: /* automatic distribution of power */
92: printf("Phasers locked on target. ");
93: while (flag)
94: {
95: printf("%d units available\n", Status.energy);
96: if(getintpar("Units to fire", &units)==0 || units < 0) return;
97: if (units > Status.energy)
98: {
99: printf("Available energy exceeded. ");
100: newline();
101: continue;
102: }
103: flag = 0;
104: Status.energy =- units;
105: extra = units;
106: if (Nkling != 0)
107: {
108: tot = Nkling * (Nkling + 1) / 2;
109: for (i = 0; i < Nkling; i++)
110: {
111: hits[i] = ((Nkling - i) / tot) * extra;
112: extra =- hits[i];
113: dustfac = 0.90;
114: tothe = Kling[i].dist;
115: hitreqd[i] = Kling[i].power / pow(dustfac, tothe) + 0.5;
116: if (hits[i] > hitreqd[i])
117: {
118: extra =+ hits[i] - hitreqd[i];
119: hits[i] = hitreqd[i];
120: }
121: }
122: if (extra != 0)
123: {
124: for (i = 0; i < Nkling; i++)
125: {
126: reqd = hitreqd[i] - hits[i];
127: if (reqd <= 0)
128: continue;
129: if (reqd >= extra)
130: {
131: hits[i] =+ extra;
132: extra = 0;
133: break;
134: }
135: hits[i] = hitreqd[i];
136: extra =- reqd;
137: }
138: }
139: }
140: }
141: }
142:
143: /* actually fire the shots */
144: Move.free = 0;
145: k = 0;
146: for (i = 0; i < n; i++)
147: {
148: if (hits[i] == 0)
149: {
150: k =+ 1;
151: continue;
152: }
153: dustfac = 0.90 + 0.01 * franf();
154: tothe = Kling[k].dist;
155: hit = hits[i] * pow(dustfac, tothe) + 0.5;
156: Kling[k].power =- hit;
157: printf("%d unit hit\t", hit);
158: if (Kling[k].power <= 0) {
159: extra =- Kling[k].power;
160: killk(Kling[k].x, Kling[k].y);
161: } else {
162: printf("on Klingon at %d,%d\n", Kling[k].x, Kling[k].y);
163: k =+ 1;
164: }
165: }
166: if (extra > 0)
167: printf("%d units expended on empty space\n", extra);
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.