date and time created 83/03/23 14:59:58 by mckusick
[unix-history] / usr / src / games / trek / compkl.c
CommitLineData
f67257fc
KM
1#ifndef lint
2static char sccsid[] = "@(#)compkl.c 4.1 (Berkeley) %G%";
3#endif not lint
4
5# include "trek.h"
6
7/*
8** compute klingon distances
9**
10** The klingon list has the distances for all klingons recomputed
11** and sorted. The parameter is a Boolean flag which is set if
12** we have just entered a new quadrant.
13**
14** This routine is used every time the Enterprise or the Klingons
15** move.
16*/
17
18compkldist(f)
19int f; /* set if new quadrant */
20{
21 register int i, dx, dy;
22 double d;
23 double temp;
24
25 if (Etc.nkling == 0)
26 return;
27 for (i = 0; i < Etc.nkling; i++)
28 {
29 /* compute distance to the Klingon */
30 dx = Ship.sectx - Etc.klingon[i].x;
31 dy = Ship.secty - Etc.klingon[i].y;
32 d = dx * dx + dy * dy;
33 d = sqrt(d);
34
35 /* compute average of new and old distances to Klingon */
36 if (!f)
37 {
38 temp = Etc.klingon[i].dist;
39 Etc.klingon[i].avgdist = 0.5 * (temp + d);
40 }
41 else
42 {
43 /* new quadrant: average is current */
44 Etc.klingon[i].avgdist = d;
45 }
46 Etc.klingon[i].dist = d;
47 }
48
49 /* leave them sorted */
50 sortkl();
51}
52
53
54/*
55** sort klingons
56**
57** bubble sort on ascending distance
58*/
59
60sortkl()
61{
62 struct kling t;
63 register int f, i, m;
64
65 m = Etc.nkling - 1;
66 f = 1;
67 while (f)
68 {
69 f = 0;
70 for (i = 0; i < m; i++)
71 if (Etc.klingon[i].dist > Etc.klingon[i+1].dist)
72 {
73 bmove(&Etc.klingon[i], &t, sizeof t);
74 bmove(&Etc.klingon[i+1], &Etc.klingon[i], sizeof t);
75 bmove(&t, &Etc.klingon[i+1], sizeof t);
76 f = 1;
77 }
78 }
79 return;
80}