Use toupper(c) rather than homegrown code.
[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 int rndint(int minp, int maxp)
42 {
43         int size;
44
45         size = maxp - minp + 1;
46         return ((rand() % size) + minp);
47 }
48
49 /*
50 Return the distance between two locations.  This is simply
51 the max of the absolute differnce between the x and y coordinates.
52 */
53
54 #define MIN(a,b) ((a)<(b) ? (a) : (b))
55 #define MAX(a,b) ((a)>(b) ? (a) : (b))
56 #define ABS(a) ((a) < 0 ? -(a) : (a))
57
58 int
59 dist(loc_t a, loc_t b)
60 {
61         int ax, ay, bx, by;
62
63         ax = loc_row (a);
64         ay = loc_col (a);
65         bx = loc_row (b);
66         by = loc_col (b);
67
68         return (MAX (ABS (ax-bx), ABS (ay-by)));
69 }
70
71 /*
72 Find the square root of an integer.  We actually return the floor
73 of the square root using Newton's method.
74 */
75
76 int isqrt(int n)
77 {
78         int guess;
79         
80         ASSERT (n >= 0); /* can't take sqrt of negative number */
81
82         if (n <= 1) return (n); /* do easy cases and avoid div by zero */
83                 
84         guess = 2; /* gotta start somewhere */
85         guess = (guess + n/guess) / 2;
86         guess = (guess + n/guess) / 2;
87         guess = (guess + n/guess) / 2;
88         guess = (guess + n/guess) / 2;
89         guess = (guess + n/guess) / 2;
90         
91         if (guess * guess > n) guess -= 1; /* take floor */
92         return (guess);
93 }