Walt Stoneburner's cleanup patch.
[vms-empire.git] / empire.h
1 /* %W% %G% %U% - (c) Copyright 1987, 1988 Chuck Simmons */
2
3 /*
4  *    Copyright (C) 1987, 1988 Chuck Simmons
5  * 
6  * See the file COPYING, distributed with empire, for restriction
7  * and warranty information.
8  */
9
10 /*
11 empire.h -- type and constant declarations
12 */
13
14 #ifndef TRUE
15 #define TRUE 1
16 #define FALSE 0
17 #endif
18
19 #ifndef NULL
20 #define NULL 0
21 #endif
22
23 /* Redefine some functions for portability. */
24 #ifdef LINUX
25 #include <string.h>
26 #elif SYSV
27 char *memset();
28 char *memcpy();
29 #define bzero(dst,len) memset(dst,0,len)
30 #else
31 #define memcpy(dst,src,len) bcopy((src),(dst),(len))
32 #define strchr(s,c) index(s,c)
33 typedef char chtype;
34 #define beep() (putchar('\7'))
35 #define napms(d) (usleep((d)*1000))
36 #endif
37
38
39
40
41 typedef unsigned char uchar;
42
43 #define ASSERT(x) if (!(x)) assert ("x", __FILE__, __LINE__);
44 #define ABORT assert ("aborting", __FILE__, __LINE__)
45
46 /* directions one can move */
47 #define NORTH 0
48 #define NORTHEAST 1
49 #define EAST 2
50 #define SOUTHEAST 3
51 #define SOUTH 4
52 #define SOUTHWEST 5
53 #define WEST 6
54 #define NORTHWEST 7
55
56 #define NUMTOPS 3 /* number of lines at top of screen for messages */
57 #define NUMSIDES 6 /* number of lines at side of screen */
58 #define STRSIZE 80 /* number of characters in a string */
59
60 /* Information we maintain about cities. */
61
62 #define NUM_CITY 70
63 #define UNOWNED 0
64 #define USER 1
65 #define COMP 2
66
67 /* Piece types. */
68 #define ARMY 0
69 #define FIGHTER 1
70 #define PATROL 2
71 #define DESTROYER 3
72 #define SUBMARINE 4
73 #define TRANSPORT 5
74 #define CARRIER 6
75 #define BATTLESHIP 7
76 #define SATELLITE 8
77 #define NUM_OBJECTS 9 /* number of defined objects */
78 #define NOPIECE ((char)255) /* a 'null' piece */
79
80 #define LIST_SIZE 5000 /* max number of pieces on board */
81
82 typedef struct city_info {
83         long loc; /* location of city */
84         uchar owner; /* UNOWNED, USER, COMP */
85         long func[NUM_OBJECTS]; /* function for each object */
86         long work; /* units of work performed */
87         char prod; /* item being produced */
88 } city_info_t;
89
90 /*
91 Types of programmed movement.  Use negative numbers for special
92 functions, use positive numbers to move toward a specific location.
93 */
94
95 #define NOFUNC -1       /* no programmed function */
96 #define RANDOM -2       /* move randomly */
97 #define SENTRY -3       /* sleep */
98 #define FILL -4         /* fill transport */
99 #define LAND -5         /* land fighter at city */
100 #define EXPLORE -6      /* piece explores nearby */
101 #define ARMYLOAD -7     /* army moves toward and boards a transport */
102 #define ARMYATTACK -8   /* army looks for city to attack */
103 #define TTLOAD -9       /* transport moves toward loading armies */
104 #define REPAIR -10      /* ship moves toward port */
105 #define WFTRANSPORT -11 /* army boards a transport */
106 #define MOVE_N -12      /* move north */
107 #define MOVE_NE -13     /* move northeast */
108 #define MOVE_E -14      /* move east */
109 #define MOVE_SE -15     /* move southeast */
110 #define MOVE_S -16      /* move south */
111 #define MOVE_SW -17     /* move southwest */
112 #define MOVE_W -18      /* move west */
113 #define MOVE_NW -19     /* move northwest */
114
115 /* Index to list of function names. */
116 #define FUNCI(x) (-(x)-1)
117
118 /*
119 Macro to convert a movement function into a direction.
120 */
121
122 #define MOVE_DIR(a) (-(a)+MOVE_N)
123
124 /*
125 Information we maintain about each piece.
126 */
127
128 typedef struct { /* ptrs for doubly linked list */
129         struct piece_info *next; /* pointer to next in list */
130         struct piece_info *prev; /* pointer to prev in list */
131 } link_t;
132
133 typedef struct piece_info {
134         link_t piece_link; /* linked list of pieces of this type */
135         link_t loc_link; /* linked list of pieces at a location */
136         link_t cargo_link; /* linked list of cargo pieces */
137         int owner; /* owner of piece */
138         int type; /* type of piece */
139         long loc; /* location of piece */
140         long func; /* programmed type of movement */
141         short hits; /* hits left */
142         int moved; /* moves made */
143         struct piece_info *ship; /* pointer to containing ship */
144         struct piece_info *cargo; /* pointer to cargo list */
145         short count; /* count of items on board */
146         short range; /* current range (if applicable) */
147 } piece_info_t;
148
149 /*
150 Macros to link and unlink an object from a doubly linked list.
151 */
152
153 #define LINK(head,obj,list) { \
154         obj->list.prev = NULL; \
155         obj->list.next = head; \
156         if (head) head->list.prev = obj; \
157         head = obj; \
158 }
159
160 #define UNLINK(head,obj,list) { \
161         if (obj->list.next) \
162                 obj->list.next->list.prev = obj->list.prev; \
163         if (obj->list.prev) \
164                 obj->list.prev->list.next = obj->list.next; \
165         else head = obj->list.next; \
166         obj->list.next = NULL; /* encourage mem faults in buggy code */ \
167         obj->list.prev = NULL; \
168 }
169
170 /* macros to set map and list of an object */
171 #define MAP(owner) ((owner) == USER ? user_map : comp_map)
172 #define LIST(owner) ((owner) == USER ? user_obj : comp_obj)
173
174 /* macro to step through adjacent cells */
175 #define FOR_ADJ(loc,new_loc,i) for (i=0; (i<8 ? new_loc=loc+dir_offset[i],1 : 0); i++)
176 #define FOR_ADJ_ON(loc,new_loc,i) FOR_ADJ(loc,new_loc,i) if (map[new_loc].on_board)
177
178 /*
179 We maintain attributes for each piece.  Attributes are currently constant,
180 but the way has been paved to allow user's to change attributes at the
181 beginning of a game.
182 */
183
184 #define INFINITY 10000000 /* a large number */
185
186 typedef struct piece_attr {
187         char sname; /* eg 'C' */
188         char name[20]; /* eg "aircraft carrier" */
189         char nickname[20]; /* eg "carrier" */
190         char article[20]; /* eg "an aircraft carrier" */
191         char plural[20]; /* eg "aircraft carriers" */
192         char terrain[4]; /* terrain piece can pass over eg "." */
193         uchar build_time; /* time needed to build unit */
194         uchar strength; /* attack strength */
195         uchar max_hits; /* number of hits when completely repaired */
196         uchar speed; /* number of squares moved per turn */
197         uchar capacity; /* max objects that can be held */
198         long range; /* range of piece */
199 } piece_attr_t;
200
201 /*
202 There are 3 maps.  'map' describes the world as it actually
203 exists; it tells whether each map cell is land, water or a city;
204 it tells whether or not a square is on the board.
205
206 'user_map' describes the user's view of the world.  'comp_map' describes
207 the computer's view of the world.
208 */
209
210 #define MAP_WIDTH 100
211 #define MAP_HEIGHT 60
212 #define MAP_SIZE (MAP_WIDTH * MAP_HEIGHT)
213
214 typedef struct real_map { /* a cell of the actual map */
215         char contents; /* '+', '.', or '*' */
216         uchar on_board; /* TRUE iff on the board */
217         city_info_t *cityp; /* ptr to city at this location */
218         piece_info_t *objp; /* list of objects at this location */
219 } real_map_t;
220
221 typedef struct view_map { /* a cell of one player's world view */
222         char contents; /* '+', '.', '*', 'A', 'a', etc */
223         long seen; /* date when last updated */
224 } view_map_t;
225
226 /* Define information we maintain for a pathmap. */
227
228 typedef struct {
229         int cost; /* total cost to get here */
230         int inc_cost; /* incremental cost to get here */
231         char terrain; /* T_LAND, T_WATER, T_UNKNOWN, T_PATH */
232 } path_map_t;
233
234 #define T_UNKNOWN 0
235 #define T_PATH 1
236 #define T_LAND 2
237 #define T_WATER 4
238 #define T_AIR (T_LAND | T_WATER)
239
240 /* A record for counts we obtain when scanning a continent. */
241
242 typedef struct {
243         int user_cities; /* number of user cities on continent */
244         int user_objects[NUM_OBJECTS];
245         int comp_cities;
246         int comp_objects[NUM_OBJECTS];
247         int size; /* size of continent in cells */
248         int unowned_cities; /* number of unowned cities */
249         int unexplored; /* unexplored territory */
250 } scan_counts_t;
251
252 /* Define useful constants for accessing sectors. */
253
254 #define SECTOR_ROWS 5 /* number of vertical sectors */
255 #define SECTOR_COLS 2 /* number of horizontal sectors */
256 #define NUM_SECTORS (SECTOR_ROWS * SECTOR_COLS) /* total sectors */
257 #define ROWS_PER_SECTOR ((MAP_HEIGHT+SECTOR_ROWS-1)/SECTOR_ROWS)
258 #define COLS_PER_SECTOR ((MAP_WIDTH+SECTOR_COLS-1)/SECTOR_COLS)
259
260 /* Information we need for finding a path for moving a piece. */
261
262 typedef struct {
263         char city_owner; /* char that represents home city */
264         char *objectives; /* list of objectives */
265         int weights[11]; /* weight of each objective */
266 } move_info_t;
267
268 /* special weights */
269 #define W_TT_BUILD -1 /* special cost for city building a tt */
270
271 /* List of cells in the perimeter of our searching for a path. */
272
273 typedef struct {
274         long len; /* number of items in list */
275         long list[MAP_SIZE]; /* list of locations */
276 } perimeter_t;