Mercurial > hg > early-roguelike
comparison srogue/io.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 3aa87373c908 |
comparison
equal
deleted
inserted
replaced
35:05018c63a721 | 36:2128c7dc8a40 |
---|---|
1 /* | |
2 * Various input/output functions | |
3 * | |
4 * @(#)io.c 9.0 (rdk) 7/17/84 | |
5 * | |
6 * Super-Rogue | |
7 * Copyright (C) 1984 Robert D. Kindelberger | |
8 * All rights reserved. | |
9 * | |
10 * Based on "Rogue: Exploring the Dungeons of Doom" | |
11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
12 * All rights reserved. | |
13 * | |
14 * See the file LICENSE.TXT for full copyright and licensing information. | |
15 */ | |
16 | |
17 #include <stdarg.h> | |
18 #include <ctype.h> | |
19 #include "rogue.h" | |
20 #include "rogue.ext" | |
21 | |
22 /* | |
23 * msg: | |
24 * Display a message at the top of the screen. | |
25 */ | |
26 static char msgbuf[BUFSIZ]; | |
27 static int newpos = 0; | |
28 | |
29 msg(char *fmt, ...) | |
30 { | |
31 va_list ap; | |
32 /* | |
33 * if the string is "", just clear the line | |
34 */ | |
35 if (*fmt == '\0') { | |
36 wmove(cw, 0, 0); | |
37 wclrtoeol(cw); | |
38 mpos = 0; | |
39 return; | |
40 } | |
41 /* | |
42 * otherwise add to the message and flush it out | |
43 */ | |
44 va_start(ap, fmt); | |
45 doadd(fmt, ap); | |
46 va_end(ap); | |
47 endmsg(); | |
48 } | |
49 | |
50 /* | |
51 * addmsg: | |
52 * Add things to the current message | |
53 */ | |
54 addmsg(char *fmt, ...) | |
55 { | |
56 va_list ap; | |
57 | |
58 va_start(ap, fmt); | |
59 doadd(fmt, ap); | |
60 va_end(ap); | |
61 } | |
62 | |
63 /* | |
64 * endmsg: | |
65 * Display a new msg, giving him a chance to see the | |
66 * previous one if it is up there with the --More-- | |
67 */ | |
68 endmsg() | |
69 { | |
70 strcpy(huh, msgbuf); | |
71 if (mpos > 0) { | |
72 wmove(cw, 0, mpos); | |
73 waddstr(cw, morestr); | |
74 draw(cw); | |
75 wait_for(cw, ' '); | |
76 } | |
77 mvwaddstr(cw, 0, 0, msgbuf); | |
78 wclrtoeol(cw); | |
79 mpos = newpos; | |
80 newpos = 0; | |
81 draw(cw); | |
82 } | |
83 | |
84 /* | |
85 * doadd: | |
86 * Perform a printf into a buffer | |
87 */ | |
88 doadd(char *fmt, va_list ap) | |
89 { | |
90 vsprintf(&msgbuf[newpos], fmt, ap); | |
91 newpos = strlen(msgbuf); | |
92 } | |
93 | |
94 /* | |
95 * step_ok: | |
96 * Returns TRUE if it is ok to step on ch | |
97 */ | |
98 step_ok(ch) | |
99 unsigned char ch; | |
100 { | |
101 if (dead_end(ch)) | |
102 return FALSE; | |
103 else if (ch >= 32 && ch <= 127 && !isalpha(ch)) | |
104 return TRUE; | |
105 return FALSE; | |
106 } | |
107 | |
108 | |
109 /* | |
110 * dead_end: | |
111 * Returns TRUE if you cant walk through that character | |
112 */ | |
113 dead_end(ch) | |
114 char ch; | |
115 { | |
116 if (ch == '-' || ch == '|' || ch == ' ' || ch == SECRETDOOR) | |
117 return TRUE; | |
118 else | |
119 return FALSE; | |
120 } | |
121 | |
122 | |
123 /* | |
124 * readchar: | |
125 * flushes stdout so that screen is up to date and then returns | |
126 * getchar. | |
127 */ | |
128 | |
129 readchar() | |
130 { | |
131 char c; | |
132 | |
133 fflush(stdout); | |
134 return( wgetch(cw) ); | |
135 } | |
136 | |
137 char *hungstr[] = { | |
138 "", | |
139 " HUNGRY", | |
140 " STARVING", | |
141 " FAINTING", | |
142 }; | |
143 | |
144 /* | |
145 * status: | |
146 * Display the important stats line. Keep the cursor where it was. | |
147 */ | |
148 status(fromfuse) | |
149 int fromfuse; | |
150 { | |
151 reg int totwght, carwght; | |
152 reg struct real *stef, *stre, *stmx; | |
153 reg char *pb; | |
154 int oy, ox, ch; | |
155 static char buf[LINLEN]; | |
156 static char hwidth[] = { "%2d(%2d)" }; | |
157 | |
158 /* | |
159 * If nothing has changed since the last time, then done | |
160 */ | |
161 if (nochange) | |
162 return; | |
163 nochange = TRUE; | |
164 updpack(); /* get all weight info */ | |
165 stef = &player.t_stats.s_ef; | |
166 stre = &player.t_stats.s_re; | |
167 stmx = &max_stats.s_re; | |
168 totwght = him->s_carry / 10; | |
169 carwght = him->s_pack / 10; | |
170 getyx(cw, oy, ox); | |
171 if (him->s_maxhp >= 100) { | |
172 hwidth[1] = '3'; /* if hit point >= 100 */ | |
173 hwidth[5] = '3'; /* change %2d to %3d */ | |
174 } | |
175 if (stre->a_str < stmx->a_str) | |
176 ch = '*'; | |
177 else | |
178 ch = ' '; | |
179 sprintf(buf, "Str: %2d(%c%2d)", stef->a_str, ch, stre->a_str); | |
180 pb = &buf[strlen(buf)]; | |
181 if (stre->a_dex < stmx->a_dex) | |
182 ch = '*'; | |
183 else | |
184 ch = ' '; | |
185 sprintf(pb, " Dex: %2d(%c%2d)", stef->a_dex, ch, stre->a_dex); | |
186 pb = &buf[strlen(buf)]; | |
187 if (stre->a_wis < stmx->a_wis) | |
188 ch = '*'; | |
189 else | |
190 ch = ' '; | |
191 sprintf(pb, " Wis: %2d(%c%2d)", stef->a_wis, ch, stre->a_wis); | |
192 pb = &buf[strlen(buf)]; | |
193 if (stre->a_con < stmx->a_con) | |
194 ch = '*'; | |
195 else | |
196 ch = ' '; | |
197 sprintf(pb, " Con: %2d(%c%2d)", stef->a_con, ch, stre->a_con); | |
198 pb = &buf[strlen(buf)]; | |
199 sprintf(pb, " Carry: %3d(%3d)", carwght, totwght); | |
200 mvwaddstr(cw, LINES - 1, 0, buf); | |
201 sprintf(buf, "Level: %d Gold: %5d Hp: ",level, purse); | |
202 pb = &buf[strlen(buf)]; | |
203 sprintf(pb, hwidth, him->s_hpt, him->s_maxhp); | |
204 pb = &buf[strlen(buf)]; | |
205 sprintf(pb," Ac: %-2d Exp: %d/%ld",cur_armor == NULL ? him->s_arm : | |
206 cur_armor->o_ac, him->s_lvl, him->s_exp); | |
207 carwght = (packvol * 100) / V_PACK; | |
208 pb = &buf[strlen(buf)]; | |
209 sprintf(pb, " Vol: %3d%%", carwght); | |
210 mvwaddstr(cw, LINES - 2, 0, buf); | |
211 waddstr(cw, hungstr[hungry_state]); | |
212 wclrtoeol(cw); | |
213 wmove(cw, oy, ox); | |
214 } | |
215 | |
216 /* | |
217 * dispmax: | |
218 * Display the hero's maximum status | |
219 */ | |
220 dispmax() | |
221 { | |
222 reg struct real *hmax; | |
223 | |
224 hmax = &max_stats.s_re; | |
225 msg("Maximums: Str = %d Dex = %d Wis = %d Con = %d", | |
226 hmax->a_str, hmax->a_dex, hmax->a_wis, hmax->a_con); | |
227 } | |
228 | |
229 /* | |
230 * illeg_ch: | |
231 * Returns TRUE if a char shouldn't show on the screen | |
232 */ | |
233 illeg_ch(ch) | |
234 unsigned char ch; | |
235 { | |
236 if (ch < 32 || ch > 127) | |
237 return TRUE; | |
238 if (ch >= '0' && ch <= '9') | |
239 return TRUE; | |
240 return FALSE; | |
241 } | |
242 | |
243 /* | |
244 * wait_for: | |
245 * Sit around until the guy types the right key | |
246 */ | |
247 wait_for(win,ch) | |
248 WINDOW *win; | |
249 char ch; | |
250 { | |
251 register char c; | |
252 | |
253 if (ch == '\n') | |
254 while ((c = wgetch(win)) != '\n' && c != '\r') | |
255 continue; | |
256 else | |
257 while (wgetch(win) != ch) | |
258 continue; | |
259 } | |
260 | |
261 #ifdef NEED_GETTIME | |
262 #include <stdio.h> | |
263 #include <pwd.h> | |
264 | |
265 /* | |
266 * gettime: | |
267 * This routine returns the current time as a string | |
268 */ | |
269 #ifdef ATT | |
270 #include <time.h> | |
271 #endif | |
272 #ifdef BSD | |
273 #include <sys/time.h> | |
274 #endif | |
275 | |
276 char * | |
277 gettime() | |
278 { | |
279 register char *timeptr; | |
280 char *ctime(); | |
281 long int now, time(); | |
282 | |
283 time(&now); /* get current time */ | |
284 timeptr = ctime(&now); /* convert to string */ | |
285 return timeptr; /* return the string */ | |
286 } | |
287 #endif | |
288 | |
289 | |
290 /* | |
291 * dbotline: | |
292 * Displays message on bottom line and waits for a space to return | |
293 */ | |
294 dbotline(scr,message) | |
295 WINDOW *scr; | |
296 char *message; | |
297 { | |
298 mvwaddstr(scr,LINES-1,0,message); | |
299 draw(scr); | |
300 wait_for(scr,' '); | |
301 } | |
302 | |
303 | |
304 /* | |
305 * restscr: | |
306 * Restores the screen to the terminal | |
307 */ | |
308 restscr(scr) | |
309 WINDOW *scr; | |
310 { | |
311 clearok(scr,TRUE); | |
312 touchwin(scr); | |
313 } | |
314 | |
315 /* | |
316 * npch: | |
317 * Get the next char in line for inventories | |
318 */ | |
319 npch(ch) | |
320 char ch; | |
321 { | |
322 reg char nch; | |
323 if (ch >= 'z') | |
324 nch = 'A'; | |
325 else | |
326 nch = ch + 1; | |
327 return nch; | |
328 } |