/* * Prepare the "variable" part of the "k_info" array. * * The "color"/"metal"/"type" of an item is its "flavor". * For the most part, flavors are assigned randomly each game. * * Initialize descriptions for the "colored" objects, including: * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls. * * The first 4 entries for potions are fixed (Water, Apple Juice, * Slime Mold Juice, Unused Potion). * * Scroll titles are always between 6 and 14 letters long. This is * ensured because every title is composed of whole words, where every * word is from 1 to 8 letters long (one or two syllables of 1 to 4 * letters each), and that no scroll is finished until it attempts to * grow beyond 15 letters. The first time this can happen is when the * current title has 6 letters and the new word has 8 letters, which * would result in a 6 letter scroll title. * * Duplicate titles are avoided by requiring that no two scrolls share * the same first four letters (not the most efficient method, and not * the least efficient method, but it will always work). * * Hack -- make sure everything stays the same for each saved game * This is accomplished by the use of a saved "random seed", as in * "town_gen()". Since no other functions are called while the special * seed is in effect, so this function is pretty "safe". * * Note that the "hacked seed" may provide an RNG with alternating parity! */ void flavor_init(void) { int i, j; byte temp_col; cptr temp_adj; /* Hack -- Use the "simple" RNG */ Rand_quick = TRUE; /* Hack -- Induce consistant flavors */ Rand_value = seed_flavor; /* Efficiency -- Rods/Wands share initial array */ for (i = 0; i < MAX_METALS; i++) { rod_adj[i] = wand_adj[i]; rod_col[i] = wand_col[i]; } /* Rings have "ring colors" */ for (i = 0; i < MAX_ROCKS; i++) { j = randint0(MAX_ROCKS); temp_adj = ring_adj[i]; ring_adj[i] = ring_adj[j]; ring_adj[j] = temp_adj; temp_col = ring_col[i]; ring_col[i] = ring_col[j]; ring_col[j] = temp_col; } /* Amulets have "amulet colors" */ for (i = 0; i < MAX_AMULETS; i++) { j = randint0(MAX_AMULETS); temp_adj = amulet_adj[i]; amulet_adj[i] = amulet_adj[j]; amulet_adj[j] = temp_adj; temp_col = amulet_col[i]; amulet_col[i] = amulet_col[j]; amulet_col[j] = temp_col; } /* Staffs */ for (i = 0; i < MAX_WOODS; i++) { j = randint0(MAX_WOODS); temp_adj = staff_adj[i]; staff_adj[i] = staff_adj[j]; staff_adj[j] = temp_adj; temp_col = staff_col[i]; staff_col[i] = staff_col[j]; staff_col[j] = temp_col; } /* Wands */ for (i = 0; i < MAX_METALS; i++) { j = randint0(MAX_METALS); temp_adj = wand_adj[i]; wand_adj[i] = wand_adj[j]; wand_adj[j] = temp_adj; temp_col = wand_col[i]; wand_col[i] = wand_col[j]; wand_col[j] = temp_col; } /* Rods */ for (i = 0; i < MAX_METALS; i++) { j = randint0(MAX_METALS); temp_adj = rod_adj[i]; rod_adj[i] = rod_adj[j]; rod_adj[j] = temp_adj; temp_col = rod_col[i]; rod_col[i] = rod_col[j]; rod_col[j] = temp_col; } /* Foods (Mushrooms) */ for (i = 0; i < MAX_SHROOM; i++) { j = randint0(MAX_SHROOM); temp_adj = food_adj[i]; food_adj[i] = food_adj[j]; food_adj[j] = temp_adj; temp_col = food_col[i]; food_col[i] = food_col[j]; food_col[j] = temp_col; } /* Potions */ for (i = 4; i < MAX_COLORS; i++) { j = rand_range(4, MAX_COLORS - 1); temp_adj = potion_adj[i]; potion_adj[i] = potion_adj[j]; potion_adj[j] = temp_adj; temp_col = potion_col[i]; potion_col[i] = potion_col[j]; potion_col[j] = temp_col; } /* Scrolls (random titles, always white) */ for (i = 0; i < MAX_TITLES; i++) { /* Get a new title */ while (TRUE) { char buf[80]; int buf_len = 0; bool okay; /* Start a new title */ buf[0] = '\0'; /* Collect words until done */ while (1) { int q, s; char tmp[80]; int len = 0; /* Start a new word */ tmp[0] = '\0'; /* Choose one or two syllables */ s = ((randint0(100) < 30) ? 1 : 2); /* Add a one or two syllable word */ for (q = 0; q < s; q++) { /* Add the syllable */ strnfcat(tmp, 80, &len, syllables[randint0(MAX_SYLLABLES)]); } /* Stop before getting too long */ if (strlen(buf) + 1 + strlen(tmp) > 15) break; /* Add a space + word */ strnfcat(buf, 80, &buf_len, " %s", tmp); } /* Save the title */ strcpy(scroll_adj[i], buf + 1); /* Assume okay */ okay = TRUE; /* Check for "duplicate" scroll titles */ for (j = 0; j < i; j++) { cptr hack1 = scroll_adj[j]; cptr hack2 = scroll_adj[i]; /* Compare first four characters */ if (*hack1++ != *hack2++) continue; if (*hack1++ != *hack2++) continue; if (*hack1++ != *hack2++) continue; if (*hack1++ != *hack2++) continue; /* Not okay */ okay = FALSE; /* Stop looking */ break; } /* Break when done */ if (okay) break; } /* All scrolls are white */ scroll_col[i] = TERM_WHITE; } /* Hack -- Use the "complex" RNG */ Rand_quick = FALSE; /* Analyze every object */ for (i = 1; i < z_info->k_max; i++) { object_kind *k_ptr = &k_info[i]; /* Skip "empty" objects */ if (!k_ptr->name) continue; /* Extract "flavor" (if any) */ k_ptr->flavor = object_flavor(i); /* No flavor yields aware */ if (!k_ptr->flavor) k_ptr->aware = TRUE; /* Check for "easily known" */ k_ptr->easy_know = object_easy_know(i); } }
/* * Prepare the "variable" part of the "k_info" array. * * The "color"/"metal"/"type" of an item is its "flavor". * For the most part, flavors are assigned randomly each game. * * Initialize descriptions for the "colored" objects, including: * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls. * * The first 4 entries for potions are fixed (Water, Apple Juice, * Slime Mold Juice, Unused Potion). * * Scroll titles are always between 6 and 14 letters long. This is * ensured because every title is composed of whole words, where every * word is from 1 to 8 letters long (one or two syllables of 1 to 4 * letters each), and that no scroll is finished until it attempts to * grow beyond 15 letters. The first time this can happen is when the * current title has 6 letters and the new word has 8 letters, which * would result in a 6 letter scroll title. * * Duplicate titles are avoided by requiring that no two scrolls share * the same first four letters (not the most efficient method, and not * the least efficient method, but it will always work). * * Hack -- make sure everything stays the same for each saved game * This is accomplished by the use of a saved "random seed", as in * "town_gen()". Since no other functions are called while the special * seed is in effect, so this function is pretty "safe". * * Note that the "hacked seed" may provide an RNG with alternating parity! */ void flavor_init(void) { int i; /* Hack -- Use the "simple" RNG */ Rand_quick = TRUE; /* Hack -- Induce consistant flavors */ Rand_value = seed_flavor; /* Initialize flavor index of each object by itself */ for (i = 0; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; /* Skip objects without flavor name */ if (!k_ptr->flavor_name) continue; /* * Initialize flavor index to itself * -> Shuffle it later */ k_ptr->flavor = i; } /* Shuffle Rings */ shuffle_flavors(TV_RING); /* Shuffle Amulets */ shuffle_flavors(TV_AMULET); /* Shuffle Staves */ shuffle_flavors(TV_STAFF); /* Shuffle Wands */ shuffle_flavors(TV_WAND); /* Shuffle Rods */ shuffle_flavors(TV_ROD); /* Shuffle Potions */ shuffle_flavors(TV_POTION); /* Shuffle Scrolls */ shuffle_flavors(TV_SCROLL); /* Hack -- Use the "complex" RNG */ Rand_quick = FALSE; /* Analyze every object */ for (i = 1; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; /* Skip "empty" objects */ if (!k_ptr->name) continue; /* No flavor yields aware */ if (!k_ptr->flavor) k_ptr->aware = TRUE; /* Check for "easily known" */ k_ptr->easy_know = object_easy_know(i); } }