Annotation of early-roguelike/rogue5/init.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * global variable initializaton
! 3: *
! 4: * @(#)init.c 4.31 (Berkeley) 02/05/99
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
! 8: * All rights reserved.
! 9: *
! 10: * See the file LICENSE.TXT for full copyright and licensing information.
! 11: */
! 12:
! 13: #include <stdlib.h>
! 14: #include <curses.h>
! 15: #include <ctype.h>
! 16: #include <string.h>
! 17: #include "rogue.h"
! 18:
! 19: /*
! 20: * init_player:
! 21: * Roll her up
! 22: */
! 23: void
! 24: init_player(void)
! 25: {
! 26: THING *obj;
! 27:
! 28: pstats = max_stats;
! 29: food_left = HUNGERTIME;
! 30: /*
! 31: * Give him some food
! 32: */
! 33: obj = new_item();
! 34: obj->o_type = FOOD;
! 35: obj->o_count = 1;
! 36: add_pack(obj, TRUE);
! 37: /*
! 38: * And his suit of armor
! 39: */
! 40: obj = new_item();
! 41: obj->o_type = ARMOR;
! 42: obj->o_which = RING_MAIL;
! 43: obj->o_arm = a_class[RING_MAIL] - 1;
! 44: obj->o_flags |= ISKNOW;
! 45: obj->o_count = 1;
! 46: cur_armor = obj;
! 47: add_pack(obj, TRUE);
! 48: /*
! 49: * Give him his weaponry. First a mace.
! 50: */
! 51: obj = new_item();
! 52: init_weapon(obj, MACE);
! 53: obj->o_hplus = 1;
! 54: obj->o_dplus = 1;
! 55: obj->o_flags |= ISKNOW;
! 56: add_pack(obj, TRUE);
! 57: cur_weapon = obj;
! 58: /*
! 59: * Now a +1 bow
! 60: */
! 61: obj = new_item();
! 62: init_weapon(obj, BOW);
! 63: obj->o_hplus = 1;
! 64: obj->o_flags |= ISKNOW;
! 65: add_pack(obj, TRUE);
! 66: /*
! 67: * Now some arrows
! 68: */
! 69: obj = new_item();
! 70: init_weapon(obj, ARROW);
! 71: obj->o_count = rnd(15) + 25;
! 72: obj->o_flags |= ISKNOW;
! 73: add_pack(obj, TRUE);
! 74: }
! 75:
! 76: /*
! 77: * Contains defintions and functions for dealing with things like
! 78: * potions and scrolls
! 79: */
! 80:
! 81: const char *rainbow[] = {
! 82: "amber",
! 83: "aquamarine",
! 84: "black",
! 85: "blue",
! 86: "brown",
! 87: "clear",
! 88: "crimson",
! 89: "cyan",
! 90: "ecru",
! 91: "gold",
! 92: "green",
! 93: "grey",
! 94: "magenta",
! 95: "orange",
! 96: "pink",
! 97: "plaid",
! 98: "purple",
! 99: "red",
! 100: "silver",
! 101: "tan",
! 102: "tangerine",
! 103: "topaz",
! 104: "turquoise",
! 105: "vermilion",
! 106: "violet",
! 107: "white",
! 108: "yellow",
! 109: };
! 110:
! 111: #define NCOLORS (sizeof rainbow / sizeof (char *))
! 112:
! 113: static const char *sylls[] = {
! 114: "a", "ab", "ag", "aks", "ala", "an", "app", "arg", "arze", "ash",
! 115: "bek", "bie", "bit", "bjor", "blu", "bot", "bu", "byt", "comp",
! 116: "con", "cos", "cre", "dalf", "dan", "den", "do", "e", "eep", "el",
! 117: "eng", "er", "ere", "erk", "esh", "evs", "fa", "fid", "fri", "fu",
! 118: "gan", "gar", "glen", "gop", "gre", "ha", "hyd", "i", "ing", "ip",
! 119: "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
! 120: "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur", "nej",
! 121: "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od", "ood",
! 122: "org", "orn", "ox", "oxy", "pay", "ple", "plu", "po", "pot",
! 123: "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol", "sa",
! 124: "san", "sat", "sef", "seh", "shu", "ski", "sna", "sne", "snik",
! 125: "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab", "tem",
! 126: "ther", "ti", "tox", "trol", "tue", "turs", "u", "ulk", "um", "un",
! 127: "uni", "ur", "val", "viv", "vly", "vom", "wah", "wed", "werg",
! 128: "wex", "whon", "wun", "xo", "y", "yot", "yu", "zant", "zeb", "zim",
! 129: "zok", "zon", "zum",
! 130: };
! 131:
! 132: const STONE stones[] = {
! 133: { "agate", 25},
! 134: { "alexandrite", 40},
! 135: { "amethyst", 50},
! 136: { "carnelian", 40},
! 137: { "diamond", 300},
! 138: { "emerald", 300},
! 139: { "germanium", 225},
! 140: { "granite", 5},
! 141: { "garnet", 50},
! 142: { "jade", 150},
! 143: { "kryptonite", 300},
! 144: { "lapis lazuli", 50},
! 145: { "moonstone", 50},
! 146: { "obsidian", 15},
! 147: { "onyx", 60},
! 148: { "opal", 200},
! 149: { "pearl", 220},
! 150: { "peridot", 63},
! 151: { "ruby", 350},
! 152: { "sapphire", 285},
! 153: { "stibotantalite", 200},
! 154: { "tiger eye", 50},
! 155: { "topaz", 60},
! 156: { "turquoise", 70},
! 157: { "taaffeite", 300},
! 158: { "zircon", 80},
! 159: };
! 160:
! 161: #define NSTONES (sizeof stones / sizeof (STONE))
! 162:
! 163: const char *wood[] = {
! 164: "avocado wood",
! 165: "balsa",
! 166: "bamboo",
! 167: "banyan",
! 168: "birch",
! 169: "cedar",
! 170: "cherry",
! 171: "cinnibar",
! 172: "cypress",
! 173: "dogwood",
! 174: "driftwood",
! 175: "ebony",
! 176: "elm",
! 177: "eucalyptus",
! 178: "fall",
! 179: "hemlock",
! 180: "holly",
! 181: "ironwood",
! 182: "kukui wood",
! 183: "mahogany",
! 184: "manzanita",
! 185: "maple",
! 186: "oaken",
! 187: "persimmon wood",
! 188: "pecan",
! 189: "pine",
! 190: "poplar",
! 191: "redwood",
! 192: "rosewood",
! 193: "spruce",
! 194: "teak",
! 195: "walnut",
! 196: "zebrawood",
! 197: };
! 198:
! 199: #define NWOOD (sizeof wood / sizeof (char *))
! 200:
! 201: const char *metal[] = {
! 202: "aluminum",
! 203: "beryllium",
! 204: "bone",
! 205: "brass",
! 206: "bronze",
! 207: "copper",
! 208: "electrum",
! 209: "gold",
! 210: "iron",
! 211: "lead",
! 212: "magnesium",
! 213: "mercury",
! 214: "nickel",
! 215: "pewter",
! 216: "platinum",
! 217: "steel",
! 218: "silver",
! 219: "silicon",
! 220: "tin",
! 221: "titanium",
! 222: "tungsten",
! 223: "zinc",
! 224: };
! 225:
! 226: #define NMETAL (sizeof metal / sizeof (char *))
! 227:
! 228: int cNWOOD = NWOOD;
! 229: int cNMETAL = NMETAL;
! 230: int cNSTONES = NSTONES;
! 231: int cNCOLORS = NCOLORS;
! 232:
! 233: /*
! 234: * init_colors:
! 235: * Initialize the potion color scheme for this time
! 236: */
! 237: void
! 238: init_colors(void)
! 239: {
! 240: int i, j;
! 241: int used[NCOLORS];
! 242:
! 243: for (i = 0; i < NCOLORS; i++)
! 244: used[i] = FALSE;
! 245: for (i = 0; i < MAXPOTIONS; i++)
! 246: {
! 247: do
! 248: j = rnd(NCOLORS);
! 249: until (!used[j]);
! 250: used[j] = TRUE;
! 251: p_colors[i] = rainbow[j];
! 252: }
! 253: }
! 254:
! 255: /*
! 256: * init_names:
! 257: * Generate the names of the various scrolls
! 258: */
! 259: #define MAXNAME 40 /* Max number of characters in a name */
! 260:
! 261: void
! 262: init_names(void)
! 263: {
! 264: int nsyl;
! 265: const char *sp;
! 266: char *cp;
! 267: int i, nwords;
! 268:
! 269: for (i = 0; i < MAXSCROLLS; i++)
! 270: {
! 271: cp = prbuf;
! 272: nwords = rnd(3) + 2;
! 273: while (nwords--)
! 274: {
! 275: nsyl = rnd(3) + 1;
! 276: while (nsyl--)
! 277: {
! 278: sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
! 279: if (&cp[strlen(sp)] > &prbuf[MAXNAME])
! 280: break;
! 281: while (*sp)
! 282: *cp++ = *sp++;
! 283: }
! 284: *cp++ = ' ';
! 285: }
! 286: *--cp = '\0';
! 287: s_names[i] = malloc(strlen(prbuf)+1);
! 288: if (s_names[i] != NULL)
! 289: strcpy(s_names[i], prbuf);
! 290: }
! 291: }
! 292:
! 293: /*
! 294: * init_stones:
! 295: * Initialize the ring stone setting scheme for this time
! 296: */
! 297: void
! 298: init_stones(void)
! 299: {
! 300: int used[NSTONES];
! 301: int i, j;
! 302:
! 303: for (i = 0; i < NSTONES; i++)
! 304: used[i] = FALSE;
! 305: for (i = 0; i < MAXRINGS; i++)
! 306: {
! 307: do
! 308: j = rnd(NSTONES);
! 309: until (!used[j]);
! 310: used[j] = TRUE;
! 311: r_stones[i] = stones[j].st_name;
! 312: ring_info[i].oi_worth += stones[j].st_value;
! 313: }
! 314: }
! 315:
! 316: /*
! 317: * init_materials:
! 318: * Initialize the construction materials for wands and staffs
! 319: */
! 320: void
! 321: init_materials(void)
! 322: {
! 323: int i, j;
! 324: const char *str;
! 325: int metused[NMETAL];
! 326: int used[NWOOD];
! 327:
! 328: for (i = 0; i < NWOOD; i++)
! 329: used[i] = FALSE;
! 330: for (i = 0; i < NMETAL; i++)
! 331: metused[i] = FALSE;
! 332: for (i = 0; i < MAXSTICKS; i++)
! 333: {
! 334: for (;;)
! 335: if (rnd(2) == 0)
! 336: {
! 337: j = rnd(NMETAL);
! 338: if (!metused[j])
! 339: {
! 340: ws_type[i] = "wand";
! 341: str = metal[j];
! 342: metused[j] = TRUE;
! 343: break;
! 344: }
! 345: }
! 346: else
! 347: {
! 348: j = rnd(NWOOD);
! 349: if (!used[j])
! 350: {
! 351: ws_type[i] = "staff";
! 352: str = wood[j];
! 353: used[j] = TRUE;
! 354: break;
! 355: }
! 356: }
! 357: ws_made[i] = str;
! 358: }
! 359: }
! 360:
! 361: #ifdef MASTER
! 362: # define NT NUMTHINGS, "things"
! 363: # define MP MAXPOTIONS, "potions"
! 364: # define MS MAXSCROLLS, "scrolls"
! 365: # define MR MAXRINGS, "rings"
! 366: # define MWS MAXSTICKS, "sticks"
! 367: # define MW MAXWEAPONS, "weapons"
! 368: # define MA MAXARMORS, "armor"
! 369: #else
! 370: # define NT NUMTHINGS
! 371: # define MP MAXPOTIONS
! 372: # define MS MAXSCROLLS
! 373: # define MR MAXRINGS
! 374: # define MWS MAXSTICKS
! 375: # define MW MAXWEAPONS
! 376: # define MA MAXARMORS
! 377: #endif
! 378:
! 379: /*
! 380: * sumprobs:
! 381: * Sum up the probabilities for items appearing
! 382: */
! 383: void
! 384: sumprobs(struct obj_info *info, int bound
! 385: #ifdef MASTER
! 386: , char *name
! 387: #endif
! 388: )
! 389: {
! 390: #ifdef MASTER
! 391: struct obj_info *start = info;
! 392: #endif
! 393: struct obj_info *endp;
! 394:
! 395: endp = info + bound;
! 396: while (++info < endp)
! 397: info->oi_prob += (info - 1)->oi_prob;
! 398: #ifdef MASTER
! 399: badcheck(name, start, bound);
! 400: #endif
! 401: }
! 402:
! 403: /*
! 404: * init_probs:
! 405: * Initialize the probabilities for the various items
! 406: */
! 407: void
! 408: init_probs(void)
! 409: {
! 410: sumprobs(things, NT);
! 411: sumprobs(pot_info, MP);
! 412: sumprobs(scr_info, MS);
! 413: sumprobs(ring_info, MR);
! 414: sumprobs(ws_info, MWS);
! 415: sumprobs(weap_info, MW);
! 416: sumprobs(arm_info, MA);
! 417: }
! 418:
! 419: #ifdef MASTER
! 420: /*
! 421: * badcheck:
! 422: * Check to see if a series of probabilities sums to 100
! 423: */
! 424: void
! 425: badcheck(const char *name, const struct obj_info *info, int bound)
! 426: {
! 427: const struct obj_info *end;
! 428:
! 429: if (info[bound - 1].oi_prob == 100)
! 430: return;
! 431: printf("\nBad percentages for %s (bound = %d):\n", name, bound);
! 432: for (end = &info[bound]; info < end; info++)
! 433: printf("%3d%% %s\n", info->oi_prob, info->oi_name);
! 434: printf("[hit RETURN to continue]");
! 435: fflush(stdout);
! 436: while (getchar() != '\n')
! 437: continue;
! 438: }
! 439: #endif
! 440:
! 441: /*
! 442: * pick_color:
! 443: * If he is halucinating, pick a random color name and return it,
! 444: * otherwise return the given color.
! 445: */
! 446: const char *
! 447: pick_color(const char *col)
! 448: {
! 449: return (on(player, ISHALU) ? rainbow[rnd(NCOLORS)] : col);
! 450: }
CVSweb