|
|
1.1 ! root 1: /* ! 2: * Various input/output functions ! 3: * ! 4: * @(#)io.c 3.10 (Berkeley) 6/15/81 ! 5: */ ! 6: ! 7: #include <curses.h> ! 8: #include <ctype.h> ! 9: #include "rogue.h" ! 10: ! 11: /* ! 12: * msg: ! 13: * Display a message at the top of the screen. ! 14: */ ! 15: ! 16: static char msgbuf[BUFSIZ]; ! 17: static int newpos = 0; ! 18: ! 19: /*VARARGS1*/ ! 20: msg(fmt, args) ! 21: char *fmt; ! 22: int args; ! 23: { ! 24: /* ! 25: * if the string is "", just clear the line ! 26: */ ! 27: if (*fmt == '\0') ! 28: { ! 29: wmove(cw, 0, 0); ! 30: wclrtoeol(cw); ! 31: mpos = 0; ! 32: return; ! 33: } ! 34: /* ! 35: * otherwise add to the message and flush it out ! 36: */ ! 37: doadd(fmt, &args); ! 38: endmsg(); ! 39: } ! 40: ! 41: /* ! 42: * add things to the current message ! 43: */ ! 44: addmsg(fmt, args) ! 45: char *fmt; ! 46: int args; ! 47: { ! 48: doadd(fmt, &args); ! 49: } ! 50: ! 51: /* ! 52: * Display a new msg (giving him a chance to see the previous one if it ! 53: * is up there with the --More--) ! 54: */ ! 55: endmsg() ! 56: { ! 57: strcpy(huh, msgbuf); ! 58: if (mpos) ! 59: { ! 60: wmove(cw, 0, mpos); ! 61: waddstr(cw, "--More--"); ! 62: draw(cw); ! 63: wait_for(' '); ! 64: } ! 65: mvwaddstr(cw, 0, 0, msgbuf); ! 66: wclrtoeol(cw); ! 67: mpos = newpos; ! 68: newpos = 0; ! 69: draw(cw); ! 70: } ! 71: ! 72: doadd(fmt, args) ! 73: char *fmt; ! 74: int **args; ! 75: { ! 76: static FILE junk; ! 77: ! 78: /* ! 79: * Do the printf into buf ! 80: */ ! 81: junk._flag = _IOWRT + _IOSTRG; ! 82: junk._ptr = (unsigned char *)&msgbuf[newpos]; ! 83: junk._cnt = 32767; ! 84: _doprnt(fmt, args, &junk); ! 85: putc('\0', &junk); ! 86: newpos = strlen(msgbuf); ! 87: } ! 88: ! 89: /* ! 90: * step_ok: ! 91: * returns true if it is ok to step on ch ! 92: */ ! 93: ! 94: step_ok(ch) ! 95: { ! 96: switch (ch) ! 97: { ! 98: case ' ': ! 99: case '|': ! 100: case '-': ! 101: case SECRETDOOR: ! 102: return FALSE; ! 103: default: ! 104: return (!isalpha(ch)); ! 105: } ! 106: } ! 107: ! 108: /* ! 109: * readchar: ! 110: * flushes stdout so that screen is up to date and then returns ! 111: * getchar. ! 112: */ ! 113: ! 114: readchar() ! 115: { ! 116: char c; ! 117: ! 118: fflush(stdout); ! 119: while (read(0, &c, 1) < 0) ! 120: continue; ! 121: return c; ! 122: } ! 123: ! 124: /* ! 125: * unctrl: ! 126: * Print a readable version of a certain character ! 127: */ ! 128: ! 129: char * ! 130: unctrl(ch) ! 131: char ch; ! 132: { ! 133: extern char *_unctrl[]; /* Defined in curses library */ ! 134: ! 135: return _unctrl[ch&0177]; ! 136: } ! 137: ! 138: /* ! 139: * status: ! 140: * Display the important stats line. Keep the cursor where it was. ! 141: */ ! 142: ! 143: status() ! 144: { ! 145: register int oy, ox, temp; ! 146: register char *pb; ! 147: static char buf[80]; ! 148: static int hpwidth = 0, s_hungry = -1; ! 149: static int s_lvl = -1, s_pur, s_hp = -1, s_str, s_add, s_ac = 0; ! 150: static long s_exp = 0; ! 151: ! 152: /* ! 153: * If nothing has changed since the last status, don't ! 154: * bother. ! 155: */ ! 156: if (s_hp == pstats.s_hpt && s_exp == pstats.s_exp && s_pur == purse ! 157: && s_ac == (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm) ! 158: && s_str == pstats.s_str.st_str && s_add == pstats.s_str.st_add ! 159: && s_lvl == level && s_hungry == hungry_state) ! 160: return; ! 161: ! 162: getyx(cw, oy, ox); ! 163: if (s_hp != max_hp) ! 164: { ! 165: temp = s_hp = max_hp; ! 166: for (hpwidth = 0; temp; hpwidth++) ! 167: temp /= 10; ! 168: } ! 169: sprintf(buf, "Level: %d Gold: %-5d Hp: %*d(%*d) Str: %-2d", ! 170: level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, ! 171: pstats.s_str.st_str); ! 172: if (pstats.s_str.st_add != 0) ! 173: { ! 174: pb = &buf[strlen(buf)]; ! 175: sprintf(pb, "/%d", pstats.s_str.st_add); ! 176: } ! 177: pb = &buf[strlen(buf)]; ! 178: sprintf(pb, " Ac: %-2d Exp: %d/%ld", ! 179: cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm, pstats.s_lvl, ! 180: pstats.s_exp); ! 181: /* ! 182: * Save old status ! 183: */ ! 184: s_lvl = level; ! 185: s_pur = purse; ! 186: s_hp = pstats.s_hpt; ! 187: s_str = pstats.s_str.st_str; ! 188: s_add = pstats.s_str.st_add; ! 189: s_exp = pstats.s_exp; ! 190: s_ac = (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm); ! 191: mvwaddstr(cw, LINES - 1, 0, buf); ! 192: switch (hungry_state) ! 193: { ! 194: when 0: ; ! 195: when 1: ! 196: waddstr(cw, " Hungry"); ! 197: when 2: ! 198: waddstr(cw, " Weak"); ! 199: when 3: ! 200: waddstr(cw, " Fainting"); ! 201: } ! 202: wclrtoeol(cw); ! 203: s_hungry = hungry_state; ! 204: wmove(cw, oy, ox); ! 205: } ! 206: ! 207: /* ! 208: * wait_for ! 209: * Sit around until the guy types the right key ! 210: */ ! 211: ! 212: wait_for(ch) ! 213: register char ch; ! 214: { ! 215: register char c; ! 216: ! 217: if (ch == '\n') ! 218: while ((c = readchar()) != '\n' && c != '\r') ! 219: continue; ! 220: else ! 221: while (readchar() != ch) ! 222: continue; ! 223: } ! 224: ! 225: /* ! 226: * show_win: ! 227: * function used to display a window and wait before returning ! 228: */ ! 229: ! 230: show_win(scr, message) ! 231: register WINDOW *scr; ! 232: char *message; ! 233: { ! 234: mvwaddstr(scr, 0, 0, message); ! 235: touchwin(scr); ! 236: wmove(scr, hero.y, hero.x); ! 237: draw(scr); ! 238: wait_for(' '); ! 239: clearok(cw, TRUE); ! 240: touchwin(cw); ! 241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.