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