[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

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