Documentation cleanup.
[vms-empire.git] / term.c
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 term.c -- this file contains various routines used to control the
12 user communications area of the terminal.  This area consists of
13 the top 3 lines of the terminal where messages are displayed to the
14 user and input is acquired from the user.
15
16 There are two types of output in this area.  One type is interactive
17 output.  This consists of a prompt line and an error message line.
18 The other type of output is informational output.  The user must
19 be given time to read informational output.
20
21 Whenever input is received, the top three lines are cleared and the
22 screen refreshed as the user has had time to read these lines.  We
23 also clear the 'need_delay' flag, saying that the user has read the
24 information on the screen.
25
26 When information is to be displayed, if the 'need_delay' flag is set,
27 we refresh the screen and pause momentarily to give the user a chance
28 to read the lines.  The new information is then displayed, and the
29 'need_delay' flag is set.
30 */
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <curses.h>
35 #include <ctype.h>
36
37 #include "empire.h"
38 #include "extern.h"
39
40 static int need_delay;
41 static FILE *my_stream;
42 void
43 /* VARARGS1 */
44 pdebug (s, a, b, c, d, e, f, g, h)
45 char *s;
46 int a, b, c, d, e, f, g, h;
47 {
48         if (!print_debug) return;
49         comment (s, a, b, c, d, e, f, g, h);
50 }
51
52 /*
53 Here are routines that handle printing to the top few lines of the
54 screen.  'topini' should be called at initialization, and whenever
55 we finish printing information to the screen.
56 */
57
58 void
59 topini()
60 {
61         info (0, 0, 0);
62 }
63 /*
64 Write a message to one of the top lines.
65 */
66
67 void
68 /* VARARGS2 */
69 topmsg(linep, buf, a, b, c, d, e, f, g, h)
70 int linep;
71 char *buf;
72 int a, b, c, d, e, f, g, h;
73 {
74         if (linep < 1 || linep > NUMTOPS)
75                 linep = 1;
76         (void) move (linep - 1, 0);
77         
78         if (buf != NULL && strlen (buf) > 0)
79                 addprintf (buf, a, b, c, d, e, f, g, h);
80         
81         (void) clrtoeol ();
82 }
83
84 void
85 topmsg1 (linep, buf, a, b, c, d, e, f, g, h)
86 int linep;
87 char *buf;
88 char *a;
89 int b, c, d, e, f, g, h;
90 {
91         if (linep < 1 || linep > NUMTOPS)
92                 linep = 1;
93         (void) move (linep - 1, 0);
94         
95         if (buf != NULL && strlen (buf) > 0)
96                 addprintf1 (buf, a, b, c, d, e, f, g, h);
97         
98         (void) clrtoeol ();
99 }
100 void
101 topmsg2 (linep, buf, a, b, c, d, e, f, g, h)
102 int linep;
103 char *buf;
104 char *a, *e, *f;
105 int b, c, d, g, h;
106 {
107         if (linep < 1 || linep > NUMTOPS)
108                 linep = 1;
109         (void) move (linep - 1, 0);
110         
111         if (buf != NULL && strlen (buf) > 0)
112                 addprintf2 (buf, a, b, c, d, e, f, g, h);
113         
114         (void) clrtoeol ();
115 }
116 /*
117 Print a prompt on the first message line.
118 */
119
120 void
121 /* VARARGS1 */
122 prompt (buf, a, b, c, d, e, f, g, h)
123 char *buf;
124 int a,b,c,d,e,f,g,h;
125 {
126         topmsg (1, buf, a, b, c, d, e, f, g, h);
127 }
128 void
129 prompt1 (buf, a, b, c, d, e, f, g, h)
130 char *buf, *a;
131 int b,c,d,e,f,g,h;
132 {
133         topmsg1 (1, buf, a, b, c, d, e, f, g, h);
134 }
135 void
136 prompt2 (buf, a, b, c, d, e, f, g, h)
137 char *buf, *a, *e, *f;
138 int b,c,d,g,h;
139 {
140         topmsg2 (1, buf, a, b, c, d, e, f, g, h);
141 }
142
143 /*
144 Print an error message on the second message line.
145 */
146
147 void
148 /* VARARGS1 */
149 error (buf, a, b, c, d, e, f, g, h)
150 char *buf;
151 int a, b, c, d, e, f, g, h;
152 {
153         topmsg (2, buf, a, b, c, d, e, f, g, h);
154 }
155
156 /*
157 Print out extra information.
158 */
159
160 void
161 /* VARARGS1 */
162 extra (buf, a, b, c, d, e, f, g, h)
163 char *buf;
164 int a, b, c, d, e, f, g, h;
165 {
166         topmsg (3, buf, a, b, c, d, e, f, g, h);
167 }
168
169 /*
170 Print out a generic error message.
171 */
172
173 void
174 huh ()
175 {
176         error ("Type H for Help.",0,0,0,0,0,0,0,0);
177 }
178
179 /*
180 Display information on the screen.  If the 'need_delay' flag is set,
181 we force a delay, then print the information.  After we print the
182 information, we set the need_delay flag.
183 */
184
185 void
186 info (a, b, c)
187 char *a, *b, *c;
188 {
189         if (need_delay) delay ();
190         topmsg (1, a,0,0,0,0,0,0,0,0);
191         topmsg (2, b,0,0,0,0,0,0,0,0);
192         topmsg (3, c,0,0,0,0,0,0,0,0);
193         need_delay = (a || b || c);
194 }
195
196 void
197 set_need_delay () {
198         need_delay = 1;
199 }
200
201 void
202 comment (buf, a, b, c, d, e, f, g, h)
203 char *buf;
204 int a, b, c, d, e, f, g, h;
205 {
206         if (need_delay) delay ();
207         topmsg (1, 0,0,0,0,0,0,0,0,0);
208         topmsg (2, 0,0,0,0,0,0,0,0,0);
209         topmsg (3, buf, a, b, c, d, e, f, g, h);
210         need_delay = (buf != 0);
211 }
212         
213 void
214 comment1 (buf, a, b, c, d, e, f, g, h)
215 char *buf, *a;
216 int b, c, d, e, f, g, h;
217 {
218         if (need_delay) delay ();
219         topmsg1 (1, 0,0,0,0,0,0,0,0,0);
220         topmsg1 (2, 0,0,0,0,0,0,0,0,0);
221         topmsg1 (3, buf, a, b, c, d, e, f, g, h);
222         need_delay = (buf != 0);
223 }
224         
225 /* kermyt begin */
226 void
227 ksend (buf, a, b, c, d, e, f, g, h)
228 char *buf;
229 int a,b,c,d,e,f,g,h;
230 {
231         if(!(my_stream=fopen("info_list.txt","a")))
232         {
233                 error("Cannot open info_list.txt",0,0,0,0,0,0,0,0);
234                 return;
235         }
236         fprintf(my_stream, buf, a, b, c, d, e, f, g, h);
237         fclose(my_stream);
238         return;
239 }
240 void
241 ksend1 (buf, a, b, c, d, e, f, g, h)
242 char *buf, *a;
243 int b,c,d,e,f,g,h;
244 {
245         if(!(my_stream=fopen("info_list.txt","a")))
246         {
247                 error("Cannot open info_list.txt",0,0,0,0,0,0,0,0);
248                 return;
249         }
250         fprintf(my_stream, buf, a, b, c, d, e, f, g, h);
251         fclose(my_stream);
252         return;
253 }
254 /* kermyt end */
255 /*
256 Get a string from the user, echoing characters all the while.
257 */
258
259 void
260 get_str (buf, sizep)
261 char *buf;
262 int sizep;
263 {
264         (void) echo();
265         get_strq(buf, sizep);
266         (void) noecho();
267 }
268
269 /*
270 Get a string from the user, ignoring the current echo mode.
271 */
272
273 void
274 get_strq (buf, sizep)
275 char *buf;
276 int sizep;
277 {
278         sizep = sizep; /* size of buf, currently unused */
279
280         (void) nocrmode ();
281         (void) refresh ();
282         (void) getstr (buf);
283         need_delay = FALSE;
284         info (0, 0, 0);
285         (void) crmode ();
286 }
287
288 /*
289 Get a character from the user and convert it to uppercase.
290 */
291
292 char
293 get_chx()
294 {
295         char c;
296
297         c = get_cq ();
298
299         if (islower(c))
300                 return (upper(c));
301         else
302                 return (c);
303 }
304
305 /*
306 Input an integer from the user.
307 */
308
309 int
310 getint (message)
311 char *message;
312 {
313         char buf[STRSIZE];
314         char *p;
315
316         for (;;) { /* until we get a legal number */
317                 prompt (message,0,0,0,0,0,0,0,0);
318                 get_str (buf, sizeof (buf));
319                 
320                 for (p = buf; *p; p++) {
321                         if (*p < '0' || *p > '9') {
322                                 error ("Please enter an integer.",0,0,0,0,0,0,0,0);
323                                 break;
324                         }
325                 }
326                 if (*p == 0) { /* no error yet? */
327                         if (p - buf > 7) /* too many digits? */
328                                 error ("Please enter a small integer.",0,0,0,0,0,0,0,0);
329                         else return (atoi (buf));
330                 }
331         }
332 }
333
334 /*
335 Input a character from the user with echoing.
336 */
337
338 char
339 get_c ()
340 {
341         char c; /* one char and a null */
342
343         (void) echo ();
344         c = get_cq ();
345         (void) noecho ();
346         return (c);
347 }
348
349 /*
350 Input a character quietly.
351 */
352
353 char
354 get_cq ()
355 {
356         char c;
357
358         (void) crmode ();
359         (void) refresh ();
360         c = getch ();
361         topini (); /* clear information lines */
362         (void) nocrmode ();
363         return (c);
364 }
365
366 /*
367 Input a yes or no response from the user.  We loop until we get
368 a valid response.  We return TRUE iff the user replies 'y'.
369 */
370
371 int
372 getyn (message)
373 char *message;
374 {
375         char c;
376
377         for (;;) {
378                 prompt (message,0,0,0,0,0,0,0,0);
379                 c = get_chx ();
380
381                 if (c == 'Y') return (TRUE);
382                 if (c == 'N') return (FALSE);
383
384                 error ("Please answer Y or N.",0,0,0,0,0,0,0,0);
385         }
386 }
387
388 /*
389 Input an integer in a range.
390 */
391
392 int
393 get_range (message, low, high)
394 char *message;
395 int low, high;
396 {
397         int result;
398
399         for (;;) {
400                 result = getint (message);
401
402                 if (result >= low && result <= high) return (result);
403
404                 error ("Please enter an integer in the range %d..%d.",low, high,0,0,0,0,0,0);
405         }
406 }
407
408 /*
409 Print a screen of help information.
410 */
411
412 void
413 help (text, nlines)
414 char **text;
415 int nlines;
416 {
417         int i, r, c;
418         int text_lines;
419
420         text_lines = (nlines + 1) / 2; /* lines of text */
421
422         clear_screen ();
423
424         pos_str (NUMTOPS, 1, text[0],0,0,0,0,0,0,0,0); /* mode */
425         pos_str (NUMTOPS, 41, "See empire(6) for more information.",0,0,0,0,0,0,0,0);
426
427         for (i = 1; i < nlines; i++) {
428                 if (i > text_lines)
429                         pos_str (i - text_lines + NUMTOPS + 1, 41, text[i],0,0,0,0,0,0,0,0);
430                 else pos_str (i + NUMTOPS + 1, 1, text[i],0,0,0,0,0,0,0,0);
431         }
432
433         pos_str (text_lines + NUMTOPS + 2,  1, "--Piece---Yours-Enemy-Moves-Hits-Cost",0,0,0,0,0,0,0,0);
434         pos_str (text_lines + NUMTOPS + 2, 41, "--Piece---Yours-Enemy-Moves-Hits-Cost",0,0,0,0,0,0,0,0);
435
436         for (i = 0; i < NUM_OBJECTS; i++) {
437                 if (i >= (NUM_OBJECTS+1)/2) {
438                         r = i - (NUM_OBJECTS+1)/2;
439                         c = 41;
440                 }
441                 else {
442                         r = i;
443                         c = 1;
444                 }
445                 pos_str1 (r + text_lines + NUMTOPS + 3, c,"%-12s%c     %c%6d%5d%6d",
446                         piece_attr[i].nickname,
447                         piece_attr[i].sname,
448                         tolower (piece_attr[i].sname),
449                         piece_attr[i].speed,
450                         piece_attr[i].max_hits,
451                         piece_attr[i].build_time,0,0);          //FLAG
452
453         }
454         (void) refresh ();
455 }
456
457
458