Another shipper metadata change.
[vms-empire.git] / math.c
1 /*
2  *    Copyright (C) 1987, 1988 Chuck Simmons
3  * 
4  * See the file COPYING, distributed with empire, for restriction
5  * and warranty information.
6  */
7
8 /*
9 math.c -- various mathematical routines.
10
11 This file contains routines used to create random integers.  The
12 initialization routine 'rndini' should be called at program startup.
13 The flavors of random integers that can be generated are:
14
15     irand(n) -- returns a random integer in the range 0..n-1
16     rndint(a,b) -- returns a random integer in the range a..b
17
18 Other routines include:
19
20     dist (a, b) -- returns the straight-line distance between two locations.
21 */
22
23 #include <stdlib.h>
24 #include <time.h>
25 #include "empire.h"
26 #include "extern.h"
27
28 void rndini(void)
29 {
30         srand((unsigned)(time(0) & 0xFFFF));
31 }
32
33 long irand(long high)
34 {
35         if (high < 2) {
36                 return (0);
37         }
38         return (rand() % high);
39 }
40
41 #ifdef __UNUSED__
42 int rndint(int minp, int maxp)
43 {
44         int size;
45
46         size = maxp - minp + 1;
47         return ((rand() % size) + minp);
48 }
49 #endif
50
51 /*
52 Return the distance between two locations.  This is simply
53 the max of the absolute differnce between the x and y coordinates.
54 */
55
56 #define MIN(a,b) ((a)<(b) ? (a) : (b))
57 #define MAX(a,b) ((a)>(b) ? (a) : (b))
58 #define ABS(a) ((a) < 0 ? -(a) : (a))
59
60 int
61 dist(loc_t a, loc_t b)
62 {
63         int ax, ay, bx, by;
64
65         ax = loc_row (a);
66         ay = loc_col (a);
67         bx = loc_row (b);
68         by = loc_col (b);
69
70         return (MAX (ABS (ax-bx), ABS (ay-by)));
71 }
72
73 /*
74 Find the square root of an integer.  We actually return the floor
75 of the square root using Newton's method.
76 */
77
78 int isqrt(int n)
79 {
80         int guess;
81         
82         ASSERT (n >= 0); /* can't take sqrt of negative number */
83
84         if (n <= 1) return (n); /* do easy cases and avoid div by zero */
85                 
86         guess = 2; /* gotta start somewhere */
87         guess = (guess + n/guess) / 2;
88         guess = (guess + n/guess) / 2;
89         guess = (guess + n/guess) / 2;
90         guess = (guess + n/guess) / 2;
91         guess = (guess + n/guess) / 2;
92         
93         if (guess * guess > n) guess -= 1; /* take floor */
94         return (guess);
95 }