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

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

1.1     ! rubenllo    1: /*
        !             2:     init.c - global variable initializaton
        !             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: /*
        !            20:     Notes
        !            21:
        !            22:         Need to add ring of maintain armor (same as ring of prot, armor only)
        !            23:         Resplit file into one just for data, one just for functions
        !            24: */
        !            25:
        !            26: #define _ALL_SOURCE /* Need to remove need for this AIXism */
        !            27:
        !            28: #include <string.h>
        !            29: #include <stdlib.h>
        !            30: #include <ctype.h>
        !            31: #include "rogue.h"
        !            32:
        !            33: static char *rainbow[] =
        !            34: {
        !            35:     "Red", "Blue", "Green", "Yellow",
        !            36:     "Black", "Brown", "Orange", "Pink",
        !            37:     "Purple", "Grey", "White", "Silver",
        !            38:     "Gold", "Violet", "Clear", "Vermilion",
        !            39:     "Ecru", "Turquoise", "Magenta", "Amber",
        !            40:     "Topaz", "Plaid", "Tan", "Tangerine",
        !            41:     "Aquamarine", "Scarlet", "Khaki", "Crimson",
        !            42:     "Indigo", "Beige", "Lavender", "Saffron"
        !            43: };
        !            44:
        !            45: #define NCOLORS (sizeof rainbow / sizeof (char *))
        !            46:
        !            47: static char *sylls[] =
        !            48: {
        !            49:     "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
        !            50:     "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
        !            51:     "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
        !            52:     "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
        !            53:     "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
        !            54:     "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
        !            55:     "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
        !            56:     "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
        !            57:     "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
        !            58:     "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
        !            59:     "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
        !            60:     "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
        !            61:     "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
        !            62:     "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
        !            63:     "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
        !            64:     "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
        !            65:     "zant", "zap", "zeb", "zim", "zok", "zon", "zum"
        !            66: };
        !            67:
        !            68: static char *stones[] =
        !            69: {
        !            70:     "Agate", "Alexandrite", "Amethyst",
        !            71:     "Azurite", "Carnelian", "Chrysoberyl",
        !            72:     "Chrysoprase", "Citrine", "Diamond",
        !            73:     "Emerald", "Garnet", "Hematite",
        !            74:     "Jacinth", "Jade", "Kryptonite",
        !            75:     "Lapus lazuli", "Malachite", "Moonstone",
        !            76:     "Obsidian", "Olivine", "Onyx",
        !            77:     "Opal", "Pearl", "Peridot",
        !            78:     "Quartz", "Rhodochrosite", "Ruby",
        !            79:     "Sapphire", "Sardonyx", "Serpentine",
        !            80:     "Spinel", "Tiger eye", "Topaz",
        !            81:     "Tourmaline", "Turquoise"
        !            82: };
        !            83:
        !            84: #define NSTONES (sizeof stones / sizeof (char *))
        !            85:
        !            86: static char *wood[] =
        !            87: {
        !            88:     "Avocado wood", "Balsa", "Banyan", "Birch",
        !            89:     "Cedar", "Cherry", "Cinnibar", "Dogwood",
        !            90:     "Driftwood", "Ebony", "Eucalyptus", "Hemlock",
        !            91:     "Ironwood", "Mahogany", "Manzanita", "Maple",
        !            92:     "Oak", "Pine", "Redwood", "Rosewood",
        !            93:     "Teak", "Walnut", "Zebra wood", "Persimmon wood"
        !            94: };
        !            95:
        !            96: #define NWOOD (sizeof wood / sizeof (char *))
        !            97:
        !            98: static char *metal[] =
        !            99: {
        !           100:     "Aluminium", "Bone", "Brass", "Bronze",
        !           101:     "Copper", "Chromium", "Iron", "Lead",
        !           102:     "Magnesium", "Pewter", "Platinum", "Steel",
        !           103:     "Tin", "Titanium", "Zinc", "Carbon",
        !           104:        "Plastic", "Glass", "Ice", "Chocolate",
        !           105:        "Gold", "Silver", "Invisible"
        !           106: };
        !           107:
        !           108: #define NMETAL (sizeof metal / sizeof (char *))
        !           109:
        !           110: const char *monstern = "monster";
        !           111: char *spacemsg = "--Press SPACE to continue--";
        !           112: char *morestr  = "--More--";
        !           113: char *retstr   = "[Press RETURN to continue]";
        !           114:
        !           115: /* 15 named levels */
        !           116:
        !           117: const char *cnames[C_NOTSET][15] =
        !           118: {
        !           119:     {   "Veteran", "Warrior",
        !           120:         "Swordsman", "Hero",    /* Fighter */
        !           121:         "Swashbuckler", "Myrmidon",
        !           122:         "Champion", "Superhero",
        !           123:         "Lord", "Lord",
        !           124:         "Lord", "Lord",
        !           125:         "Lord", "Lord",
        !           126:         "Lord"
        !           127:     },
        !           128:
        !           129:     {   "Gallant", "Keeper",
        !           130:         "Protector", "Defender",    /* Paladin */
        !           131:         "Warder", "Guardian",
        !           132:         "Chevalier", "Justiciar",
        !           133:         "Paladin", "Paladin",
        !           134:         "Paladin", "Paladin",
        !           135:         "Paladin", "Paladin",
        !           136:         "Paladin"
        !           137:     },
        !           138:
        !           139:     {   "Runner", "Strider",
        !           140:         "Scout", "Courser", /* Ranger */
        !           141:         "Tracker", "Guide",
        !           142:         "Pathfinder", "Ranger",
        !           143:         "Ranger Knight", "Ranger Lord",
        !           144:         "Ranger Lord", "Ranger Lord",
        !           145:         "Ranger Lord", "Ranger Lord",
        !           146:         "Ranger Lord"
        !           147:     },
        !           148:
        !           149:     {   "Acolyte", "Adept",
        !           150:         "Priest", "Curate", /* Cleric */
        !           151:         "Prefect", "Canon",
        !           152:         "Lama", "Patriarch",
        !           153:         "High Priest", "High Priest",
        !           154:         "High Priest", "High Priest",
        !           155:         "High Priest", "High Priest",
        !           156:         "High Priest"
        !           157:     },
        !           158:
        !           159:     {   "Aspirant", "Ovate",   /* Druid */
        !           160:         "Initiate of the 1st Circle", "Initiate of the 2nd Circle",
        !           161:         "Initiate of the 3rd Circle", "Initiate of the 4th Circle",
        !           162:         "Initiate of the 5th Circle", "Initiate of the 6th Circle",
        !           163:         "Initiate of the 7th Circle", "Initiate of the 8th Circle",
        !           164:         "Initiate of the 9th Circle", "Druid",
        !           165:         "Archdruid", "The Great Druid",
        !           166:         "The Grand Druid"
        !           167:     },
        !           168:
        !           169:     {   "Prestidigitator", "Evoker",
        !           170:         "Conjurer", "Theurgist",    /* Magic User */
        !           171:         "Thaumaturgist", "Magician",
        !           172:         "Enchanter", "Warlock",
        !           173:         "Sorcerer", "Necromancer",
        !           174:         "Wizard", "Wizard",
        !           175:         "Wizard", "Wizard",
        !           176:         "Wizard"
        !           177:     },
        !           178:
        !           179:     {   "Prestidigitator", "Minor Trickster",
        !           180:         "Trickster", "Master Trickster",    /* Illusionist */
        !           181:         "Cabalist", "Visionist",
        !           182:         "Phantasmist", "Apparitionist",
        !           183:         "Spellbinder", "Illusionist",
        !           184:         "Illusionist", "Illusionist",
        !           185:         "Illusionist", "Illusionist",
        !           186:         "Illusionist"
        !           187:     },
        !           188:
        !           189:     {   "Rogue", "Footpad",
        !           190:         "Cutpurse", "Robber",   /* Thief */
        !           191:         "Burglar", "Filcher",
        !           192:         "Sharper", "Magsman",
        !           193:         "Thief", "Master Thief",
        !           194:         "Master Thief", "Master Thief",
        !           195:         "Master Thief", "Master Thief",
        !           196:         "Master Thief"
        !           197:     },
        !           198:
        !           199:     {   "Bravo", "Rutterkin",
        !           200:         "Waghalter", "Murderer",    /* Assasin */
        !           201:         "Thug", "Killer",
        !           202:         "Cutthroat", "Executioner",
        !           203:         "Assassin", "Expert Assassin",
        !           204:         "Senior Assassin", "Chief Assassin",
        !           205:         "Prime Assassin", "Guildmaster Assassin",
        !           206:         "Grandfather of Assassins"
        !           207:     },
        !           208:
        !           209:     {   "Ninja", "Ninja",
        !           210:         "Ninja", "Ninja",   /* Ninja */
        !           211:         "Ninja", "Ninja",
        !           212:         "Ninja", "Ninja",
        !           213:         "Ninja", "Ninja",
        !           214:         "Ninja", "Ninja",
        !           215:         "Ninja", "Ninja",
        !           216:         "Ninja"
        !           217:     }
        !           218: };
        !           219:
        !           220: const struct h_list helpstr[] =
        !           221: {
        !           222:     { '?',      "  prints help"                         },
        !           223:     { '/',      "  identify object"                     },
        !           224:     { 'h',      "  left"                                },
        !           225:     { 'j',      "  down"                                },
        !           226:     { 'k',      "  up"                                  },
        !           227:     { 'l',      "  right"                               },
        !           228:     { 'y',      "  up & left"                           },
        !           229:     { 'u',      "  up & right"                          },
        !           230:     { 'b',      "  down & left"                         },
        !           231:     { 'n',      "  down & right"                        },
        !           232:     { '<',      "SHIFT><dir> run that way"              },
        !           233:     { 'm',      "<dir> move onto without picking up"    },
        !           234:     { 't',       "<dir> throw something"                },
        !           235:     { 'z',      "<dir> zap a wand or staff"             },
        !           236:     { '>',      "  go down a staircase"                 },
        !           237:     { 's',      "  search for trap/secret door"         },
        !           238:     { '.',      "  rest for a while"                    },
        !           239:     { ',',      "  pick up an object"                   },
        !           240:     { 'i',      "  inventory all items"                 },
        !           241:     { 'I',      "  inventory type of item"              },
        !           242:     { 'q',      "  quaff potion"                        },
        !           243:     { 'r',      "  read paper"                          },
        !           244:     { 'e',      "  eat food"                            },
        !           245:     { 'w',      "  wield a weapon"                      },
        !           246:     { 'W',      "  wear armor"                          },
        !           247:     { 'T',      "  take armor off"                      },
        !           248:     { 'P',      "  put on ring"                         },
        !           249:     { 'R',      "  remove ring"                         },
        !           250:     { 'A',      "  activate/apply an artifact"          },
        !           251:     { 'd',      "  drop object"                         },
        !           252:     { 'C',      "  call object (generic)"               },
        !           253:     { 'M',      "  mark object (specific)"              },
        !           254:     { 'o',      "  examine/set options"                 },
        !           255:     { 'c',      "  cast a spell/say a prayer"           },
        !           256:     { 'p',      "  pray for help (risky)"               },
        !           257:     { 'a',      "  affect the undead"                   },
        !           258:     { '^',      "  set a trap"                          },
        !           259:     { 'D',      "  dip something (into a pool)"         },
        !           260:     { 20,       "<dir>  take (steal) from (direction)"  }, /* ctrl-t */
        !           261:     { 18,       "   redraw screen"                      }, /* ctrl-r */
        !           262:     { 16,       "   back up to 10 previous messages"    }, /* ctrl-p */
        !           263:     { ESCAPE,   "   cancel command"                     },
        !           264:     { 'v',      "  print program version number"        },
        !           265:     { 'S',      "  save game"                           },
        !           266:     { 'Q',      "  quit"                                },
        !           267:     { '=',      "  listen for monsters"                 },
        !           268:     { 'f',      "<dir> fight monster"                   },
        !           269:     { 'F',      "<dir> fight monster to the death"      },
        !           270:
        !           271:     /* Wizard commands.  Identified by (h_ch != 0 && h_desc == 0). */
        !           272:
        !           273:     {'-',       0                                       },
        !           274:     { 23,       "   enter wizard mode"                  }, /* ctrl-w */
        !           275:     { 23,       "v  toggle wizard verbose mode"         },
        !           276:     { 23,       "e  exit wizard mode"                   },
        !           277:     { 23,       "r  random number check"                },
        !           278:     { 23,       "s  system statistics"                  },
        !           279:     { 23,       "F  food statistics"                    },
        !           280:     { 23,       "f  floor map"                          },
        !           281:     { 23,       "m  see monster"                        },
        !           282:     { 23,       "M  create monster"                     },
        !           283:     { 23,       "c  create item"                        },
        !           284:     { 23,       "i  inventory level"                    },
        !           285:     { 23,       "I  identify item"                      },
        !           286:     { 23,       "t  random teleport"                    },
        !           287:     { 23,       "g  goto level"                         },
        !           288:     { 23,       "C  charge item"                        },
        !           289:     { 23,       "w  print worth of object"              },
        !           290:     { 23,       "o  improve stats and pack"             },
        !           291:     { 0,        0                                       }
        !           292: };
        !           293:
        !           294: struct magic_item things[] =
        !           295: {
        !           296:     {"potion",  "POTION",   250,    5}, /* potion           */
        !           297:     {"scroll",  "SCROLL",   260,    30},/* scroll           */
        !           298:     {"ring",    "RING",     70,     5}, /* ring             */
        !           299:     {"stick",   "STICK",    60,     0}, /* stick            */
        !           300:     {"food",    "FOOD",     210,    7}, /* food             */
        !           301:     {"weapon",  "WEAPON",   60,     0}, /* weapon           */
        !           302:     {"armor",   "ARMOR",    90,     0}, /* armor            */
        !           303:     {"artifact","ARTIFACT", 0,      0}  /* special artifacts*/
        !           304: };
        !           305:
        !           306: int numthings = NUMTHINGS;
        !           307:
        !           308: struct magic_item s_magic[] =
        !           309: {
        !           310:     {"monster confusion",   "CON",      50, 125,    0,  0   },
        !           311:     {"magic mapping",       "MAP",      45, 150,    20, 10  },
        !           312:     {"light",               "WATT",     0,  0,      0,  0   },
        !           313:     {"hold monster",        "HOLD",     25, 200,    33, 10  },
        !           314:     {"sleep",               "SNOOZE",   23, 50,     20, 10  },
        !           315:     {"enchantment",         "ENCHANT",  110,400,    15, 10  },
        !           316:     {"identify",            "ID",       150,50,     0,  15  },
        !           317:     {"scare monster",       "SCARE",    35, 250,    27, 21  },
        !           318:     {"detect gold",         "GOLD",     0,  0,      0,  0   },
        !           319:     {"teleportation",       "TELEP",    50, 165,    10, 20  },
        !           320:     {"create monster",      "CREATE",   25, 75,     30, 0   },
        !           321:     {"remove curse",        "REM",      75, 220,    10, 15  },
        !           322:     {"petrification",       "PET",      25, 285,    0,  0   },
        !           323:     {"genocide",            "GEN",      10, 1200,   0,  0   },
        !           324:     {"cure disease",        "CURE",     70, 80,     0,  0   },
        !           325:     {"acquirement",         "MAKE",     5,  2500,   50, 15  },
        !           326:     {"protection",          "PROT",     50, 1150,   0,  0   },
        !           327:     {"nothing",             "NOTHING",  75, 50,     50, 50  },
        !           328:     {"magic hitting",       "SILVER",   25, 1875,   45, 10  },
        !           329:     {"ownership",           "OWN",      15, 1550,   45, 10  },
        !           330:     {"detect food",         "FOOD",     0,  0,      0,  0   },
        !           331:     {"electrification",     "ELECTRIFY",20, 1450,   0,  0   },
        !           332:     {"charm monster",       "CHARM",    26, 1500,   25, 15  },
        !           333:     {"summon monster",      "SUMMON",   26, 1500,   25, 15  },
        !           334:     {"gaze reflection",     "REFLECT",  25, 400,    25, 15  },
        !           335:     {"summon familiar",     "SUMFAM",   0,  0,      0,  0   },
        !           336:     {"fear",                "FEAR",     20, 200,    20, 10  },
        !           337:     {"missile protection",  "MSHIELD",  20, 300,    20, 10  }
        !           338: };
        !           339:
        !           340: int maxscrolls = MAXSCROLLS;
        !           341:
        !           342: struct magic_item p_magic[] =
        !           343: {
        !           344:     {"clear thought",       "CLEAR",    90, 380,    27, 15  },
        !           345:     {"gain ability",        "GAINABIL", 40, 1250,   15, 15  },
        !           346:     {"see invisible",       "SEE",      0,  0,      0,  0   },
        !           347:     {"healing",             "HEAL",     120,330,    27, 27  },
        !           348:     {"detect monster",      "MON",      0,  0,      0,  0   },
        !           349:     {"detect magic",        "MAG",      0,  0,      0,  0   },
        !           350:     {"raise level",         "RAISE",    1,  1900,   11, 10  },
        !           351:     {"haste self",          "HASTE",    140,300,    30, 5   },
        !           352:     {"restore abilities",   "RESTORE",  130,120,    0,  0   },
        !           353:     {"phasing",             "PHASE",    45, 340,    21, 20  },
        !           354:     {"invisibility",        "INVIS",    30, 300,    0,  15  },
        !           355:     {"acute scent",         "SMELL",    30, 100,    20, 15  },
        !           356:     {"acute hearing",       "HEAR",     30, 100,    20, 15  },
        !           357:     {"super heroism",       "SUPER",    10, 800,    20, 15  },
        !           358:     {"disguise",            "DISGUISE", 30, 500,    0,  15  },
        !           359:     {"fire resistance",     "NOFIRE",   40, 350,    20, 15  },
        !           360:     {"cold resistance",     "NOCOLD",   40, 300,    20, 15  },
        !           361:     {"continuous breathing","BREATHE",  10, 200,    20, 15  },
        !           362:     {"flying",              "FLY",      30, 300,    20, 15  },
        !           363:     {"regeneration",        "REGEN",    20, 500,    20, 15  },
        !           364:     {"shield",              "SHIELD",   100,200,    20, 10  },
        !           365:     {"true sight",          "TRUESEE",  64, 570,    25, 15  }
        !           366: };
        !           367:
        !           368: int maxpotions = MAXPOTIONS;
        !           369:
        !           370: struct magic_item r_magic[] =
        !           371: {
        !           372:     {"protection",              "", 70, 500,    33, 25  },
        !           373:     {"add strength",            "", 65, 300,    33, 25  },
        !           374:     {"sustain ability",         "", 40, 380,    10, 0   },
        !           375:     {"searching",               "", 65, 250,    10, 0   },
        !           376:     {"see invisible",           "", 30, 175,    10, 0   },
        !           377:     {"alertness",               "", 40, 190,    10, 0   },
        !           378:     {"aggravate monster",       "", 35, 100,    100,0   },
        !           379:     {"dexterity",               "", 65, 220,    33, 25  },
        !           380:     {"increase damage",         "", 65, 320,    33, 25  },
        !           381:     {"regeneration",            "", 35, 860,    10, 0   },
        !           382:     {"slow digestion",          "", 40, 340,    15, 10  },
        !           383:     {"teleportation",           "", 35, 100,    100,0   },
        !           384:     {"stealth",                 "", 50, 700,    10, 0   },
        !           385:     {"add intelligence",        "", 60, 540,    33, 25  },
        !           386:     {"increase wisdom",         "", 60, 540,    33, 25  },
        !           387:     {"sustain health",          "", 60, 250,    10, 0   },
        !           388:     {"vampiric regeneration",   "", 20, 900,    25, 10  },
        !           389:     {"illumination",            "", 20, 300,    10, 0   },
        !           390:     {"delusion",                "", 20, 100,    75, 0   },
        !           391:     {"carrying",                "", 20, 400,    30, 30  },
        !           392:     {"adornment",               "", 15, 10000,  10, 0   },
        !           393:     {"levitation",              "", 20, 450,    30, 0   },
        !           394:     {"fire resistance",         "", 10, 750,    10, 0   },
        !           395:     {"cold resistance",         "", 10, 650,    10, 0   },
        !           396:     {"lightning resistance",    "", 10, 750,    10, 0   },
        !           397:     {"resurrection",            "", 1,  8000,   10, 0   },
        !           398:     {"breathing",               "", 10, 250,    10, 0   },
        !           399:     {"free action",             "", 10, 225,    10, 0   },
        !           400:     {"wizardry",                "", 2,  1950,   10, 0   },
        !           401:     {"piety",                   "", 2,  1950,   10, 0   },
        !           402:     {"teleport control",        "", 5,  450,    10, 0   },
        !           403:     {"true sight",              "", 10, 775,    10, 0   }
        !           404: };
        !           405:
        !           406: int maxrings = MAXRINGS;
        !           407:
        !           408: struct magic_item  ws_magic[] =
        !           409: {
        !           410:     {"light",           "LIGHT",        90, 150,    20, 20  },
        !           411:     {"striking",        "HIT",          58, 400,    0,  0   },
        !           412:     {"lightning",       "BOLT",         25, 800,    0,  0   },
        !           413:     {"fire",            "FIRE",         25, 600,    0,  0   },
        !           414:     {"cold",            "COLD",         30, 600,    0,  0   },
        !           415:     {"polymorph",       "POLY",         90, 210,    0,  0   },
        !           416:     {"magic missile",   "MLE",          90, 500,    0,  0   },
        !           417:     {"slow monster",    "SLOW",         76, 320,    25, 20  },
        !           418:     {"drain life",      "DRAIN",        90, 310,    20, 0   },
        !           419:     {"charging",        "CHARGE",       70, 1100,   0,  0   },
        !           420:     {"teleport monster","RANDOM",       90, 240,    25, 20  },
        !           421:     {"cancellation",    "CANCEL",       38, 230,    0,  0   },
        !           422:     {"confuse monster", "CONFMON",      50, 200,    0,  0   },
        !           423:     {"disintegration",  "KILL-O-ZAP",   10, 1550,   33, 0   },
        !           424:     {"anti-matter",     "BLACKHOLE",    30, 980,    0,  0   },
        !           425:     {"paralyze monster","PARAL",        38, 200,    0,  0   },
        !           426:     {"heal monster",    "XENOHEAL",     30, 200,    40, 10  },
        !           427:     {"nothing",         "NOTHING",      30, 100,    0,  0   },
        !           428:     {"invisibility",    "WS_INVIS",     30, 150,    30, 5   },
        !           429:     {"blasting",        "BLAST",        10, 220,    0,  0   },
        !           430:     {"webbing",         "WEB",          0,  0,      0,  0   },
        !           431:     {"door opening",    "KNOCK",        0,  0,      0,  0   },
        !           432:     {"hold portal",     "CLOSE",        0,  0,      0,  0   }
        !           433: };
        !           434:
        !           435: int maxsticks = MAXSTICKS;
        !           436:
        !           437: struct magic_item   fd_data[] =
        !           438: {
        !           439:     {"food ration", "RATION",   400,    20,     20, 20  },
        !           440:     {"random fruit","FRUIT", 300, 10, 0, 0},
        !           441:     {"cram",        "CRAM",     120,    30,     0,  0   },
        !           442:     {"honey cake",  "CAKES",    80,     10,     0,  0   },
        !           443:     {"lemba",       "LEMBA",    50,     80,     0,  0   },
        !           444:     {"miruvor",     "MIRUVOR",  50,     200,    0,  0   }
        !           445: };
        !           446:
        !           447: int maxfoods = MAXFOODS;
        !           448:
        !           449: /*
        !           450:  * weapons and their attributes
        !           451:  * Average Damage = (min_damage + max_damage) / 2)
        !           452:  * AD of 2D5+3 = (5 + 13) / 2 = 9
        !           453:  * AD of 3D6   = (3 + 18) / 2 = 10.5
        !           454:  */
        !           455:
        !           456: #define ISSHARPMETAL (ISSHARP | ISMETAL)
        !           457: #define ISCRYSKNIFE (ISSHARP | ISPOISON | ISMANY | ISLITTLE)
        !           458:
        !           459: struct init_weps weaps[] =
        !           460: {
        !           461:     /* Missile weapons */
        !           462:     {"sling",           "0d0", "0d0",   NONE,       5,  1,
        !           463:         ISLAUNCHER | ISLITTLE,                              },
        !           464:     {"rock",            "1d2", "1d4",   SLING,      5,  1,
        !           465:         ISMANY | ISMISL | ISLITTLE                          },
        !           466:     {"sling bullet",    "1d1", "1d8",   SLING,      3,  1,
        !           467:         ISSHARP | ISMANY | ISMISL | ISMETAL | ISLITTLE      },
        !           468:     {"short bow",       "1d1", "1d1",   NONE,       40, 75,
        !           469:         ISLAUNCHER                                          },
        !           470:     {"arrow",           "1d1", "2d3",   BOW,        5,  1,
        !           471:         ISSHARP | ISMANY | ISMISL | ISLITTLE                },
        !           472:     {"arrow",           "1d2", "2d8",   BOW,        10, 5,
        !           473:         ISSHARP | ISSILVER | ISMANY | ISMISL | ISLITTLE     },
        !           474:     {"fire arrow",      "1d2", "2d8",   BOW,        10, 3,
        !           475:         ISSHARP | CANBURN | ISMANY | ISMISL | ISLITTLE      },
        !           476:     {"footbow",         "1d1", "1d1",   NONE,       90, 125,
        !           477:         ISLAUNCHER                                          },
        !           478:     {"footbow bolt",    "1d2", "1d10",  FOOTBOW,    5,  1,
        !           479:         ISSHARP | ISMANY | ISMISL | ISLITTLE                },
        !           480:     {"crossbow",        "1d1", "1d1",   NONE,       100,175,
        !           481:         ISLAUNCHER                                          },
        !           482:     {"crossbow bolt",   "1d2", "2d5",  CROSSBOW,   7,  3,
        !           483:         ISSHARP | ISMANY | ISMISL | ISLITTLE                },
        !           484:
        !           485:     /* Useful throwing weapons */
        !           486:     {"dart",        "1d1", "1d3",       NONE,   5,  1,
        !           487:         ISSHARP | ISMANY | ISMISL | ISLITTLE            },
        !           488:     {"dagger",      "1d6", "1d4",       NONE,   10, 2,
        !           489:         ISSHARP | ISMETAL | ISMANY | ISMISL | ISLITTLE  },
        !           490:     {"hammer",      "1d3", "1d5",       NONE,   50, 3,
        !           491:         ISMETAL | ISMISL                                },
        !           492:     {"leuku",       "1d6", "1d5",       NONE,   40, 4,
        !           493:         ISSHARP | ISMETAL | ISTWOH                      },
        !           494:     {"javelin",     "1d4", "1d6",       NONE,   10, 5,
        !           495:         ISSHARP | ISMISL | ISTWOH                       },
        !           496:     {"tomahawk",    "1d6", "1d6",       NONE,   45, 7,
        !           497:         ISSHARP | ISMISL                                },
        !           498:     {"machete",     "1d7", "1d6",       NONE,   45, 4,
        !           499:         ISSHARP | ISMETAL | ISMISL                      },
        !           500:     {"throwing axe","1d3", "1d6+2",     NONE,   50, 8,
        !           501:         ISSHARP | ISMETAL | ISMISL                      },
        !           502:     {"spear",       "2d3", "1d6",       NONE,   50, 2,
        !           503:         ISSHARP | ISMETAL | ISMISL                      },
        !           504:     {"boomerang",   "1d1", "1d8",       NONE,   10, 13,
        !           505:         CANRETURN | ISMANY | ISMISL | ISLITTLE          },
        !           506:     {"long spear",  "1d8", "1d10",      NONE,   50, 20,
        !           507:         ISSHARP | ISMETAL | ISMISL | ISTWOH             },
        !           508:     {"shuriken",    "1d1", "2d5",       NONE,   4,  20,
        !           509:         ISSHARP | ISMETAL | ISMANY | ISMISL | ISLITTLE  },
        !           510:     {"burning oil", "0d0", "2d10+5",    NONE,   20, 30,
        !           511:         CANBURN | ISMANY | ISMISL | ISLITTLE            },
        !           512:     {"grenade",       "1d1", "1d2/4d8", NONE,   10, 50,
        !           513:         ISMANY | ISSMALL                                },
        !           514:
        !           515:     /* other weapons */
        !           516:     {"club",          "1d4",   "1d2", NONE, 30,  2,   0                     },
        !           517:     {"pitchfork",     "1d5",   "2d2", NONE, 15,  5,   ISSHARPMETAL          },
        !           518:     {"short sword",   "1d6",   "1d2", NONE, 50,  10,  ISSHARPMETAL          },
        !           519:     {"hand axe",      "1d6",   "1d2", NONE, 40,  15,  ISSHARPMETAL          },
        !           520:     {"partisan",      "1d6",   "1d2", NONE, 75,  4,   ISSHARPMETAL | ISTWOH },
        !           521:     {"grain flail",   "1d6",   "1d4", NONE, 100, 2,   ISSHARPMETAL          },
        !           522:     {"singlestick",   "1d4+2", "1d2", NONE, 30,  20,  0                     },
        !           523:     {"rapier",        "1d6+1", "1d2", NONE, 7,   75,  ISSHARPMETAL          },
        !           524:     {"sickle",        "1d6+1", "1d2", NONE, 30,  15,  ISSHARPMETAL          },
        !           525:     {"hatchet",       "1d6+1", "1d4", NONE, 50,  10,  ISSHARPMETAL          },
        !           526:     {"scimitar",      "1d8",   "1d2", NONE, 40,  10,  ISSHARPMETAL          },
        !           527:     {"mace",          "2d4",   "1d3", NONE, 100, 40,  0                     },
        !           528:     {"morning star",  "2d4",   "1d3", NONE, 125, 35,  ISMETAL               },
        !           529:     {"broad sword",   "2d4",   "1d3", NONE, 75,  50,  ISSHARPMETAL          },
        !           530:     {"miner's pick",  "2d4",   "1d2", NONE, 85,  40,  ISSHARPMETAL          },
        !           531:     {"guisarme",      "2d4",   "1d3", NONE, 100, 25,  ISSHARPMETAL | ISTWOH },
        !           532:     {"war flail",     "1d6+2", "1d4", NONE, 150, 50,  ISSHARPMETAL | ISTWOH },
        !           533:     {"crysknife",     "3d3",   "1d3", NONE, 12,  100, ISCRYSKNIFE           },
        !           534:     {"battle axe",    "1d8+2", "1d3", NONE, 80,  100, ISSHARPMETAL          },
        !           535:     {"cutlass",       "1d10",  "1d2", NONE, 55,  120, ISSHARPMETAL          },
        !           536:     {"glaive",        "1d10",  "1d3", NONE, 80,  80,  ISSHARPMETAL | ISTWOH },
        !           537:     {"pertuska",      "2d5",   "1d3", NONE, 130, 100, ISSHARPMETAL | ISTWOH },
        !           538:     {"long sword",    "3d4",   "1d2", NONE, 100, 150, ISSHARPMETAL          },
        !           539:     {"lance",         "1d12",  "1d8", NONE, 80,  140, ISSHARP | ISTWOH      },
        !           540:     {"ranseur",       "1d12",  "1d8", NONE, 100, 130, ISSHARPMETAL | ISTWOH },
        !           541:     {"sabre",         "2d6",   "1d3", NONE, 50,  200, ISSHARPMETAL          },
        !           542:     {"spetum",        "2d6",   "1d3", NONE, 50,  180, ISSHARPMETAL | ISTWOH },
        !           543:     {"halberd",       "2d6",   "1d3", NONE, 150, 125, ISSHARPMETAL | ISTWOH },
        !           544:     {"trident",       "3d4",   "1d4", NONE, 50,  200, ISSHARPMETAL | ISTWOH },
        !           545:     {"war pick",      "3d4",   "1d2", NONE, 75,  175, ISSHARPMETAL | ISTWOH },
        !           546:     {"bardiche",      "3d4",   "1d2", NONE, 125, 125, ISSHARPMETAL | ISTWOH },
        !           547:     {"heavy mace",    "3d4",   "1d3", NONE, 200, 50,  ISTWOH                },
        !           548:     {"great scythe",  "2d6+2", "1d2", NONE, 100, 200, ISSHARP | ISTWOH      },
        !           549:     {"quarter staff", "3d5",   "1d2", NONE, 70,  250, 0                     },
        !           550:     {"bastard sword", "2d8",   "1d2", NONE, 150, 300, ISSHARPMETAL          },
        !           551:     {"pike",          "2d8",   "2d6", NONE, 200, 275, ISSHARPMETAL | ISTWOH },
        !           552:     {"great flail",   "2d6+2", "1d4", NONE, 200, 275, ISSHARPMETAL | ISTWOH },
        !           553:     {"great maul",    "4d4",   "1d3", NONE, 400, 250, ISTWOH                },
        !           554:     {"great pick",    "2d9",   "1d2", NONE, 175, 330, ISSHARPMETAL | ISTWOH },
        !           555:     {"two handed sword","4d4", "1d2", NONE, 250, 300, ISSHARPMETAL | ISTWOH },
        !           556:     {"claymore",      "3d7",   "1d2", NONE, 200, 500, ISSHARPMETAL | ISTWOH }
        !           557: };
        !           558:
        !           559: int maxweapons = MAXWEAPONS;
        !           560:
        !           561: struct init_armor   armors[] =
        !           562: {
        !           563:     { "soft leather",         75, 20,  9,  50 },
        !           564:     { "cuirboilli",          150, 30,  8, 130 },
        !           565:     { "leather armor",       175, 40,  8, 100 },
        !           566:     { "ring mail",           350, 49,  7, 250 },
        !           567:     { "studded leather armor",400,58,  7, 200 },
        !           568:     { "scale mail",          500, 66,  6, 250 },
        !           569:     { "padded armor",        550, 72,  6, 150 },
        !           570:     { "chain mail",          750, 78,  5, 300 },
        !           571:     { "brigandine",          800, 84,  5, 280 },
        !           572:     { "splint mail",        1000, 88,  4, 350 },
        !           573:     { "banded mail",        1250, 90,  4, 300 },
        !           574:     { "superior chain",     1500, 93,  3, 350 },
        !           575:     { "plate mail",         1400, 96,  3, 400 },
        !           576:     { "plate armor",        1650, 98,  2, 450 },
        !           577:     { "mithril",           30000, 99,  2, 200 },
        !           578:     { "crystalline armor", 15000, 100, 0, 300 }
        !           579: };
        !           580:
        !           581: int     maxarmors = MAXARMORS;
        !           582:
        !           583: struct init_artifact    arts[] = {
        !           584:     { "Magic Purse of Yendor", 15, 1, 1, 1,  1,  4600L, 50 },
        !           585:     { "Phial of Galadriel",    20, 2, 2, 2,  1, 12500L, 10 },
        !           586:     { "Amulet of Yendor",      25, 4, 1, 1,  2, 16000L, 10 },
        !           587:     { "Palantir of Might",     30, 1, 4, 1,  2, 18500L, 70 },
        !           588:     { "Crown of Might",        35, 6, 2, 1,  1, 23500L, 50 },
        !           589:     { "Sceptre of Might",      40, 2, 2, 1,  6, 38000L, 50 },
        !           590:     { "Silmaril of Ea",        45, 4, 2, 5,  1, 50000L, 50 },
        !           591:     { "Wand of Yendor",        50, 4, 2, 3, 10, 80000L, 50 }
        !           592: };
        !           593:
        !           594: int     maxartifact = MAXARTIFACT;
        !           595:
        !           596: /*
        !           597:     init_player()
        !           598:         roll up the rogue
        !           599: */
        !           600:
        !           601: void
        !           602: init_player(void)
        !           603: {
        !           604:     int special = rnd(100) < 20;
        !           605:     struct linked_list  *item;
        !           606:     struct object   *obj;
        !           607:     int which_armor = 0, which_weapon = 0;
        !           608:     int other_weapon_flags = 0;
        !           609:
        !           610:     pstats.s_lvl = 1;
        !           611:     pstats.s_exp = 0L;
        !           612:     pstats.s_arm = 10;
        !           613:
        !           614:     if (!geta_player())
        !           615:     {
        !           616:         do_getplayer(); /* get character class */
        !           617:         pstats.s_str = 8 + rnd(5);
        !           618:         pstats.s_intel = 8 + rnd(5);
        !           619:         pstats.s_wisdom = 8 + rnd(5);
        !           620:         pstats.s_dext = 8 + rnd(5);
        !           621:         pstats.s_const = 10 + rnd(8);
        !           622:         pstats.s_charisma = 8 + rnd(4);
        !           623:         pstats.s_power = 5 + rnd(5);
        !           624:         pstats.s_hpt = 15 + rnd(5);
        !           625:
        !           626:         switch (char_type)      /* Class-specific abilities */
        !           627:         {
        !           628:             case C_FIGHTER:
        !           629:                 pstats.s_str = 17;
        !           630:                 pstats.s_const += rnd(4) + 1;
        !           631:                 if (special)
        !           632:                 {
        !           633:                     pstats.s_str += rnd(3);
        !           634:                     pstats.s_dext += rnd(4);
        !           635:                 }
        !           636:                 pstats.s_const = max(pstats.s_const, 16);
        !           637:                 break;
        !           638:
        !           639:             case C_PALADIN:
        !           640:                 pstats.s_charisma = 17;
        !           641:
        !           642:                 if (special)
        !           643:                 {
        !           644:                     pstats.s_charisma += rnd(3);
        !           645:                     pstats.s_wisdom += rnd(4);
        !           646:                     pstats.s_str += rnd(5);
        !           647:                 }
        !           648:
        !           649:                 pstats.s_str = max(pstats.s_str, 16);
        !           650:                 pstats.s_wisdom = max(pstats.s_wisdom, 16);
        !           651:                 break;
        !           652:
        !           653:             case C_RANGER:
        !           654:                 if (special)
        !           655:                 {
        !           656:                     pstats.s_wisdom += rnd(4);
        !           657:                     pstats.s_intel += rnd(4);
        !           658:                     pstats.s_str += rnd(5);
        !           659:                 }
        !           660:
        !           661:                 pstats.s_str = max(pstats.s_str, 16);
        !           662:                 pstats.s_wisdom = max(pstats.s_wisdom, 16);
        !           663:                 pstats.s_const = max(pstats.s_const, 14);
        !           664:                 break;
        !           665:
        !           666:             case C_MAGICIAN:
        !           667:                 pstats.s_intel = (special) ? 18 : 16;
        !           668:                 pstats.s_power += 5 + rnd(10);
        !           669:                 break;
        !           670:
        !           671:             case C_ILLUSION:
        !           672:                 pstats.s_intel = (special) ? 18 : 16;
        !           673:                 pstats.s_dext = (special) ? 18 : 14;
        !           674:                 pstats.s_power += 5 + rnd(10);
        !           675:                 break;
        !           676:
        !           677:             case C_CLERIC:
        !           678:                 pstats.s_wisdom = (special) ? 18 : 16;
        !           679:                 pstats.s_str += rnd(4);
        !           680:                 pstats.s_power += 5 + rnd(10);
        !           681:                 break;
        !           682:
        !           683:             case C_DRUID:
        !           684:                 if (special)
        !           685:                 {
        !           686:                     pstats.s_wisdom += rnd(5);
        !           687:                     pstats.s_charisma += rnd(4);
        !           688:                 }
        !           689:                 pstats.s_str += rnd(4);
        !           690:                 pstats.s_power += 5 + rnd(10);
        !           691:                 pstats.s_wisdom = max(pstats.s_wisdom, 16);
        !           692:                 break;
        !           693:
        !           694:             case C_THIEF:
        !           695:                 pstats.s_dext = 18;
        !           696:                 if (special)
        !           697:                     pstats.s_const += rnd(4) + 1;
        !           698:                 break;
        !           699:
        !           700:             case C_ASSASIN:
        !           701:                 pstats.s_dext = (special) ? 18 : 16;
        !           702:                 pstats.s_intel = (special) ? 18 : 16;
        !           703:                 break;
        !           704:
        !           705:             case C_NINJA:
        !           706:                 if (special)
        !           707:                 {
        !           708:                     pstats.s_dext += rnd(5);
        !           709:                     pstats.s_str += rnd(4);
        !           710:                     pstats.s_intel += rnd(3);
        !           711:                     pstats.s_wisdom += rnd(3);
        !           712:                 }
        !           713:                 pstats.s_dext = max(pstats.s_dext, 16);
        !           714:                 pstats.s_str = max(pstats.s_str, 15);
        !           715:                 pstats.s_wisdom = max(pstats.s_wisdom, 15);
        !           716:                 pstats.s_const = max(pstats.s_const, 15);
        !           717:                 pstats.s_charisma = max(pstats.s_charisma, 11);
        !           718:         }
        !           719:
        !           720:         puta_player();
        !           721:     }
        !           722:
        !           723:     if (char_type == C_ASSASIN || char_type == C_NINJA
        !           724:         || char_type == C_FIGHTER)
        !           725:         pstats.s_dmg = "2d6";
        !           726:     else
        !           727:         pstats.s_dmg = "1d4";
        !           728:
        !           729:     if (char_type == C_NINJA || char_type == C_FIGHTER)
        !           730:         pstats.s_arm = 8;
        !           731:
        !           732:     if (pstats.s_const > 15)
        !           733:         pstats.s_hpt += pstats.s_const - 15;
        !           734:
        !           735:     max_stats = pstats;
        !           736:     player.t_rest_hpt = player.t_rest_pow = 0;
        !           737:     player.t_praycnt = 0;
        !           738:     pstats.s_carry = totalenc();
        !           739:     pack = NULL;
        !           740:
        !           741:     switch (player.t_ctype)    /* now outfit pack */
        !           742:     {
        !           743:         case C_PALADIN:
        !           744:             purse        = roll(20, 60);
        !           745:             which_armor  = CHAIN_MAIL;
        !           746:             which_weapon = LONG_SWORD;
        !           747:             break;
        !           748:
        !           749:         case C_FIGHTER:
        !           750:             purse = roll(50, 60);
        !           751:             which_armor = SCALE_MAIL;
        !           752:             which_weapon = BROAD_SWORD;
        !           753:             break;
        !           754:
        !           755:         case C_RANGER:
        !           756:             purse        = roll(50, 60);
        !           757:             which_armor  = PADDED_ARMOR;
        !           758:             which_weapon = LONG_SPEAR;
        !           759:             other_weapon_flags |= ISOWNED | CANRETURN;
        !           760:             break;
        !           761:
        !           762:         case C_CLERIC:
        !           763:             purse        = roll(30, 80);
        !           764:             which_armor  = RING_MAIL;
        !           765:             which_weapon = MORNINGSTAR;
        !           766:             break;
        !           767:
        !           768:         case C_DRUID:
        !           769:             purse        = roll(30, 80);
        !           770:             which_armor  = STUDDED_LEATHER;
        !           771:             which_weapon = LIGHT_MACE;
        !           772:             break;
        !           773:
        !           774:         case C_THIEF:
        !           775:             purse        = roll(40, 80);
        !           776:             which_armor  = HEAVY_LEATHER;
        !           777:             which_weapon = CUTLASS;
        !           778:             break;
        !           779:
        !           780:         case C_ASSASIN:
        !           781:             purse        = roll(20, 80);
        !           782:             which_armor  = CUIRBOLILLI;
        !           783:             which_weapon = SABRE;
        !           784:             other_weapon_flags |= ISPOISON;
        !           785:             break;
        !           786:
        !           787:         case C_NINJA:
        !           788:             purse        = roll(20, 80);
        !           789:             which_armor  = CUIRBOLILLI;
        !           790:             which_weapon = CRYSKNIFE;
        !           791:             other_weapon_flags |= ISPOISON;
        !           792:             item = spec_item(WEAPON, SHURIKEN, 1, 1);
        !           793:             obj = OBJPTR(item);
        !           794:             obj->o_count = 1;
        !           795:             obj->o_flags |= ISKNOW | ISPOISON | ISOWNED | CANRETURN;
        !           796:             add_pack(item, NOMESSAGE);
        !           797:             break;
        !           798:
        !           799:         case C_MAGICIAN:
        !           800:         case C_ILLUSION:
        !           801:             purse        = roll(20, 60);
        !           802:             which_armor  = SOFT_LEATHER;
        !           803:             which_weapon = SINGLESTICK;
        !           804:             break;
        !           805:
        !           806:         default:
        !           807:             break;
        !           808:     }
        !           809:
        !           810:     /* Add weapon to pack */
        !           811:
        !           812:     item = spec_item(WEAPON, which_weapon, 1, 1);
        !           813:     obj  = OBJPTR(item);
        !           814:
        !           815:     obj->o_flags |= ISKNOW;
        !           816:     obj->o_flags |= other_weapon_flags;
        !           817:     obj->o_count = 1;
        !           818:     add_pack(item, NOMESSAGE);
        !           819:     cur_weapon = obj;
        !           820:
        !           821:     /* Add armor to pack */
        !           822:
        !           823:     item = spec_item(ARMOR, which_armor, 0, 0);
        !           824:     obj = OBJPTR(item);
        !           825:
        !           826:     obj->o_flags |= ISKNOW;
        !           827:     obj->o_weight = armors[which_armor].a_wght;
        !           828:     add_pack(item, NOMESSAGE);
        !           829:     cur_armor = obj;
        !           830:
        !           831:     /* Add some food to pack */
        !           832:
        !           833:     item = spec_item(FOOD, FD_CRAM, 0, 0);
        !           834:     obj = OBJPTR(item);
        !           835:
        !           836:     obj->o_weight = things[TYP_FOOD].mi_wght;
        !           837:     obj->o_count = 3;
        !           838:     add_pack(item, NOMESSAGE);
        !           839: }
        !           840:
        !           841: /*
        !           842:     init_flags()
        !           843:         Initialize flags on startup
        !           844: */
        !           845:
        !           846: void
        !           847: init_flags(void)
        !           848: {
        !           849:     switch (player.t_ctype)
        !           850:     {
        !           851:         case C_MAGICIAN:
        !           852:         case C_ILLUSION:
        !           853:         case C_CLERIC:
        !           854:         case C_DRUID:
        !           855:         case C_RANGER:
        !           856:         case C_PALADIN:
        !           857:             turn_on(player, CANSUMMON);
        !           858:             break;
        !           859:
        !           860:         default:
        !           861:             break;
        !           862:     }
        !           863:
        !           864:     turn_on(player, CANCAST);
        !           865:     turn_on(player, CANWIELD);
        !           866: }
        !           867:
        !           868: /*
        !           869:  * Contains definitions and functions for dealing with things like potions
        !           870:  * and scrolls
        !           871:  */
        !           872:
        !           873: /*
        !           874:     init_things()
        !           875:         Initialize the probabilities for types of things
        !           876: */
        !           877:
        !           878: void
        !           879: init_things(void)
        !           880: {
        !           881:     struct magic_item *mp;
        !           882:
        !           883:     for (mp = &things[1]; mp < &things[numthings]; mp++)
        !           884:         mp->mi_prob += (mp - 1)->mi_prob;
        !           885:
        !           886:     badcheck("things", things, numthings);
        !           887: }
        !           888:
        !           889: /*
        !           890:     init_fd()
        !           891:         Initialize the probabilities for types of food
        !           892: */
        !           893:
        !           894: void
        !           895: init_fd(void)
        !           896: {
        !           897:     struct magic_item  *mp;
        !           898:
        !           899:     for (mp = &fd_data[1]; mp < &fd_data[maxfoods]; mp++)
        !           900:         mp->mi_prob += (mp - 1)->mi_prob;
        !           901:
        !           902:     badcheck("food", fd_data, maxfoods);
        !           903: }
        !           904:
        !           905: /*
        !           906:     init_colors()
        !           907:         Initialize the potion color scheme for this time
        !           908: */
        !           909:
        !           910: void
        !           911: init_colors(void)
        !           912: {
        !           913:     int   i;
        !           914:     char *str;
        !           915:
        !           916:     for (i = 0; i < maxpotions; i++)
        !           917:     {
        !           918:         do
        !           919:             str = rainbow[rnd(NCOLORS)];
        !           920:         while( !isupper(*str) );
        !           921:
        !           922:         p_colors[i]    = md_strdup(str);
        !           923:         p_colors[i][0] = (char) tolower(p_colors[i][0]);
        !           924:
        !           925:         know_items[TYP_POTION][i]  = FALSE;
        !           926:         guess_items[TYP_POTION][i] = NULL;
        !           927:
        !           928:         if (i > 0)
        !           929:             p_magic[i].mi_prob += p_magic[i - 1].mi_prob;
        !           930:     }
        !           931:
        !           932:     badcheck("potions", p_magic, maxpotions);
        !           933: }
        !           934:
        !           935: /*
        !           936:     init_names()
        !           937:         Generate the names of the various scrolls
        !           938: */
        !           939:
        !           940: void
        !           941: init_names(void)
        !           942: {
        !           943:     int    nsyl;
        !           944:     char   *cp, *sp;
        !           945:     int    i, nwords;
        !           946:
        !           947:     for (i = 0; i < maxscrolls; i++)
        !           948:     {
        !           949:         cp = prbuf;
        !           950:         nwords = rnd(COLS / 20) + 1 + (COLS > 40 ? 1 : 0);
        !           951:
        !           952:         while (nwords--)
        !           953:         {
        !           954:             nsyl = rnd(3) + 1;
        !           955:
        !           956:             while (nsyl--)
        !           957:             {
        !           958:                 sp = sylls[rnd((sizeof sylls) /
        !           959:                     (sizeof(char *)))];
        !           960:
        !           961:                 while (*sp)
        !           962:                     *cp++ = *sp++;
        !           963:             }
        !           964:             *cp++ = ' ';
        !           965:         }
        !           966:
        !           967:         *--cp = '\0';
        !           968:         s_names[i] = (char *) new_alloc(strlen(prbuf) + 1);
        !           969:
        !           970:         know_items[TYP_SCROLL][i] = FALSE;
        !           971:         guess_items[TYP_SCROLL][i] = 0;
        !           972:
        !           973:         strcpy(s_names[i], prbuf);
        !           974:
        !           975:         if (i > 0)
        !           976:             s_magic[i].mi_prob += s_magic[i - 1].mi_prob;
        !           977:     }
        !           978:
        !           979:     badcheck("scrolls", s_magic, maxscrolls);
        !           980: }
        !           981:
        !           982: /*
        !           983:     init_stones()
        !           984:         Initialize the ring stone setting scheme for this time
        !           985: */
        !           986:
        !           987: void
        !           988: init_stones(void)
        !           989: {
        !           990:     int   i;
        !           991:     char *str;
        !           992:
        !           993:     for (i = 0; i < maxrings; i++)
        !           994:     {
        !           995:         do
        !           996:             str = stones[rnd(NSTONES)];
        !           997:         while(!isupper(*str));
        !           998:
        !           999:         r_stones[i]    = md_strdup(str);
        !          1000:         r_stones[i][0] = (char) tolower( r_stones[i][0] );
        !          1001:
        !          1002:         know_items[TYP_RING][i]  = FALSE;
        !          1003:         guess_items[TYP_RING][i] = NULL;
        !          1004:
        !          1005:         if (i > 0)
        !          1006:             r_magic[i].mi_prob += r_magic[i - 1].mi_prob;
        !          1007:     }
        !          1008:
        !          1009:     badcheck("rings", r_magic, maxrings);
        !          1010: }
        !          1011:
        !          1012: /*
        !          1013:     init_materials()
        !          1014:         Initialize the construction materials for wands and staffs
        !          1015: */
        !          1016:
        !          1017: void
        !          1018: init_materials(void)
        !          1019: {
        !          1020:     int   i;
        !          1021:     char *str;
        !          1022:
        !          1023:     for (i = 0; i < maxsticks; i++)
        !          1024:     {
        !          1025:         do
        !          1026:         {
        !          1027:             if (rnd(100) > 50)
        !          1028:             {
        !          1029:                 str = metal[rnd(NMETAL)];
        !          1030:
        !          1031:                 if (isupper(*str))
        !          1032:                     ws_type[i] = "wand";
        !          1033:             }
        !          1034:             else
        !          1035:             {
        !          1036:                 str = wood[rnd(NWOOD)];
        !          1037:
        !          1038:                 if (isupper(*str))
        !          1039:                     ws_type[i] = "staff";
        !          1040:             }
        !          1041:         }
        !          1042:         while(!isupper(*str));
        !          1043:
        !          1044:         ws_made[i] = md_strdup(str);
        !          1045:         ws_made[i][0] = (char) tolower( ws_made[i][0] );
        !          1046:
        !          1047:         know_items[TYP_STICK][i]  = FALSE;
        !          1048:         guess_items[TYP_STICK][i] = 0;
        !          1049:
        !          1050:         if (i > 0)
        !          1051:             ws_magic[i].mi_prob += ws_magic[i - 1].mi_prob;
        !          1052:     }
        !          1053:
        !          1054:     badcheck("sticks", ws_magic, maxsticks);
        !          1055: }
        !          1056:
        !          1057: void
        !          1058: badcheck(char *name, struct magic_item *magic, int bound)
        !          1059: {
        !          1060:     struct magic_item  *end;
        !          1061:
        !          1062:     if (magic[bound - 1].mi_prob == 1000)
        !          1063:         return;
        !          1064:
        !          1065:     printf("\nBad percentages for %s:\n", name);
        !          1066:
        !          1067:     for (end = &magic[bound]; magic < end; magic++)
        !          1068:         printf("%3d%% %s\n", magic->mi_prob, magic->mi_name);
        !          1069:
        !          1070:     printf("[Hit RETURN to continue]");
        !          1071:     fflush(stdout);
        !          1072:
        !          1073:     while ((readchar() & 0177) != '\n')
        !          1074:         continue;
        !          1075: }

CVSweb