Mercurial > hg > early-roguelike
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; | |