Mercurial > hg > early-roguelike
diff srogue/init.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 3aa87373c908 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/init.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,338 @@ +/* + * initializate various things + * + * @(#)init.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * All rights reserved. + * + * Based on "Rogue: Exploring the Dungeons of Doom" + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include <ctype.h> +#include "rogue.h" +#include "rogue.ext" + +char *rainbow[NCOLORS] = { + "Red", "Blue", "Green", "Yellow", + "Black", "Brown", "Orange", "Pink", + "Purple", "Grey", "White", "Silver", + "Gold", "Violet", "Clear", "Vermilion", + "Ecru", "Turquoise","Magenta", "Amber", + "Topaz", "Plaid", "Tan", "Tangerine", + "Aquamarine", "Scarlet","Khaki", "Crimson", + "Indigo", "Beige", "Lavender", "Saffron", +}; + +char *sylls[NSYLS] = { + "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze", + "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor", + "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf", + "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk", + "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar", + "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip", + "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech", + "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur", + "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od", + "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po", + "pot","prok","re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol", + "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna", + "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta", + "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u", + "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah", + "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu", + "zant", "zap", "zeb", "zim", "zok", "zon", "zum", +}; + +char *stones[] = { + "Agate", "Alexandrite", "Amethyst", + "Azurite", "Carnelian", "Chrysoberyl", + "Chrysoprase", "Citrine", "Diamond", + "Emerald", "Garnet", "Hematite", + "Jacinth", "Jade", "Kryptonite", + "Lapus lazuli", "Malachite", "Moonstone", + "Obsidian", "Olivine", "Onyx", + "Opal", "Pearl", "Peridot", + "Quartz", "Rhodochrosite","Ruby", + "Sapphire", "Sardonyx", "Serpintine", + "Spinel", "Tiger eye", "Topaz", + "Tourmaline", "Turquoise", +}; + +char *wood[NWOOD] = { + "Avocado wood", "Balsa", "Banyan", "Birch", + "Cedar", "Cherry", "Cinnibar", "Dogwood", + "Driftwood", "Ebony", "Eucalyptus", "Hemlock", + "Ironwood", "Mahogany", "Manzanita", "Maple", + "Oak", "Pine", "Redwood", "Rosewood", + "Teak", "Walnut", "Zebra wood", "Persimmon wood", +}; + +char *metal[NMETAL] = { + "Aluminium", "Bone", "Brass", "Bronze", + "Copper", "Chromium", "Iron", "Lead", + "Magnesium", "Pewter", "Platinum", "Steel", + "Tin", "Titanium", "Zinc", +}; + +/* + * init_everything: + * Set up all important stuff. + */ +init_everything() +{ + init_player(); /* Roll up the rogue */ + init_things(); /* Set up probabilities */ + init_names(); /* Set up names of scrolls */ + init_colors(); /* Set up colors of potions */ + init_stones(); /* Set up stones in rings */ + init_materials(); /* Set up materials of wands */ +} + +/* + * init_things: + * Initialize the probabilities for types of things + */ +init_things() +{ + struct magic_item *mi; + + /* + * init general things + */ + for (mi = &things[1]; mi < &things[NUMTHINGS]; mi++) + mi->mi_prob += (mi-1)->mi_prob; + badcheck("things", things); + /* + * init armor things + */ + for (mi = &a_magic[1]; mi < &a_magic[MAXARMORS]; mi++) + mi->mi_prob += (mi-1)->mi_prob; + badcheck("armor", a_magic); + /* + * init weapon stuff + */ + for (mi = &w_magic[1]; mi < &w_magic[MAXWEAPONS]; mi++) + mi->mi_prob += (mi-1)->mi_prob; + badcheck("weapon", w_magic); +} + + +/* + * init_colors: + * Initialize the potion color scheme for this time + */ +init_colors() +{ + reg int i, j; + reg char *str; + bool used[NCOLORS]; + + for (i = 0; i < NCOLORS; i++) + used[i] = FALSE; + for (i = 0; i < MAXPOTIONS; i++) { + do { + j = rnd(NCOLORS); + } until (!used[j]); + used[j] = TRUE; + p_colors[i] = rainbow[j]; + p_know[i] = FALSE; + p_guess[i] = NULL; + if (i > 0) + p_magic[i].mi_prob += p_magic[i-1].mi_prob; + } + badcheck("potions", p_magic); +} + + +/* + * init_names: + * Generate the names of the various scrolls + */ +init_names() +{ + reg int nsyl; + reg char *cp, *sp; + reg int i, nwords; + + for (i = 0; i < MAXSCROLLS; i++) { + cp = prbuf; + nwords = rnd(3)+1; + while(nwords--) { + nsyl = rnd(3)+2; + while(nsyl--) { + sp = sylls[rnd(NSYLS)]; + while(*sp) + *cp++ = *sp++; + } + *cp++ = ' '; + } + *--cp = '\0'; + s_names[i] = new(strlen(prbuf)+1); + s_know[i] = FALSE; + s_guess[i] = NULL; + strcpy(s_names[i], prbuf); + if (i > 0) + s_magic[i].mi_prob += s_magic[i-1].mi_prob; + } + badcheck("scrolls", s_magic); +} + +/* + * init_stones: + * Initialize the ring stone setting scheme for this time + */ + +init_stones() +{ + reg int i, j; + reg char *str; + bool used[NSTONES]; + + for (i = 0; i < NSTONES; i++) + used[i] = FALSE; + + for (i = 0; i < MAXRINGS; i++) { + do { + j = rnd(NSTONES); + } until (!used[j]); + used[j] = TRUE; + r_stones[i] = stones[j]; + r_know[i] = FALSE; + r_guess[i] = NULL; + if (i > 0) + r_magic[i].mi_prob += r_magic[i-1].mi_prob; + } + badcheck("rings", r_magic); +} + +/* + * init_materials: + * Initialize the construction materials for wands and staffs + */ + +init_materials() +{ + int i, j; + char *str; + struct rod *rd; + bool metused[NMETAL], woodused[NWOOD]; + + for (i = 0; i < NWOOD; i++) + woodused[i] = FALSE; + for (i = 0; i < NMETAL; i++) + metused[i] = FALSE; + + for (i = 0; i < MAXSTICKS; i++) { + rd = &ws_stuff[i]; + for (;;) { + if (rnd(100) > 50) { + j = rnd(NMETAL); + if (!metused[j]) { + str = metal[j]; + rd->ws_type = "wand"; + rd->ws_vol = V_WS_WAND; + rd->ws_wght = W_WS_WAND; + metused[j] = TRUE; + break; + } + } + else { + j = rnd(NWOOD); + if (!woodused[j]) { + str = wood[j]; + rd->ws_type = "staff"; + rd->ws_vol = V_WS_STAFF; + rd->ws_wght = W_WS_WAND; + woodused[j] = TRUE; + break; + } + } + } + ws_stuff[i].ws_made = str; + ws_know[i] = FALSE; + ws_guess[i] = NULL; + if (i > 0) + ws_magic[i].mi_prob += ws_magic[i-1].mi_prob; + } + badcheck("sticks", ws_magic); +} + +badcheck(name, magic) +char *name; +struct magic_item *magic; +{ + struct magic_item *mg; + + for (mg = magic; mg->mi_name != NULL; mg++) + ; + if ((mg - 1)->mi_prob == 1000) + return; + printf("\nBad percentages for %s:\n", name); + for (mg = magic; mg->mi_name != NULL; mg++) + printf("%4d%% %s\n", mg->mi_prob, mg->mi_name); + printf("%s", retstr); + fflush(stdout); + while (getchar() != '\n') + continue; +} + + +/* + * init_player: + * roll up the rogue + */ + +init_player() +{ + player.t_nomove = 0; + player.t_nocmd = 0; + him = &player.t_stats; + him->s_lvl = 1; + him->s_exp = 0L; + him->s_maxhp = him->s_hpt = pinit(); /* hit points */ + him->s_re.a_str = pinit(); /* strength */ + him->s_re.a_dex = pinit(); /* dexterity */ + him->s_re.a_wis = pinit(); /* wisdom */ + him->s_re.a_con = pinit(); /* constitution */ + him->s_ef = him->s_re; /* effective = real */ + strcpy(him->s_dmg, "1d4"); + him->s_arm = NORMAC; + him->s_carry = totalenc(); + him->s_pack = 0; + pack = NULL; /* empty pack so far */ + max_stats = *him; +} + + +/* + * pinit: + * Returns the best 3 of 4 on a 6-sided die + */ +pinit() +{ + int best[4]; + reg int i, min, minind, dicetot; + + for (i = 0 ; i < 4 ; i++) + best[i] = roll(1,6); /* populate array */ + min = best[0]; /* assume that 1st entry */ + minind = 0; /* is the lowest */ + for (i = 1 ; i < 4 ; i++) { /* find the lowest */ + if (best[i] < min) { /* if < minimum then update */ + min = best[i]; + minind = i; /* point to lowest value */ + } + } + dicetot = 0; /* start with nothing */ + for (i = 0 ; i < 4 ; i++) { + if (i != minind) /* if not minimum, then add it */ + dicetot += best[i]; + } + return(dicetot); +}