Annotation of early-roguelike/rogue4/io.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Various input/output functions
3: *
4: * @(#)io.c 4.13 (Berkeley) 2/25/82
5: *
6: * Rogue: Exploring the Dungeons of Doom
7: * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
8: * All rights reserved.
9: *
10: * See the file LICENSE.TXT for full copyright and licensing information.
11: */
12:
13: #include <curses.h>
14: #include <ctype.h>
15: #include <string.h>
16: #include "rogue.h"
17: #include <stdarg.h>
18:
19: void doadd(char *fmt, va_list ap);
20:
21: /*
22: * msg:
23: * Display a message at the top of the screen.
24: */
25: static char msgbuf[BUFSIZ];
26: static int newpos = 0;
27:
28: void
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: {
37: move(0, 0);
38: clrtoeol();
39: mpos = 0;
40: return;
41: }
42: /*
43: * otherwise add to the message and flush it out
44: */
45: va_start(ap,fmt);
46: doadd(fmt, ap);
47: va_end(ap);
48: endmsg();
49: }
50:
51: /*
52: * addmsg:
53: * Add things to the current message
54: */
55:
56: void
57: addmsg(char *fmt, ...)
58: {
59: va_list ap;
60:
61: va_start(ap, fmt);
62: doadd(fmt, ap);
63: va_end(ap);
64: }
65:
66: /*
67: * endmsg:
68: * Display a new msg (giving him a chance to see the previous one
69: * if it is up there with the --More--)
70: */
71:
72: void
73: endmsg(void)
74: {
75: if (save_msg)
76: {
77: strncpy(huh, msgbuf, 80);
78: huh[79] = 0;
79: }
80:
81: if (mpos)
82: {
83: look(FALSE);
84: move(0, mpos);
85: addstr("--More--");
86: refresh();
87: wait_for(' ');
88: }
89: /*
90: * All messages should start with uppercase, except ones that
91: * start with a pack addressing character
92: */
93: if (islower(msgbuf[0]) && msgbuf[1] != ')')
94: msgbuf[0] = toupper(msgbuf[0]);
95: mvaddstr(0, 0, msgbuf);
96: clrtoeol();
97: mpos = newpos;
98: newpos = 0;
99: refresh();
100: }
101:
102: /*
103: * doadd:
104: * Perform an add onto the message buffer
105: */
106:
107: void
108: doadd(char *fmt, va_list ap)
109: {
110: vsprintf(&msgbuf[newpos], fmt, ap);
111: newpos = strlen(msgbuf);
112: }
113:
114: /*
115: * step_ok:
116: * Returns true if it is ok to step on ch
117: */
118: bool
119: step_ok(char ch)
120: {
121: switch (ch)
122: {
123: case ' ':
124: case '|':
125: case '-':
126: return FALSE;
127: default:
128: return (!isalpha(ch));
129: }
130: }
131:
132: /*
133: * readchar:
134: * Flushes stdout so that screen is up to date and then returns
135: * getchar().
136: */
137: int
138: readcharw(WINDOW *win)
139: {
140: int ch;
141:
142: ch = md_readchar(win);
143:
144: if ((ch == 3) || (ch == 0))
145: {
146: quit(0);
147: return(27);
148: }
149:
150: return(ch);
151: }
152:
153: int
154: readchar(void)
155: {
156: return( readcharw(stdscr) );
157: }
158:
159: char *
160: unctrol(char ch)
161: {
162: return( (char *) unctrl(ch) );
163: }
164:
165: /*
166: * status:
167: * Display the important stats line. Keep the cursor where it was.
168: */
169: void
170: status(void)
171: {
172: register int oy, ox, temp;
173: static int hpwidth = 0, s_hungry;
174: static int s_lvl, s_pur = -1, s_hp, s_ac = 0;
175: static str_t s_str;
176: static long s_exp = 0;
177: static char *state_name[] =
178: {
179: "", "Hungry", "Weak", "Faint"
180: };
181:
182: /*
183: * If nothing has changed since the last status, don't
184: * bother.
185: */
186: if (s_hp == pstats.s_hpt && s_exp == pstats.s_exp && s_pur == purse
187: && s_ac == (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm)
188: && s_str == pstats.s_str && s_lvl == level && s_hungry == hungry_state)
189: return;
190:
191: getyx(stdscr, oy, ox);
192: if (s_hp != max_hp)
193: {
194: temp = s_hp = max_hp;
195: for (hpwidth = 0; temp; hpwidth++)
196: temp /= 10;
197: }
198: move(LINES - 1, 0);
199: printw("Level: %d Gold: %-5d Hp: %*d(%*d) Str: %2d(%d) Ac: %-2d Exp: %d/%ld %s",
200: level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, pstats.s_str,
201: max_stats.s_str,
202: cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm, pstats.s_lvl,
203: pstats.s_exp, state_name[hungry_state]);
204:
205: clrtoeol();
206: /*
207: * Save old status
208: */
209: s_lvl = level;
210: s_pur = purse;
211: s_hp = pstats.s_hpt;
212: s_str = pstats.s_str;
213: s_exp = pstats.s_exp;
214: s_ac = (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm);
215: s_hungry = hungry_state;
216: move(oy, ox);
217: }
218:
219: /*
220: * wait_for
221: * Sit around until the guy types the right key
222: */
223:
224:
225:
226: void
227: wait_for(char ch)
228: {
229: w_wait_for(stdscr, ch);
230: }
231:
232: void
233: w_wait_for(WINDOW *win, char ch)
234: {
235: register char c;
236:
237: if (ch == '\n')
238: while ((c = readcharw(win)) != '\n' && c != '\r')
239: continue;
240: else
241: while (readcharw(win) != ch)
242: continue;
243: }
244:
245: /*
246: * show_win:
247: * Function used to display a window and wait before returning
248: */
249: void
250: show_win(WINDOW *scr, char *message)
251: {
252: mvwaddstr(scr, 0, 0, message);
253: touchwin(scr);
254: wmove(scr, hero.y, hero.x);
255: wrefresh(scr);
256: w_wait_for(scr,' ');
257: clearok(curscr, TRUE);
258: touchwin(stdscr);
259: }
CVSweb