Annotation of early-roguelike/rogue4/io.c, Revision 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