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

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

1.1     ! rubenllo    1: /*
        !             2:     io.c - Various input/output functions
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <string.h>
        !            20: #include <ctype.h>
        !            21: #include <stdarg.h>
        !            22: #include "rogue.h"
        !            23:
        !            24: char prbuf[2 * LINELEN];    /* Buffer for sprintfs                      */
        !            25: static char mbuf[2*LINELEN];  /* Current message buffer        */
        !            26: static int newpos = 0;       /* index in mbuf to end of msg   */
        !            27:
        !            28: int mpos = 0;                 /* 0  = Overwrite existing message */
        !            29:                               /* >0 = print --More-- at this pos */
        !            30:                               /*      and wait for key           */
        !            31:
        !            32: int line_cnt = 0;
        !            33: int newpage  = FALSE;
        !            34:
        !            35: /*
        !            36:     msg()
        !            37:         Display a message at the top of the screen.
        !            38: */
        !            39:
        !            40: void
        !            41: msg(const char *fmt, ...)
        !            42: {
        !            43:     va_list ap;
        !            44:
        !            45:     /* if the string is "", just clear the line */
        !            46:
        !            47:     if (*fmt == '\0')
        !            48:     {
        !            49:         wmove(cw, 0, 0);
        !            50:         wclrtoeol(cw);
        !            51:         mpos = 0;
        !            52:         return;
        !            53:     }
        !            54:
        !            55:     /* otherwise add to the message and flush it out */
        !            56:
        !            57:     va_start(ap, fmt);
        !            58:     doadd(fmt, ap);
        !            59:     va_end(ap);
        !            60:
        !            61:     endmsg();
        !            62: }
        !            63:
        !            64: void
        !            65: vmsg(const char *fmt, va_list ap)
        !            66: {
        !            67:     /* if the string is "", just clear the line */
        !            68:
        !            69:     if (*fmt == '\0')
        !            70:     {
        !            71:         wmove(cw, 0, 0);
        !            72:         wclrtoeol(cw);
        !            73:         mpos = 0;
        !            74:         return;
        !            75:     }
        !            76:
        !            77:     /* otherwise add to the message and flush it out */
        !            78:
        !            79:     doadd(fmt, ap);
        !            80:     endmsg();
        !            81: }
        !            82:
        !            83:
        !            84: /*
        !            85:     addmsg()
        !            86:         add things to the current message
        !            87: */
        !            88:
        !            89: void
        !            90: addmsg(const char *fmt, ...)
        !            91: {
        !            92:     va_list ap;
        !            93:
        !            94:     va_start(ap, fmt);
        !            95:     doadd(fmt,ap);
        !            96:     va_end(ap);
        !            97: }
        !            98:
        !            99: /*
        !           100:     endmsg()
        !           101:         Display a new msg (giving him a chance to see the previous one
        !           102:         if it is up there with the --More--)
        !           103: */
        !           104:
        !           105: void
        !           106: endmsg(void)
        !           107: {
        !           108:     strcpy(msgbuf[msg_index], mbuf);
        !           109:
        !           110:     msg_index = ++msg_index % 10;
        !           111:
        !           112:     if (mpos)
        !           113:     {
        !           114:         wmove(cw, 0, mpos);
        !           115:         wprintw(cw, (char *) morestr);
        !           116:         wrefresh(cw);
        !           117:         wait_for(' ');
        !           118:     }
        !           119:
        !           120:     mvwprintw(cw, 0, 0, mbuf);
        !           121:     wclrtoeol(cw);
        !           122:
        !           123:     mpos = newpos;
        !           124:     newpos = 0;
        !           125:
        !           126:     wrefresh(cw);
        !           127: }
        !           128:
        !           129: void
        !           130: doadd(const char *fmt, va_list ap)
        !           131: {
        !           132:     vsprintf(&mbuf[newpos], fmt, ap);
        !           133:     newpos = (int) strlen(mbuf);
        !           134: }
        !           135:
        !           136: /*
        !           137:     status()
        !           138:         Display the important stats line.  Keep the cursor where it was.
        !           139: */
        !           140:
        !           141: void
        !           142: status(int display)
        !           143: {
        !           144:     static char buf[1024];             /* Temporary buffer */
        !           145:     struct stats *stat_ptr, *max_ptr;
        !           146:     int oy, ox;
        !           147:
        !           148:     stat_ptr = &pstats;
        !           149:     max_ptr = &max_stats;
        !           150:
        !           151:     getyx(cw, oy, ox);
        !           152:     sprintf(buf,
        !           153:     "Int:%d(%d) Str:%d(%d) Wis:%d(%d) Dex:%d(%d) Con:%d(%d) Carry:%d(%d) %d",
        !           154:         stat_ptr->s_intel, max_ptr->s_intel,
        !           155:         stat_ptr->s_str, max_ptr->s_str,
        !           156:         stat_ptr->s_wisdom, max_ptr->s_wisdom,
        !           157:         stat_ptr->s_dext, max_ptr->s_dext,
        !           158:         stat_ptr->s_const, max_ptr->s_const,
        !           159:         stat_ptr->s_pack / 10, stat_ptr->s_carry / 10, foodlev );
        !           160:
        !           161:     mvwaddstr(cw, LINES - 2, 0, buf);
        !           162:     wclrtoeol(cw);
        !           163:
        !           164:     sprintf(buf, "Lvl:%d Au:%ld Hpt:%3ld(%3ld) Pow:%d(%d) Ac:%d  Exp:%d+%ld  %s",
        !           165:         level,
        !           166:         purse,
        !           167:         stat_ptr->s_hpt, max_ptr->s_hpt,
        !           168:         stat_ptr->s_power, max_ptr->s_power,
        !           169:         (cur_armor != NULL ? (cur_armor->o_ac - 10 + stat_ptr->s_arm)
        !           170:          : stat_ptr->s_arm) - ring_value(R_PROTECT),
        !           171:         stat_ptr->s_lvl,
        !           172:         stat_ptr->s_exp,
        !           173:         cnames[player.t_ctype][min(stat_ptr->s_lvl - 1, 14)]);
        !           174:
        !           175:     mvwaddstr(cw, LINES - 1, 0, buf);
        !           176:
        !           177:     switch(hungry_state)
        !           178:     {
        !           179:         case F_OK:     break;
        !           180:         case F_HUNGRY: waddstr(cw, " Hungry");
        !           181:                        break;
        !           182:         case F_WEAK:   waddstr(cw, " Weak");
        !           183:                        break;
        !           184:         case F_FAINT:  waddstr(cw, " Fainting");
        !           185:                        break;
        !           186:     }
        !           187:
        !           188:     wclrtoeol(cw);
        !           189:     wmove(cw, oy, ox);
        !           190:
        !           191:     if (display)
        !           192:         wrefresh(cw);
        !           193: }
        !           194:
        !           195: /*
        !           196:  * readchar:
        !           197:  *     Flushes stdout so that screen is up to date and then returns
        !           198:  *     getchar().
        !           199:  */
        !           200:
        !           201: char
        !           202: readcharw(WINDOW *win)
        !           203: {
        !           204:     char ch;
        !           205:
        !           206:     ch = (char) md_readchar(win);
        !           207:
        !           208:     if ((ch == 3) || (ch == 0))
        !           209:     {
        !           210:        quit();
        !           211:        return(27);
        !           212:     }
        !           213:
        !           214:     return(ch);
        !           215: }
        !           216:
        !           217: char
        !           218: readchar()
        !           219: {
        !           220:     return( readcharw(cw) );
        !           221: }
        !           222:
        !           223: /*
        !           224:     wait_for()
        !           225:         Sit around until the guy types the right key
        !           226: */
        !           227:
        !           228: void
        !           229: w_wait_for(WINDOW *w, int ch)
        !           230: {
        !           231:     char    c;
        !           232:
        !           233:     if (ch == '\n')
        !           234:         while ((c = readcharw(w)) != '\n' && c != '\r')
        !           235:             continue;
        !           236:     else
        !           237:         while (readcharw(w) != ch)
        !           238:             continue;
        !           239: }
        !           240:
        !           241: void
        !           242: wait_for(int ch)
        !           243: {
        !           244:     w_wait_for(cw, ch);
        !           245: }
        !           246:
        !           247: /*
        !           248:     show_win()
        !           249:         function used to display a window and wait before returning
        !           250: */
        !           251:
        !           252: void
        !           253: show_win(WINDOW *scr, char *message)
        !           254: {
        !           255:     mvwaddstr(scr, 0, 0, message);
        !           256:     touchwin(scr);
        !           257:     wmove(scr, hero.y, hero.x);
        !           258:     wrefresh(scr);
        !           259:     wait_for(' ');
        !           260:     clearok(cw, TRUE);
        !           261:     touchwin(cw);
        !           262: }
        !           263:
        !           264: /*
        !           265:     restscr()
        !           266:         Restores the screen to the terminal
        !           267: */
        !           268:
        !           269: void
        !           270: restscr(WINDOW *scr)
        !           271: {
        !           272:     clearok(scr, TRUE);
        !           273:     touchwin(scr);
        !           274: }
        !           275:
        !           276: /*
        !           277:     add_line()
        !           278:         Add a line to the list of discoveries
        !           279: */
        !           280:
        !           281: void
        !           282: add_line(const char *fmt, ...)
        !           283: {
        !           284:     WINDOW  *tw;
        !           285:     va_list ap;
        !           286:
        !           287:     va_start(ap, fmt);
        !           288:
        !           289:     if (line_cnt == 0)
        !           290:     {
        !           291:         wclear(hw);
        !           292:
        !           293:         if (inv_type == INV_SLOW)
        !           294:             mpos = 0;
        !           295:     }
        !           296:
        !           297:     if (inv_type == INV_SLOW)
        !           298:     {
        !           299:         if ( (fmt != NULL) && (*fmt != '\0') )
        !           300:             vmsg(fmt, ap);
        !           301:         line_cnt++;
        !           302:     }
        !           303:     else
        !           304:     {
        !           305:         if ( (line_cnt >= LINES - 2) || (fmt == NULL)) /* end 'o page */
        !           306:         {
        !           307:             if (fmt == NULL && !newpage && inv_type == INV_OVER)
        !           308:             {
        !           309:                 tw = newwin(line_cnt + 2, COLS, 0, 0);
        !           310:                 overwrite(hw, tw);
        !           311:                 wstandout(tw);
        !           312:                 mvwaddstr(tw, line_cnt, 0, spacemsg);
        !           313:                 wstandend(tw);
        !           314:                 touchwin(tw);
        !           315:                 wrefresh(tw);
        !           316:                 wait_for(' ');
        !           317:                 delwin(tw);
        !           318:                 touchwin(cw);
        !           319:             }
        !           320:             else
        !           321:             {
        !           322:                 wstandout(hw);
        !           323:                 mvwaddstr(hw, LINES - 1, 0, spacemsg);
        !           324:                 wstandend(hw);
        !           325:                 wrefresh(hw);
        !           326:                 w_wait_for(hw, ' ');
        !           327:                 touchwin(cw);
        !           328:                 wclear(hw);
        !           329:             }
        !           330:             newpage = TRUE;
        !           331:             line_cnt = 0;
        !           332:         }
        !           333:
        !           334:         /* draw line */
        !           335:         if (fmt != NULL && !(line_cnt == 0 && *fmt == '\0'))
        !           336:         {
        !           337:             static char tmpbuf[1024];
        !           338:
        !           339:             vsprintf(tmpbuf, fmt, ap);
        !           340:             mvwprintw(hw, line_cnt++, 0, tmpbuf);
        !           341:         }
        !           342:     }
        !           343: }
        !           344:
        !           345: /*
        !           346:     end_line()
        !           347:         End the list of lines
        !           348: */
        !           349:
        !           350: void
        !           351: end_line(void)
        !           352: {
        !           353:     if (inv_type != INV_SLOW)
        !           354:         add_line(NULL);
        !           355:
        !           356:     line_cnt = 0;
        !           357:     newpage = FALSE;
        !           358: }
        !           359:
        !           360: /*
        !           361:     hearmsg()
        !           362:         Call msg() only if you are not deaf
        !           363: */
        !           364:
        !           365: void
        !           366: hearmsg(const char *fmt, ...)
        !           367: {
        !           368:     va_list ap;
        !           369:
        !           370:     va_start(ap, fmt);
        !           371:
        !           372:     if (off(player, ISDEAF))
        !           373:         vmsg(fmt, ap);
        !           374:     else if (wizard)
        !           375:     {
        !           376:         msg("Couldn't hear: ");
        !           377:         vmsg(fmt, ap);
        !           378:     }
        !           379:
        !           380:     va_end(ap);
        !           381: }
        !           382:
        !           383: /*
        !           384:     seemsg()
        !           385:         Call msg() only if you are not blind
        !           386: */
        !           387:
        !           388: void
        !           389: seemsg(const char *fmt, ...)
        !           390: {
        !           391:     va_list ap;
        !           392:
        !           393:     va_start(ap, fmt);
        !           394:
        !           395:     if (off(player, ISBLIND))
        !           396:         vmsg(fmt, ap);
        !           397:     else if (wizard)
        !           398:     {
        !           399:         msg("Couldn't see: ");
        !           400:         vmsg(fmt, ap);
        !           401:     }
        !           402:
        !           403:     va_end(ap);
        !           404: }
        !           405:
        !           406: int
        !           407: get_string(char *buffer, WINDOW *win)
        !           408: {
        !           409:     char    *sp, c;
        !           410:     int oy, ox;
        !           411:     char    buf[2 * LINELEN];
        !           412:
        !           413:     wrefresh(win);
        !           414:     getyx(win, oy, ox);
        !           415:
        !           416:     /* loop reading in the string, and put it in a temporary buffer */
        !           417:
        !           418:     for (sp = buf; (c = readcharw(win)) != '\n' &&
        !           419:          c != '\r' &&
        !           420:          c != '\033' &&
        !           421:          c != '\007' &&
        !           422:          sp < &buf[LINELEN - 1];
        !           423:          wclrtoeol(win), wrefresh(win))
        !           424:     {
        !           425:        if ((c == '\b') || (c == 0x7f))
        !           426:         {
        !           427:             if (sp > buf)
        !           428:             {
        !           429:                 size_t i;
        !           430:
        !           431:                 sp--;
        !           432:
        !           433:                 for (i = strlen(unctrl(*sp)); i; i--)
        !           434:                     waddch(win, '\b');
        !           435:             }
        !           436:             continue;
        !           437:         }
        !           438:         else if (c == '\0')
        !           439:         {
        !           440:             sp = buf;
        !           441:             wmove(win, oy, ox);
        !           442:             continue;
        !           443:         }
        !           444:         else if (sp == buf && c == '-' && win == hw)
        !           445:             break;
        !           446:
        !           447:         *sp++ = c;
        !           448:         waddstr(win, unctrl(c));
        !           449:     }
        !           450:
        !           451:     *sp = '\0';
        !           452:
        !           453:     if (sp > buf)       /* only change option if something has been typed */
        !           454:         strncpy(buffer, buf, strlen(buf)+1);
        !           455:
        !           456:     wmove(win, oy, ox);
        !           457:     waddstr(win, buffer);
        !           458:     waddch(win, '\n');
        !           459:     wrefresh(win);
        !           460:
        !           461:     if (win == cw)
        !           462:         mpos += (int)(sp - buf);
        !           463:
        !           464:     if (c == '-')
        !           465:         return(MINUS);
        !           466:     else if (c == '\033' || c == '\007')
        !           467:         return(QUIT);
        !           468:     else
        !           469:         return(NORM);
        !           470: }
        !           471:

CVSweb