#include "AppHdr.h"
#include "branch.h"
#include "describe.h"
#include "itemname.h"
#include "player.h"
#include "random.h"
static unsigned char _random_potion_description()
{
int desc, nature, colour;
do
{
desc = random2( PDQ_NQUALS * PDC_NCOLOURS );
if (coinflip())
desc %= PDC_NCOLOURS;
nature = PQUAL(desc);
colour = PCOLOUR(desc);
}
while (colour == PDC_CLEAR && nature > PDQ_VISCOUS
|| desc == PDESCS(PDC_CLEAR));
return static_cast<unsigned char>(desc);
}
void initialise_branch_depths()
{
branches[BRANCH_ECUMENICAL_TEMPLE].startdepth = random_range(4, 7);
branches[BRANCH_ORCISH_MINES].startdepth = random_range(6, 11);
branches[BRANCH_ELVEN_HALLS].startdepth = random_range(3, 4);
branches[BRANCH_LAIR].startdepth = random_range(8, 13);
branches[BRANCH_HIVE].startdepth = random_range(11, 16);
branches[BRANCH_SLIME_PITS].startdepth = random_range(5, 8);
if ( coinflip() )
{
branches[BRANCH_SWAMP].startdepth = random_range(2, 5);
branches[BRANCH_SHOALS].startdepth = -1;
}
else
{
branches[BRANCH_SWAMP].startdepth = -1;
branches[BRANCH_SHOALS].startdepth = random_range(2, 5);
}
branches[BRANCH_SNAKE_PIT].startdepth = random_range(3, 6);
branches[BRANCH_VAULTS].startdepth = random_range(14, 19);
branches[BRANCH_CRYPT].startdepth = random_range(2, 4);
branches[BRANCH_HALL_OF_BLADES].startdepth = random_range(4, 6);
branches[BRANCH_TOMB].startdepth = random_range(2, 3);
}
static int _get_random_porridge_desc()
{
return PDESCQ(PDQ_GLUGGY, one_chance_in(3) ? PDC_BROWN
: PDC_WHITE);
}
static int _get_random_coagulated_blood_desc()
{
potion_description_qualifier_type qualifier = PDQ_NONE;
while (true)
{
switch (random2(4))
{
case 0:
qualifier = PDQ_GLUGGY;
break;
case 1:
qualifier = PDQ_LUMPY;
break;
case 2:
qualifier = PDQ_SEDIMENTED;
break;
case 3:
qualifier = PDQ_VISCOUS;
break;
}
potion_description_colour_type colour = (coinflip() ? PDC_RED
: PDC_BROWN);
int desc = PDESCQ(qualifier, colour);
if (you.item_description[IDESC_POTIONS][POT_BLOOD] != desc)
return desc;
}
}
static int _get_random_blood_desc()
{
return PDESCQ(coinflip() ? PDQ_NONE :
coinflip() ? PDQ_VISCOUS
: PDQ_SEDIMENTED, PDC_RED);
}
void initialise_item_descriptions()
{
you.item_description.init(255);
you.item_description[IDESC_POTIONS][POT_WATER] = PDESCS(PDC_CLEAR);
you.item_description[IDESC_POTIONS][POT_PORRIDGE]
= _get_random_porridge_desc();
you.item_description[IDESC_POTIONS][POT_BLOOD]
= _get_random_blood_desc();
you.item_description[IDESC_POTIONS][POT_BLOOD_COAGULATED]
= _get_random_coagulated_blood_desc();
const int max_item_number[6] = { NUM_WANDS,
NUM_POTIONS,
NUM_SCROLLS,
NUM_JEWELLERY,
NUM_SCROLLS,
NUM_STAVES };
for (int i = 0; i < NUM_IDESC; i++)
{
for (int j = 0; j < max_item_number[i]; j++)
{
if (you.item_description[i][j] != 255)
continue;
while (true)
{
switch (i)
{
case IDESC_WANDS: you.item_description[i][j] = random2( 16 * 12 );
if (coinflip())
you.item_description[i][j] %= 12;
break;
case IDESC_POTIONS: you.item_description[i][j] = _random_potion_description();
break;
case IDESC_SCROLLS: case IDESC_SCROLLS_II:
you.item_description[i][j] = random2(151);
break;
case IDESC_RINGS: you.item_description[i][j] = random2( 13 * 13 );
if (coinflip())
you.item_description[i][j] %= 13;
break;
case IDESC_STAVES: you.item_description[i][j] = random2( 10 * 4 );
break;
}
bool is_ok = true;
for (int p = 0; p < max_item_number[i]; p++)
{
if (p == j)
continue;
if (you.item_description[i][p] == you.item_description[i][j])
{
is_ok = false;
break;
}
}
if (is_ok)
break;
}
}
}
}
void fix_up_jiyva_name()
{
do
you.second_god_name = make_name(random_int(), false, 8, 'J');
while (strncmp(you.second_god_name.c_str(), "J", 1) != 0);
you.second_god_name = replace_all(you.second_god_name, " ", "");
}