Annotation of early-roguelike/arogue5/init.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * global variable initializaton
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include <ctype.h>
! 17: #include <string.h>
! 18: #include <stdlib.h>
! 19: #include "rogue.h"
! 20: #include "mach_dep.h"
! 21:
! 22:
! 23: char *rainbow[NCOLORS] = {
! 24:
! 25: "amber", "aquamarine", "beige",
! 26: "black", "blue", "brown",
! 27: "clear", "crimson", "ecru",
! 28: "gold", "green", "grey",
! 29: "indigo", "khaki", "lavender",
! 30: "magenta", "orange", "pink",
! 31: "plaid", "purple", "red",
! 32: "silver", "saffron", "scarlet",
! 33: "tan", "tangerine", "topaz",
! 34: "turquoise", "vermilion", "violet",
! 35: "white", "yellow",
! 36: };
! 37:
! 38: char *sylls[NSYLLS] = {
! 39: "a", "ab", "ag", "aks", "ala", "an", "ankh","app", "arg", "arze",
! 40: "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
! 41: "blu", "bot", "bu", "byt", "comp","con", "cos", "cre", "dalf",
! 42: "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
! 43: "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
! 44: "glen","gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
! 45: "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis","la", "lech",
! 46: "man", "mar", "me", "mi", "mic", "mik", "mon", "mung","mur",
! 47: "nej", "nelg","nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
! 48: "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
! 49: "pot", "prok","re", "rea", "rhov","ri", "ro", "rog", "rok", "rol",
! 50: "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
! 51: "sne", "snik","sno", "so", "sol", "sri", "sta", "sun", "ta",
! 52: "tab", "tem", "ther","ti", "tox", "trol","tue", "turs","u",
! 53: "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
! 54: "wed", "werg","wex", "whon","wun", "xo", "y", "yot", "yu",
! 55: "zant","zap", "zeb", "zim", "zok", "zon", "zum",
! 56: };
! 57:
! 58: char *stones[NSTONES] = {
! 59: "agate", "alexandrite", "amethyst",
! 60: "azurite", "bloodstone", "cairngorm",
! 61: "carnelian", "chalcedony", "chrysoberyl",
! 62: "chrysolite", "chrysoprase", "citrine",
! 63: "coral", "diamond", "emerald",
! 64: "garnet", "heliotrope", "hematite",
! 65: "hyacinth", "jacinth", "jade",
! 66: "jargoon", "jasper", "kryptonite",
! 67: "lapus lazuli", "malachite", "mocca stone",
! 68: "moonstone", "obsidian", "olivine",
! 69: "onyx", "opal", "pearl",
! 70: "peridot", "quartz", "rhodochrosite",
! 71: "rhodolite", "ruby", "sapphire",
! 72: "sardonyx", "serpintine", "spinel",
! 73: "tiger eye", "topaz", "tourmaline",
! 74: "turquoise", "zircon",
! 75: };
! 76:
! 77: char *wood[NWOOD] = {
! 78: "avocado wood", "balsa", "banyan", "birch",
! 79: "cedar", "cherry", "cinnibar", "dogwood",
! 80: "driftwood", "ebony", "eucalyptus", "hemlock",
! 81: "ironwood", "mahogany", "manzanita", "maple",
! 82: "oak", "pine", "redwood", "rosewood",
! 83: "teak", "walnut", "zebra wood", "persimmon wood",
! 84: };
! 85:
! 86: char *metal[NMETAL] = {
! 87: "aluminium", "bone", "brass", "bronze",
! 88: "copper", "chromium", "iron", "lead",
! 89: "magnesium", "pewter", "platinum", "silver",
! 90: "steel", "tin", "titanium", "zinc",
! 91: };
! 92:
! 93:
! 94:
! 95:
! 96: /*
! 97: * make sure all the percentages specified in the tables add up to the
! 98: * right amounts
! 99: */
! 100: void
! 101: badcheck(char *name, struct magic_item *magic, int bound)
! 102: {
! 103: register struct magic_item *end;
! 104:
! 105: if (magic[bound - 1].mi_prob == 1000)
! 106: return;
! 107: printf("\nBad percentages for %s:\n", name);
! 108: for (end = &magic[bound] ; magic < end ; magic++)
! 109: printf("%4d%% %s\n", magic->mi_prob, magic->mi_name);
! 110: printf(retstr);
! 111: fflush(stdout);
! 112: while (getchar() != '\n')
! 113: continue;
! 114: }
! 115:
! 116: /*
! 117: * init_colors:
! 118: * Initialize the potion color scheme for this time
! 119: */
! 120:
! 121: void
! 122: init_colors(void)
! 123: {
! 124: register int i, j;
! 125: bool used[NCOLORS];
! 126:
! 127: for(i = 0; i < NCOLORS; i++)
! 128: used[i] = FALSE;
! 129:
! 130: for (i = 0 ; i < MAXPOTIONS ; i++)
! 131: {
! 132: do
! 133: j = rnd(NCOLORS);
! 134: until (!used[j]);
! 135: used[j] = TRUE;
! 136: p_colors[i] = rainbow[j];
! 137: p_know[i] = FALSE;
! 138: p_guess[i] = NULL;
! 139: if (i > 0)
! 140: p_magic[i].mi_prob += p_magic[i-1].mi_prob;
! 141: }
! 142: badcheck("potions", p_magic, MAXPOTIONS);
! 143: }
! 144:
! 145: /*
! 146: * init_materials:
! 147: * Initialize the construction materials for wands and staffs
! 148: */
! 149:
! 150: void
! 151: init_materials(void)
! 152: {
! 153: register int i, j;
! 154: register char *str;
! 155: bool metused[NMETAL], woodused[NWOOD];
! 156:
! 157: for(i = 0; i < NWOOD; i++)
! 158: woodused[i] = FALSE;
! 159:
! 160: for(i = 0; i < NMETAL; i++)
! 161: metused[i] = FALSE;
! 162:
! 163: for (i = 0 ; i < MAXSTICKS ; i++)
! 164: {
! 165: for (;;)
! 166: if (rnd(100) > 50)
! 167: {
! 168: j = rnd(NMETAL);
! 169:
! 170: if (!metused[j])
! 171: {
! 172: ws_type[i] = "wand";
! 173: str = metal[j];
! 174: metused[j] = TRUE;
! 175: break;
! 176: }
! 177: }
! 178: else
! 179: {
! 180: j = rnd(NWOOD);
! 181:
! 182: if (!woodused[j])
! 183: {
! 184: ws_type[i] = "staff";
! 185: str = wood[j];
! 186: woodused[j] = TRUE;
! 187: break;
! 188: }
! 189: }
! 190:
! 191: ws_made[i] = str;
! 192: ws_know[i] = FALSE;
! 193: ws_guess[i] = NULL;
! 194: if (i > 0)
! 195: ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
! 196: }
! 197: badcheck("sticks", ws_magic, MAXSTICKS);
! 198: }
! 199:
! 200: /*
! 201: * do any initialization for miscellaneous magic
! 202: */
! 203:
! 204: void
! 205: init_misc(void)
! 206: {
! 207: register int i;
! 208:
! 209: for (i=0; i < MAXMM; i++) {
! 210: m_know[i] = FALSE;
! 211: m_guess[i] = NULL;
! 212: if (i > 0)
! 213: m_magic[i].mi_prob += m_magic[i-1].mi_prob;
! 214: }
! 215:
! 216: badcheck("miscellaneous magic", m_magic, MAXMM);
! 217: }
! 218:
! 219:
! 220: /*
! 221: * init_names:
! 222: * Generate the names of the various scrolls
! 223: */
! 224:
! 225: void
! 226: init_names(void)
! 227: {
! 228: register int nsyl;
! 229: register char *cp, *sp;
! 230: register int i, nwords;
! 231:
! 232: for (i = 0 ; i < MAXSCROLLS ; i++)
! 233: {
! 234: cp = prbuf;
! 235: nwords = rnd(COLS/20) + 1 + (COLS > 40 ? 1 : 0);
! 236: while(nwords--)
! 237: {
! 238: nsyl = rnd(3)+1;
! 239: while(nsyl--)
! 240: {
! 241: sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
! 242: while(*sp)
! 243: *cp++ = *sp++;
! 244: }
! 245: *cp++ = ' ';
! 246: }
! 247: *--cp = '\0';
! 248: s_names[i] = (char *) new(strlen(prbuf)+1);
! 249: s_know[i] = FALSE;
! 250: s_guess[i] = NULL;
! 251: strcpy(s_names[i], prbuf);
! 252: if (i > 0)
! 253: s_magic[i].mi_prob += s_magic[i-1].mi_prob;
! 254: }
! 255: badcheck("scrolls", s_magic, MAXSCROLLS);
! 256: }
! 257:
! 258: /*
! 259: * init_player:
! 260: * roll up the rogue
! 261: */
! 262:
! 263: void
! 264: init_player(void)
! 265: {
! 266: int stat_total, ch = 0, wpt = 0, i, j;
! 267: struct linked_list *weap_item, *armor_item, *food_item;
! 268: struct object *obj;
! 269: char *class;
! 270:
! 271: weap_item = armor_item = NULL;
! 272:
! 273: if (char_type == -1) {
! 274: /* See what type character will be */
! 275: wclear(hw);
! 276: touchwin(hw);
! 277: mvwaddstr(hw,2,0,"[1] Fighter\n[2] Magician\n[3] Cleric\n[4] Thief");
! 278: mvwaddstr(hw, 0, 0, "What character class do you desire? ");
! 279: draw(hw);
! 280: char_type = (wgetch(hw) - '0');
! 281: while (char_type < 1 || char_type > 4) {
! 282: mvwaddstr(hw,0,0,"Please enter a character type between 1 and 4: ");
! 283: draw(hw);
! 284: char_type = (wgetch(hw) - '0');
! 285: }
! 286: char_type--;
! 287: }
! 288: player.t_ctype = char_type;
! 289: player.t_quiet = 0;
! 290: pack = NULL;
! 291:
! 292: #ifdef WIZARD
! 293: /*
! 294: * allow me to describe a super character
! 295: */
! 296: if (wizard && md_getuid() == AUTHOR && strcmp(getenv("SUPER"),"YES") == 0) {
! 297: pstats.s_str = 25;
! 298: pstats.s_intel = 25;
! 299: pstats.s_wisdom = 25;
! 300: pstats.s_dext = 25;
! 301: pstats.s_const = 25;
! 302: pstats.s_charisma = 25;
! 303: pstats.s_exp = 7500000L;
! 304: pstats.s_lvl = 20;
! 305: pstats.s_hpt = 500;
! 306: pstats.s_carry = totalenc();
! 307: strcpy(pstats.s_dmg,"3d4");
! 308: if (player.t_ctype == C_FIGHTER)
! 309: weap_item = spec_item(WEAPON, TWOSWORD, 5, 5);
! 310: else
! 311: weap_item = spec_item(WEAPON, SWORD, 5, 5);
! 312: obj = OBJPTR(weap_item);
! 313: obj->o_flags |= ISKNOW;
! 314: add_pack(weap_item, TRUE, NULL);
! 315: cur_weapon = obj;
! 316: j = PLATE_ARMOR;
! 317: if (player.t_ctype == C_THIEF)
! 318: j = STUDDED_LEATHER;
! 319: armor_item = spec_item(ARMOR, j, 10, 0);
! 320: obj = OBJPTR(armor_item);
! 321: obj->o_flags |= (ISKNOW | ISPROT);
! 322: obj->o_weight = armors[j].a_wght;
! 323: add_pack(armor_item, TRUE, NULL);
! 324: cur_armor = obj;
! 325: purse += 10000;
! 326: }
! 327: else
! 328: #endif
! 329:
! 330: {
! 331: wclear(hw);
! 332: do {
! 333: if (armor_item != NULL) {
! 334: o_discard(armor_item);
! 335: armor_item = NULL;
! 336: }
! 337: if (weap_item != NULL) {
! 338: o_discard(weap_item);
! 339: weap_item = NULL;
! 340: }
! 341: pstats.s_lvl = 1;
! 342: pstats.s_exp = 0L;
! 343: pstats.s_hpt = 12 + rnd(10);
! 344: pstats.s_str = 7 + rnd(5);
! 345: pstats.s_intel = 7 + rnd(5);
! 346: pstats.s_wisdom = 7 + rnd(5);
! 347: pstats.s_dext = 7 + rnd(5);
! 348: pstats.s_const = 14 + rnd(5);
! 349: pstats.s_charisma = 7 + rnd(5);
! 350:
! 351: /* Now for the special ability */
! 352: switch (char_type) {
! 353: case C_FIGHTER: pstats.s_str = (rnd(10) == 7) ? 18 : 16;
! 354: when C_MAGICIAN: pstats.s_intel = (rnd(10) == 7) ? 18 : 16;
! 355: when C_CLERIC: pstats.s_wisdom= (rnd(10) == 7) ? 18 : 16;
! 356: when C_THIEF: pstats.s_dext = (rnd(10) == 7) ? 18 : 16;
! 357: }
! 358: strcpy(pstats.s_dmg,"1d4");
! 359: stat_total =pstats.s_str + pstats.s_intel + pstats.s_wisdom +
! 360: pstats.s_dext + pstats.s_const;
! 361: /*
! 362: * since the player can re-roll stats at will, keep the maximum
! 363: * to some reasonable limit
! 364: */
! 365: if (stat_total > MAXSTATS)
! 366: pstats.s_const -= (stat_total - MAXSTATS);
! 367: pstats.s_carry = totalenc();
! 368:
! 369: /*
! 370: * Give the rogue his weaponry.
! 371: */
! 372: do {
! 373: i = rnd(8); /* number of acceptable weapons */
! 374: switch(i) {
! 375: case 0: ch = 25; wpt = MACE;
! 376: when 1: ch = 25; wpt = SWORD;
! 377: when 2: ch = 20; wpt = BATTLEAXE;
! 378: when 3: ch = 20; wpt = TRIDENT;
! 379: when 4: ch = 20; wpt = SPETUM;
! 380: when 5: ch = 20; wpt = BARDICHE;
! 381: when 6: ch = 15; wpt = PIKE;
! 382: when 7: ch = 20; wpt = HALBERD;
! 383: }
! 384: } while(rnd(100) > ch);
! 385: if (player.t_ctype == C_FIGHTER)
! 386: wpt = TWOSWORD;
! 387: weap_item = spec_item(WEAPON, wpt, rnd(2), rnd(2)+1);
! 388: obj = OBJPTR(weap_item);
! 389: obj->o_flags |= ISKNOW;
! 390: /*
! 391: * And his suit of armor.......
! 392: * Thieves can only wear leather armor
! 393: * fighters get better armor on an average
! 394: */
! 395: if (player.t_ctype == C_THIEF)
! 396: j = STUDDED_LEATHER;
! 397: else {
! 398: if (player.t_ctype == C_FIGHTER)
! 399: i = 50 + rnd(50);
! 400: else
! 401: i = rnd(100);
! 402: j = 0;
! 403: while (armors[j].a_prob < i)
! 404: j++;
! 405: }
! 406: armor_item = spec_item(ARMOR, j, 0, 0);
! 407: obj = OBJPTR(armor_item);
! 408: obj->o_flags |= ISKNOW;
! 409: obj->o_weight = armors[j].a_wght;
! 410: switch(player.t_ctype) {
! 411: case C_FIGHTER: class = "fighter";
! 412: when C_MAGICIAN:class = "magic user";
! 413: when C_CLERIC: class = "cleric";
! 414: when C_THIEF: class = "thief";
! 415: otherwise: class = "unknown";
! 416: }
! 417: wmove(hw, 2, 0);
! 418: wprintw(hw, "You have rolled a %s with the following attributes:",class);
! 419: wmove(hw,4,0);
! 420: wprintw(hw, " Int: %2d", pstats.s_intel);
! 421: wprintw(hw, " Str: %2d", pstats.s_str);
! 422: wprintw(hw, " Wis: %2d", pstats.s_wisdom);
! 423: wprintw(hw, " Dex: %2d", pstats.s_dext);
! 424: wprintw(hw, " Const: %2d", pstats.s_const);
! 425: wclrtoeol(hw);
! 426: wmove(hw, 6, 0);
! 427: wprintw(hw, " Hp: %2d", pstats.s_hpt);
! 428: wclrtoeol(hw);
! 429: mvwaddstr(hw, 8, 5, inv_name(OBJPTR(weap_item), FALSE));
! 430: wclrtoeol(hw);
! 431: mvwaddstr(hw, 9, 5, inv_name(OBJPTR(armor_item), FALSE));
! 432: wclrtoeol(hw);
! 433: mvwaddstr(hw,0,0,"Would you like to re-roll the character? ");
! 434: draw(hw);
! 435: } while(wgetch(hw) == 'y');
! 436:
! 437: obj = OBJPTR(weap_item);
! 438: add_pack(weap_item, TRUE, NULL);
! 439: cur_weapon = obj;
! 440: obj = OBJPTR(armor_item);
! 441: add_pack(armor_item, TRUE, NULL);
! 442: cur_armor = obj;
! 443: }
! 444: /*
! 445: * Give him some food
! 446: */
! 447: food_item = spec_item(FOOD, 0, 0, 0);
! 448: obj = OBJPTR(food_item);
! 449: obj->o_weight = things[TYP_FOOD].mi_wght;
! 450: add_pack(food_item, TRUE, NULL);
! 451: pstats.s_arm = 10;
! 452: max_stats = pstats;
! 453: }
! 454:
! 455:
! 456:
! 457:
! 458:
! 459:
! 460: /*
! 461: * init_stones:
! 462: * Initialize the ring stone setting scheme for this time
! 463: */
! 464:
! 465: void
! 466: init_stones(void)
! 467: {
! 468: register int i, j;
! 469: bool used[NSTONES];
! 470:
! 471: for (i = 0; i < NSTONES; i++)
! 472: used[i] = FALSE;
! 473:
! 474: for (i = 0 ; i < MAXRINGS ; i++)
! 475: {
! 476: do
! 477: j = rnd(NSTONES);
! 478: until (!used[j]);
! 479:
! 480: used[j] = TRUE;
! 481: r_stones[i] = stones[j];
! 482: r_know[i] = FALSE;
! 483: r_guess[i] = NULL;
! 484: if (i > 0)
! 485: r_magic[i].mi_prob += r_magic[i-1].mi_prob;
! 486: }
! 487: badcheck("rings", r_magic, MAXRINGS);
! 488: }
! 489:
! 490: /*
! 491: * init_things
! 492: * Initialize the probabilities for types of things
! 493: */
! 494: void
! 495: init_things(void)
! 496: {
! 497: register struct magic_item *mp;
! 498:
! 499: for (mp = &things[1] ; mp < &things[NUMTHINGS] ; mp++)
! 500: mp->mi_prob += (mp-1)->mi_prob;
! 501: badcheck("things", things, NUMTHINGS);
! 502: }
! 503:
! 504:
CVSweb