[BACK]Return to io.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / rogue5

Annotation of early-roguelike/rogue5/io.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * Various input/output functions
        !             3:  *
        !             4:  * @(#)io.c    4.32 (Berkeley) 02/05/99
        !             5:  */
        !             6:
        !             7: #include <stdarg.h>
        !             8: #include <curses.h>
        !             9: #include <ctype.h>
        !            10: #include <string.h>
        !            11: #include "rogue.h"
        !            12:
        !            13: /*
        !            14:  * msg:
        !            15:  *     Display a message at the top of the screen.
        !            16:  */
        !            17: #define MAXMSG (NUMCOLS - sizeof "--More--")
        !            18:
        !            19: static char msgbuf[2*MAXMSG+1];
        !            20: static int newpos = 0;
        !            21:
        !            22: /* VARARGS1 */
        !            23: int
        !            24: msg(const char *fmt, ...)
        !            25: {
        !            26:     va_list args;
        !            27:
        !            28:     /*
        !            29:      * if the string is "", just clear the line
        !            30:      */
        !            31:     if (*fmt == '\0')
        !            32:     {
        !            33:        move(0, 0);
        !            34:        clrtoeol();
        !            35:        mpos = 0;
        !            36:        return ~ESCAPE;
        !            37:     }
        !            38:     /*
        !            39:      * otherwise add to the message and flush it out
        !            40:      */
        !            41:     va_start(args, fmt);
        !            42:     doadd(fmt, args);
        !            43:     va_end(args);
        !            44:     return endmsg();
        !            45: }
        !            46:
        !            47: /*
        !            48:  * addmsg:
        !            49:  *     Add things to the current message
        !            50:  */
        !            51: /* VARARGS1 */
        !            52: void
        !            53: addmsg(const char *fmt, ...)
        !            54: {
        !            55:     va_list args;
        !            56:
        !            57:     va_start(args, fmt);
        !            58:     doadd(fmt, args);
        !            59:     va_end(args);
        !            60: }
        !            61:
        !            62: /*
        !            63:  * endmsg:
        !            64:  *     Display a new msg (giving him a chance to see the previous one
        !            65:  *     if it is up there with the --More--)
        !            66:  */
        !            67: int
        !            68: endmsg(void)
        !            69: {
        !            70:     int ch;
        !            71:
        !            72:     if (save_msg)
        !            73:        strcpy(huh, msgbuf);
        !            74:     if (mpos)
        !            75:     {
        !            76:        look(FALSE);
        !            77:        mvaddstr(0, mpos, "--More--");
        !            78:        refresh();
        !            79:        if (!msg_esc)
        !            80:            wait_for(stdscr, ' ');
        !            81:        else
        !            82:        {
        !            83:            while ((ch = readchar()) != ' ')
        !            84:                if (ch == ESCAPE)
        !            85:                {
        !            86:                    msgbuf[0] = '\0';
        !            87:                    mpos = 0;
        !            88:                    newpos = 0;
        !            89:                    msgbuf[0] = '\0';
        !            90:                    return ESCAPE;
        !            91:                }
        !            92:        }
        !            93:     }
        !            94:     /*
        !            95:      * All messages should start with uppercase, except ones that
        !            96:      * start with a pack addressing character
        !            97:      */
        !            98:     if (islower((int)msgbuf[0]) && !lower_msg && msgbuf[1] != ')')
        !            99:        msgbuf[0] = (char) toupper(msgbuf[0]);
        !           100:     mvaddstr(0, 0, msgbuf);
        !           101:     clrtoeol();
        !           102:     mpos = newpos;
        !           103:     newpos = 0;
        !           104:     msgbuf[0] = '\0';
        !           105:     refresh();
        !           106:     return ~ESCAPE;
        !           107: }
        !           108:
        !           109: /*
        !           110:  * doadd:
        !           111:  *     Perform an add onto the message buffer
        !           112:  */
        !           113: void
        !           114: doadd(const char *fmt, va_list args)
        !           115: {
        !           116:     static char buf[MAXSTR];
        !           117:
        !           118:     /*
        !           119:      * Do the printf into buf
        !           120:      */
        !           121:     vsprintf(buf, fmt, args);
        !           122:     if (strlen(buf) + newpos >= MAXMSG)
        !           123:         endmsg();
        !           124:     strcat(msgbuf, buf);
        !           125:     newpos = (int) strlen(msgbuf);
        !           126: }
        !           127:
        !           128: /*
        !           129:  * step_ok:
        !           130:  *     Returns true if it is ok to step on ch
        !           131:  */
        !           132: int
        !           133: step_ok(int ch)
        !           134: {
        !           135:     switch (ch)
        !           136:     {
        !           137:        case ' ':
        !           138:        case '|':
        !           139:        case '-':
        !           140:            return FALSE;
        !           141:        default:
        !           142:            return (!isalpha(ch));
        !           143:     }
        !           144: }
        !           145:
        !           146: /*
        !           147:  * readchar:
        !           148:  *     Reads and returns a character, checking for gross input errors
        !           149:  */
        !           150:
        !           151: int
        !           152: readchar(void)
        !           153: {
        !           154:     int ch;
        !           155:
        !           156:     ch = md_readchar(stdscr);
        !           157:
        !           158:     if (ch == 3)
        !           159:     {
        !           160:                quit(0);
        !           161:         return(27);
        !           162:     }
        !           163:
        !           164:     return(ch);
        !           165: }
        !           166:
        !           167: int
        !           168: wreadchar(WINDOW *win)
        !           169: {
        !           170:     int ch;
        !           171:
        !           172:     ch = md_readchar(win);
        !           173:
        !           174:     if (ch == 3)
        !           175:     {
        !           176:                quit(0);
        !           177:         return(27);
        !           178:     }
        !           179:
        !           180:     return(ch);
        !           181: }
        !           182:
        !           183:
        !           184: /*
        !           185:  * status:
        !           186:  *     Display the important stats line.  Keep the cursor where it was.
        !           187:  */
        !           188: void
        !           189: status(void)
        !           190: {
        !           191:     int oy, ox, temp;
        !           192:     static int hpwidth = 0;
        !           193:     static int s_hungry = 0;
        !           194:     static int s_lvl = 0;
        !           195:     static int s_pur = -1;
        !           196:     static int s_hp = 0;
        !           197:     static int s_arm = 0;
        !           198:     static int s_str = 0;
        !           199:     static int s_exp = 0;
        !           200:     static char *state_name[] =
        !           201:     {
        !           202:        "", "Hungry", "Weak", "Faint"
        !           203:     };
        !           204:
        !           205:     /*
        !           206:      * If nothing has changed since the last status, don't
        !           207:      * bother.
        !           208:      */
        !           209:     temp = (cur_armor != NULL ? cur_armor->o_arm : pstats.s_arm);
        !           210:     if (s_hp == pstats.s_hpt && s_exp == pstats.s_exp && s_pur == purse
        !           211:        && s_arm == temp && s_str == pstats.s_str && s_lvl == level
        !           212:        && s_hungry == hungry_state
        !           213:        && !stat_msg
        !           214:        )
        !           215:            return;
        !           216:
        !           217:     s_arm = temp;
        !           218:
        !           219:     getyx(stdscr, oy, ox);
        !           220:     if (s_hp != max_hp)
        !           221:     {
        !           222:        temp = max_hp;
        !           223:        s_hp = max_hp;
        !           224:        for (hpwidth = 0; temp; hpwidth++)
        !           225:            temp /= 10;
        !           226:     }
        !           227:
        !           228:     /*
        !           229:      * Save current status
        !           230:      */
        !           231:     s_lvl = level;
        !           232:     s_pur = purse;
        !           233:     s_hp = pstats.s_hpt;
        !           234:     s_str = pstats.s_str;
        !           235:     s_exp = pstats.s_exp;
        !           236:     s_hungry = hungry_state;
        !           237:
        !           238:     if (stat_msg)
        !           239:     {
        !           240:         move(0, 0);
        !           241:         msg("Level: %d  Gold: %-5d  Hp: %*d(%*d)  Str: %2d(%d)  Arm: %-2d  Exp: %d/%d  %s",
        !           242:         level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, pstats.s_str,
        !           243:         max_stats.s_str, 10 - s_arm, pstats.s_lvl, pstats.s_exp,
        !           244:         state_name[hungry_state]);
        !           245:     }
        !           246:     else
        !           247:     {
        !           248:        move(STATLINE, 0);
        !           249:
        !           250:         printw("Level: %d  Gold: %-5d  Hp: %*d(%*d)  Str: %2d(%d)  Arm: %-2d  Exp: %d/%d  %s",
        !           251:            level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, pstats.s_str,
        !           252:            max_stats.s_str, 10 - s_arm, pstats.s_lvl, pstats.s_exp,
        !           253:            state_name[hungry_state]);
        !           254:     }
        !           255:
        !           256:     clrtoeol();
        !           257:     move(oy, ox);
        !           258: }
        !           259:
        !           260: /*
        !           261:  * wait_for
        !           262:  *     Sit around until the guy types the right key
        !           263:  */
        !           264: void
        !           265: wait_for(WINDOW *win, int ch)
        !           266: {
        !           267:     int c;
        !           268:
        !           269:     if (ch == '\n')
        !           270:         while ((c = wreadchar(win)) != '\n' && c != '\r')
        !           271:            continue;
        !           272:     else
        !           273:         while (wreadchar(win) != ch)
        !           274:            continue;
        !           275: }
        !           276:
        !           277: /*
        !           278:  * show_win:
        !           279:  *     Function used to display a window and wait before returning
        !           280:  */
        !           281: void
        !           282: show_win(const char *message)
        !           283: {
        !           284:     WINDOW *win;
        !           285:
        !           286:     win = hw;
        !           287:     wmove(win, 0, 0);
        !           288:     waddstr(win, message);
        !           289:     touchwin(win);
        !           290:     wrefresh(win);
        !           291:     wait_for(win, ' ');
        !           292:     clearok(curscr, TRUE);
        !           293:     touchwin(stdscr);
        !           294: }

CVSweb