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