Adapted for modrn C compiler.
[vms-empire.git] / empire.c
1 /* $Id: empire.c,v 1.2 1990/03/29 23:22:07 eric Exp esr $  - (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.c -- this file contains initialization code, the main command
12 parser, and the simple commands.
13 */
14
15 #include <stdio.h>
16 #include <curses.h>
17 #include "empire.h"
18 #include "extern.h"
19
20 void c_examine(), c_movie();
21
22 void
23 empire () {
24         void do_command();
25         void print_zoom();
26
27         char order;
28         int turn = 0;
29
30         ttinit (); /* init tty */
31         rndini (); /* init random number generator */
32
33         clear_screen (); /* nothing on screen */
34         (void) move (7, 0);
35         ver ();
36         pos_str (8, 0, "Detailed directions are in EMPIRE.DOC\n");
37         (void) refresh ();
38
39         if (!restore_game ()) /* try to restore previous game */
40                 init_game (); /* otherwise init a new game */
41
42         /* Command loop starts here. */
43
44         for (;;) { /* until user quits */
45             if (automove) { /* don't ask for cmd in auto mode */
46                 user_move ();
47                 comp_move (1);
48                 if (++turn % save_interval == 0)
49                         save_game ();
50             }
51             else {
52                 prompt (0); /* blank top line */
53                 (void) refresh ();
54                 prompt ("Your orders? ");
55                 order = get_chx (); /* get a command */
56                 do_command (order);
57             }
58         }
59 }
60
61 /*
62 Execute a command.
63 */
64
65 void
66 do_command (orders)
67 char orders;
68 {
69         void c_debug(), c_quit(), c_sector(), c_map();
70         void c_give();
71
72         char e;
73         int ncycle;
74
75         switch (orders) {
76         case 'A': /* turn on auto move mode */
77                 automove = TRUE;
78                 error ("Now in Auto-Mode");
79                 user_move ();
80                 comp_move (1);
81                 save_game ();
82                 break;
83
84         case 'C': /* give a city to the computer */
85                 c_give ();
86                 break;
87         
88         case 'D': /* display round number */
89                 error ("Round #%d", date);
90                 break;
91
92         case 'E': /* examine enemy map */
93                 if (resigned) c_examine ();
94                 else huh (); /* illegal command */
95                 break;
96
97         case 'F': /* print map to file */
98                 c_map ();
99                 break;
100
101         case 'G': /* give one free enemy move */
102                 comp_move (1);
103                 break;
104
105         case 'H': /* help */
106                 help (help_cmd, cmd_lines);
107                 break;
108
109         case 'J': /* edit mode */
110                 ncycle = cur_sector ();
111                 if (ncycle == -1) ncycle = 0;
112                 edit (sector_loc (ncycle));
113                 break;
114
115         case 'M': /* move */
116                 user_move ();
117                 comp_move (1);
118                 save_game ();
119                 break;
120
121         case 'N': /* give enemy free moves */
122                 ncycle = getint ("Number of free enemy moves: ");
123                 comp_move (ncycle);
124                 save_game ();
125                 break;
126
127         case 'P': /* print a sector */
128                 c_sector ();
129                 break;
130
131         case '\026': /* some interrupt */
132         case 'Q': /* quit */
133                 c_quit ();
134                 break;
135
136         case 'R': /* restore game */
137                 clear_screen ();
138                 e = restore_game ();
139                 break;
140
141         case 'S': /* save game */
142                 save_game ();
143                 break;
144         
145         case 'T': /* trace: toggle save_movie flag */
146                 save_movie = !save_movie;
147                 if (save_movie) comment ("Saving movie screens to 'empmovie.dat'.");
148                 else comment ("No longer saving movie screens.");
149                 break;
150
151         case 'W': /* watch movie */
152                 if (resigned || debug) replay_movie ();
153                 else error ("You cannot watch movie until computer resigns.");
154                 break;
155         
156         case 'Z': /* print compressed map */
157                 (void) clear ();
158                 print_zoom (user_map);
159                 (void) refresh ();
160                 break;
161
162         case '\014': /* redraw the screen */
163                 redraw ();
164                 break;
165
166         case '+': /* change debug state */
167                 e = get_chx();
168                 if ( e  ==  '+' ) debug = TRUE;
169                 else if ( e  ==  '-' ) debug = FALSE;
170                 else huh ();
171                 break;
172
173         default:
174                 if (debug) c_debug (orders); /* debug */
175                 else huh (); /* illegal command */
176                 break;
177         }
178         e = e; /* keep lint quiet */
179 }
180
181 /*
182 Give an unowned city (if any) to the computer.  We make
183 a list of unowned cities, choose one at random, and mark
184 it as the computers.
185 */
186
187 void
188 c_give () {
189         int unowned[NUM_CITY];
190         long i, count;
191
192         count = 0; /* nothing in list yet */
193         for (i = 0; i < NUM_CITY; i++) {
194                 if (city[i].owner == UNOWNED) {
195                         unowned[count] = i; /* remember this city */
196                         count += 1;
197                 }
198         }
199         if (count == 0) {
200                 error ("There are no unowned cities.");
201                 return;
202         }
203         i = irand (count);
204         i = unowned[i]; /* get city index */
205         city[i].owner = COMP;
206         city[i].prod = NOPIECE;
207         city[i].work = 0;
208         scan (comp_map, city[i].loc);
209 }
210
211 /*
212 Debugging commands should be implemented here.  
213 The order cannot be any legal command.
214 */
215
216 void
217 c_debug (order)
218 char order;
219 {
220         char e;
221
222         switch (order) {
223         case '#' : c_examine (); break;
224         case '%' : c_movie (); break;
225         
226         case '@': /* change trace state */
227                 e = get_chx();
228                 if ( e  ==  '+' ) trace_pmap = TRUE;
229                 else if ( e  ==  '-' ) trace_pmap = FALSE;
230                 else huh ();
231                 break;
232
233         case '$': /* change print_debug state */
234                 e = get_chx();
235                 if ( e  ==  '+' ) print_debug = TRUE;
236                 else if ( e  ==  '-' ) print_debug = FALSE;
237                 else huh ();
238                 break;
239
240         case '&': /* change print_vmap state */
241                 print_vmap = get_chx();
242                 break;
243
244         default: huh (); break;
245         }
246 }
247
248 /*
249 The quit command.  Make sure the user really wants to quit.
250 */
251
252 void
253 c_quit () {
254         if (getyn ("QUIT - Are you sure? ")) {
255             empend ();
256         }
257 }
258
259 /*
260 Print a sector.  Read the sector number from the user
261 and print it.
262 */
263
264 void
265 c_sector () {
266         int num;
267
268         num = get_range ("Sector number? ", 0, NUM_SECTORS-1);
269         print_sector_u (num);
270 }
271
272 /*
273 Print the map to a file.  We ask for a filename, attempt to open the
274 file, and if successful, print out the user's information to the file.
275 We print the map sideways to make it easier for the user to print
276 out the map.
277 */
278
279 void
280 c_map () {
281         FILE *f;
282         int i, j;
283         char line[MAP_HEIGHT+2];
284
285         prompt ("Filename? ");
286         get_str (jnkbuf, STRSIZE);
287
288         f = fopen (jnkbuf, "w");
289         if (f == NULL) {
290                 error ("I can't open that file.");
291                 return;
292         }
293         for (i = 0; i < MAP_WIDTH; i++) { /* for each column */
294                 for (j = MAP_HEIGHT-1; j >= 0; j--) { /* for each row */
295                         line[MAP_HEIGHT-1-j] = user_map[row_col_loc(j,i)].contents;
296                 }
297                 j = MAP_HEIGHT-1;
298                 while (j >= 0 && line[j] == ' ') /* scan off trailing blanks */
299                         j -= 1;
300                         
301                 line[++j] = '\n';
302                 line[++j] = 0; /* trailing null */
303                 (void) fputs (line, f);
304         }
305         (void) fclose (f);
306 }
307
308 /*
309 Allow user to examine the computer's map.
310 */
311
312 void
313 c_examine () {
314         int num;
315
316         num = get_range ("Sector number? ", 0, NUM_SECTORS-1);
317         print_sector_c (num);
318 }
319
320 /*
321 We give the computer lots of free moves and
322 Print a "zoomed" version of the computer's map.
323 */
324
325 void
326 c_movie () {
327         (void) clear ();
328         for (;;) {
329                 comp_move (1);
330                 print_zoom (comp_map);
331                 save_game ();
332 #ifdef PROFILE
333                 if (date == 125) empend();
334 #endif
335         }
336 }