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

Annotation of early-roguelike/rogue4/options.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * This file has all the code for the option command.  I would rather
                      3:  * this command were not necessary, but it is the only way to keep the
                      4:  * wolves off of my back.
                      5:  *
                      6:  * @(#)options.c       4.12 (Berkeley) 3/2/82
                      7:  *
                      8:  * Rogue: Exploring the Dungeons of Doom
                      9:  * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
                     10:  * All rights reserved.
                     11:  *
                     12:  * See the file LICENSE.TXT for full copyright and licensing information.
                     13:  */
                     14:
                     15: #include <curses.h>
                     16: #include <ctype.h>
                     17: #include <string.h>
                     18: #include "rogue.h"
                     19:
                     20: #define        EQSTR(a, b, c)  (strncmp(a, b, c) == 0)
                     21:
                     22: #define        NUM_OPTS        (sizeof optlist / sizeof (OPTION))
                     23:
                     24: /*
                     25:  * description of an option and what to do with it
                     26:  */
                     27: struct optstruct {
                     28:     char       *o_name;        /* option name */
                     29:     char       *o_prompt;      /* prompt for interactive entry */
                     30:     void       *o_opt;         /* pointer to thing to set */
                     31:     void       (*o_putfunc)(); /* function to print value */
                     32:     int                (*o_getfunc)(); /* function to get value interactively */
                     33: };
                     34:
                     35: typedef struct optstruct       OPTION;
                     36:
                     37: int allowchange(OPTION *opt);
                     38:
                     39: void put_bool(bool *b);
                     40: void put_str(char *str);
                     41: int get_bool(bool *bp, WINDOW *win);
                     42: int get_str(char *opt, WINDOW *win);
                     43:
                     44: OPTION optlist[] = {
                     45:     {"terse",   "Terse output: ",
                     46:                 (void *) &terse,       put_bool,       get_bool        },
                     47:     {"flush",   "Flush typeahead during battle: ",
                     48:                (void *) &fight_flush,  put_bool,       get_bool        },
                     49:     {"jump",    "Show position only at end of run: ",
                     50:                (void *) &jump,         put_bool,       get_bool        },
                     51:     {"step",   "Do inventories one line at a time: ",
                     52:                (void *) &slow_invent,  put_bool,       get_bool        },
                     53:     {"askme",  "Ask me about unidentified things: ",
                     54:                (void *) &askme,        put_bool,       get_bool        },
                     55:     {"passgo", "Follow turnings in passageways: ",
                     56:                (void *) &passgo,       put_bool,       get_bool        },
                     57:     {"name",    "Name: ",
                     58:                (void *) whoami,        put_str,        get_str         },
                     59:     {"fruit",   "Fruit: ",
                     60:                (void *) fruit,         put_str,        get_str         },
                     61:     {"file",    "Save file: ",
                     62:                (void *) file_name,     put_str,        get_str         }
                     63: };
                     64:
                     65: /*
                     66:  * option:
                     67:  *     Print and then set options from the terminal
                     68:  */
                     69: void
                     70: option(void)
                     71: {
                     72:     register OPTION    *op;
                     73:     register int       retval;
                     74:
                     75:     wclear(hw);
                     76:     /*
                     77:      * Display current values of options
                     78:      */
                     79:     for (op = optlist; op < &optlist[NUM_OPTS]; op++)
                     80:     {
                     81:         if (allowchange(op))
                     82:         {
                     83:            waddstr(hw, op->o_prompt);
                     84:            (*op->o_putfunc)(op->o_opt);
                     85:            waddch(hw, '\n');
                     86:         }
                     87:     }
                     88:     /*
                     89:      * Set values
                     90:      */
                     91:     wmove(hw, 0, 0);
                     92:     for (op = optlist; op < &optlist[NUM_OPTS]; op++)
                     93:     {
                     94:         if (!allowchange(op))
                     95:             continue;
                     96:        waddstr(hw, op->o_prompt);
                     97:        if ((retval = (*op->o_getfunc)(op->o_opt, hw)))
                     98:         {
                     99:            if (retval == QUIT)
                    100:                break;
                    101: #if 0 /* disable MINUS */
                    102:            else if (op > optlist) {    /* MINUS */
                    103:                wmove(hw, (op - optlist) - 1, 0);
                    104:                op -= 2;
                    105:            }
                    106:            else        /* trying to back up beyond the top */
                    107:            {
                    108:                putchar('\007');
                    109:                wmove(hw, 0, 0);
                    110:                op--;
                    111:            }
                    112: #else
                    113:             break;
                    114: #endif
                    115:         }
                    116:     }
                    117:     /*
                    118:      * Switch back to original screen
                    119:      */
                    120:     mvwaddstr(hw, LINES-1, 0, "--Press space to continue--");
                    121:     wrefresh(hw);
                    122:     wait_for(' ');
                    123:     clearok(curscr, TRUE);
                    124:     touchwin(stdscr);
                    125:     after = FALSE;
                    126: }
                    127:
                    128: /*
                    129:  * put_bool
                    130:  *     Put out a boolean
                    131:  */
                    132: void
                    133: put_bool(bool *b)
                    134: {
                    135:     waddstr(hw, *b ? "True" : "False");
                    136: }
                    137:
                    138: /*
                    139:  * put_str:
                    140:  *     Put out a string
                    141:  */
                    142: void
                    143: put_str(char *str)
                    144: {
                    145:     waddstr(hw, str);
                    146: }
                    147:
                    148: /*
                    149:  * get_bool:
                    150:  *     Allow changing a boolean option and print it out
                    151:  */
                    152: int
                    153: get_bool(bool *bp, WINDOW *win)
                    154: {
                    155:     register int oy, ox;
                    156:     register bool op_bad;
                    157:
                    158:     op_bad = TRUE;
                    159:     getyx(win, oy, ox);
                    160:     waddstr(win, *bp ? "True" : "False");
                    161:     while (op_bad)
                    162:     {
                    163:        wmove(win, oy, ox);
                    164:        wrefresh(win);
                    165:        switch (readcharw(win))
                    166:        {
                    167:            case 't':
                    168:            case 'T':
                    169:                *bp = TRUE;
                    170:                op_bad = FALSE;
                    171:                break;
                    172:            case 'f':
                    173:            case 'F':
                    174:                *bp = FALSE;
                    175:                op_bad = FALSE;
                    176:                break;
                    177:            case '\n':
                    178:            case '\r':
                    179:                op_bad = FALSE;
                    180:                break;
                    181:            case '\033':
                    182:            case '\007':
                    183:                return QUIT;
                    184:            case '-':
                    185:                return MINUS;
                    186:            default:
                    187:                mvwaddstr(win, oy, ox + 10, "(T or F)");
                    188:        }
                    189:     }
                    190:     wmove(win, oy, ox);
                    191:     waddstr(win, *bp ? "True" : "False");
                    192:     waddch(win, '\n');
                    193:     return NORM;
                    194: }
                    195:
                    196: /*
                    197:  * get_str:
                    198:  *     Set a string option
                    199:  */
                    200: #define MAXINP 50      /* max string to read from terminal or environment */
                    201:
                    202: int
                    203: get_str(char *opt, WINDOW *win)
                    204: {
                    205:     register char *sp;
                    206:     register int c, oy, ox;
                    207:     char buf[MAXSTR];
                    208:
                    209:     getyx(win, oy, ox);
                    210:     wrefresh(win);
                    211:     /*
                    212:      * loop reading in the string, and put it in a temporary buffer
                    213:      */
                    214:     for (sp = buf; (c = readcharw(win)) != '\n' && c != '\r' && c != '\033';
                    215:        wclrtoeol(win), wrefresh(win))
                    216:     {
                    217:        if (c == -1)
                    218:            continue;
                    219:        else if (c == md_erasechar())   /* process erase character */
                    220:        {
                    221:            if (sp > buf)
                    222:            {
                    223:                register int i;
                    224:
                    225:                sp--;
                    226:                for (i = strlen(unctrol(*sp)); i; i--)
                    227:                    waddch(win, '\b');
                    228:            }
                    229:            continue;
                    230:        }
                    231:        else if (c == md_killchar())     /* process kill character */
                    232:        {
                    233:            sp = buf;
                    234:            wmove(win, oy, ox);
                    235:            continue;
                    236:        }
                    237:        else if (sp == buf)
                    238:        {
                    239:            if (c == '-' && win != stdscr)
                    240:                break;
                    241:            else if (c == '~')
                    242:            {
                    243:                strcpy(buf, home);
                    244:                waddstr(win, home);
                    245:                sp += strlen(home);
                    246:                continue;
                    247:            }
                    248:        }
                    249:        if (sp >= &buf[MAXINP] || !(isprint(c) || c == ' '))
                    250:            putchar(CTRL('G'));
                    251:        else
                    252:        {
                    253:            *sp++ = c;
                    254:            waddstr(win, unctrol(c));
                    255:        }
                    256:     }
                    257:     *sp = '\0';
                    258:     if (sp > buf)      /* only change option if something has been typed */
                    259:        strucpy(opt, buf, strlen(buf));
                    260:     wmove(win, oy, ox);
                    261:     waddstr(win, opt);
                    262:     waddch(win, '\n');
                    263:     wrefresh(win);
                    264:     if (win == stdscr)
                    265:        mpos += sp - buf;
                    266:     if (c == '-')
                    267:        return MINUS;
                    268:     else if (c == '\033' || c == '\007')
                    269:        return QUIT;
                    270:     else
                    271:        return NORM;
                    272: }
                    273:
                    274: #ifdef WIZARD
                    275: /*
                    276:  * get_num:
                    277:  *     Get a numeric option
                    278:  */
                    279: int
                    280: get_num(short *opt, WINDOW *win)
                    281: {
                    282:     register int i;
                    283:     char buf[MAXSTR];
                    284:
                    285:     if ((i = get_str(buf, win)) == NORM)
                    286:        *opt = atoi(buf);
                    287:     return i;
                    288: }
                    289: #endif
                    290:
                    291: /*
                    292:  * parse_opts:
                    293:  *     Parse options from string, usually taken from the environment.
                    294:  *     The string is a series of comma seperated values, with booleans
                    295:  *     being stated as "name" (true) or "noname" (false), and strings
                    296:  *     being "name=....", with the string being defined up to a comma
                    297:  *     or the end of the entire option string.
                    298:  */
                    299: void
                    300: parse_opts(char *str)
                    301: {
                    302:     register char *sp;
                    303:     register OPTION *op;
                    304:     register int len;
                    305:
                    306:     while (*str)
                    307:     {
                    308:        /*
                    309:         * Get option name
                    310:         */
                    311:        for (sp = str; isalpha(*sp); sp++)
                    312:            continue;
                    313:        len = sp - str;
                    314:        /*
                    315:         * Look it up and deal with it
                    316:         */
                    317:        for (op = optlist; op < &optlist[NUM_OPTS]; op++)
                    318:         {
                    319:             /* If using system savefiles, changing your name or the
                    320:                save file is not allowed. */
                    321:             if (!allowchange(op))
                    322:                 continue;
                    323:            if (EQSTR(str, op->o_name, len))
                    324:            {
                    325:                if (op->o_putfunc == put_bool)  /* if option is a boolean */
                    326:                    *(bool *)op->o_opt = TRUE;
                    327:                else                            /* string option */
                    328:                {
                    329:                    register char *start;
                    330:                    /*
                    331:                     * Skip to start of string value
                    332:                     */
                    333:                    for (str = sp + 1; *str == '='; str++)
                    334:                        continue;
                    335:                    if (*str == '~')
                    336:                    {
                    337:                        strcpy((char *) op->o_opt, home);
                    338:                        start = (char *) op->o_opt + strlen(home);
                    339:                        while (*++str == '/')
                    340:                            continue;
                    341:                    }
                    342:                    else
                    343:                        start = (char *) op->o_opt;
                    344:                    /*
                    345:                     * Skip to end of string value
                    346:                     */
                    347:                    for (sp = str + 1; *sp && *sp != ','; sp++)
                    348:                        continue;
                    349:                    strucpy(start, str, sp - str);
                    350:                }
                    351:                break;
                    352:            }
                    353:            /*
                    354:             * check for "noname" for booleans
                    355:             */
                    356:            else if (op->o_putfunc == put_bool
                    357:              && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2))
                    358:            {
                    359:                *(bool *)op->o_opt = FALSE;
                    360:                break;
                    361:            }
                    362:         }
                    363:
                    364:        /*
                    365:         * skip to start of next option name
                    366:         */
                    367:        while (*sp && !isalpha(*sp))
                    368:            sp++;
                    369:        str = sp;
                    370:     }
                    371: }
                    372:
                    373: /*
                    374:  * strucpy:
                    375:  *     Copy string using unctrol for things
                    376:  */
                    377: void
                    378: strucpy(char *s1, char *s2, int len)
                    379: {
                    380:     if (len > MAXINP)
                    381:        len = MAXINP;
                    382:     while (len--)
                    383:     {
                    384:        if (isprint(*s2) || *s2 == ' ')
                    385:            *s1++ = *s2;
                    386:        s2++;
                    387:     }
                    388:     *s1 = '\0';
                    389: }
                    390:
                    391: /* Tells whether the player is allowed to change the option. */
                    392: int allowchange(OPTION *opt)
                    393: {
                    394:     if (!use_savedir)
                    395:         return 1;
                    396:     if (!strcmp(opt->o_name, "name"))
                    397:         return 0;
                    398:     if (!strcmp(opt->o_name, "file"))
                    399:         return 0;
                    400:     return 1;
                    401: }
                    402:

CVSweb