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

Annotation of early-roguelike/rogue3/init.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * global variable initializaton
                      3:  *
                      4:  * @(#)init.c  3.33 (Berkeley) 6/15/81
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include "curses.h"
                     14: #include <ctype.h>
                     15: #include <string.h>
                     16: #include <stdlib.h>
                     17: #include "machdep.h"
                     18: #include "rogue.h"
                     19:
                     20: int playing = TRUE, running = FALSE, wizard = FALSE;
                     21: int notify = TRUE, fight_flush = FALSE, terse = FALSE, door_stop = FALSE;
                     22: int jump = FALSE, slow_invent = FALSE, firstmove = FALSE, askme = TRUE;
                     23: int use_savedir = FALSE;
                     24: int amulet = FALSE;
                     25: int in_shell = FALSE;
                     26: struct linked_list *lvl_obj = NULL, *mlist = NULL;
                     27: struct object *cur_weapon = NULL;
                     28: int mpos = 0, no_move = 0, no_command = 0, level = 1, purse = 0, inpack = 0;
                     29: int total = 0, no_food = 0, count = 0, fung_hit = 0, quiet = 0;
                     30: int food_left = HUNGERTIME, group = 1, hungry_state = 0;
                     31: int lastscore = -1;
                     32:
                     33: struct thing player;
                     34: struct room rooms[MAXROOMS];
                     35: struct room *oldrp;
                     36: struct stats max_stats;
                     37: struct object *cur_armor;
                     38: struct object *cur_ring[2];
                     39: int after;
                     40: int waswizard;
                     41: coord oldpos;                            /* Position before last look() call */
                     42: coord delta;                             /* Change indicated to get_dir()    */
                     43:
                     44: int s_know[MAXSCROLLS];         /* Does he know what a scroll does */
                     45: int p_know[MAXPOTIONS];         /* Does he know what a potion does */
                     46: int r_know[MAXRINGS];                   /* Does he know what a ring does
                     47:  */
                     48: int ws_know[MAXSTICKS];         /* Does he know what a stick does */
                     49:
                     50: int  take;                               /* Thing the rogue is taking */
                     51: int  runch;                              /* Direction player is running */
                     52: char whoami[80];                 /* Name of player */
                     53: char fruit[80];                          /* Favorite fruit */
                     54: char huh[80];                            /* The last message printed */
                     55: int dnum;                                /* Dungeon number */
                     56: char *s_names[MAXSCROLLS];               /* Names of the scrolls */
                     57: char *p_colors[MAXPOTIONS];              /* Colors of the potions */
                     58: char *r_stones[MAXRINGS];                /* Stone settings of the rings */
                     59: char *a_names[MAXARMORS];                /* Names of armor types */
                     60: char *ws_made[MAXSTICKS];                /* What sticks are made of */
                     61: char *s_guess[MAXSCROLLS];               /* Players guess at what scroll is */
                     62: char *p_guess[MAXPOTIONS];               /* Players guess at what potion is */
                     63: char *r_guess[MAXRINGS];         /* Players guess at what ring is */
                     64: char *ws_guess[MAXSTICKS];               /* Players guess at what wand is */
                     65: char *ws_type[MAXSTICKS];                /* Is it a wand or a staff */
                     66: char file_name[256];                      /* Save file name */
                     67: char home[PATH_MAX];                     /* User's home directory */
                     68: char prbuf[80];                          /* Buffer for sprintfs */
                     69: int max_hp;                              /* Player's max hit points */
                     70: int ntraps;                              /* Number of traps on this level */
                     71: int max_level;                           /* Deepest player has gone */
                     72: int seed;                                /* Random number seed */
                     73:
                     74: struct trap  traps[MAXTRAPS];
                     75:
                     76:
                     77: #define ___ 1
                     78: #define _x {1,1}
                     79: struct monster monsters[26] = {
                     80:        /* Name          CARRY  FLAG    str, exp, lvl, amr, hpt, dmg */
                     81:        { "giant ant",   0,     ISMEAN, { _x, 10,   2,   3, ___, "1d6" } },
                     82:        { "bat",         0,     0,      { _x,  1,   1,   3, ___, "1d2" } },
                     83:        { "centaur",     15,    0,      { _x, 15,   4,   4, ___, "1d6/1d6" } },
                     84:        { "dragon",      100,   ISGREED,{ _x,9000, 10,  -1, ___, "1d8/1d8/3d10" } },
                     85:        { "floating eye",0,     0,      { _x,  5,   1,   9, ___, "0d0" } },
                     86:        { "violet fungi",0,     ISMEAN, { _x, 85,   8,   3, ___, "000d0" } },
                     87:        { "gnome",       10,    0,      { _x,  8,   1,   5, ___, "1d6" } },
                     88:        { "hobgoblin",   0,     ISMEAN, { _x,  3,   1,   5, ___, "1d8" } },
                     89:        { "invisible stalker",0,ISINVIS,{ _x,120,   8,   3, ___, "4d4" } },
                     90:        { "jackal",      0,     ISMEAN, { _x,  2,   1,   7, ___, "1d2" } },
                     91:        { "kobold",      0,     ISMEAN, { _x,  1,   1,   7, ___, "1d4" } },
                     92:        { "leprechaun",  0,     0,      { _x, 10,   3,   8, ___, "1d1" } },
                     93:        { "mimic",       30,    0,      { _x,140,   7,   7, ___, "3d4" } },
                     94:        { "nymph",       100,   0,      { _x, 40,   3,   9, ___, "0d0" } },
                     95:        { "orc",         15,    ISBLOCK,{ _x,  5,   1,   6, ___, "1d8" } },
                     96:        { "purple worm", 70,    0,      { _x,7000, 15,   6, ___, "2d12/2d4" } },
                     97:        { "quasit",      30,    ISMEAN, { _x, 35,   3,   2, ___, "1d2/1d2/1d4" } },
                     98:        { "rust monster",0,     ISMEAN, { _x, 25,   5,   2, ___, "0d0/0d0" } },
                     99:        { "snake",       0,     ISMEAN, { _x,  3,   1,   5, ___, "1d3" } },
                    100:        { "troll",       50,    ISREGEN|ISMEAN,{ _x, 55,   6,   4, ___, "1d8/1d8/2d6" } },
                    101:        { "umber hulk",  40,    ISMEAN, { _x,130,   8,   2, ___, "3d4/3d4/2d5" } },
                    102:        { "vampire",     20,    ISREGEN|ISMEAN,{ _x,380,   8,   1, ___, "1d10" } },
                    103:        { "wraith",      0,     0,      { _x, 55,   5,   4, ___, "1d6" } },
                    104:        { "xorn",        0,     ISMEAN, { _x,120,   7,  -2, ___, "1d3/1d3/1d3/4d6" } },
                    105:        { "yeti",        30,    0,      { _x, 50,   4,   6, ___, "1d6/1d6" } },
                    106:        { "zombie",      0,     ISMEAN, { _x,  7,   2,   8, ___, "1d8" } }
                    107: };
                    108: #undef ___
                    109:
                    110: /*
                    111:  * init_player:
                    112:  *     roll up the rogue
                    113:  */
                    114:
                    115: void
                    116: init_player()
                    117: {
                    118:     pstats.s_lvl = 1;
                    119:     pstats.s_exp = 0L;
                    120:     max_hp = pstats.s_hpt = 12;
                    121:     if (rnd(100) == 7)
                    122:     {
                    123:        pstats.s_str.st_str = 18;
                    124:        pstats.s_str.st_add = rnd(100) + 1;
                    125:     }
                    126:     else
                    127:     {
                    128:        pstats.s_str.st_str = 16;
                    129:        pstats.s_str.st_add = 0;
                    130:     }
                    131:     strcpy(pstats.s_dmg,"1d4");
                    132:     pstats.s_arm = 10;
                    133:     max_stats = pstats;
                    134:     pack = NULL;
                    135: }
                    136:
                    137: /*
                    138:  * Contains defintions and functions for dealing with things like
                    139:  * potions and scrolls
                    140:  */
                    141:
                    142: char *rainbow[] = {
                    143:     "red",
                    144:     "blue",
                    145:     "green",
                    146:     "yellow",
                    147:     "black",
                    148:     "brown",
                    149:     "orange",
                    150:     "pink",
                    151:     "purple",
                    152:     "grey",
                    153:     "white",
                    154:     "silver",
                    155:     "gold",
                    156:     "violet",
                    157:     "clear",
                    158:     "vermilion",
                    159:     "ecru",
                    160:     "turquoise",
                    161:     "magenta",
                    162:     "amber",
                    163:     "topaz",
                    164:     "plaid",
                    165:     "tan",
                    166:     "tangerine"
                    167: };
                    168:
                    169: #define NCOLORS (sizeof rainbow / sizeof (char *))
                    170: int cNCOLORS = NCOLORS;
                    171:
                    172: char *sylls[] = {
                    173:     "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
                    174:     "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
                    175:     "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
                    176:     "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
                    177:     "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
                    178:     "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
                    179:     "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
                    180:     "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
                    181:     "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
                    182:     "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
                    183:     "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
                    184:     "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
                    185:     "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
                    186:     "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
                    187:     "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
                    188:     "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
                    189:     "zant", "zap", "zeb", "zim", "zok", "zon", "zum",
                    190: };
                    191:
                    192: char *stones[] = {
                    193:     "agate",
                    194:     "alexandrite",
                    195:     "amethyst",
                    196:     "carnelian",
                    197:     "diamond",
                    198:     "emerald",
                    199:     "granite",
                    200:     "jade",
                    201:     "kryptonite",
                    202:     "lapus lazuli",
                    203:     "moonstone",
                    204:     "obsidian",
                    205:     "onyx",
                    206:     "opal",
                    207:     "pearl",
                    208:     "ruby",
                    209:     "saphire",
                    210:     "tiger eye",
                    211:     "topaz",
                    212:     "turquoise",
                    213: };
                    214:
                    215: #define NSTONES (sizeof stones / sizeof (char *))
                    216: int cNSTONES = NSTONES;
                    217:
                    218: char *wood[] = {
                    219:     "avocado wood",
                    220:     "balsa",
                    221:     "banyan",
                    222:     "birch",
                    223:     "cedar",
                    224:     "cherry",
                    225:     "cinnibar",
                    226:     "driftwood",
                    227:     "ebony",
                    228:     "eucalyptus",
                    229:     "hemlock",
                    230:     "ironwood",
                    231:     "mahogany",
                    232:     "manzanita",
                    233:     "maple",
                    234:     "oak",
                    235:     "persimmon wood",
                    236:     "redwood",
                    237:     "rosewood",
                    238:     "teak",
                    239:     "walnut",
                    240:     "zebra wood",
                    241: };
                    242:
                    243: #define NWOOD (sizeof wood / sizeof (char *))
                    244: int cNWOOD = NWOOD;
                    245:
                    246: char *metal[] = {
                    247:     "aluminium",
                    248:     "bone",
                    249:     "brass",
                    250:     "bronze",
                    251:     "copper",
                    252:     "iron",
                    253:     "lead",
                    254:     "pewter",
                    255:     "steel",
                    256:     "tin",
                    257:     "zinc",
                    258: };
                    259:
                    260: #define NMETAL (sizeof metal / sizeof (char *))
                    261: int cNMETAL = NMETAL;
                    262:
                    263: struct magic_item things[NUMTHINGS] = {
                    264:     { "",                      27 },   /* potion */
                    265:     { "",                      27 },   /* scroll */
                    266:     { "",                      18 },   /* food */
                    267:     { "",                       9 },   /* weapon */
                    268:     { "",                       9 },   /* armor */
                    269:     { "",                       5 },   /* ring */
                    270:     { "",                       5 },   /* stick */
                    271: };
                    272:
                    273: struct magic_item s_magic[MAXSCROLLS] = {
                    274:     { "monster confusion",      8, 170 },
                    275:     { "magic mapping",          5, 180 },
                    276:     { "light",                 10, 100 },
                    277:     { "hold monster",           2, 200 },
                    278:     { "sleep",                  5,  50 },
                    279:     { "enchant armor",          8, 130 },
                    280:     { "identify",              21, 100 },
                    281:     { "scare monster",          4, 180 },
                    282:     { "gold detection",                 4, 110 },
                    283:     { "teleportation",          7, 175 },
                    284:     { "enchant weapon",                10, 150 },
                    285:     { "create monster",                 5,  75 },
                    286:     { "remove curse",           8, 105 },
                    287:     { "aggravate monsters",     1,  60 },
                    288:     { "blank paper",            1,  50 },
                    289:     { "genocide",               1, 200 },
                    290: };
                    291:
                    292: struct magic_item p_magic[MAXPOTIONS] = {
                    293:     { "confusion",              8,  50 },
                    294:     { "paralysis",             10,  50 },
                    295:     { "poison",                         8,  50 },
                    296:     { "gain strength",         15, 150 },
                    297:     { "see invisible",          2, 170 },
                    298:     { "healing",               15, 130 },
                    299:     { "monster detection",      6, 120 },
                    300:     { "magic detection",        6, 105 },
                    301:     { "raise level",            2, 220 },
                    302:     { "extra healing",          5, 180 },
                    303:     { "haste self",             4, 200 },
                    304:     { "restore strength",      14, 120 },
                    305:     { "blindness",              4,  50 },
                    306:     { "thirst quenching",       1,  50 },
                    307: };
                    308:
                    309: struct magic_item r_magic[MAXRINGS] = {
                    310:     { "protection",             9, 200 },
                    311:     { "add strength",           9, 200 },
                    312:     { "sustain strength",       5, 180 },
                    313:     { "searching",             10, 200 },
                    314:     { "see invisible",         10, 175 },
                    315:     { "adornment",              1, 100 },
                    316:     { "aggravate monster",     11, 100 },
                    317:     { "dexterity",              8, 220 },
                    318:     { "increase damage",        8, 220 },
                    319:     { "regeneration",           4, 260 },
                    320:     { "slow digestion",                 9, 240 },
                    321:     { "teleportation",          9, 100 },
                    322:     { "stealth",                7, 100 },
                    323: };
                    324:
                    325: struct magic_item ws_magic[MAXSTICKS] = {
                    326:     { "light",                 12, 120 },
                    327:     { "striking",               9, 115 },
                    328:     { "lightning",              3, 200 },
                    329:     { "fire",                   3, 200 },
                    330:     { "cold",                   3, 200 },
                    331:     { "polymorph",             15, 210 },
                    332:     { "magic missile",         10, 170 },
                    333:     { "haste monster",          9,  50 },
                    334:     { "slow monster",          11, 220 },
                    335:     { "drain life",             9, 210 },
                    336:     { "nothing",                1,  70 },
                    337:     { "teleport away",          5, 140 },
                    338:     { "teleport to",            5,  60 },
                    339:     { "cancellation",           5, 130 },
                    340: };
                    341:
                    342: int a_class[MAXARMORS] = {
                    343:     8,
                    344:     7,
                    345:     7,
                    346:     6,
                    347:     5,
                    348:     4,
                    349:     4,
                    350:     3,
                    351: };
                    352:
                    353: char *a_names[MAXARMORS] = {
                    354:     "leather armor",
                    355:     "ring mail",
                    356:     "studded leather armor",
                    357:     "scale mail",
                    358:     "chain mail",
                    359:     "splint mail",
                    360:     "banded mail",
                    361:     "plate mail",
                    362: };
                    363:
                    364: int a_chances[MAXARMORS] = {
                    365:     20,
                    366:     35,
                    367:     50,
                    368:     63,
                    369:     75,
                    370:     85,
                    371:     95,
                    372:     100
                    373: };
                    374:
                    375: #define MAX3(a,b,c)     (a > b ? (a > c ? a : c) : (b > c ? b : c))
                    376: static int used[MAX3(NCOLORS, NSTONES, NWOOD)];
                    377:
                    378: /*
                    379:  * init_things
                    380:  *     Initialize the probabilities for types of things
                    381:  */
                    382: void
                    383: init_things()
                    384: {
                    385:     struct magic_item *mp;
                    386:
                    387:     for (mp = &things[1]; mp <= &things[NUMTHINGS-1]; mp++)
                    388:        mp->mi_prob += (mp-1)->mi_prob;
                    389:     badcheck("things", things, NUMTHINGS);
                    390: }
                    391:
                    392: /*
                    393:  * init_colors:
                    394:  *     Initialize the potion color scheme for this time
                    395:  */
                    396:
                    397: void
                    398: init_colors()
                    399: {
                    400:     int i, j;
                    401:
                    402:     for (i = 0; i < NCOLORS; i++)
                    403:        used[i] = 0;
                    404:     for (i = 0; i < MAXPOTIONS; i++)
                    405:     {
                    406:        do
                    407:            j = rnd(NCOLORS);
                    408:        until (!used[j]);
                    409:        used[j] = TRUE;
                    410:        p_colors[i] = rainbow[j];
                    411:        p_know[i] = FALSE;
                    412:        p_guess[i] = NULL;
                    413:        if (i > 0)
                    414:                p_magic[i].mi_prob += p_magic[i-1].mi_prob;
                    415:     }
                    416:     badcheck("potions", p_magic, MAXPOTIONS);
                    417: }
                    418:
                    419: /*
                    420:  * init_names:
                    421:  *     Generate the names of the various scrolls
                    422:  */
                    423:
                    424: void
                    425: init_names()
                    426: {
                    427:     int nsyl;
                    428:     char *cp, *sp;
                    429:     int i, nwords;
                    430:
                    431:     for (i = 0; i < MAXSCROLLS; i++)
                    432:     {
                    433:        cp = prbuf;
                    434:        nwords = rnd(4)+2;
                    435:        while(nwords--)
                    436:        {
                    437:            nsyl = rnd(3)+1;
                    438:            while(nsyl--)
                    439:            {
                    440:                sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
                    441:                while(*sp)
                    442:                    *cp++ = *sp++;
                    443:            }
                    444:            *cp++ = ' ';
                    445:        }
                    446:        *--cp = '\0';
                    447:        s_names[i] = (char *) _new(strlen(prbuf)+1);
                    448:        s_know[i] = FALSE;
                    449:        s_guess[i] = NULL;
                    450:        strcpy(s_names[i], prbuf);
                    451:        if (i > 0)
                    452:                s_magic[i].mi_prob += s_magic[i-1].mi_prob;
                    453:     }
                    454:     badcheck("scrolls", s_magic, MAXSCROLLS);
                    455: }
                    456:
                    457: /*
                    458:  * init_stones:
                    459:  *     Initialize the ring stone setting scheme for this time
                    460:  */
                    461:
                    462: void
                    463: init_stones()
                    464: {
                    465:     int i, j;
                    466:
                    467:     for (i = 0; i < NSTONES; i++)
                    468:        used[i] = FALSE;
                    469:     for (i = 0; i < MAXRINGS; i++)
                    470:     {
                    471:        do
                    472:            j = rnd(NSTONES);
                    473:        until (!used[j]);
                    474:        used[j] = TRUE;
                    475:        r_stones[i] = stones[j];
                    476:        r_know[i] = FALSE;
                    477:        r_guess[i] = NULL;
                    478:        if (i > 0)
                    479:                r_magic[i].mi_prob += r_magic[i-1].mi_prob;
                    480:     }
                    481:     badcheck("rings", r_magic, MAXRINGS);
                    482: }
                    483:
                    484: /*
                    485:  * init_materials:
                    486:  *     Initialize the construction materials for wands and staffs
                    487:  */
                    488:
                    489: void
                    490: init_materials()
                    491: {
                    492:     int i, j;
                    493:     static int metused[NMETAL];
                    494:
                    495:     for (i = 0; i < NWOOD; i++)
                    496:        used[i] = FALSE;
                    497:     for (i = 0; i < NMETAL; i++)
                    498:        metused[i] = FALSE;
                    499:
                    500:     for (i = 0; i < MAXSTICKS; i++)
                    501:     {
                    502:        for (;;)
                    503:            if (rnd(100) > 50)
                    504:            {
                    505:                j = rnd(NMETAL);
                    506:                if (!metused[j])
                    507:                {
                    508:                    metused[j] = TRUE;
                    509:                    ws_made[i] = metal[j];
                    510:                    ws_type[i] = "wand";
                    511:                    break;
                    512:                }
                    513:            }
                    514:            else
                    515:            {
                    516:                j = rnd(NWOOD);
                    517:                if (!used[j])
                    518:                {
                    519:                    used[j] = TRUE;
                    520:                    ws_made[i] = wood[j];
                    521:                    ws_type[i] = "staff";
                    522:                    break;
                    523:                }
                    524:            }
                    525:
                    526:        ws_know[i] = FALSE;
                    527:        ws_guess[i] = NULL;
                    528:        if (i > 0)
                    529:                ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
                    530:     }
                    531:     badcheck("sticks", ws_magic, MAXSTICKS);
                    532: }
                    533:
                    534: void
                    535: badcheck(char *name, struct magic_item *magic, int bound)
                    536: {
                    537:     struct magic_item *end;
                    538:
                    539:     if (magic[bound - 1].mi_prob == 100)
                    540:        return;
                    541:     printf("\nBad percentages for %s:\n", name);
                    542:     for (end = &magic[bound]; magic < end; magic++)
                    543:        printf("%3d%% %s\n", magic->mi_prob, magic->mi_name);
                    544:     printf("[hit RETURN to continue]");
                    545:     fflush(stdout);
                    546:     while (getchar() != '\n')
                    547:        continue;
                    548: }
                    549:
                    550: struct h_list helpstr[] = {
                    551:     { '?',     "       prints help" },
                    552:     { '/',     "       identify object" },
                    553:     { 'h',     "       left" },
                    554:     { 'j',     "       down" },
                    555:     { 'k',     "       up" },
                    556:     { 'l',     "       right" },
                    557:     { 'y',     "       up & left" },
                    558:     { 'u',     "       up & right" },
                    559:     { 'b',     "       down & left" },
                    560:     { 'n',     "       down & right" },
                    561:     { 'H',     "       run left" },
                    562:     { 'J',     "       run down" },
                    563:     { 'K',     "       run up" },
                    564:     { 'L',     "       run right" },
                    565:     { 'Y',     "       run up & left" },
                    566:     { 'U',     "       run up & right" },
                    567:     { 'B',     "       run down & left" },
                    568:     { 'N',     "       run down & right" },
                    569:     { 't',     "<dir>  throw something" },
                    570:     { 'f',     "<dir>  forward until find something" },
                    571:     { 'p',     "<dir>  zap a wand in a direction" },
                    572:     { 'z',     "       zap a wand or staff" },
                    573:     { '>',     "       go down a staircase" },
                    574:     { 's',     "       search for trap/secret door" },
                    575:     { '.',     "       rest for a turn" },
                    576:     { 'i',     "       inventory" },
                    577:     { 'I',     "       inventory single item" },
                    578:     { 'q',     "       quaff potion" },
                    579:     { 'r',     "       read paper" },
                    580:     { 'e',     "       eat food" },
                    581:     { 'w',     "       wield a weapon" },
                    582:     { 'W',     "       wear armor" },
                    583:     { 'T',     "       take armor off" },
                    584:     { 'P',     "       put on ring" },
                    585:     { 'R',     "       remove ring" },
                    586:     { 'd',     "       drop object" },
                    587:     { 'c',     "       call object" },
                    588:     { 'o',     "       examine/set options" },
                    589:     { CTRL('L'),       "       redraw screen" },
                    590:     { CTRL('R'),       "       repeat last message" },
                    591:     { ESCAPE,  "       cancel command" },
                    592:     { 'v',     "       print program version number" },
                    593:     { '!',     "       shell escape" },
                    594:     { 'S',     "       save game" },
                    595:     { 'Q',     "       quit" },
                    596:     { 0, 0 }
                    597: };

CVSweb