Mercurial > hg > early-roguelike
diff rogue3/io.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue3/io.c Tue Oct 13 13:33:34 2009 +0000 @@ -0,0 +1,248 @@ +/* + * Various input/output functions + * + * @(#)io.c 3.10 (Berkeley) 6/15/81 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include <stdlib.h> +#include "curses.h" +#include <ctype.h> +#include <stdarg.h> +#include <string.h> +#include "machdep.h" +#include "rogue.h" + +/* + * msg: + * Display a message at the top of the screen. + */ + +static char msgbuf[BUFSIZ]; +static int newpos = 0; + +/*VARARGS1*/ +void +msg(char *fmt, ...) +{ + va_list ap; + /* + * if the string is "", just clear the line + */ + if (*fmt == '\0') + { + wmove(cw, 0, 0); + wclrtoeol(cw); + mpos = 0; + return; + } + /* + * otherwise add to the message and flush it out + */ + va_start(ap, fmt); + doadd(fmt, ap); + va_end(ap); + endmsg(); +} + +/* + * add things to the current message + */ +void +addmsg(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + doadd(fmt, ap); + va_end(ap); +} + +/* + * Display a new msg (giving him a chance to see the previous one if it + * is up there with the --More--) + */ +void +endmsg() +{ + strncpy(huh, msgbuf, 80); + huh[79] = 0; + + if (mpos) + { + wmove(cw, 0, mpos); + waddstr(cw, "--More--"); + draw(cw); + wait_for(cw,' '); + } + mvwaddstr(cw, 0, 0, msgbuf); + wclrtoeol(cw); + mpos = newpos; + newpos = 0; + draw(cw); +} + +void +doadd(char *fmt, va_list ap) +{ + vsprintf(&msgbuf[newpos], fmt, ap); + newpos = (int) strlen(msgbuf); +} + +/* + * step_ok: + * returns true if it is ok to step on ch + */ + +int +step_ok(int ch) +{ + switch (ch) + { + case ' ': + case '|': + case '-': + case SECRETDOOR: + return FALSE; + default: + return (!isalpha(ch)); + } +} + +/* + * readchar: + * flushes stdout so that screen is up to date and then returns + * getchar. + */ + +int +readchar(WINDOW *win) +{ + int ch; + + ch = md_readchar(win); + + if ((ch == 3) || (ch == 0)) + { + quit(0); + return(27); + } + + return(ch); +} + +/* + * status: + * Display the important stats line. Keep the cursor where it was. + */ + +void +status() +{ + int oy, ox, temp; + char *pb; + static char buf[80]; + static int hpwidth = 0, s_hungry = -1; + static int s_lvl = -1, s_pur, s_hp = -1, s_str, s_add, s_ac = 0; + static long s_exp = 0; + + /* + * If nothing has changed since the last status, don't + * bother. + */ + if (s_hp == pstats.s_hpt && s_exp == pstats.s_exp && s_pur == purse + && s_ac == (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm) + && s_str == pstats.s_str.st_str && s_add == pstats.s_str.st_add + && s_lvl == level && s_hungry == hungry_state) + return; + + getyx(cw, oy, ox); + if (s_hp != max_hp) + { + temp = s_hp = max_hp; + for (hpwidth = 0; temp; hpwidth++) + temp /= 10; + } + sprintf(buf, "Level: %d Gold: %-5d Hp: %*d(%*d) Str: %-2d", + level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, + pstats.s_str.st_str); + if (pstats.s_str.st_add != 0) + { + pb = &buf[strlen(buf)]; + sprintf(pb, "/%d", pstats.s_str.st_add); + } + pb = &buf[strlen(buf)]; + sprintf(pb, " Ac: %-2d Exp: %d/%d", + cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm, pstats.s_lvl, + pstats.s_exp); + /* + * Save old status + */ + s_lvl = level; + s_pur = purse; + s_hp = pstats.s_hpt; + s_str = pstats.s_str.st_str; + s_add = pstats.s_str.st_add; + s_exp = pstats.s_exp; + s_ac = (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm); + mvwaddstr(cw, LINES - 1, 0, buf); + switch (hungry_state) + { + case 0: ; + when 1: + waddstr(cw, " Hungry"); + when 2: + waddstr(cw, " Weak"); + when 3: + waddstr(cw, " Fainting"); + } + wclrtoeol(cw); + s_hungry = hungry_state; + wmove(cw, oy, ox); +} + +/* + * wait_for + * Sit around until the guy types the right key + */ + +void +wait_for(WINDOW *win, int ch) +{ + int c; + + if (ch == '\n') + while ((c = readchar(win)) != '\n' && c != '\r') + continue; + else + while (readchar(win) != ch) + continue; +} + +/* + * show_win: + * function used to display a window and wait before returning + */ + +void +show_win(WINDOW *scr, char *message) +{ + mvwaddstr(scr, 0, 0, message); + touchwin(scr); + wmove(scr, hero.y, hero.x); + draw(scr); + wait_for(scr,' '); + clearok(cw, TRUE); + touchwin(cw); +} + +void +flush_type() +{ + flushinp(); +}