comparison urogue/io.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children 0250220d8cdd
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 io.c - Various input/output functions
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 #include <string.h>
20 #include <ctype.h>
21 #include <stdarg.h>
22 #include "rogue.h"
23
24 char prbuf[2 * LINELEN]; /* Buffer for sprintfs */
25 static char mbuf[2*LINELEN]; /* Current message buffer */
26 static int newpos = 0; /* index in mbuf to end of msg */
27
28 int mpos = 0; /* 0 = Overwrite existing message */
29 /* >0 = print --More-- at this pos */
30 /* and wait for key */
31
32 int line_cnt = 0;
33 int newpage = FALSE;
34
35 /*
36 msg()
37 Display a message at the top of the screen.
38 */
39
40 void
41 msg(const char *fmt, ...)
42 {
43 va_list ap;
44
45 /* if the string is "", just clear the line */
46
47 if (*fmt == '\0')
48 {
49 wmove(cw, 0, 0);
50 wclrtoeol(cw);
51 mpos = 0;
52 return;
53 }
54
55 /* otherwise add to the message and flush it out */
56
57 va_start(ap, fmt);
58 doadd(fmt, ap);
59 va_end(ap);
60
61 endmsg();
62 }
63
64 void
65 vmsg(const char *fmt, va_list ap)
66 {
67 /* if the string is "", just clear the line */
68
69 if (*fmt == '\0')
70 {
71 wmove(cw, 0, 0);
72 wclrtoeol(cw);
73 mpos = 0;
74 return;
75 }
76
77 /* otherwise add to the message and flush it out */
78
79 doadd(fmt, ap);
80 endmsg();
81 }
82
83
84 /*
85 addmsg()
86 add things to the current message
87 */
88
89 void
90 addmsg(const char *fmt, ...)
91 {
92 va_list ap;
93
94 va_start(ap, fmt);
95 doadd(fmt,ap);
96 va_end(ap);
97 }
98
99 /*
100 endmsg()
101 Display a new msg (giving him a chance to see the previous one
102 if it is up there with the --More--)
103 */
104
105 void
106 endmsg(void)
107 {
108 strcpy(msgbuf[msg_index], mbuf);
109
110 msg_index = ++msg_index % 10;
111
112 if (mpos)
113 {
114 wmove(cw, 0, mpos);
115 wprintw(cw, (char *) morestr);
116 wrefresh(cw);
117 wait_for(' ');
118 }
119
120 mvwprintw(cw, 0, 0, mbuf);
121 wclrtoeol(cw);
122
123 mpos = newpos;
124 newpos = 0;
125
126 wrefresh(cw);
127 }
128
129 void
130 doadd(const char *fmt, va_list ap)
131 {
132 vsprintf(&mbuf[newpos], fmt, ap);
133 newpos = (int) strlen(mbuf);
134 }
135
136 /*
137 status()
138 Display the important stats line. Keep the cursor where it was.
139 */
140
141 void
142 status(int display)
143 {
144 static char buf[1024]; /* Temporary buffer */
145 struct stats *stat_ptr, *max_ptr;
146 int oy, ox;
147
148 stat_ptr = &pstats;
149 max_ptr = &max_stats;
150
151 getyx(cw, oy, ox);
152 sprintf(buf,
153 "Int:%d(%d) Str:%d(%d) Wis:%d(%d) Dex:%d(%d) Con:%d(%d) Carry:%d(%d) %d",
154 stat_ptr->s_intel, max_ptr->s_intel,
155 stat_ptr->s_str, max_ptr->s_str,
156 stat_ptr->s_wisdom, max_ptr->s_wisdom,
157 stat_ptr->s_dext, max_ptr->s_dext,
158 stat_ptr->s_const, max_ptr->s_const,
159 stat_ptr->s_pack / 10, stat_ptr->s_carry / 10, foodlev );
160
161 mvwaddstr(cw, LINES - 2, 0, buf);
162 wclrtoeol(cw);
163
164 sprintf(buf, "Lvl:%d Au:%d Hpt:%3d(%3d) Pow:%d(%d) Ac:%d Exp:%d+%ld %s",
165 level,
166 purse,
167 stat_ptr->s_hpt, max_ptr->s_hpt,
168 stat_ptr->s_power, max_ptr->s_power,
169 (cur_armor != NULL ? (cur_armor->o_ac - 10 + stat_ptr->s_arm)
170 : stat_ptr->s_arm) - ring_value(R_PROTECT),
171 stat_ptr->s_lvl,
172 stat_ptr->s_exp,
173 cnames[player.t_ctype][min(stat_ptr->s_lvl - 1, 14)]);
174
175 mvwaddstr(cw, LINES - 1, 0, buf);
176
177 switch(hungry_state)
178 {
179 case F_OK: break;
180 case F_HUNGRY: waddstr(cw, " Hungry");
181 break;
182 case F_WEAK: waddstr(cw, " Weak");
183 break;
184 case F_FAINT: waddstr(cw, " Fainting");
185 break;
186 }
187
188 wclrtoeol(cw);
189 wmove(cw, oy, ox);
190
191 if (display)
192 wrefresh(cw);
193 }
194
195 /*
196 * readchar:
197 * Flushes stdout so that screen is up to date and then returns
198 * getchar().
199 */
200
201 char
202 readcharw(WINDOW *win)
203 {
204 char ch;
205
206 ch = (char) md_readchar(win);
207
208 if ((ch == 3) || (ch == 0))
209 {
210 quit();
211 return(27);
212 }
213
214 return(ch);
215 }
216
217 char
218 readchar()
219 {
220 return( readcharw(cw) );
221 }
222
223 /*
224 wait_for()
225 Sit around until the guy types the right key
226 */
227
228 void
229 w_wait_for(WINDOW *w, int ch)
230 {
231 char c;
232
233 if (ch == '\n')
234 while ((c = readcharw(w)) != '\n' && c != '\r')
235 continue;
236 else
237 while (readcharw(w) != ch)
238 continue;
239 }
240
241 void
242 wait_for(int ch)
243 {
244 w_wait_for(cw, ch);
245 }
246
247 /*
248 show_win()
249 function used to display a window and wait before returning
250 */
251
252 void
253 show_win(WINDOW *scr, char *message)
254 {
255 mvwaddstr(scr, 0, 0, message);
256 touchwin(scr);
257 wmove(scr, hero.y, hero.x);
258 wrefresh(scr);
259 wait_for(' ');
260 clearok(cw, TRUE);
261 touchwin(cw);
262 }
263
264 /*
265 restscr()
266 Restores the screen to the terminal
267 */
268
269 void
270 restscr(WINDOW *scr)
271 {
272 clearok(scr, TRUE);
273 touchwin(scr);
274 }
275
276 /*
277 add_line()
278 Add a line to the list of discoveries
279 */
280
281 void
282 add_line(const char *fmt, ...)
283 {
284 WINDOW *tw;
285 va_list ap;
286
287 va_start(ap, fmt);
288
289 if (line_cnt == 0)
290 {
291 wclear(hw);
292
293 if (inv_type == INV_SLOW)
294 mpos = 0;
295 }
296
297 if (inv_type == INV_SLOW)
298 {
299 if ( (fmt != NULL) && (*fmt != '\0') )
300 vmsg(fmt, ap);
301 line_cnt++;
302 }
303 else
304 {
305 if ( (line_cnt >= LINES - 2) || (fmt == NULL)) /* end 'o page */
306 {
307 if (fmt == NULL && !newpage && inv_type == INV_OVER)
308 {
309 tw = newwin(line_cnt + 2, COLS, 0, 0);
310 overwrite(hw, tw);
311 wstandout(tw);
312 mvwaddstr(tw, line_cnt, 0, spacemsg);
313 wstandend(tw);
314 touchwin(tw);
315 wrefresh(tw);
316 wait_for(' ');
317 delwin(tw);
318 touchwin(cw);
319 }
320 else
321 {
322 wstandout(hw);
323 mvwaddstr(hw, LINES - 1, 0, spacemsg);
324 wstandend(hw);
325 wrefresh(hw);
326 w_wait_for(hw, ' ');
327 touchwin(cw);
328 wclear(hw);
329 }
330 newpage = TRUE;
331 line_cnt = 0;
332 }
333
334 /* draw line */
335 if (fmt != NULL && !(line_cnt == 0 && *fmt == '\0'))
336 {
337 static char tmpbuf[1024];
338
339 vsprintf(tmpbuf, fmt, ap);
340 mvwprintw(hw, line_cnt++, 0, tmpbuf);
341 }
342 }
343 }
344
345 /*
346 end_line()
347 End the list of lines
348 */
349
350 void
351 end_line(void)
352 {
353 if (inv_type != INV_SLOW)
354 add_line(NULL);
355
356 line_cnt = 0;
357 newpage = FALSE;
358 }
359
360 /*
361 hearmsg()
362 Call msg() only if you are not deaf
363 */
364
365 void
366 hearmsg(const char *fmt, ...)
367 {
368 va_list ap;
369
370 va_start(ap, fmt);
371
372 if (off(player, ISDEAF))
373 vmsg(fmt, ap);
374 else if (wizard)
375 {
376 msg("Couldn't hear: ");
377 vmsg(fmt, ap);
378 }
379
380 va_end(ap);
381 }
382
383 /*
384 seemsg()
385 Call msg() only if you are not blind
386 */
387
388 void
389 seemsg(const char *fmt, ...)
390 {
391 va_list ap;
392
393 va_start(ap, fmt);
394
395 if (off(player, ISBLIND))
396 vmsg(fmt, ap);
397 else if (wizard)
398 {
399 msg("Couldn't see: ");
400 vmsg(fmt, ap);
401 }
402
403 va_end(ap);
404 }
405
406 int
407 get_string(char *buffer, WINDOW *win)
408 {
409 char *sp, c;
410 int oy, ox;
411 char buf[2 * LINELEN];
412
413 wrefresh(win);
414 getyx(win, oy, ox);
415
416 /* loop reading in the string, and put it in a temporary buffer */
417
418 for (sp = buf; (c = readcharw(win)) != '\n' &&
419 c != '\r' &&
420 c != '\033' &&
421 c != '\007' &&
422 sp < &buf[LINELEN - 1];
423 wclrtoeol(win), wrefresh(win))
424 {
425 if ((c == '\b') || (c == 0x7f))
426 {
427 if (sp > buf)
428 {
429 size_t i;
430
431 sp--;
432
433 for (i = strlen(unctrl(*sp)); i; i--)
434 waddch(win, '\b');
435 }
436 continue;
437 }
438 else if (c == '\0')
439 {
440 sp = buf;
441 wmove(win, oy, ox);
442 continue;
443 }
444 else if (sp == buf && c == '-' && win == hw)
445 break;
446
447 *sp++ = c;
448 waddstr(win, unctrl(c));
449 }
450
451 *sp = '\0';
452
453 if (sp > buf) /* only change option if something has been typed */
454 strncpy(buffer, buf, strlen(buf)+1);
455
456 wmove(win, oy, ox);
457 waddstr(win, buffer);
458 waddch(win, '\n');
459 wrefresh(win);
460
461 if (win == cw)
462 mpos += (int)(sp - buf);
463
464 if (c == '-')
465 return(MINUS);
466 else if (c == '\033' || c == '\007')
467 return(QUIT);
468 else
469 return(NORM);
470 }
471