Mercurial > hg > early-roguelike
diff rogue4/io.c @ 12:9535a08ddc39
Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Sat, 24 Oct 2009 16:52:52 +0000 |
parents | |
children | 1b73a8641b37 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue4/io.c Sat Oct 24 16:52:52 2009 +0000 @@ -0,0 +1,253 @@ +/* + * Various input/output functions + * + * @(#)io.c 4.13 (Berkeley) 2/25/82 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include <curses.h> +#include <ctype.h> +#include <string.h> +#include "rogue.h" +#include <stdarg.h> + +/* + * msg: + * Display a message at the top of the screen. + */ +static char msgbuf[BUFSIZ]; +static int newpos = 0; + +msg(char *fmt, ...) +{ + va_list ap; + /* + * if the string is "", just clear the line + */ + if (*fmt == '\0') + { + move(0, 0); + clrtoeol(); + mpos = 0; + return; + } + /* + * otherwise add to the message and flush it out + */ + va_start(ap,fmt); + doadd(fmt, ap); + va_end(ap); + endmsg(); +} + +/* + * addmsg: + * Add things to the current message + */ + +addmsg(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + doadd(fmt, ap); + va_end(ap); +} + +/* + * endmsg: + * Display a new msg (giving him a chance to see the previous one + * if it is up there with the --More--) + */ + +endmsg() +{ + if (save_msg) + { + strncpy(huh, msgbuf, 80); + huh[79] = 0; + } + + if (mpos) + { + look(FALSE); + move(0, mpos); + addstr("--More--"); + refresh(); + wait_for(' '); + } + /* + * All messages should start with uppercase, except ones that + * start with a pack addressing character + */ + if (islower(msgbuf[0]) && msgbuf[1] != ')') + msgbuf[0] = toupper(msgbuf[0]); + mvaddstr(0, 0, msgbuf); + clrtoeol(); + mpos = newpos; + newpos = 0; + refresh(); +} + +/* + * doadd: + * Perform an add onto the message buffer + */ + +doadd(char *fmt, va_list ap) +{ + vsprintf(&msgbuf[newpos], fmt, ap); + newpos = strlen(msgbuf); +} + +/* + * step_ok: + * Returns true if it is ok to step on ch + */ +step_ok(ch) +{ + switch (ch) + { + case ' ': + case '|': + case '-': + return FALSE; + default: + return (!isalpha(ch)); + } +} + +/* + * readchar: + * Flushes stdout so that screen is up to date and then returns + * getchar(). + */ +readcharw(win) +WINDOW *win; +{ + int ch; + + ch = md_readchar(win); + + if ((ch == 3) || (ch == 0)) + { + quit(0); + return(27); + } + + return(ch); +} + +readchar() +{ + return( readcharw(stdscr) ); +} + +char * +unctrol(ch) +char ch; +{ + return( (char *) unctrl(ch) ); +} + +/* + * status: + * Display the important stats line. Keep the cursor where it was. + */ +status() +{ + register int oy, ox, temp; + static int hpwidth = 0, s_hungry; + static int s_lvl, s_pur = -1, s_hp, s_ac = 0; + static str_t s_str; + static long s_exp = 0; + static char *state_name[] = + { + "", "Hungry", "Weak", "Faint" + }; + + /* + * 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 && s_lvl == level && s_hungry == hungry_state) + return; + + getyx(stdscr, oy, ox); + if (s_hp != max_hp) + { + temp = s_hp = max_hp; + for (hpwidth = 0; temp; hpwidth++) + temp /= 10; + } + move(LINES - 1, 0); + printw("Level: %d Gold: %-5d Hp: %*d(%*d) Str: %2d(%d) Ac: %-2d Exp: %d/%ld %s", + level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, pstats.s_str, + max_stats.s_str, + cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm, pstats.s_lvl, + pstats.s_exp, state_name[hungry_state]); + + clrtoeol(); + /* + * Save old status + */ + s_lvl = level; + s_pur = purse; + s_hp = pstats.s_hpt; + s_str = pstats.s_str; + s_exp = pstats.s_exp; + s_ac = (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm); + s_hungry = hungry_state; + move(oy, ox); +} + +/* + * wait_for + * Sit around until the guy types the right key + */ + + + +wait_for(ch) +register char ch; +{ + w_wait_for(stdscr, ch); +} + +w_wait_for(win,ch) +WINDOW *win; +register char ch; +{ + register char c; + + if (ch == '\n') + while ((c = readcharw(win)) != '\n' && c != '\r') + continue; + else + while (readcharw(win) != ch) + continue; +} + +/* + * show_win: + * Function used to display a window and wait before returning + */ +show_win(scr, message) +register WINDOW *scr; +char *message; +{ + mvwaddstr(scr, 0, 0, message); + touchwin(scr); + wmove(scr, hero.y, hero.x); + wrefresh(scr); + w_wait_for(scr,' '); + clearok(curscr, TRUE); + touchwin(stdscr); +}