cleanup, add Berkeley header
[unix-history] / usr / src / games / trek / klmove.c
CommitLineData
9758240b
KM
1/*
2 * Copyright (c) 1980 Regents of the University of California.
e9fb6bea
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
d99e6414
KB
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.
9758240b
KM
16 */
17
b8768ee6 18#ifndef lint
d99e6414 19static char sccsid[] = "@(#)klmove.c 5.3 (Berkeley) %G%";
e9fb6bea 20#endif /* not lint */
b8768ee6
KM
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
47klmove(fl)
48int 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;
06d69904 75 motion *= k->avgdist * Param.movefac[2 * Move.newquad + fl];
b8768ee6
KM
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)
06d69904 106 qx -= 1;
b8768ee6
KM
107 else
108 if (lookx >= NSECTS)
06d69904 109 qx += 1;
b8768ee6 110 if (looky < 0)
06d69904 111 qy -= 1;
b8768ee6
KM
112 else
113 if (looky >= NSECTS)
06d69904 114 qy += 1;
b8768ee6
KM
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)
06d69904 124 Quad[qx][qy].scanned += 100;
b8768ee6
KM
125 motion = Quad[Ship.quadx][Ship.quady].scanned;
126 if (motion >= 0 && motion < 1000)
06d69904 127 Quad[Ship.quadx][Ship.quady].scanned -= 100;
b8768ee6
KM
128 }
129 Sect[k->x][k->y] = EMPTY;
06d69904
KL
130 Quad[qx][qy].klings += 1;
131 Etc.nkling -= 1;
b8768ee6 132 bmove(&Etc.klingon[Etc.nkling], k, sizeof *k);
06d69904 133 Quad[Ship.quadx][Ship.quady].klings -= 1;
b8768ee6
KM
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}