|
|
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[] = "@(#)klmove.c 5.3 (Berkeley) 6/18/88";
20: #endif /* not lint */
21:
22: # include "trek.h"
23:
24: /*
25: ** Move Klingons Around
26: **
27: ** This is a largely incomprehensible block of code that moves
28: ** Klingons around in a quadrant. It was written in a very
29: ** "program as you go" fashion, and is a prime candidate for
30: ** rewriting.
31: **
32: ** The flag `fl' is zero before an attack, one after an attack,
33: ** and two if you are leaving a quadrant. This serves to
34: ** change the probability and distance that it moves.
35: **
36: ** Basically, what it will try to do is to move a certain number
37: ** of steps either toward you or away from you. It will avoid
38: ** stars whenever possible. Nextx and nexty are the next
39: ** sector to move to on a per-Klingon basis; they are roughly
40: ** equivalent to Ship.sectx and Ship.secty for the starship. Lookx and
41: ** looky are the sector that you are going to look at to see
42: ** if you can move their. Dx and dy are the increment. Fudgex
43: ** and fudgey are the things you change around to change your
44: ** course around stars.
45: */
46:
47: klmove(fl)
48: int fl;
49: {
50: int n;
51: register struct kling *k;
52: double dx, dy;
53: int nextx, nexty;
54: register int lookx, looky;
55: int motion;
56: int fudgex, fudgey;
57: int qx, qy;
58: double bigger;
59: int i;
60:
61: # ifdef xTRACE
62: if (Trace)
63: printf("klmove: fl = %d, Etc.nkling = %d\n", fl, Etc.nkling);
64: # endif
65: for (n = 0; n < Etc.nkling; k && n++)
66: {
67: k = &Etc.klingon[n];
68: i = 100;
69: if (fl)
70: i = 100.0 * k->power / Param.klingpwr;
71: if (ranf(i) >= Param.moveprob[2 * Move.newquad + fl])
72: continue;
73: /* compute distance to move */
74: motion = ranf(75) - 25;
75: motion *= k->avgdist * Param.movefac[2 * Move.newquad + fl];
76: /* compute direction */
77: dx = Ship.sectx - k->x + ranf(3) - 1;
78: dy = Ship.secty - k->y + ranf(3) - 1;
79: bigger = dx;
80: if (dy > bigger)
81: bigger = dy;
82: if (bigger == 0.0)
83: bigger = 1.0;
84: dx = dx / bigger + 0.5;
85: dy = dy / bigger + 0.5;
86: if (motion < 0)
87: {
88: motion = -motion;
89: dx = -dx;
90: dy = -dy;
91: }
92: fudgex = fudgey = 1;
93: /* try to move the klingon */
94: nextx = k->x;
95: nexty = k->y;
96: for (; motion > 0; motion--)
97: {
98: lookx = nextx + dx;
99: looky = nexty + dy;
100: if (lookx < 0 || lookx >= NSECTS || looky < 0 || looky >= NSECTS)
101: {
102: /* new quadrant */
103: qx = Ship.quadx;
104: qy = Ship.quady;
105: if (lookx < 0)
106: qx -= 1;
107: else
108: if (lookx >= NSECTS)
109: qx += 1;
110: if (looky < 0)
111: qy -= 1;
112: else
113: if (looky >= NSECTS)
114: qy += 1;
115: if (qx < 0 || qx >= NQUADS || qy < 0 || qy >= NQUADS ||
116: Quad[qx][qy].stars < 0 || Quad[qx][qy].klings > MAXKLQUAD - 1)
117: break;
118: if (!damaged(SRSCAN))
119: {
120: printf("Klingon at %d,%d escapes to quadrant %d,%d\n",
121: k->x, k->y, qx, qy);
122: motion = Quad[qx][qy].scanned;
123: if (motion >= 0 && motion < 1000)
124: Quad[qx][qy].scanned += 100;
125: motion = Quad[Ship.quadx][Ship.quady].scanned;
126: if (motion >= 0 && motion < 1000)
127: Quad[Ship.quadx][Ship.quady].scanned -= 100;
128: }
129: Sect[k->x][k->y] = EMPTY;
130: Quad[qx][qy].klings += 1;
131: Etc.nkling -= 1;
132: bmove(&Etc.klingon[Etc.nkling], k, sizeof *k);
133: Quad[Ship.quadx][Ship.quady].klings -= 1;
134: k = 0;
135: break;
136: }
137: if (Sect[lookx][looky] != EMPTY)
138: {
139: lookx = nextx + fudgex;
140: if (lookx < 0 || lookx >= NSECTS)
141: lookx = nextx + dx;
142: if (Sect[lookx][looky] != EMPTY)
143: {
144: fudgex = -fudgex;
145: looky = nexty + fudgey;
146: if (looky < 0 || looky >= NSECTS || Sect[lookx][looky] != EMPTY)
147: {
148: fudgey = -fudgey;
149: break;
150: }
151: }
152: }
153: nextx = lookx;
154: nexty = looky;
155: }
156: if (k && (k->x != nextx || k->y != nexty))
157: {
158: if (!damaged(SRSCAN))
159: printf("Klingon at %d,%d moves to %d,%d\n",
160: k->x, k->y, nextx, nexty);
161: Sect[k->x][k->y] = EMPTY;
162: Sect[k->x = nextx][k->y = nexty] = KLINGON;
163: }
164: }
165: compkldist(0);
166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.