Mercurial > hg > early-roguelike
diff srogue/io.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 3aa87373c908 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/io.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,328 @@ +/* + * Various input/output functions + * + * @(#)io.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * All rights reserved. + * + * Based on "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 <stdarg.h> +#include <ctype.h> +#include "rogue.h" +#include "rogue.ext" + +/* + * 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') { + 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(); +} + +/* + * 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() +{ + strcpy(huh, msgbuf); + if (mpos > 0) { + wmove(cw, 0, mpos); + waddstr(cw, morestr); + draw(cw); + wait_for(cw, ' '); + } + mvwaddstr(cw, 0, 0, msgbuf); + wclrtoeol(cw); + mpos = newpos; + newpos = 0; + draw(cw); +} + +/* + * doadd: + * Perform a printf into a 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) +unsigned char ch; +{ + if (dead_end(ch)) + return FALSE; + else if (ch >= 32 && ch <= 127 && !isalpha(ch)) + return TRUE; + return FALSE; +} + + +/* + * dead_end: + * Returns TRUE if you cant walk through that character + */ +dead_end(ch) +char ch; +{ + if (ch == '-' || ch == '|' || ch == ' ' || ch == SECRETDOOR) + return TRUE; + else + return FALSE; +} + + +/* + * readchar: + * flushes stdout so that screen is up to date and then returns + * getchar. + */ + +readchar() +{ + char c; + + fflush(stdout); + return( wgetch(cw) ); +} + +char *hungstr[] = { + "", + " HUNGRY", + " STARVING", + " FAINTING", +}; + +/* + * status: + * Display the important stats line. Keep the cursor where it was. + */ +status(fromfuse) +int fromfuse; +{ + reg int totwght, carwght; + reg struct real *stef, *stre, *stmx; + reg char *pb; + int oy, ox, ch; + static char buf[LINLEN]; + static char hwidth[] = { "%2d(%2d)" }; + + /* + * If nothing has changed since the last time, then done + */ + if (nochange) + return; + nochange = TRUE; + updpack(); /* get all weight info */ + stef = &player.t_stats.s_ef; + stre = &player.t_stats.s_re; + stmx = &max_stats.s_re; + totwght = him->s_carry / 10; + carwght = him->s_pack / 10; + getyx(cw, oy, ox); + if (him->s_maxhp >= 100) { + hwidth[1] = '3'; /* if hit point >= 100 */ + hwidth[5] = '3'; /* change %2d to %3d */ + } + if (stre->a_str < stmx->a_str) + ch = '*'; + else + ch = ' '; + sprintf(buf, "Str: %2d(%c%2d)", stef->a_str, ch, stre->a_str); + pb = &buf[strlen(buf)]; + if (stre->a_dex < stmx->a_dex) + ch = '*'; + else + ch = ' '; + sprintf(pb, " Dex: %2d(%c%2d)", stef->a_dex, ch, stre->a_dex); + pb = &buf[strlen(buf)]; + if (stre->a_wis < stmx->a_wis) + ch = '*'; + else + ch = ' '; + sprintf(pb, " Wis: %2d(%c%2d)", stef->a_wis, ch, stre->a_wis); + pb = &buf[strlen(buf)]; + if (stre->a_con < stmx->a_con) + ch = '*'; + else + ch = ' '; + sprintf(pb, " Con: %2d(%c%2d)", stef->a_con, ch, stre->a_con); + pb = &buf[strlen(buf)]; + sprintf(pb, " Carry: %3d(%3d)", carwght, totwght); + mvwaddstr(cw, LINES - 1, 0, buf); + sprintf(buf, "Level: %d Gold: %5d Hp: ",level, purse); + pb = &buf[strlen(buf)]; + sprintf(pb, hwidth, him->s_hpt, him->s_maxhp); + pb = &buf[strlen(buf)]; + sprintf(pb," Ac: %-2d Exp: %d/%ld",cur_armor == NULL ? him->s_arm : + cur_armor->o_ac, him->s_lvl, him->s_exp); + carwght = (packvol * 100) / V_PACK; + pb = &buf[strlen(buf)]; + sprintf(pb, " Vol: %3d%%", carwght); + mvwaddstr(cw, LINES - 2, 0, buf); + waddstr(cw, hungstr[hungry_state]); + wclrtoeol(cw); + wmove(cw, oy, ox); +} + +/* + * dispmax: + * Display the hero's maximum status + */ +dispmax() +{ + reg struct real *hmax; + + hmax = &max_stats.s_re; + msg("Maximums: Str = %d Dex = %d Wis = %d Con = %d", + hmax->a_str, hmax->a_dex, hmax->a_wis, hmax->a_con); +} + +/* + * illeg_ch: + * Returns TRUE if a char shouldn't show on the screen + */ +illeg_ch(ch) +unsigned char ch; +{ + if (ch < 32 || ch > 127) + return TRUE; + if (ch >= '0' && ch <= '9') + return TRUE; + return FALSE; +} + +/* + * wait_for: + * Sit around until the guy types the right key + */ +wait_for(win,ch) +WINDOW *win; +char ch; +{ + register char c; + + if (ch == '\n') + while ((c = wgetch(win)) != '\n' && c != '\r') + continue; + else + while (wgetch(win) != ch) + continue; +} + +#ifdef NEED_GETTIME +#include <stdio.h> +#include <pwd.h> + +/* + * gettime: + * This routine returns the current time as a string + */ +#ifdef ATT +#include <time.h> +#endif +#ifdef BSD +#include <sys/time.h> +#endif + +char * +gettime() +{ + register char *timeptr; + char *ctime(); + long int now, time(); + + time(&now); /* get current time */ + timeptr = ctime(&now); /* convert to string */ + return timeptr; /* return the string */ +} +#endif + + +/* + * dbotline: + * Displays message on bottom line and waits for a space to return + */ +dbotline(scr,message) +WINDOW *scr; +char *message; +{ + mvwaddstr(scr,LINES-1,0,message); + draw(scr); + wait_for(scr,' '); +} + + +/* + * restscr: + * Restores the screen to the terminal + */ +restscr(scr) +WINDOW *scr; +{ + clearok(scr,TRUE); + touchwin(scr); +} + +/* + * npch: + * Get the next char in line for inventories + */ +npch(ch) +char ch; +{ + reg char nch; + if (ch >= 'z') + nch = 'A'; + else + nch = ch + 1; + return nch; +}