Annotation of early-roguelike/arogue7/init.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * init.c - global variable initializaton
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985, 1986 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: /*
! 16: * global variable initializaton
! 17: *
! 18: */
! 19:
! 20: #include "curses.h"
! 21: #include <ctype.h>
! 22: #include <string.h>
! 23: #include "rogue.h"
! 24: #include "mach_dep.h"
! 25:
! 26:
! 27: /*
! 28: * If there is any news, put it in a character string and assign it to
! 29: * rogue_news. Otherwise, assign NULL to rogue_news.
! 30: */
! 31: static char *rogue_news = "You no longer fall into trading posts. They are \
! 32: now entered like going down the stairs.";
! 33:
! 34: char *rainbow[] = {
! 35:
! 36: "amber", "aquamarine", "beige",
! 37: "black", "blue", "brown",
! 38: "clear", "crimson", "ecru",
! 39: "gold", "green", "grey",
! 40: "indigo", "khaki", "lavender",
! 41: "magenta", "orange", "pink",
! 42: "plaid", "purple", "red",
! 43: "silver", "saffron", "scarlet",
! 44: "tan", "tangerine", "topaz",
! 45: "turquoise", "vermilion", "violet",
! 46: "white", "yellow",
! 47: };
! 48: #define NCOLORS (sizeof rainbow / sizeof(char *))
! 49: int cNCOLORS = NCOLORS;
! 50:
! 51: static char *sylls[] = {
! 52: "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
! 53: "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
! 54: "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
! 55: "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
! 56: "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
! 57: "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
! 58: "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
! 59: "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
! 60: "nej", "nelg", "nep", "ner", "nes", "net", "nih", "nin", "o", "od",
! 61: "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
! 62: "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
! 63: "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
! 64: "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
! 65: "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
! 66: "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
! 67: "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
! 68: "zant", "zap", "zeb", "zim", "zok", "zon", "zum",
! 69: };
! 70:
! 71: char *stones[] = {
! 72: "agate", "alexandrite", "amethyst",
! 73: "azurite", "bloodstone", "cairngorm",
! 74: "carnelian", "chalcedony", "chrysoberyl",
! 75: "chrysolite", "chrysoprase", "citrine",
! 76: "coral", "diamond", "emerald",
! 77: "garnet", "heliotrope", "hematite",
! 78: "hyacinth", "jacinth", "jade",
! 79: "jargoon", "jasper", "kryptonite",
! 80: "lapus lazuli", "malachite", "mocca stone",
! 81: "moonstone", "obsidian", "olivine",
! 82: "onyx", "opal", "pearl",
! 83: "peridot", "quartz", "rhodochrosite",
! 84: "rhodolite", "ruby", "sapphire",
! 85: "sardonyx", "serpintine", "spinel",
! 86: "tiger eye", "topaz", "tourmaline",
! 87: "turquoise", "zircon",
! 88: };
! 89: #define NSTONES (sizeof stones / sizeof(char *))
! 90: int cNSTONES = NSTONES;
! 91:
! 92: char *wood[] = {
! 93: "avocado wood", "balsa", "banyan", "birch",
! 94: "cedar", "cherry", "cinnibar", "dogwood",
! 95: "driftwood", "ebony", "eucalyptus", "hemlock",
! 96: "ironwood", "mahogany", "manzanita", "maple",
! 97: "oak", "pine", "redwood", "rosewood",
! 98: "teak", "walnut", "zebra wood", "persimmon wood",
! 99: };
! 100: #define NWOOD (sizeof wood / sizeof(char *))
! 101: int cNWOOD = NWOOD;
! 102:
! 103: char *metal[] = {
! 104: "aluminium", "bone", "brass", "bronze",
! 105: "copper", "chromium", "iron", "lead",
! 106: "magnesium", "pewter", "platinum", "silver",
! 107: "steel", "tin", "titanium", "zinc",
! 108: };
! 109: #define NMETAL (sizeof metal / sizeof(char *))
! 110: int cNMETAL = NMETAL;
! 111: #define MAX3(a,b,c) (a > b ? (a > c ? a : c) : (b > c ? b : c))
! 112:
! 113: static bool used[MAX3(NCOLORS, NSTONES, NWOOD)];
! 114:
! 115:
! 116: /*
! 117: * make sure all the percentages specified in the tables add up to the
! 118: * right amounts
! 119: */
! 120: void
! 121: badcheck(char *name, struct magic_item *magic, int bound)
! 122: {
! 123: register struct magic_item *end;
! 124:
! 125: if (magic[bound - 1].mi_prob == 1000)
! 126: return;
! 127: printf("\nBad percentages for %s:\n", name);
! 128: for (end = &magic[bound] ; magic < end ; magic++)
! 129: printf("%4d%% %s\n", magic->mi_prob, magic->mi_name);
! 130: printf(retstr);
! 131: fflush(stdout);
! 132: while (getchar() != '\n')
! 133: continue;
! 134: }
! 135:
! 136: /*
! 137: * init_colors:
! 138: * Initialize the potion color scheme for this time
! 139: */
! 140:
! 141: void
! 142: init_colors(void)
! 143: {
! 144: register int i, j;
! 145:
! 146: for (i = 0; i < NCOLORS; i++)
! 147: used[i] = FALSE;
! 148:
! 149: for (i = 0 ; i < MAXPOTIONS ; i++)
! 150: {
! 151: do
! 152: j = rnd(NCOLORS);
! 153: until (!used[j]);
! 154: used[j] = TRUE;
! 155: p_colors[i] = rainbow[j];
! 156: p_know[i] = FALSE;
! 157: p_guess[i] = NULL;
! 158: if (i > 0)
! 159: p_magic[i].mi_prob += p_magic[i-1].mi_prob;
! 160: }
! 161: badcheck("potions", p_magic, MAXPOTIONS);
! 162: }
! 163:
! 164: /*
! 165: * do any initialization for food
! 166: */
! 167:
! 168: void
! 169: init_foods(void)
! 170: {
! 171: register int i;
! 172:
! 173: for (i=0; i < MAXFOODS; i++) {
! 174: if (i > 0)
! 175: foods[i].mi_prob += foods[i-1].mi_prob;
! 176: }
! 177: badcheck("foods", foods, MAXFOODS);
! 178: }
! 179:
! 180: /*
! 181: * init_materials:
! 182: * Initialize the construction materials for wands and staffs
! 183: */
! 184:
! 185: void
! 186: init_materials(void)
! 187: {
! 188: register int i, j;
! 189: register char *str;
! 190: static bool metused[NMETAL];
! 191:
! 192: for (i = 0; i < NWOOD; i++)
! 193: used[i] = FALSE;
! 194: for (i = 0; i < NMETAL; i++)
! 195: metused[i] = FALSE;
! 196:
! 197: for (i = 0 ; i < MAXSTICKS ; i++)
! 198: {
! 199: for (;;)
! 200: if (rnd(100) > 50)
! 201: {
! 202: j = rnd(NMETAL);
! 203: if (!metused[j])
! 204: {
! 205: ws_type[i] = "wand";
! 206: str = metal[j];
! 207: metused[j] = TRUE;
! 208: break;
! 209: }
! 210: }
! 211: else
! 212: {
! 213: j = rnd(NWOOD);
! 214: if (!used[j])
! 215: {
! 216: ws_type[i] = "staff";
! 217: str = wood[j];
! 218: used[j] = TRUE;
! 219: break;
! 220: }
! 221: }
! 222:
! 223: ws_made[i] = str;
! 224: ws_know[i] = FALSE;
! 225: ws_guess[i] = NULL;
! 226: if (i > 0)
! 227: ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
! 228: }
! 229: badcheck("sticks", ws_magic, MAXSTICKS);
! 230: }
! 231:
! 232: /*
! 233: * do any initialization for miscellaneous magic
! 234: */
! 235:
! 236: void
! 237: init_misc(void)
! 238: {
! 239: register int i;
! 240:
! 241: for (i=0; i < MAXMM; i++) {
! 242: m_know[i] = FALSE;
! 243: m_guess[i] = NULL;
! 244: if (i > 0)
! 245: m_magic[i].mi_prob += m_magic[i-1].mi_prob;
! 246: }
! 247: badcheck("miscellaneous magic", m_magic, MAXMM);
! 248: }
! 249:
! 250: /*
! 251: * init_names:
! 252: * Generate the names of the various scrolls
! 253: */
! 254:
! 255: void
! 256: init_names(void)
! 257: {
! 258: register int nsyl;
! 259: register char *cp, *sp;
! 260: register int i, nwords;
! 261:
! 262: for (i = 0 ; i < MAXSCROLLS ; i++)
! 263: {
! 264: cp = prbuf;
! 265: nwords = rnd(cols/20) + 1 + (cols > 40 ? 1 : 0);
! 266: while(nwords--)
! 267: {
! 268: nsyl = rnd(3)+1;
! 269: while(nsyl--)
! 270: {
! 271: sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
! 272: while(*sp)
! 273: *cp++ = *sp++;
! 274: }
! 275: *cp++ = ' ';
! 276: }
! 277: *--cp = '\0';
! 278: s_names[i] = (char *) new(strlen(prbuf)+1);
! 279: s_know[i] = FALSE;
! 280: s_guess[i] = NULL;
! 281: strcpy(s_names[i], prbuf);
! 282: if (i > 0)
! 283: s_magic[i].mi_prob += s_magic[i-1].mi_prob;
! 284: }
! 285: badcheck("scrolls", s_magic, MAXSCROLLS);
! 286: }
! 287:
! 288: /*
! 289: * init_player:
! 290: * roll up the rogue
! 291: */
! 292:
! 293: void
! 294: init_player(void)
! 295: {
! 296: int stat_total, round, minimum, maximum, ch, i, j;
! 297: short do_escape, *our_stats[NUMABILITIES-1];
! 298: struct linked_list *weap_item, *armor_item;
! 299: struct object *obj;
! 300:
! 301: weap_item = armor_item = NULL;
! 302:
! 303: if (char_type == -1) {
! 304: /* See what type character will be */
! 305: wclear(hw);
! 306: touchwin(hw);
! 307: wmove(hw,2,0);
! 308: for(i=1; i<=NUM_CHARTYPES-1; i++) {
! 309: wprintw(hw,"[%d] %s\n",i,char_class[i-1].name);
! 310: }
! 311: mvwaddstr(hw, 0, 0, "What character class do you desire? ");
! 312: draw(hw);
! 313: char_type = (wgetch(hw) - '0');
! 314: while (char_type < 1 || char_type > NUM_CHARTYPES-1) {
! 315: wmove(hw,0,0);
! 316: wprintw(hw,"Please enter a character type between 1 and %d: ",
! 317: NUM_CHARTYPES-1);
! 318: draw(hw);
! 319: char_type = (wgetch(hw) - '0');
! 320: }
! 321: char_type--;
! 322: }
! 323: player.t_ctype = char_type;
! 324: player.t_quiet = 0;
! 325: pack = NULL;
! 326:
! 327: /* Select the gold */
! 328: purse = 2700;
! 329: switch (player.t_ctype) {
! 330: case C_FIGHTER:
! 331: purse += 1800;
! 332: when C_THIEF:
! 333: case C_ASSASIN:
! 334: purse += 600;
! 335: }
! 336: #ifdef WIZARD
! 337: /*
! 338: * allow me to describe a super character
! 339: */
! 340: if (wizard && strcmp(getenv("SUPER"),"YES") == 0) {
! 341: pstats.s_str = 25;
! 342: pstats.s_intel = 25;
! 343: pstats.s_wisdom = 25;
! 344: pstats.s_dext = 25;
! 345: pstats.s_const = 25;
! 346: pstats.s_charisma = 25;
! 347: pstats.s_exp = 10000000L;
! 348: pstats.s_lvladj = 0;
! 349: pstats.s_lvl = 1;
! 350: pstats.s_hpt = 500;
! 351: pstats.s_carry = totalenc(&player);
! 352: strncpy(pstats.s_dmg, "3d4", sizeof(pstats.s_dmg));
! 353: check_level();
! 354: mpos = 0;
! 355: if (player.t_ctype == C_FIGHTER ||
! 356: player.t_ctype == C_RANGER ||
! 357: player.t_ctype == C_PALADIN)
! 358: weap_item = spec_item(WEAPON, TWOSWORD, 5, 5);
! 359: else
! 360: weap_item = spec_item(WEAPON, SWORD, 5, 5);
! 361: obj = OBJPTR(weap_item);
! 362: obj->o_flags |= ISKNOW;
! 363: add_pack(weap_item, TRUE, NULL);
! 364: cur_weapon = obj;
! 365: if (player.t_ctype != C_MONK) {
! 366: j = PLATE_ARMOR;
! 367: if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASIN)
! 368: j = STUDDED_LEATHER;
! 369: armor_item = spec_item(ARMOR, j, 10, 0);
! 370: obj = OBJPTR(armor_item);
! 371: obj->o_flags |= (ISKNOW | ISPROT);
! 372: obj->o_weight = armors[j].a_wght;
! 373: add_pack(armor_item, TRUE, NULL);
! 374: cur_armor = obj;
! 375: }
! 376: purse += 10000;
! 377: }
! 378: else
! 379: #endif
! 380:
! 381: {
! 382: switch(player.t_ctype) {
! 383: case C_MAGICIAN:round = A_INTELLIGENCE;
! 384: when C_FIGHTER: round = A_STRENGTH;
! 385: when C_RANGER: round = A_STRENGTH;
! 386: when C_PALADIN: round = A_STRENGTH;
! 387: when C_CLERIC: round = A_WISDOM;
! 388: when C_DRUID: round = A_WISDOM;
! 389: when C_THIEF: round = A_DEXTERITY;
! 390: when C_ASSASIN: round = A_DEXTERITY;
! 391: when C_MONK: round = A_DEXTERITY;
! 392: }
! 393:
! 394: do {
! 395: wclear(hw);
! 396:
! 397: /* If there is any news, display it */
! 398: if (rogue_news) {
! 399: register int i;
! 400:
! 401: /* Print a separator line */
! 402: wmove(hw, 12, 0);
! 403: for (i=0; i<cols; i++) waddch(hw, '-');
! 404:
! 405: /* Print the news */
! 406: mvwaddstr(hw, 14, 0, rogue_news);
! 407: }
! 408:
! 409: stat_total = MAXSTATS;
! 410: do_escape = FALSE; /* No escape seen yet */
! 411:
! 412: /* Initialize abilities */
! 413: pstats.s_intel = 0;
! 414: pstats.s_str = 0;
! 415: pstats.s_wisdom = 0;
! 416: pstats.s_dext = 0;
! 417: pstats.s_const = 0;
! 418: pstats.s_charisma = 0;
! 419:
! 420: /* Initialize pointer into abilities */
! 421: our_stats[A_INTELLIGENCE] = &pstats.s_intel;
! 422: our_stats[A_STRENGTH] = &pstats.s_str;
! 423: our_stats[A_WISDOM] = &pstats.s_wisdom;
! 424: our_stats[A_DEXTERITY] = &pstats.s_dext;
! 425: our_stats[A_CONSTITUTION] = &pstats.s_const;
! 426:
! 427: /* Let player distribute attributes */
! 428: for (i=0; i<NUMABILITIES-1; i++) {
! 429: wmove(hw, 2, 0);
! 430: wprintw(hw, "You are creating a %s with %2d attribute points.",
! 431: char_class[player.t_ctype].name, stat_total);
! 432:
! 433: /*
! 434: * Player must have a minimum of 7 in any attribute and 11 in
! 435: * the player's primary attribute.
! 436: */
! 437: minimum = (round == i ? 11 : 7);
! 438:
! 439: /* Subtract out remaining minimums */
! 440: maximum = stat_total - (7 * (NUMABILITIES-1 - i));
! 441:
! 442: /* Subtract out remainder of profession minimum (11 - 7) */
! 443: if (round > i) maximum -= 4;
! 444:
! 445: /* Maximum can't be greater than 18 */
! 446: if (maximum > 18) maximum = 18;
! 447:
! 448: wmove(hw, 4, 0);
! 449: wprintw(hw,
! 450: "Minimum: %2d; Maximum: %2d (%s corrects previous entry)",
! 451: minimum, maximum, unctrl('\b'));
! 452:
! 453: wmove(hw, 6, 0);
! 454: wprintw(hw, " Int: %-2d", pstats.s_intel);
! 455: wprintw(hw, " Str: %-2d", pstats.s_str);
! 456: wprintw(hw, " Wis: %-2d", pstats.s_wisdom);
! 457: wprintw(hw, " Dex: %-2d", pstats.s_dext);
! 458: wprintw(hw, " Con: %-2d", pstats.s_const);
! 459: wprintw(hw, " Cha: %-2d", pstats.s_charisma);
! 460: wclrtoeol(hw);
! 461: wmove(hw, 6, 11*i + 9);
! 462: if (do_escape == FALSE) draw(hw);
! 463:
! 464: /* Get player's input */
! 465: if (do_escape || maximum == minimum) {
! 466: *our_stats[i] = maximum;
! 467: stat_total -= maximum;
! 468: }
! 469: else for (;;) {
! 470: ch = wgetch(hw);
! 471: if (ch == '\b') { /* Backspace */
! 472: if (i == 0) continue; /* Can't move back */
! 473: else {
! 474: stat_total += *our_stats[i-1];
! 475: *our_stats[i] = 0;
! 476: *our_stats[i-1] = 0;
! 477: i -= 2; /* Back out */
! 478: break;
! 479: }
! 480: }
! 481: if (ch == '\033') { /* Escape */
! 482: /*
! 483: * Escape will result in using all maximums for
! 484: * remaining abilities.
! 485: */
! 486: do_escape = TRUE;
! 487: *our_stats[i] = maximum;
! 488: stat_total -= maximum;
! 489: break;
! 490: }
! 491:
! 492: /* Do we have a legal digit? */
! 493: if (ch >= '0' && ch <= '9') {
! 494: ch -= '0'; /* Convert it to a number */
! 495: *our_stats[i] = 10 * *our_stats[i] + ch;
! 496:
! 497: /* Is the number in range? */
! 498: if (*our_stats[i] >= minimum &&
! 499: *our_stats[i] <= maximum) {
! 500: stat_total -= *our_stats[i];
! 501: break;
! 502: }
! 503:
! 504: /*
! 505: * If it's too small, get more - 1x is the only
! 506: * allowable case.
! 507: */
! 508: if (*our_stats[i] < minimum && *our_stats[i] == 1) {
! 509: /* Print the player's one */
! 510: waddch(hw, '1');
! 511: draw(hw);
! 512: continue;
! 513: }
! 514: }
! 515:
! 516: /* Error condition */
! 517: putchar('\007');
! 518: *our_stats[i] = 0;
! 519: i--; /* Rewind */
! 520: break;
! 521: }
! 522: }
! 523:
! 524: /* Discard extra points over 18 */
! 525: if (stat_total > 18) stat_total = 18;
! 526:
! 527: /* Charisma gets what's left */
! 528: pstats.s_charisma = stat_total;
! 529:
! 530: /* Intialize constants */
! 531: pstats.s_lvl = 1;
! 532: pstats.s_lvladj = 0;
! 533: pstats.s_exp = 0L;
! 534: strncpy(pstats.s_dmg, "1d4", sizeof(pstats.s_dmg));
! 535: pstats.s_carry = totalenc(&player);
! 536:
! 537: /* Get the hit points. */
! 538: pstats.s_hpt = 12 + const_bonus(); /* Base plus bonus */
! 539:
! 540: /* Add in the component that varies according to class */
! 541: pstats.s_hpt += char_class[player.t_ctype].hit_pts;
! 542:
! 543: /* Display the character */
! 544: wmove(hw, 2, 0);
! 545: wprintw(hw,"You are creating a %s.",
! 546: char_class[player.t_ctype].name);
! 547: wclrtoeol(hw);
! 548:
! 549: /* Get rid of max/min line */
! 550: wmove(hw, 4, 0);
! 551: wclrtoeol(hw);
! 552:
! 553: wmove(hw, 6, 0);
! 554: wprintw(hw, " Int: %2d", pstats.s_intel);
! 555: wprintw(hw, " Str: %2d", pstats.s_str);
! 556: wprintw(hw, " Wis: %2d", pstats.s_wisdom);
! 557: wprintw(hw, " Dex: %2d", pstats.s_dext);
! 558: wprintw(hw, " Con: %2d", pstats.s_const);
! 559: wprintw(hw, " Cha: %2d", pstats.s_charisma);
! 560: wclrtoeol(hw);
! 561:
! 562: wmove(hw, 8, 0);
! 563: wprintw(hw, " Hp: %2d", pstats.s_hpt);
! 564: wclrtoeol(hw);
! 565:
! 566: wmove(hw, 10, 0);
! 567: wprintw(hw, " Gold: %d", purse);
! 568:
! 569: mvwaddstr(hw, 0, 0, "Is this character okay? ");
! 570: draw(hw);
! 571: } while(wgetch(hw) != 'y');
! 572: }
! 573:
! 574: pstats.s_arm = 10;
! 575: max_stats = pstats;
! 576:
! 577: /* Set up the initial movement rate */
! 578: player.t_action = A_NIL;
! 579: player.t_movement = 6;
! 580: player.t_no_move = 0;
! 581: player.t_using = NULL;
! 582: }
! 583:
! 584:
! 585:
! 586:
! 587:
! 588:
! 589: /*
! 590: * init_stones:
! 591: * Initialize the ring stone setting scheme for this time
! 592: */
! 593:
! 594: void
! 595: init_stones(void)
! 596: {
! 597: register int i, j;
! 598:
! 599: for (i = 0; i < NSTONES; i++)
! 600: used[i] = FALSE;
! 601:
! 602: for (i = 0 ; i < MAXRINGS ; i++)
! 603: {
! 604: do
! 605: j = rnd(NSTONES);
! 606: until (!used[j]);
! 607: used[j] = TRUE;
! 608: r_stones[i] = stones[j];
! 609: r_know[i] = FALSE;
! 610: r_guess[i] = NULL;
! 611: if (i > 0)
! 612: r_magic[i].mi_prob += r_magic[i-1].mi_prob;
! 613: }
! 614: badcheck("rings", r_magic, MAXRINGS);
! 615: }
! 616:
! 617: /*
! 618: * init_things
! 619: * Initialize the probabilities for types of things
! 620: */
! 621: void
! 622: init_things(void)
! 623: {
! 624: register struct magic_item *mp;
! 625:
! 626: for (mp = &things[1] ; mp < &things[NUMTHINGS] ; mp++)
! 627: mp->mi_prob += (mp-1)->mi_prob;
! 628: badcheck("things", things, NUMTHINGS);
! 629: }
! 630:
! 631:
CVSweb