1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32: #include <sys/cdefs.h>
33: #ifndef lint
34: #if 0
35: static char sccsid[] = "@(#)klmove.c 8.1 (Berkeley) 5/31/93";
36: #else
37: __RCSID("$NetBSD: klmove.c,v 1.5 2003/08/07 09:37:52 agc Exp $");
38: #endif
39: #endif
40:
41: #include <stdio.h>
42: #include "trek.h"
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67: void
68: klmove(fl)
69: int fl;
70: {
71: int n;
72: struct kling *k;
73: double dx, dy;
74: int nextx, nexty;
75: int lookx, looky;
76: int motion;
77: int fudgex, fudgey;
78: int qx, qy;
79: double bigger;
80: int i;
81:
82: # ifdef xTRACE
83: if (Trace)
84: printf("klmove: fl = %d, Etc.nkling = %d\n", fl, Etc.nkling);
85: # endif
86: for (n = 0; n < Etc.nkling; n++)
87: {
88: k = &Etc.klingon[n];
89: i = 100;
90: if (fl)
91: i = 100.0 * k->power / Param.klingpwr;
92: if (ranf(i) >= Param.moveprob[2 * Move.newquad + fl])
93: continue;
94:
95: motion = ranf(75) - 25;
96: motion *= k->avgdist * Param.movefac[2 * Move.newquad + fl];
97:
98: dx = Ship.sectx - k->x + ranf(3) - 1;
99: dy = Ship.secty - k->y + ranf(3) - 1;
100: bigger = dx;
101: if (dy > bigger)
102: bigger = dy;
103: if (bigger == 0.0)
104: bigger = 1.0;
105: dx = dx / bigger + 0.5;
106: dy = dy / bigger + 0.5;
107: if (motion < 0)
108: {
109: motion = -motion;
110: dx = -dx;
111: dy = -dy;
112: }
113: fudgex = fudgey = 1;
114:
115: nextx = k->x;
116: nexty = k->y;
117: for (; motion > 0; motion--)
118: {
119: lookx = nextx + dx;
120: looky = nexty + dy;
121: if (lookx < 0 || lookx >= NSECTS || looky < 0 || looky >= NSECTS)
122: {
123:
124: qx = Ship.quadx;
125: qy = Ship.quady;
126: if (lookx < 0)
127: qx -= 1;
128: else
129: if (lookx >= NSECTS)
130: qx += 1;
131: if (looky < 0)
132: qy -= 1;
133: else
134: if (looky >= NSECTS)
135: qy += 1;
136: if (qx < 0 || qx >= NQUADS || qy < 0 || qy >= NQUADS ||
137: Quad[qx][qy].stars < 0 || Quad[qx][qy].klings > MAXKLQUAD - 1)
138: break;
139: if (!damaged(SRSCAN))
140: {
141: printf("Klingon at %d,%d escapes to quadrant %d,%d\n",
142: k->x, k->y, qx, qy);
143: motion = Quad[qx][qy].scanned;
144: if (motion >= 0 && motion < 1000)
145: Quad[qx][qy].scanned += 100;
146: motion = Quad[Ship.quadx][Ship.quady].scanned;
147: if (motion >= 0 && motion < 1000)
148: Quad[Ship.quadx][Ship.quady].scanned -= 100;
149: }
150: Sect[k->x][k->y] = EMPTY;
151: Quad[qx][qy].klings += 1;
152: Etc.nkling -= 1;
153: *k = Etc.klingon[Etc.nkling];
154: Quad[Ship.quadx][Ship.quady].klings -= 1;
155: k = 0;
156: break;
157: }
158: if (Sect[lookx][looky] != EMPTY)
159: {
160: lookx = nextx + fudgex;
161: if (lookx < 0 || lookx >= NSECTS)
162: lookx = nextx + dx;
163: if (Sect[lookx][looky] != EMPTY)
164: {
165: fudgex = -fudgex;
166: looky = nexty + fudgey;
167: if (looky < 0 || looky >= NSECTS || Sect[lookx][looky] != EMPTY)
168: {
169: fudgey = -fudgey;
170: break;
171: }
172: }
173: }
174: nextx = lookx;
175: nexty = looky;
176: }
177: if (k && (k->x != nextx || k->y != nexty))
178: {
179: if (!damaged(SRSCAN))
180: printf("Klingon at %d,%d moves to %d,%d\n",
181: k->x, k->y, nextx, nexty);
182: Sect[k->x][k->y] = EMPTY;
183: Sect[k->x = nextx][k->y = nexty] = KLINGON;
184: }
185: }
186: compkldist(0);
187: }