git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1340 c06c8d41-db1a-0410-9941-cceddc491573
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
JOI7WFNNDLVFF37WWV2OK5434U6O3ZHNJXIS5XIRPQFCY45JHGQAC
MD646KOBV4NCU7DFXQ4GQYEOJ35NC22RVDXEQ7YO6U2B7R4GLVUAC
6NTCURCJQA4PBNDD5VGFBQAF5QCZZPLWRDZTA65R3EOGMVA475IAC
6QBSOHXCD43FMEVQQLDA243JYP6SGEP3DKSNBZM42RXRFNAKE5TQC
I7T4UNPX4M63RXNVFQUB7XXUKBS2H7YMK44F3YZIIL75IBOCJQLAC
DYBB7LISQQKT734KRIQZCO67OGDQWLZ2KSTDZUY4BZFCCOIDTUWAC
TZ55IZNANEJO2WDTKYWVLY2W2VV6BR7WKIN7XLNISAMMFT6LG2WQC
KOSAQXB3KF6VAYTG2TOTHGJBB3F7AL6O32EMCXPVZJ5WHQX6XR5AC
5YWWRDK5FK7BY5EPDN5YUHWM5MZUSHBARTQEQXGX3327OCM4O3AAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
LAMIVDKY7LO5ONX5Z273ZCCEA5UBENOJD5VWNE4AK2EXGFED6BFQC
5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC
UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC
MQ62OAMLGJVRW2QIL4PAZRAU6PC52ZVGY2FCOBIY6IWGQIHMU5CAC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
XY77S75KH5KV54MZVAPMUC64TVRE2QM2KVJAAGJGCIBGQEC5GUTQC
ENXH3WOZDV5SVVQ2WIGVUOUZ7LEIEOGBHVOY7TD6DUSJEJGXU33QC
KAGDUJFWWZGGIYQECFGRHNSQT47XIUN3ZTSETAIWLYIZ43QXGQ2AC
3A3OAIFRFU3IHF6SDNDPCN3XYOFYIBYCEYJAXAFASCFDY76SMFXQC
KKROXTUPBNEXXEUUDJNADATK3BCQPSQWFZ6L4VTKBPTYXJLYUHDQC
OHGGKG5PLPCOEVLYJKBNR4CVQAH6SDC6BSZOK7VCFRNEQY7ASSBAC
CRZBZINP644IGYFOCXJKMEKBLFKN5CQ4GGO3PIVH5BTN7FIITPFQC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
IPQ63XIUPHFMCQOZZAVSGCJOZFDRDWZTUUJSAUMARNDUFLBEMYIAC
5OVWAD2MGK2NT6Q546KW7HZHELVDBBRC2CQX6VZMZF2YVRC7CPVAC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
D77K7ISUWRLGNSQGYH5P2KEJZCNYQHDZC5AMLSKTXVBIRNG6F5KQC
CQO4TZ3Z2LL6TRJGO4SXVFUNDTAEVPUVVPO52SJLTJ73RCXBEIJQC
FXQ3ZOBEJ6JC65JLPKUHOIRM62HUURI2OJZ5QZRG33QMR6C6YRIQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
MXSHWV5RWY6U3WF3NUGDTT7IQBPGUSCXM5XAXLLYKOQU24XN2LZQC
SN7Z6RDZ7SJOAWZCUTWJ63A4XR4EG4SF7L2H4HQVEJY7NEPJF5KAC
7VVRO5HMNNOXVRLBLJUCHUJP6MDIRMC2BWCO7MWH4OLQRM3LMTMQC
#ifndef MAKEITEM_H
#define MAKEITEM_H
#include "dungeon.h"
int items( int allow_uniques, int force_class, int force_type,
bool dont_place, int item_level, int item_race,
const dgn_region_list &forbidden = dgn_region_list() );
void item_colour( item_def &item );
void init_rod_mp(item_def &item);
void give_item(int mid, int level_number);
#endif
#include "AppHdr.h"
#include "enum.h"
#include "externs.h"
#include "makeitem.h"
#include "itemname.h"
#include "itemprop.h"
#include "items.h"
#include "mon-util.h"
#include "player.h"
#include "randart.h"
#include "spl-book.h"
#include "stuff.h"
static bool weapon_is_visibly_special(const item_def &item);
static bool got_curare_roll(const int item_level)
{
return one_chance_in(item_level > 27? 6 :
item_level < 2 ? 15 :
(364 - 7 * item_level) / 25);
}
static bool got_distortion_roll(const int item_level)
{
return (one_chance_in(25));
}
static bool is_weapon_special(int the_weapon)
{
return (mitm[the_weapon].special != SPWPN_NORMAL);
} // end is_weapon_special()
static void set_weapon_special(int the_weapon, int spwpn)
{
set_item_ego_type( mitm[the_weapon], OBJ_WEAPONS, spwpn );
} // end set_weapon_special()
static int exciting_colour()
{
switch(random2(4))
{
case 0: return YELLOW;
case 1: return LIGHTGREEN;
case 2: return LIGHTRED;
case 3: return LIGHTMAGENTA;
default: return MAGENTA;
}
}
static int newwave_weapon_colour(const item_def &item)
{
int item_colour = BLACK;
// fixed artefacts get predefined colours
std::string itname = item_name( item, DESC_PLAIN );
lowercase(itname);
const bool item_runed = itname.find(" runed ") != std::string::npos;
const bool heav_runed = itname.find(" heavily ") != std::string::npos;
if ( is_random_artefact(item) && (!item_runed || heav_runed) )
return exciting_colour();
if (is_range_weapon( item ))
{
switch (range_skill(item))
{
case SK_BOWS:
item_colour = BLUE;
break;
case SK_CROSSBOWS:
item_colour = LIGHTBLUE;
break;
case SK_DARTS:
item_colour = WHITE;
break;
case SK_SLINGS:
item_colour = BROWN;
break;
default:
// huh?
item_colour = MAGENTA;
break;
}
}
else
{
switch (weapon_skill(item))
{
case SK_SHORT_BLADES:
item_colour = CYAN;
break;
case SK_LONG_SWORDS:
item_colour = LIGHTCYAN;
break;
case SK_AXES:
item_colour = DARKGREY;
break;
case SK_MACES_FLAILS:
item_colour = LIGHTGREY;
break;
case SK_POLEARMS:
item_colour = RED;
break;
case SK_STAVES:
item_colour = GREEN;
break;
default:
// huh?
item_colour = random_colour();
break;
}
}
return (item_colour);
}
static int classic_weapon_colour(const item_def &item)
{
int item_colour = BLACK;
if (is_range_weapon( item ))
item_colour = BROWN;
else
{
switch (item.sub_type)
{
case WPN_CLUB:
case WPN_GIANT_CLUB:
case WPN_GIANT_SPIKED_CLUB:
case WPN_ANCUS:
case WPN_WHIP:
case WPN_QUARTERSTAFF:
item_colour = BROWN;
break;
case WPN_QUICK_BLADE:
item_colour = LIGHTBLUE;
break;
case WPN_EXECUTIONERS_AXE:
item_colour = RED;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
}
return (item_colour);
}
static int weapon_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_weapon_colour(item) : newwave_weapon_colour(item));
}
static int newwave_missile_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case MI_STONE:
case MI_LARGE_ROCK:
item_colour = BROWN;
break;
case MI_ARROW:
item_colour = BLUE;
break;
case MI_NEEDLE:
item_colour = WHITE;
break;
case MI_BOLT:
item_colour = LIGHTBLUE;
break;
case MI_DART:
item_colour = CYAN;
break;
default:
// huh?
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int classic_missile_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case MI_STONE:
case MI_LARGE_ROCK:
case MI_ARROW:
item_colour = BROWN;
break;
case MI_NEEDLE:
item_colour = WHITE;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int missile_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_missile_colour(item) : newwave_missile_colour(item));
}
static int newwave_armour_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case ARM_CLOAK:
item_colour = WHITE;
break;
case ARM_NAGA_BARDING:
item_colour = LIGHTGREEN;
break;
case ARM_CENTAUR_BARDING:
item_colour = GREEN;
break;
case ARM_ROBE:
case ARM_CAP:
item_colour = random_uncommon_colour();
break;
case ARM_HELMET:
//caps and wizard's hats are random coloured
if (get_helmet_type(item) == THELM_CAP
|| get_helmet_type(item) == THELM_WIZARD_HAT)
{
item_colour = random_uncommon_colour();
}
else
item_colour = DARKGREY;
break;
case ARM_BOOTS:
item_colour = BLUE;
break;
case ARM_GLOVES:
item_colour = LIGHTBLUE;
break;
case ARM_LEATHER_ARMOUR:
item_colour = BROWN;
break;
case ARM_CRYSTAL_PLATE_MAIL:
item_colour = WHITE;
break;
case ARM_ANIMAL_SKIN:
item_colour = YELLOW;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int classic_armour_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case ARM_CLOAK:
case ARM_ROBE:
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
case ARM_CAP:
item_colour = random_colour();
break;
case ARM_HELMET:
// caps and wizard's hats are random coloured
if (get_helmet_type(item) == THELM_CAP
|| get_helmet_type(item) == THELM_WIZARD_HAT)
{
item_colour = random_colour();
}
else
item_colour = LIGHTCYAN;
break;
case ARM_BOOTS: // maybe more interesting boot colours?
case ARM_GLOVES:
case ARM_LEATHER_ARMOUR:
item_colour = BROWN;
break;
case ARM_CRYSTAL_PLATE_MAIL:
item_colour = LIGHTGREY;
break;
case ARM_ANIMAL_SKIN:
item_colour = BROWN;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int armour_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_armour_colour(item) : newwave_armour_colour(item));
}
void item_colour( item_def &item )
{
int switchnum = 0;
int temp_value;
switch (item.base_type)
{
case OBJ_WEAPONS:
if (is_unrandom_artefact( item ))
break; // unrandarts already coloured
if (is_fixed_artefact( item ))
{
switch (item.special) // was: - 180, but that is *wrong* {dlb}
{
case SPWPN_SINGING_SWORD:
case SPWPN_SCEPTRE_OF_TORMENT:
item.colour = YELLOW;
break;
case SPWPN_WRATH_OF_TROG:
case SPWPN_SWORD_OF_POWER:
item.colour = RED;
break;
case SPWPN_SCYTHE_OF_CURSES:
item.colour = DARKGREY;
break;
case SPWPN_MACE_OF_VARIABILITY:
item.colour = random_colour();
break;
case SPWPN_GLAIVE_OF_PRUNE:
item.colour = MAGENTA;
break;
case SPWPN_SWORD_OF_ZONGULDROK:
item.colour = LIGHTGREY;
break;
case SPWPN_KNIFE_OF_ACCURACY:
item.colour = LIGHTCYAN;
break;
case SPWPN_STAFF_OF_OLGREB:
item.colour = GREEN;
break;
case SPWPN_VAMPIRES_TOOTH:
item.colour = WHITE;
break;
case SPWPN_STAFF_OF_WUCAD_MU:
item.colour = BROWN;
break;
}
break;
}
if (is_demonic( item ))
item.colour = random_uncommon_colour();
else
item.colour = weapon_colour(item);
if (is_random_artefact( item ) && one_chance_in(5)
&& Options.classic_item_colours)
item.colour = random_colour();
break;
case OBJ_MISSILES:
item.colour = missile_colour(item);
break;
case OBJ_ARMOUR:
if (is_unrandom_artefact( item ))
break; /* unrandarts have already been coloured */
switch (item.sub_type)
{
case ARM_DRAGON_HIDE:
case ARM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_DRAGON );
break;
case ARM_TROLL_HIDE:
case ARM_TROLL_LEATHER_ARMOUR:
item.colour = mons_class_colour( MONS_TROLL );
break;
case ARM_ICE_DRAGON_HIDE:
case ARM_ICE_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_ICE_DRAGON );
break;
case ARM_STEAM_DRAGON_HIDE:
case ARM_STEAM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_STEAM_DRAGON );
break;
case ARM_MOTTLED_DRAGON_HIDE:
case ARM_MOTTLED_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_MOTTLED_DRAGON );
break;
case ARM_STORM_DRAGON_HIDE:
case ARM_STORM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_STORM_DRAGON );
break;
case ARM_GOLD_DRAGON_HIDE:
case ARM_GOLD_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_GOLDEN_DRAGON );
break;
case ARM_SWAMP_DRAGON_HIDE:
case ARM_SWAMP_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_SWAMP_DRAGON );
break;
default:
item.colour = armour_colour(item);
break;
}
// I don't think this is ever done -- see start of case {dlb}:
if (is_random_artefact( item ) && one_chance_in(5))
item.colour = random_colour();
break;
case OBJ_WANDS:
item.special = you.item_description[IDESC_WANDS][item.sub_type];
switch (item.special % 12)
{
case 0: //"iron wand"
item.colour = CYAN;
break;
case 1: //"brass wand"
case 5: //"gold wand"
item.colour = YELLOW;
break;
case 2: //"bone wand"
case 8: //"ivory wand"
case 9: //"glass wand"
case 10: //"lead wand"
default:
item.colour = LIGHTGREY;
break;
case 3: //"wooden wand"
case 4: //"copper wand"
case 7: //"bronze wand"
item.colour = BROWN;
break;
case 6: //"silver wand"
item.colour = WHITE;
break;
case 11: //"plastic wand"
item.colour = random_colour();
break;
}
if (item.special / 12 == 9)
item.colour = DARKGREY;
// rare wands (eg disintegration - these will be very rare):
// maybe only 1 thing, like: crystal, shining, etc.
break;
case OBJ_POTIONS:
item.special = you.item_description[IDESC_POTIONS][item.sub_type];
switch (item.special % 14)
{
case 0: //"clear potion"
default:
item.colour = LIGHTGREY;
break;
case 1: //"blue potion"
case 7: //"inky potion"
item.colour = BLUE;
break;
case 2: //"black potion"
item.colour = DARKGREY;
break;
case 3: //"silvery potion"
case 13: //"white potion"
item.colour = WHITE;
break;
case 4: //"cyan potion"
item.colour = CYAN;
break;
case 5: //"purple potion"
item.colour = MAGENTA;
break;
case 6: //"orange potion"
item.colour = LIGHTRED;
break;
case 8: //"red potion"
item.colour = RED;
break;
case 9: //"yellow potion"
item.colour = YELLOW;
break;
case 10: //"green potion"
item.colour = GREEN;
break;
case 11: //"brown potion"
item.colour = BROWN;
break;
case 12: //"pink potion"
item.colour = LIGHTMAGENTA;
break;
}
break;
case OBJ_FOOD:
switch (item.sub_type)
{
case FOOD_BEEF_JERKY:
case FOOD_BREAD_RATION:
case FOOD_LYCHEE:
case FOOD_MEAT_RATION:
case FOOD_RAMBUTAN:
case FOOD_SAUSAGE:
case FOOD_SULTANA:
item.colour = BROWN;
break;
case FOOD_BANANA:
case FOOD_CHEESE:
case FOOD_HONEYCOMB:
case FOOD_LEMON:
case FOOD_PIZZA:
case FOOD_ROYAL_JELLY:
item.colour = YELLOW;
break;
case FOOD_PEAR:
item.colour = LIGHTGREEN;
break;
case FOOD_CHOKO:
case FOOD_SNOZZCUMBER:
item.colour = GREEN;
break;
case FOOD_APRICOT:
case FOOD_ORANGE:
item.colour = LIGHTRED;
break;
case FOOD_STRAWBERRY:
item.colour = RED;
break;
case FOOD_APPLE:
item.colour = (coinflip() ? RED : GREEN);
break;
case FOOD_GRAPE:
item.colour = (coinflip() ? MAGENTA : GREEN);
break;
case FOOD_CHUNK:
// set the appropriate colour of the meat:
temp_value = mons_class_colour( item.plus );
item.colour = (temp_value == BLACK) ? LIGHTRED : temp_value;
break;
default:
item.colour = BROWN;
}
break;
case OBJ_JEWELLERY:
/* unrandarts have already been coloured */
if (is_unrandom_artefact( item ))
break;
else if (is_random_artefact( item ))
{
item.colour = random_colour();
break;
}
item.colour = YELLOW;
item.special = you.item_description[IDESC_RINGS][item.sub_type];
switchnum = item.special % 13;
switch (switchnum)
{
case 0:
case 5:
item.colour = BROWN;
break;
case 1:
case 8:
case 11:
item.colour = LIGHTGREY;
break;
case 2:
case 6:
item.colour = YELLOW;
break;
case 3:
case 4:
item.colour = CYAN;
break;
case 7:
item.colour = BROWN;
break;
case 9:
case 10:
item.colour = WHITE;
break;
case 12:
item.colour = GREEN;
break;
case 13:
item.colour = LIGHTCYAN;
break;
}
if (item.sub_type >= AMU_RAGE)
{
switch (switchnum)
{
case 0: //"zirconium amulet"
case 9: //"ivory amulet"
case 11: //"platinum amulet"
item.colour = WHITE;
break;
case 1: //"sapphire amulet"
item.colour = LIGHTBLUE;
break;
case 2: //"golden amulet"
case 6: //"brass amulet"
item.colour = YELLOW;
break;
case 3: //"emerald amulet"
item.colour = GREEN;
break;
case 4: //"garnet amulet"
case 8: //"ruby amulet"
item.colour = RED;
break;
case 5: //"bronze amulet"
case 7: //"copper amulet"
item.colour = BROWN;
break;
case 10: //"bone amulet"
item.colour = LIGHTGREY;
break;
case 12: //"jade amulet"
item.colour = GREEN;
break;
case 13: //"plastic amulet"
item.colour = random_colour();
}
}
// blackened - same for both rings and amulets
if (item.special / 13 == 5)
item.colour = DARKGREY;
break;
case OBJ_SCROLLS:
item.colour = LIGHTGREY;
item.special = you.item_description[IDESC_SCROLLS][item.sub_type];
item.plus = you.item_description[IDESC_SCROLLS_II][item.sub_type];
break;
case OBJ_BOOKS:
switch (item.special % 10)
{
case 0:
case 1:
default:
item.colour = random_colour();
break;
case 2:
item.colour = (one_chance_in(3) ? BROWN : DARKGREY);
break;
case 3:
item.colour = CYAN;
break;
case 4:
item.colour = LIGHTGREY;
break;
}
break;
case OBJ_STAVES:
item.colour = BROWN;
break;
case OBJ_ORBS:
item.colour = LIGHTMAGENTA;
break;
case OBJ_MISCELLANY:
switch (item.sub_type)
{
case MISC_BOTTLED_EFREET:
case MISC_STONE_OF_EARTH_ELEMENTALS:
item.colour = BROWN;
break;
case MISC_AIR_ELEMENTAL_FAN:
case MISC_CRYSTAL_BALL_OF_ENERGY:
case MISC_CRYSTAL_BALL_OF_FIXATION:
case MISC_CRYSTAL_BALL_OF_SEEING:
case MISC_DISC_OF_STORMS:
case MISC_HORN_OF_GERYON:
case MISC_LANTERN_OF_SHADOWS:
item.colour = LIGHTGREY;
break;
case MISC_LAMP_OF_FIRE:
item.colour = YELLOW;
break;
case MISC_BOX_OF_BEASTS:
item.colour = DARKGREY;
break;
case MISC_RUNE_OF_ZOT:
switch (item.plus)
{
case RUNE_DIS: // iron
item.colour = CYAN;
break;
case RUNE_COCYTUS: // icy
item.colour = LIGHTBLUE;
break;
case RUNE_TARTARUS: // bone
item.colour = WHITE;
break;
case RUNE_SLIME_PITS: // slimy
item.colour = GREEN;
break;
case RUNE_SNAKE_PIT: // serpentine
case RUNE_ELVEN_HALLS: // elven
item.colour = LIGHTGREEN;
break;
case RUNE_VAULTS: // silver
item.colour = LIGHTGREY;
break;
case RUNE_TOMB: // golden
item.colour = YELLOW;
break;
case RUNE_SWAMP: // decaying
item.colour = BROWN;
break;
case RUNE_ISLANDS:
item.colour = BLUE; // liquid
// These two are hardly unique, but since colour isn't used for
// stacking, so we don't have to worry to much about this. -- bwr
case RUNE_DEMONIC: // random pandemonium demonlords
case RUNE_ABYSSAL: // random in abyss
item.colour = random_colour();
break;
case RUNE_MNOLEG: // glowing
item.colour = coinflip() ? MAGENTA : LIGHTMAGENTA;
break;
case RUNE_LOM_LOBON: // magical
item.colour = BLUE;
break;
case RUNE_CEREBOV: // fiery
item.colour = coinflip() ? RED : LIGHTRED;
break;
case RUNE_GEHENNA: // obsidian
case RUNE_GLOORX_VLOQ: // dark
default:
item.colour = DARKGREY;
break;
}
break;
case MISC_EMPTY_EBONY_CASKET:
item.colour = DARKGREY;
break;
case MISC_DECK_OF_SUMMONINGS:
case MISC_DECK_OF_WONDERS:
case MISC_DECK_OF_TRICKS:
case MISC_DECK_OF_POWER:
default:
item.colour = random_colour();
break;
}
break;
case OBJ_CORPSES:
// set the appropriate colour of the body:
temp_value = mons_class_colour( item.plus );
item.colour = (temp_value == BLACK) ? LIGHTRED : temp_value;
break;
case OBJ_GOLD:
item.colour = YELLOW;
break;
}
} // end item_colour()
// Returns item slot or NON_ITEM if it fails
int items( int allow_uniques, // not just true-false,
// because of BCR acquirement hack
int force_class, // desired OBJECTS class {dlb}
int force_type, // desired SUBTYPE - enum varies by OBJ
bool dont_place, // don't randomly place item on level
int item_level, // level of the item, can differ from global
int item_race, // weapon / armour racial categories
// item_race also gives type of rune!
const dgn_region_list &forbidden)
{
int temp_rand = 0; // probability determination {dlb}
int range_charges = 0; // for OBJ_WANDS charge count {dlb}
int temp_value = 0; // temporary value storage {dlb}
int loopy = 0; // just another loop variable {dlb}
int count = 0; // just another loop variable {dlb}
int race_plus = 0;
int race_plus2 = 0;
int x_pos, y_pos;
int quant = 0;
int icky = 0;
int p = 0;
// find an empty slot for the item (with culling if required)
p = get_item_slot(10);
if (p == NON_ITEM)
return (NON_ITEM);
// cap item_level unless an acquirement-level item {dlb}:
if (item_level > 50 && item_level != MAKE_GOOD_ITEM)
item_level = 50;
// determine base_type for item generated {dlb}:
if (force_class != OBJ_RANDOM)
mitm[p].base_type = force_class;
else
{
// nice and large for subtle differences {dlb}
temp_rand = random2(10000);
mitm[p].base_type = ((temp_rand < 50) ? OBJ_STAVES : // 0.50%
(temp_rand < 200) ? OBJ_BOOKS : // 1.50%
(temp_rand < 450) ? OBJ_JEWELLERY :// 2.50%
(temp_rand < 800) ? OBJ_WANDS : // 3.50%
(temp_rand < 1500) ? OBJ_FOOD : // 7.00%
(temp_rand < 2500) ? OBJ_ARMOUR : // 10.00%
(temp_rand < 3500) ? OBJ_WEAPONS : // 10.00%
(temp_rand < 4500) ? OBJ_POTIONS : // 10.00%
(temp_rand < 6000) ? OBJ_MISSILES : // 15.00%
(temp_rand < 8000) ? OBJ_SCROLLS // 20.00%
: OBJ_GOLD); // 20.00%
// misc items placement wholly dependent upon current depth {dlb}:
if (item_level > 7 && (20 + item_level) >= random2(3500))
mitm[p].base_type = OBJ_MISCELLANY;
if (item_level < 7
&& (mitm[p].base_type == OBJ_BOOKS
|| mitm[p].base_type == OBJ_STAVES
|| mitm[p].base_type == OBJ_WANDS)
&& random2(7) >= item_level)
{
mitm[p].base_type = coinflip() ? OBJ_POTIONS : OBJ_SCROLLS;
}
}
// determine sub_type accordingly {dlb}:
switch (mitm[p].base_type)
{
case OBJ_WEAPONS:
// generate initial weapon subtype using weighted function --
// indefinite loop now more evident and fewer array lookups {dlb}:
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
if (random2(20) < 20 - item_level)
{
// these are the common/low level weapon types
temp_rand = random2(12);
mitm[p].sub_type = ((temp_rand == 0) ? WPN_KNIFE :
(temp_rand == 1) ? WPN_QUARTERSTAFF :
(temp_rand == 2) ? WPN_SLING :
(temp_rand == 3) ? WPN_SPEAR :
(temp_rand == 4) ? WPN_HAND_AXE :
(temp_rand == 5) ? WPN_DAGGER :
(temp_rand == 6) ? WPN_MACE :
(temp_rand == 7) ? WPN_DAGGER :
(temp_rand == 8) ? WPN_CLUB :
(temp_rand == 9) ? WPN_HAMMER :
(temp_rand == 10) ? WPN_WHIP
: WPN_SABRE);
}
else if (item_level > 6 && random2(100) < (10 + item_level)
&& one_chance_in(30))
{
// place the rare_weapon() == 0 weapons
//
// this replaced the infinite loop (wasteful) -- may need
// to make into its own function to allow ease of tweaking
// distribution {dlb}:
temp_rand = random2(10);
mitm[p].sub_type = ((temp_rand == 9) ? WPN_LAJATANG :
(temp_rand == 8) ? WPN_DEMON_BLADE :
(temp_rand == 7) ? WPN_DEMON_TRIDENT :
(temp_rand == 6) ? WPN_DEMON_WHIP :
(temp_rand == 5) ? WPN_DOUBLE_SWORD :
(temp_rand == 4) ? WPN_EVENINGSTAR :
(temp_rand == 3) ? WPN_EXECUTIONERS_AXE :
(temp_rand == 2) ? WPN_KATANA :
(temp_rand == 1) ? WPN_QUICK_BLADE
/*(temp_rand == 0)*/: WPN_TRIPLE_SWORD);
}
else
{
// pick a weapon based on rarity
for (;;)
{
temp_value = (unsigned char) random2(NUM_WEAPONS);
if (weapon_rarity(temp_value) >= random2(10) + 1)
{
mitm[p].sub_type = temp_value;
break;
}
}
}
}
if (allow_uniques)
{
// Note there is nothing to stop randarts being reproduced,
// except vast improbability.
if (mitm[p].sub_type != WPN_CLUB && item_level > 2
&& random2(2000) <= 100 + (item_level * 3) && coinflip())
{
if (you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM
&& one_chance_in(50))
{
icky = find_okay_unrandart( OBJ_WEAPONS, force_type );
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
make_item_randart( mitm[p] );
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].plus += random2(7);
mitm[p].plus2 += random2(7);
if (one_chance_in(3))
mitm[p].plus += random2(7);
if (one_chance_in(3))
mitm[p].plus2 += random2(7);
if (one_chance_in(9))
mitm[p].plus -= random2(7);
if (one_chance_in(9))
mitm[p].plus2 -= random2(7);
quant = 1;
if (one_chance_in(4))
{
do_curse_item( mitm[p] );
mitm[p].plus = -random2(6);
mitm[p].plus2 = -random2(6);
}
else if ((mitm[p].plus < 0 || mitm[p].plus2 < 0)
&& !one_chance_in(3))
{
do_curse_item( mitm[p] );
}
break;
}
if (item_level > 6
&& random2(3000) <= 30 + (item_level * 3) && one_chance_in(12))
{
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Making fixed artifact.");
#endif
if (make_item_fixed_artefact( mitm[p], (item_level == 51) ))
{
quant = 1;
break;
}
}
}
ASSERT(!is_fixed_artefact(mitm[p]) && !is_random_artefact(mitm[p]));
if (item_level == MAKE_GOOD_ITEM
&& force_type != OBJ_RANDOM
&& (mitm[p].sub_type == WPN_CLUB || mitm[p].sub_type == WPN_SLING))
{
mitm[p].sub_type = WPN_LONG_SWORD;
}
quant = 1;
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].special = SPWPN_NORMAL;
if (item_race == MAKE_ITEM_RANDOM_RACE && coinflip())
{
switch (mitm[p].sub_type)
{
case WPN_CLUB:
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_MACE:
case WPN_FLAIL:
case WPN_SPIKED_FLAIL:
case WPN_GREAT_MACE:
case WPN_DIRE_FLAIL:
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_MORNINGSTAR:
case WPN_HAMMER:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_DAGGER:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_SHORT_SWORD:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_FALCHION:
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_LONG_SWORD:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_GREAT_SWORD:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_SCIMITAR:
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_WAR_AXE:
case WPN_HAND_AXE:
case WPN_BROAD_AXE:
case WPN_BATTLEAXE:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_SPEAR:
case WPN_TRIDENT:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_HALBERD:
case WPN_GLAIVE:
case WPN_EXECUTIONERS_AXE:
case WPN_LOCHABER_AXE:
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_QUICK_BLADE:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_KATANA:
case WPN_LAJATANG:
case WPN_KNIFE:
case WPN_SLING:
set_equip_race( mitm[p], ISFLAG_NO_RACE );
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
break;
case WPN_BOW:
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_LONGBOW:
set_equip_race( mitm[p], one_chance_in(3) ? ISFLAG_ELVEN
: ISFLAG_NO_RACE );
break;
case WPN_CROSSBOW:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_HAND_CROSSBOW:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_BLOWGUN:
if (one_chance_in(10))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
}
// fine, but out-of-order relative to mitm[].special ordering {dlb}
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
// if we allow acquirement-type items to be orcish, then
// there's a good chance that we'll just strip them of
// their ego type at the bottom of this function. -- bwr
if (item_level == MAKE_GOOD_ITEM
&& get_equip_race( mitm[p] ) == ISFLAG_ORCISH)
{
set_equip_race( mitm[p], ISFLAG_NO_RACE );
}
switch (get_equip_race( mitm[p] ))
{
case ISFLAG_ORCISH:
if (coinflip())
race_plus--;
if (coinflip())
race_plus2++;
break;
case ISFLAG_ELVEN:
race_plus += random2(3);
break;
case ISFLAG_DWARVEN:
if (coinflip())
race_plus++;
if (coinflip())
race_plus2++;
break;
}
mitm[p].plus += race_plus;
mitm[p].plus2 += race_plus2;
if ((random2(200) <= 50 + item_level
|| item_level == MAKE_GOOD_ITEM
|| is_demonic(mitm[p]))
// nobody would bother enchanting a club
&& mitm[p].sub_type != WPN_CLUB
&& mitm[p].sub_type != WPN_GIANT_CLUB
&& mitm[p].sub_type != WPN_GIANT_SPIKED_CLUB)
{
count = 0;
do
{
if (random2(300) <= 100 + item_level
|| item_level == MAKE_GOOD_ITEM
|| is_demonic( mitm[p] ))
{
// note: this doesn't guarantee special enchantment
switch (mitm[p].sub_type)
{
case WPN_EVENINGSTAR:
if (coinflip())
set_weapon_special(p, SPWPN_DRAINING);
// **** intentional fall through here ****
case WPN_MORNINGSTAR:
if (one_chance_in(4))
set_weapon_special(p, SPWPN_VENOM);
if (one_chance_in(4))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(20))
set_weapon_special(p, SPWPN_VAMPIRICISM);
// **** intentional fall through here ****
case WPN_MACE:
case WPN_GREAT_MACE:
if ((mitm[p].sub_type == WPN_MACE
|| mitm[p].sub_type == WPN_GREAT_MACE)
&& one_chance_in(4))
{
set_weapon_special(p, SPWPN_DISRUPTION);
}
// **** intentional fall through here ****
case WPN_FLAIL:
case WPN_SPIKED_FLAIL:
case WPN_DIRE_FLAIL:
case WPN_HAMMER:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(3) &&
(!is_weapon_special(p) || one_chance_in(5)))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_DRAINING);
break;
case WPN_DAGGER:
if (one_chance_in(10))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_VENOM);
// **** intentional fall through here ****
case WPN_SHORT_SWORD:
case WPN_SABRE:
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(8))
{
set_weapon_special(p,(coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(12))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_FALCHION:
case WPN_LONG_SWORD:
if (one_chance_in(12))
set_weapon_special(p, SPWPN_VENOM);
// **** intentional fall through here ****
case WPN_SCIMITAR:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(7))
set_weapon_special(p, SPWPN_SPEED);
// **** intentional fall through here ****
case WPN_GREAT_SWORD:
case WPN_DOUBLE_SWORD:
case WPN_TRIPLE_SWORD:
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5))
{
set_weapon_special(p,(coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(7))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(12))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(7))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(4)
&& (!is_weapon_special(p) || one_chance_in(3)))
{
set_weapon_special(p, SPWPN_VORPAL);
}
break;
case WPN_WAR_AXE:
case WPN_BROAD_AXE:
case WPN_BATTLEAXE:
case WPN_EXECUTIONERS_AXE:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(14))
set_weapon_special(p, SPWPN_DRAINING);
// **** intentional fall through here ****
case WPN_HAND_AXE:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(3)
&& (!is_weapon_special(p) || one_chance_in(5)))
{
set_weapon_special(p, SPWPN_VORPAL);
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(4))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(12))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_WHIP:
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(6))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
if (coinflip())
set_weapon_special(p, SPWPN_REACHING);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_ELECTROCUTION);
break;
case WPN_HALBERD:
case WPN_GLAIVE:
case WPN_SCYTHE:
case WPN_TRIDENT:
case WPN_LOCHABER_AXE:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_PROTECTION);
// **** intentional fall through here ****
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
// **** intentional fall through here ****
case WPN_SPEAR:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5) &&
(!is_weapon_special(p) || one_chance_in(6)))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(6))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(6))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_REACHING);
break;
case WPN_SLING:
case WPN_HAND_CROSSBOW:
if (coinflip())
break;
// **** possible intentional fall through here ****
case WPN_BOW:
case WPN_LONGBOW:
case WPN_CROSSBOW:
{
const int tmp = random2(1000);
set_weapon_special( p, (tmp < 375) ? SPWPN_FLAME :
(tmp < 750) ? SPWPN_FROST :
(tmp < 920) ? SPWPN_PROTECTION :
(tmp < 980) ? SPWPN_VORPAL
: SPWPN_SPEED );
break;
}
// quarterstaff - not powerful, as this would make
// the 'staves' skill just too good
case WPN_QUARTERSTAFF:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_PAIN);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_PROTECTION);
break;
case WPN_DEMON_TRIDENT:
case WPN_DEMON_WHIP:
case WPN_DEMON_BLADE:
set_equip_race( mitm[p], ISFLAG_NO_RACE );
if (one_chance_in(10))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(3)
&& (mitm[p].sub_type == WPN_DEMON_WHIP
|| mitm[p].sub_type == WPN_DEMON_TRIDENT))
{
set_weapon_special(p, SPWPN_REACHING);
}
if (one_chance_in(5))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(5))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(5))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_BLESSED_BLADE: // special gift of TSO
set_weapon_special( p, SPWPN_HOLY_WRATH );
break;
// unlisted weapons have no associated, standard ego-types {dlb}
default:
break;
}
} // end if specially enchanted
count++;
}
while (item_level == MAKE_GOOD_ITEM
&& mitm[p].special == SPWPN_NORMAL
&& count < 5);
// if acquired item still not ego... enchant it up a bit.
if (item_level == MAKE_GOOD_ITEM && mitm[p].special == SPWPN_NORMAL)
{
mitm[p].plus += 2 + random2(3);
mitm[p].plus2 += 2 + random2(3);
}
const int chance = (item_level == MAKE_GOOD_ITEM) ? 200
: item_level;
// odd-looking, but this is how the algorithm compacts {dlb}:
for (loopy = 0; loopy < 4; loopy++)
{
mitm[p].plus += random2(3);
if (random2(350) > 20 + chance)
break;
}
// odd-looking, but this is how the algorithm compacts {dlb}:
for (loopy = 0; loopy < 4; loopy++)
{
mitm[p].plus2 += random2(3);
if (random2(500) > 50 + chance)
break;
}
}
else
{
if (one_chance_in(12))
{
do_curse_item( mitm[p] );
mitm[p].plus -= random2(4);
mitm[p].plus2 -= random2(4);
// clear specials {dlb}
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
}
}
// value was "0" comment said "orc" so I went with comment {dlb}
if (get_equip_race(mitm[p]) == ISFLAG_ORCISH)
{
// no holy wrath or slay orc and 1/2 the time no-ego
const int brand = get_weapon_brand( mitm[p] );
if (brand == SPWPN_HOLY_WRATH
|| brand == SPWPN_ORC_SLAYING
|| (brand != SPWPN_NORMAL && coinflip()))
{
// this makes no sense {dlb}
// Probably a remnant of the old code which used
// to decrement this when the electric attack happened -- bwr
// if (brand == SPWPN_ELECTROCUTION)
// mitm[p].plus = 0;
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
}
}
if (weapon_is_visibly_special(mitm[p]))
{
set_equip_desc( mitm[p], (coinflip() ? ISFLAG_GLOWING
: ISFLAG_RUNED) );
}
break;
case OBJ_MISSILES:
quant = 0;
mitm[p].plus = 0;
mitm[p].special = SPMSL_NORMAL;
temp_rand = random2(20);
mitm[p].sub_type = (temp_rand < 6) ? MI_STONE : // 30 %
(temp_rand < 10) ? MI_DART : // 20 %
(temp_rand < 14) ? MI_ARROW : // 20 %
(temp_rand < 18) ? MI_BOLT // 20 %
: MI_NEEDLE; // 10 %
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
// no fancy rocks -- break out before we get to racial/special stuff
if (mitm[p].sub_type == MI_LARGE_ROCK)
{
quant = 2 + random2avg(5,2);
break;
}
else if (mitm[p].sub_type == MI_STONE)
{
quant = 1 + random2(9) + random2(12) + random2(15) + random2(12);
break;
}
// set racial type:
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case MAKE_ITEM_RANDOM_RACE:
if ((mitm[p].sub_type == MI_ARROW
|| mitm[p].sub_type == MI_DART)
&& one_chance_in(4))
{
// elven - not for bolts, though
set_equip_race( mitm[p], ISFLAG_ELVEN );
}
if ((mitm[p].sub_type == MI_ARROW
|| mitm[p].sub_type == MI_BOLT
|| mitm[p].sub_type == MI_DART)
&& one_chance_in(4))
{
set_equip_race( mitm[p], ISFLAG_ORCISH );
}
if ((mitm[p].sub_type == MI_DART
|| mitm[p].sub_type == MI_BOLT)
&& one_chance_in(6))
{
set_equip_race( mitm[p], ISFLAG_DWARVEN );
}
if (mitm[p].sub_type == MI_NEEDLE)
{
if (one_chance_in(10))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ORCISH );
}
break;
}
// note that needles can only be poisoned
//
// Actually, it'd be really nice if there where
// some paralysis or slowing poison needles, just
// so that blowguns have some added utility over
// the other launchers/throwing weapons. -- bwr
if (mitm[p].sub_type == MI_NEEDLE)
{
const int pois =
got_curare_roll(item_level) ? SPMSL_CURARE : SPMSL_POISONED;
set_item_ego_type( mitm[p], OBJ_MISSILES, pois );
}
else
{
// decide specials:
if (item_level == MAKE_GOOD_ITEM)
temp_rand = random2(150);
else
temp_rand = random2(2000 - 55 * item_level);
set_item_ego_type( mitm[p], OBJ_MISSILES,
(temp_rand < 60) ? SPMSL_FLAME :
(temp_rand < 120) ? SPMSL_ICE :
(temp_rand < 150) ? SPMSL_POISONED
: SPMSL_NORMAL );
}
// orcish ammo gets poisoned a lot more often -- in the original
// code it was poisoned every time!?
if (get_equip_race(mitm[p]) == ISFLAG_ORCISH && one_chance_in(3))
set_item_ego_type( mitm[p], OBJ_MISSILES, SPMSL_POISONED );
// reduced quantity if special
if (get_ammo_brand( mitm[p] ) == SPMSL_CURARE)
quant = 1 + random2(9) + random2(9);
else if (get_ammo_brand( mitm[p] ) != SPMSL_NORMAL )
quant = 1 + random2(9) + random2(12) + random2(12);
else
quant = 1 + random2(9) + random2(12) + random2(15) + random2(12);
if (10 + item_level >= random2(100))
mitm[p].plus += random2(5);
// elven arrows and dwarven bolts are quality items
if ((get_equip_race(mitm[p]) == ISFLAG_ELVEN
&& mitm[p].sub_type == MI_ARROW)
|| (get_equip_race(mitm[p]) == ISFLAG_DWARVEN
&& mitm[p].sub_type == MI_BOLT))
{
mitm[p].plus += random2(3);
}
break;
case OBJ_ARMOUR:
quant = 1;
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].special = SPARM_NORMAL;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2(3);
if (random2(35) <= item_level + 10)
{
mitm[p].sub_type = random2(5);
if (one_chance_in(4))
mitm[p].sub_type = ARM_ANIMAL_SKIN;
}
if (random2(60) <= item_level + 10)
mitm[p].sub_type = random2(8);
if (10 + item_level >= random2(400) && one_chance_in(20))
mitm[p].sub_type = ARM_DRAGON_HIDE + random2(7);
if (10 + item_level >= random2(500) && one_chance_in(20))
{
mitm[p].sub_type = ARM_STEAM_DRAGON_HIDE + random2(11);
if (mitm[p].sub_type == ARM_ANIMAL_SKIN && one_chance_in(20))
mitm[p].sub_type = ARM_CRYSTAL_PLATE_MAIL;
}
// secondary armours:
if (one_chance_in(5))
{
mitm[p].sub_type = ARM_SHIELD + random2(5);
if (mitm[p].sub_type == ARM_SHIELD) // 33.3%
{
if (coinflip())
mitm[p].sub_type = ARM_BUCKLER; // 50.0%
else if (one_chance_in(3))
mitm[p].sub_type = ARM_LARGE_SHIELD; // 16.7%
}
}
}
if (mitm[p].sub_type == ARM_HELMET)
{
set_helmet_type( mitm[p], THELM_HELMET );
set_helmet_desc( mitm[p], THELM_DESC_PLAIN );
if (one_chance_in(3))
set_helmet_type( mitm[p], random2( THELM_NUM_TYPES ) );
if (one_chance_in(3))
set_helmet_random_desc( mitm[p] );
}
if (allow_uniques == 1
&& item_level > 2
&& random2(2000) <= (100 + item_level * 3)
&& coinflip())
{
if ((you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM)
&& one_chance_in(50))
{
icky = find_okay_unrandart(OBJ_ARMOUR);
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
hide2armour(mitm[p]);
// mitm[p].special = SPARM_RANDART_II + random2(4);
make_item_randart( mitm[p] );
mitm[p].plus = 0;
if (mitm[p].sub_type == ARM_BOOTS
&& one_chance_in(10))
{
mitm[p].sub_type =
coinflip()? ARM_NAGA_BARDING
: ARM_CENTAUR_BARDING;
}
mitm[p].plus += random2(4);
if (one_chance_in(5))
mitm[p].plus += random2(4);
if (one_chance_in(6))
mitm[p].plus -= random2(8);
quant = 1;
if (one_chance_in(5))
{
do_curse_item( mitm[p] );
mitm[p].plus = -random2(6);
}
else if (mitm[p].plus < 0 && !one_chance_in(3))
{
do_curse_item( mitm[p] );
}
break;
}
mitm[p].plus = 0;
if (item_race == MAKE_ITEM_RANDOM_RACE && coinflip())
{
switch (mitm[p].sub_type)
{
case ARM_SHIELD: // shield - must do special things for this!
case ARM_BUCKLER:
case ARM_LARGE_SHIELD:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case ARM_CLOAK:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_GLOVES:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
case ARM_BOOTS:
if (mitm[p].sub_type == ARM_BOOTS)
{
if (one_chance_in(4))
{
mitm[p].sub_type = ARM_NAGA_BARDING;
break;
}
if (one_chance_in(4))
{
mitm[p].sub_type = ARM_CENTAUR_BARDING;
break;
}
}
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case ARM_HELMET:
if (get_helmet_type(mitm[p]) == THELM_CAP
|| get_helmet_type(mitm[p]) == THELM_WIZARD_HAT)
{
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
}
else
{
// helms and helmets
if (one_chance_in(8))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
}
break;
case ARM_ROBE:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_RING_MAIL:
case ARM_SCALE_MAIL:
case ARM_CHAIN_MAIL:
case ARM_SPLINT_MAIL:
case ARM_BANDED_MAIL:
case ARM_PLATE_MAIL:
if (mitm[p].sub_type <= ARM_CHAIN_MAIL && one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (mitm[p].sub_type >= ARM_RING_MAIL && one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_ORCISH );
default: // skins, hides, crystal plate are always plain
break;
}
}
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (coinflip())
mitm[p].plus++;
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
if (50 + item_level >= random2(250)
|| item_level == MAKE_GOOD_ITEM
|| (mitm[p].sub_type == ARM_HELMET
&& get_helmet_type(mitm[p]) == THELM_WIZARD_HAT))
{
mitm[p].plus += random2(3);
if (mitm[p].sub_type <= ARM_PLATE_MAIL && 20 + item_level >= random2(300))
mitm[p].plus += random2(3);
if (30 + item_level >= random2(350)
&& (item_level == MAKE_GOOD_ITEM
|| (!get_equip_race(mitm[p]) == ISFLAG_ORCISH
|| (mitm[p].sub_type <= ARM_PLATE_MAIL && coinflip()))))
{
switch (mitm[p].sub_type)
{
case ARM_SHIELD: // shield - must do special things for this!
case ARM_LARGE_SHIELD:
case ARM_BUCKLER:
{
const int tmp = random2(1000);
set_item_ego_type( mitm[p], OBJ_ARMOUR,
(tmp < 40) ? SPARM_RESISTANCE :
(tmp < 160) ? SPARM_FIRE_RESISTANCE :
(tmp < 280) ? SPARM_COLD_RESISTANCE :
(tmp < 400) ? SPARM_POISON_RESISTANCE :
(tmp < 520) ? SPARM_POSITIVE_ENERGY
: SPARM_PROTECTION );
break; // prot
//break;
}
case ARM_CLOAK:
if (get_equip_race(mitm[p]) == ISFLAG_DWARVEN)
break;
switch (random2(4))
{
case 0:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POISON_RESISTANCE );
break;
case 1:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_DARKNESS );
break;
case 2:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
break;
case 3:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_PRESERVATION );
break;
}
break;
case ARM_HELMET:
if (get_helmet_type(mitm[p]) == THELM_WIZARD_HAT && coinflip())
{
if (one_chance_in(3))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
}
else
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_INTELLIGENCE );
}
}
else
{
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_SEE_INVISIBLE
: SPARM_INTELLIGENCE );
}
break;
case ARM_GLOVES:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_DEXTERITY
: SPARM_STRENGTH );
break;
case ARM_BOOTS:
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
{
const int tmp = random2(600)
+ 200 * (mitm[p].sub_type != ARM_BOOTS);
set_item_ego_type( mitm[p], OBJ_ARMOUR,
(tmp < 200) ? SPARM_RUNNING :
(tmp < 400) ? SPARM_LEVITATION :
(tmp < 600) ? SPARM_STEALTH :
(tmp < 700) ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
break;
}
case ARM_ROBE:
switch (random2(4))
{
case 0:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
break;
case 1:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
break;
case 2:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_POSITIVE_ENERGY
: SPARM_RESISTANCE );
break;
case 3:
if (force_type != OBJ_RANDOM
|| is_random_artefact( mitm[p] )
|| get_armour_ego_type( mitm[p] ) != SPARM_NORMAL
|| random2(50) > 10 + item_level)
{
break;
}
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_ARCHMAGI );
break;
}
break;
default: // other body armours:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
if (one_chance_in(9))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POSITIVE_ENERGY );
}
if (one_chance_in(5))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
}
if (one_chance_in(5))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POISON_RESISTANCE );
}
if (mitm[p].sub_type == ARM_PLATE_MAIL
&& one_chance_in(15))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_PONDEROUSNESS );
mitm[p].plus += 3 + random2(4);
}
break;
}
}
}
else if (one_chance_in(12))
{
// mitm[p].plus = (coinflip() ? 99 : 98); // 98? 99?
do_curse_item( mitm[p] );
if (one_chance_in(5))
mitm[p].plus -= random2(3);
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_NORMAL );
}
// if not given a racial type, and special, give shiny/runed/etc desc.
if (get_equip_race(mitm[p]) == 0
&& get_equip_desc(mitm[p]) == 0
&& (((is_random_artefact(mitm[p])
|| get_armour_ego_type( mitm[p] ) != SPARM_NORMAL)
&& !one_chance_in(10))
|| (mitm[p].plus != 0 && one_chance_in(3))))
{
switch (random2(3))
{
case 0:
set_equip_desc( mitm[p], ISFLAG_GLOWING );
break;
case 1:
set_equip_desc( mitm[p], ISFLAG_RUNED );
break;
case 2:
default:
set_equip_desc( mitm[p], ISFLAG_EMBROIDERED_SHINY );
break;
}
}
// Make sure you don't get a hide from acquirement (since that
// would be an enchanted item which somehow didn't get converted
// into armour).
if (item_level == MAKE_GOOD_ITEM)
hide2armour(mitm[p]); // what of animal hides? {dlb}
// skin armours + Crystal PM don't get special enchantments
// or species, but can be randarts
if (mitm[p].sub_type >= ARM_DRAGON_HIDE
&& mitm[p].sub_type <= ARM_SWAMP_DRAGON_ARMOUR)
{
set_equip_race( mitm[p], ISFLAG_NO_RACE );
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_NORMAL );
}
break;
case OBJ_WANDS:
// determine sub_type:
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2( NUM_WANDS );
// Adjusted distribution here -- bwr
// Wands used to be uniform (5.26% each)
//
// Now:
// invis, hasting, healing (1.11% each)
// fireball, teleportaion (3.74% each)
// others (6.37% each)
if ((mitm[p].sub_type == WAND_INVISIBILITY
|| mitm[p].sub_type == WAND_HASTING
|| mitm[p].sub_type == WAND_HEALING)
|| ((mitm[p].sub_type == WAND_FIREBALL
|| mitm[p].sub_type == WAND_TELEPORTATION)
&& coinflip()))
{
mitm[p].sub_type = random2( NUM_WANDS );
}
}
// determine upper bound on charges:
range_charges = ((mitm[p].sub_type == WAND_HEALING
|| mitm[p].sub_type == WAND_HASTING
|| mitm[p].sub_type == WAND_INVISIBILITY) ? 8 :
(mitm[p].sub_type == WAND_FLAME
|| mitm[p].sub_type == WAND_FROST
|| mitm[p].sub_type == WAND_MAGIC_DARTS
|| mitm[p].sub_type == WAND_RANDOM_EFFECTS) ? 28
: 16);
// generate charges randomly:
mitm[p].plus = random2avg(range_charges, 3);
//
// set quantity to one:
quant = 1;
break;
case OBJ_FOOD: // this can be parsed out {dlb}
// determine sub_type:
if (force_type == OBJ_RANDOM)
{
temp_rand = random2(1000);
mitm[p].sub_type =
((temp_rand >= 750) ? FOOD_MEAT_RATION : // 25.00% chance
(temp_rand >= 450) ? FOOD_BREAD_RATION :// 30.00% chance
(temp_rand >= 350) ? FOOD_PEAR : // 10.00% chance
(temp_rand >= 250) ? FOOD_APPLE : // 10.00% chance
(temp_rand >= 150) ? FOOD_CHOKO : // 10.00% chance
(temp_rand >= 140) ? FOOD_CHEESE : // 1.00% chance
(temp_rand >= 130) ? FOOD_PIZZA : // 1.00% chance
(temp_rand >= 120) ? FOOD_SNOZZCUMBER : // 1.00% chance
(temp_rand >= 110) ? FOOD_APRICOT : // 1.00% chance
(temp_rand >= 100) ? FOOD_ORANGE : // 1.00% chance
(temp_rand >= 90) ? FOOD_BANANA : // 1.00% chance
(temp_rand >= 80) ? FOOD_STRAWBERRY : // 1.00% chance
(temp_rand >= 70) ? FOOD_RAMBUTAN : // 1.00% chance
(temp_rand >= 60) ? FOOD_LEMON : // 1.00% chance
(temp_rand >= 50) ? FOOD_GRAPE : // 1.00% chance
(temp_rand >= 40) ? FOOD_SULTANA : // 1.00% chance
(temp_rand >= 30) ? FOOD_LYCHEE : // 1.00% chance
(temp_rand >= 20) ? FOOD_BEEF_JERKY : // 1.00% chance
(temp_rand >= 10) ? FOOD_SAUSAGE : // 1.00% chance
(temp_rand >= 5) ? FOOD_HONEYCOMB // 0.50% chance
: FOOD_ROYAL_JELLY );// 0.50% chance
}
else
mitm[p].sub_type = force_type;
// Happens with ghoul food acquirement -- use place_chunks() outherwise
if (mitm[p].sub_type == FOOD_CHUNK)
{
for (count = 0; count < 1000; count++)
{
temp_rand = random2( NUM_MONSTERS ); // random monster
temp_rand = mons_species( temp_rand ); // corpse base type
if (mons_weight( temp_rand ) > 0) // drops a corpse
break;
}
// set chunk flavour (default to common dungeon rat steaks):
mitm[p].plus = (count == 1000) ? MONS_RAT : temp_rand;
// set duration
mitm[p].special = (10 + random2(11)) * 10;
}
// determine quantity:
if (allow_uniques > 1)
quant = allow_uniques;
else
{
quant = 1;
if (mitm[p].sub_type != FOOD_MEAT_RATION
&& mitm[p].sub_type != FOOD_BREAD_RATION)
{
if (one_chance_in(80))
quant += random2(3);
if (mitm[p].sub_type == FOOD_STRAWBERRY
|| mitm[p].sub_type == FOOD_GRAPE
|| mitm[p].sub_type == FOOD_SULTANA)
{
quant += 3 + random2avg(15,2);
}
}
}
break;
case OBJ_POTIONS:
quant = 1;
if (one_chance_in(18))
quant++;
if (one_chance_in(25))
quant++;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
temp_rand = random2(9); // general type of potion;
switch (temp_rand)
{
case 0:
case 1:
case 2:
case 8:
// healing potions
if (one_chance_in(3))
mitm[p].sub_type = POT_HEAL_WOUNDS; // 14.074%
else
mitm[p].sub_type = POT_HEALING; // 28.148%
if (one_chance_in(20))
mitm[p].sub_type = POT_CURE_MUTATION; // 2.222%
break;
case 3:
case 4:
// enhancements
if (coinflip())
mitm[p].sub_type = POT_SPEED; // 6.444%
else
mitm[p].sub_type = POT_MIGHT; // 6.444%
if (one_chance_in(10))
mitm[p].sub_type = POT_BERSERK_RAGE; // 1.432%
if (one_chance_in(5))
mitm[p].sub_type = POT_INVISIBILITY; // 3.580%
if (one_chance_in(6))
mitm[p].sub_type = POT_LEVITATION; // 3.580%
if (one_chance_in(30))
mitm[p].sub_type = POT_PORRIDGE; // 0.741%
break;
case 5:
// gain ability
mitm[p].sub_type = POT_GAIN_STRENGTH + random2(3); // 1.125%
// or 0.375% each
if (one_chance_in(10))
mitm[p].sub_type = POT_EXPERIENCE; // 0.125%
if (one_chance_in(10))
mitm[p].sub_type = POT_MAGIC; // 0.139%
if (!one_chance_in(8))
mitm[p].sub_type = POT_RESTORE_ABILITIES; // 9.722%
quant = 1;
break;
case 6:
case 7:
// bad things
switch (random2(6))
{
case 0:
case 4:
// is this not always the case? - no, level one is 0 {dlb}
if (item_level > 0)
{
mitm[p].sub_type = POT_POISON; // 6.475%
if (item_level > 10 && one_chance_in(4))
mitm[p].sub_type = POT_STRONG_POISON;
break;
}
/* **** intentional fall through **** */ // ignored for %
case 5:
if (item_level > 6)
{
mitm[p].sub_type = POT_MUTATION; // 3.237%
break;
}
/* **** intentional fall through **** */ // ignored for %
case 1:
mitm[p].sub_type = POT_SLOWING; // 3.237%
break;
case 2:
mitm[p].sub_type = POT_PARALYSIS; // 3.237%
break;
case 3:
mitm[p].sub_type = POT_CONFUSION; // 3.237%
break;
}
if (one_chance_in(8))
mitm[p].sub_type = POT_DEGENERATION; // 2.775%
if (one_chance_in(1000)) // 0.022%
mitm[p].sub_type = POT_DECAY;
break;
}
}
mitm[p].plus = 0;
break;
case OBJ_SCROLLS:
// determine sub_type:
if (force_type == OBJ_RANDOM)
{
// only used in certain cases {dlb}
int depth_mod = random2(1 + item_level);
temp_rand = random2(920);
mitm[p].sub_type =
((temp_rand > 751) ? SCR_IDENTIFY : // 18.26%
(temp_rand > 629) ? SCR_REMOVE_CURSE : // 13.26%
(temp_rand > 554) ? SCR_TELEPORTATION : // 8.15%
(temp_rand > 494) ? SCR_DETECT_CURSE : // 6.52%
(temp_rand > 464) ? SCR_FEAR : // 3.26%
(temp_rand > 434) ? SCR_NOISE : // 3.26%
(temp_rand > 404) ? SCR_MAGIC_MAPPING : // 3.26%
(temp_rand > 374) ? SCR_FORGETFULNESS : // 3.26%
(temp_rand > 344) ? SCR_RANDOM_USELESSNESS :// 3.26%
(temp_rand > 314) ? SCR_CURSE_WEAPON : // 3.26%
(temp_rand > 284) ? SCR_CURSE_ARMOUR : // 3.26%
(temp_rand > 254) ? SCR_RECHARGING : // 3.26%
(temp_rand > 224) ? SCR_BLINKING : // 3.26%
(temp_rand > 194) ? SCR_PAPER : // 3.26%
(temp_rand > 164) ? SCR_ENCHANT_ARMOUR : // 3.26%
(temp_rand > 134) ? SCR_ENCHANT_WEAPON_I : // 3.26%
(temp_rand > 104) ? SCR_ENCHANT_WEAPON_II : // 3.26%
// Crawl is kind to newbie adventurers {dlb}:
// yes -- these five are messy {dlb}:
// yes they are a hellish mess of tri-ops and long lines,
// this formating is somewhat better -- bwr
(temp_rand > 74) ?
((item_level < 4) ? SCR_TELEPORTATION
: SCR_IMMOLATION) : // 3.26%
(temp_rand > 59) ?
((depth_mod < 4) ? SCR_TELEPORTATION
: SCR_ACQUIREMENT) : // 1.63%
(temp_rand > 44) ?
((depth_mod < 4) ? SCR_DETECT_CURSE
: SCR_SUMMONING) : // 1.63%
(temp_rand > 29) ?
((depth_mod < 4) ? SCR_TELEPORTATION // 1.63%
: SCR_ENCHANT_WEAPON_III) :
(temp_rand > 14) ?
((depth_mod < 7) ? SCR_DETECT_CURSE
: SCR_TORMENT) // 1.63%
// default:
: ((depth_mod < 7) ? SCR_TELEPORTATION // 1.63%
: SCR_VORPALISE_WEAPON));
}
else
mitm[p].sub_type = force_type;
// determine quantity:
temp_rand = random2(48);
quant = ((temp_rand > 1
|| mitm[p].sub_type == SCR_VORPALISE_WEAPON
|| mitm[p].sub_type == SCR_ENCHANT_WEAPON_III
|| mitm[p].sub_type == SCR_ACQUIREMENT
|| mitm[p].sub_type == SCR_TORMENT) ? 1 : // 95.83%
(temp_rand == 0) ? 2 // 2.08%
: 3); // 2.08%
mitm[p].plus = 0;
break;
case OBJ_JEWELLERY:
// determine whether an unrandart will be generated {dlb}:
if (item_level > 2
&& you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM
&& random2(2000) <= 100 + (item_level * 3)
&& one_chance_in(20))
{
icky = find_okay_unrandart(OBJ_JEWELLERY);
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
// otherwise, determine jewellery type {dlb}:
if (force_type == OBJ_RANDOM)
{
mitm[p].sub_type = (!one_chance_in(4) ? random2(24) // rings
: AMU_RAGE + random2(10));
// Adjusted distribution here -- bwr
if ((mitm[p].sub_type == RING_INVISIBILITY
|| mitm[p].sub_type == RING_REGENERATION
|| mitm[p].sub_type == RING_TELEPORT_CONTROL
|| mitm[p].sub_type == RING_SLAYING)
&& !one_chance_in(3))
{
mitm[p].sub_type = random2(24);
}
}
else
mitm[p].sub_type = force_type;
// quantity is always one {dlb}:
quant = 1;
// everything begins as uncursed, unenchanted jewellery {dlb}:
mitm[p].plus = 0;
mitm[p].plus2 = 0;
// set pluses for rings that require them {dlb}:
switch (mitm[p].sub_type)
{
case RING_PROTECTION:
case RING_STRENGTH:
case RING_SLAYING:
case RING_EVASION:
case RING_DEXTERITY:
case RING_INTELLIGENCE:
if (one_chance_in(5)) // 20% of such rings are cursed {dlb}
{
do_curse_item( mitm[p] );
mitm[p].plus = (coinflip() ? -2 : -3);
if (one_chance_in(3))
mitm[p].plus -= random2(4);
}
else
{
mitm[p].plus += 1 + (one_chance_in(3) ? random2(3)
: random2avg(6, 2));
}
break;
default:
break;
}
// rings of slaying also require that pluses2 be set {dlb}:
if (mitm[p].sub_type == RING_SLAYING)
{
if (item_cursed( mitm[p] ) && !one_chance_in(20))
mitm[p].plus2 = -1 - random2avg(6, 2);
else
{
mitm[p].plus2 += 1 + (one_chance_in(3) ? random2(3)
: random2avg(6, 2));
if (random2(25) < 9) // 36% of such rings {dlb}
{
// make "ring of damage"
do_uncurse_item( mitm[p] );
mitm[p].plus = 0;
mitm[p].plus2 += 2;
}
}
}
// All jewellery base types should now work. -- bwr
if (allow_uniques == 1 && item_level > 2
&& random2(2000) <= 100 + (item_level * 3) && coinflip())
{
make_item_randart( mitm[p] );
break;
}
// rings of hunger and teleportation are always cursed {dlb}:
if (mitm[p].sub_type == RING_HUNGER
|| mitm[p].sub_type == RING_TELEPORTATION
|| one_chance_in(50))
{
do_curse_item( mitm[p] );
}
break;
case OBJ_BOOKS:
do
{
mitm[p].sub_type = random2(NUM_BOOKS);
if (mitm[p].sub_type != BOOK_DESTRUCTION &&
mitm[p].sub_type != BOOK_MANUAL &&
book_rarity(mitm[p].sub_type) != 100 &&
one_chance_in(10))
{
mitm[p].sub_type = coinflip() ? BOOK_WIZARDRY : BOOK_POWER;
}
if (!one_chance_in(100) &&
random2(item_level+1) + 1 < book_rarity(mitm[p].sub_type))
{
mitm[p].sub_type = BOOK_DESTRUCTION; // continue trying
}
}
while (mitm[p].sub_type == BOOK_DESTRUCTION ||
mitm[p].sub_type == BOOK_MANUAL ||
book_rarity(mitm[p].sub_type) == 100);
mitm[p].special = random2(5);
if (one_chance_in(10))
mitm[p].special += random2(8) * 10;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
quant = 1;
// tome of destruction : rare!
if (force_type == BOOK_DESTRUCTION
|| (random2(7000) <= item_level + 20 && item_level > 10
&& force_type == OBJ_RANDOM))
{
mitm[p].sub_type = BOOK_DESTRUCTION;
}
// skill manuals - also rare
// fixed to generate manuals for *all* extant skills - 14mar2000 {dlb}
if (force_type == BOOK_MANUAL
|| (random2(4000) <= item_level + 20 && item_level > 6
&& force_type == OBJ_RANDOM))
{
mitm[p].sub_type = BOOK_MANUAL;
if (one_chance_in(4))
{
mitm[p].plus = SK_SPELLCASTING
+ random2(NUM_SKILLS - SK_SPELLCASTING);
}
else
{
mitm[p].plus = random2(SK_UNARMED_COMBAT);
if (mitm[p].plus == SK_UNUSED_1)
mitm[p].plus = SK_UNARMED_COMBAT;
}
}
break;
case OBJ_STAVES: // this can be parsed, too {dlb}
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2(13);
// top three non-spell staves are in separate block -- bwr
if (mitm[p].sub_type >= 10)
mitm[p].sub_type = STAFF_AIR + mitm[p].sub_type - 10;
// spell staves
if (one_chance_in(10))
mitm[p].sub_type = STAFF_SMITING + random2(10);
if ((mitm[p].sub_type == STAFF_ENERGY
|| mitm[p].sub_type == STAFF_CHANNELING) && one_chance_in(4))
{
mitm[p].sub_type = coinflip() ? STAFF_WIZARDRY : STAFF_POWER;
}
}
mitm[p].special = random2(NUM_STAVE_ADJ);
if (item_is_rod( mitm[p] ))
init_rod_mp( mitm[p] );
quant = 1;
break;
case OBJ_ORBS: // always forced in current setup {dlb}
quant = 1;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
// I think we only have one type of orb now, so ... {dlb}
set_unique_item_status( OBJ_ORBS, mitm[p].sub_type, UNIQ_EXISTS );
break;
// I think these must always be forced, too ... {dlb}
case OBJ_MISCELLANY: //mv: rewrote with use of NUM_MISCELLANY (9 Aug 01)
if (force_type == OBJ_RANDOM)
{
do
mitm[p].sub_type = random2(NUM_MISCELLANY);
while //mv: never generated
((mitm[p].sub_type == MISC_RUNE_OF_ZOT)
|| (mitm[p].sub_type == MISC_HORN_OF_GERYON)
|| (mitm[p].sub_type == MISC_PORTABLE_ALTAR_OF_NEMELEX)
// mv: others are possible but less often
// btw. chances of generating decks are almost the same as
// before, other chances are now distributed more steadily
|| (mitm[p].sub_type == MISC_DECK_OF_POWER && !one_chance_in(12))
|| (mitm[p].sub_type == MISC_DECK_OF_SUMMONINGS && !one_chance_in(3))
|| (mitm[p].sub_type == MISC_DECK_OF_TRICKS && !one_chance_in(3))
|| (mitm[p].sub_type == MISC_DECK_OF_WONDERS && !one_chance_in(3))
);
// filling those silly empty boxes -- bwr
if (mitm[p].sub_type == MISC_EMPTY_EBONY_CASKET
&& !one_chance_in(20))
{
mitm[p].sub_type = MISC_BOX_OF_BEASTS;
}
}
else
{
mitm[p].sub_type = force_type;
}
if (mitm[p].sub_type == MISC_DECK_OF_WONDERS
|| mitm[p].sub_type == MISC_DECK_OF_SUMMONINGS
|| mitm[p].sub_type == MISC_DECK_OF_POWER)
{
mitm[p].plus = 4 + random2(10);
}
if (mitm[p].sub_type == MISC_DECK_OF_TRICKS)
mitm[p].plus = 6 + random2avg(15, 2);
if (mitm[p].sub_type == MISC_RUNE_OF_ZOT)
mitm[p].plus = item_race;
quant = 1;
break; // mv: end of rewrote;
// that is, everything turns to gold if not enumerated above, so ... {dlb}
default:
mitm[p].base_type = OBJ_GOLD;
// Note that acquirement level gold gives much less than the
// price of a scroll of acquirement (520 gold). -- bwr
if (item_level == MAKE_GOOD_ITEM)
quant = 50 + random2avg(100, 2) + random2avg(100, 2);
else
quant = 1 + random2avg(19, 2) + random2(item_level);
break;
}
mitm[p].quantity = quant;
// should really only be used for monster inventories.
if (dont_place)
{
mitm[p].x = 0;
mitm[p].y = 0;
mitm[p].link = NON_ITEM;
}
else
{
int tries = 500;
do
{
if (tries-- <= 0)
{
destroy_item(p);
return (NON_ITEM);
}
x_pos = random2(GXM);
y_pos = random2(GYM);
}
while (grd[x_pos][y_pos] != DNGN_FLOOR
|| !unforbidden(coord_def(x_pos, y_pos), forbidden));
move_item_to_grid( &p, x_pos, y_pos );
}
item_colour( mitm[p] );
// Okay, this check should be redundant since the purpose of
// this function is to create valid items. Still, we're adding
// this safety for fear that a report of Trog giving a non-existant
// item might symbolize something more serious. -- bwr
return (is_valid_item( mitm[p] ) ? p : NON_ITEM);
} // end items()
void init_rod_mp(item_def &item)
{
if (!item_is_rod(item))
return;
if (item.sub_type == STAFF_STRIKING)
item.plus2 = random_range(6, 9) * ROD_CHARGE_MULT;
else
item.plus2 = random_range(9, 14) * ROD_CHARGE_MULT;
item.plus = item.plus2;
}
static bool weapon_is_visibly_special(const item_def &item)
{
const int brand = get_weapon_brand(item);
const bool visibly_branded =
brand != SPWPN_NORMAL && brand != SPWPN_DISTORTION;
return (((is_random_artefact(item) || visibly_branded)
&& !one_chance_in(10))
|| ((item.plus != 0 || item.plus2 != 0)
&& one_chance_in(3)
&& brand != SPWPN_DISTORTION))
&& item.sub_type != WPN_CLUB
&& item.sub_type != WPN_GIANT_CLUB
&& item.sub_type != WPN_GIANT_SPIKED_CLUB
&& get_equip_desc(item) == 0
&& get_equip_race(item) == 0;
}
static void give_monster_item(monsters *mon, int thing, bool force_item = false)
{
item_def &mthing = mitm[thing];
mthing.x = 0;
mthing.y = 0;
mthing.link = NON_ITEM;
unset_ident_flags(mthing, ISFLAG_IDENT_MASK);
switch (mthing.base_type)
{
case OBJ_WEAPONS:
{
const int slot = mon->inv[MSLOT_WEAPON] == NON_ITEM? 0 : 1;
mon->inv[slot] = thing;
break;
}
case OBJ_MISSILES:
mon->inv[MSLOT_MISSILE] = thing;
break;
case OBJ_SCROLLS:
mon->inv[MSLOT_SCROLL] = thing;
break;
case OBJ_GOLD:
mon->inv[MSLOT_GOLD] = thing;
break;
case OBJ_POTIONS:
mon->inv[MSLOT_POTION] = thing;
break;
case OBJ_MISCELLANY:
mon->inv[MSLOT_MISCELLANY] = thing;
break;
case OBJ_WANDS:
mon->inv[MSLOT_WAND] = thing;
break;
case OBJ_ARMOUR:
{
mon->inv[MSLOT_ARMOUR] = thing;
mon->ac += property( mthing, PARM_AC );
const int armour_plus = mthing.plus;
ASSERT(abs(armour_plus) < 20);
if (abs(armour_plus) < 20)
mon->ac += armour_plus;
mon->ev += property( mthing, PARM_EVASION ) / 2;
if (mon->ev < 1)
mon->ev = 1; // This *shouldn't* happen.
break;
}
default:
break;
}
const mon_holy_type mholy = mons_holiness(mon);
if (get_weapon_brand( mthing ) == SPWPN_PROTECTION )
mon->ac += 5;
else if (get_weapon_brand(mthing) == SPWPN_DISRUPTION
&& mholy == MH_UNDEAD)
{
set_item_ego_type( mthing, OBJ_WEAPONS, SPWPN_NORMAL );
}
else if (get_weapon_brand(mthing) == SPWPN_HOLY_WRATH
&& (mholy == MH_UNDEAD || mholy == MH_DEMONIC))
{
set_item_ego_type( mthing, OBJ_WEAPONS, SPWPN_NORMAL );
}
if (!force_item || mthing.colour == BLACK)
item_colour( mthing );
}
static void give_scroll(monsters *mon, int level)
{
//mv - give scroll
if (mons_is_unique( mon->type ) && one_chance_in(3))
{
const int thing_created =
items(0, OBJ_SCROLLS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static void give_wand(monsters *mon, int level)
{
//mv - give wand
if (mons_is_unique( mon->type ) && one_chance_in(5))
{
const int thing_created =
items(0, OBJ_WANDS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
// don't give top-tier wands before 5 HD
if ( mon->hit_dice < 5 )
{
// technically these wands will be undercharged, but it
// doesn't really matter
if ( mitm[thing_created].sub_type == WAND_FIRE )
mitm[thing_created].sub_type = WAND_FLAME;
if ( mitm[thing_created].sub_type == WAND_COLD )
mitm[thing_created].sub_type = WAND_FROST;
if ( mitm[thing_created].sub_type == WAND_LIGHTNING )
mitm[thing_created].sub_type = (coinflip() ?
WAND_FLAME : WAND_FROST);
}
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static void give_potion(monsters *mon, int level)
{
//mv - give potion
if (mons_is_unique( mon->type ) && one_chance_in(3))
{
const int thing_created =
items(0, OBJ_POTIONS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static int give_weapon(monsters *mon, int level)
{
const int bp = get_item_slot();
bool force_item = false;
if (bp == NON_ITEM)
return (MAKE_ITEM_RANDOM_RACE);
item_def &item = mitm[bp];
int item_race = MAKE_ITEM_RANDOM_RACE;
// this flags things to "goto give_armour" below ... {dlb}
item.base_type = 101;
if (mon->type == MONS_DANCING_WEAPON
&& player_in_branch( BRANCH_HALL_OF_BLADES ))
{
level = MAKE_GOOD_ITEM;
}
// moved setting of quantity here to keep it in mind {dlb}
int iquan = 1;
// I wonder if this is even used, given calls to item() {dlb}
switch (mon->type)
{
case MONS_KOBOLD:
// a few of the smarter kobolds have blowguns.
if (one_chance_in(10) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BLOWGUN;
break;
}
// intentional fallthrough
case MONS_BIG_KOBOLD:
if (random2(5) < 3) // give hand weapon
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(5);
item.sub_type = ((temp_rand > 2) ? WPN_DAGGER : // 40%
(temp_rand > 0) ? WPN_SHORT_SWORD // 40%
: WPN_CLUB); // 20%
}
else if (random2(5) < 2) // give darts
{
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_MISSILES;
item.sub_type = MI_DART;
iquan = 1 + random2(5);
}
else
return (item_race);
break;
case MONS_HOBGOBLIN:
if (one_chance_in(3))
item_race = MAKE_ITEM_ORCISH;
if (random2(5) < 3) // give hand weapon
{
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_CLUB;
}
else
return (item_race);
break;
case MONS_GOBLIN:
if (one_chance_in(3))
item_race = MAKE_ITEM_ORCISH;
if (one_chance_in(12) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.base_type = WPN_BLOWGUN;
break;
}
// deliberate fall through {dlb}
case MONS_JESSICA:
case MONS_IJYB:
if (random2(5) < 3) // < 1 // give hand weapon
{
item.base_type = OBJ_WEAPONS;
item.sub_type = (coinflip() ? WPN_DAGGER : WPN_CLUB);
}
else
return (item_race);
break;
case MONS_WIGHT:
case MONS_NORRIS:
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(6) ? WPN_WAR_AXE + random2(4)
: WPN_MACE + random2(12));
if (coinflip())
{
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.plus += 1 + random2(3);
item.plus2 += 1 + random2(3);
if (one_chance_in(5))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FREEZING );
}
if (one_chance_in(3))
do_curse_item( item );
break;
case MONS_GNOLL:
case MONS_OGRE_MAGE:
case MONS_NAGA_WARRIOR:
case MONS_GREATER_NAGA:
case MONS_EDMUND:
case MONS_DUANE:
item_race = MAKE_ITEM_NO_RACE;
if (!one_chance_in(5))
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(5);
item.sub_type = ((temp_rand > 2) ? WPN_SPEAR : // 40%
(temp_rand == 2) ? WPN_FLAIL : // 20%
(temp_rand == 1) ? WPN_HALBERD // 20%
: WPN_CLUB); // 20%
}
break;
case MONS_ORC:
if (one_chance_in(15) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.base_type = WPN_BLOWGUN;
break;
}
// deliberate fall through {gdl}
case MONS_ORC_PRIEST:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {gdl}
case MONS_TERENCE:
case MONS_DRACONIAN:
case MONS_DRACONIAN_ZEALOT:
if (!one_chance_in(5))
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(240);
item.sub_type = ((temp_rand > 209) ? WPN_DAGGER : //12.50%
(temp_rand > 179) ? WPN_CLUB : //12.50%
(temp_rand > 152) ? WPN_FLAIL : //11.25%
(temp_rand > 128) ? WPN_HAND_AXE : //10.00%
(temp_rand > 108) ? WPN_HAMMER : // 8.33%
(temp_rand > 88) ? WPN_HALBERD : // 8.33%
(temp_rand > 68) ? WPN_SHORT_SWORD : // 8.33%
(temp_rand > 48) ? WPN_MACE : // 8.33%
(temp_rand > 38) ? WPN_WHIP : // 4.17%
(temp_rand > 28) ? WPN_TRIDENT : // 4.17%
(temp_rand > 18) ? WPN_FALCHION : // 4.17%
(temp_rand > 8) ? WPN_MORNINGSTAR : // 4.17%
(temp_rand > 2) ? WPN_WAR_AXE // 2.50%
: WPN_SPIKED_FLAIL);// 1.25%
}
else
return (item_race);
break;
case MONS_DEEP_ELF_FIGHTER:
case MONS_DEEP_ELF_HIGH_PRIEST:
case MONS_DEEP_ELF_KNIGHT:
case MONS_DEEP_ELF_PRIEST:
case MONS_DEEP_ELF_SOLDIER:
{
item_race = MAKE_ITEM_ELVEN;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(100);
item.sub_type = ((temp_rand > 79) ? WPN_LONG_SWORD : // 20%
(temp_rand > 59) ? WPN_SHORT_SWORD : // 20%
(temp_rand > 45) ? WPN_SCIMITAR : // 14%
(temp_rand > 31) ? WPN_MACE : // 14%
(temp_rand > 18) ? WPN_BOW : // 13%
(temp_rand > 5) ? WPN_HAND_CROSSBOW // 13%
: WPN_LONGBOW); // 6%
break;
}
case MONS_DEEP_ELF_ANNIHILATOR:
case MONS_DEEP_ELF_CONJURER:
case MONS_DEEP_ELF_DEATH_MAGE:
case MONS_DEEP_ELF_DEMONOLOGIST:
case MONS_DEEP_ELF_MAGE:
case MONS_DEEP_ELF_SORCERER:
case MONS_DEEP_ELF_SUMMONER:
case MONS_DRACONIAN_SHIFTER:
case MONS_DRACONIAN_SCORCHER:
case MONS_DRACONIAN_ANNIHILATOR:
case MONS_DRACONIAN_CALLER:
{
if (mons_genus(mon->type) != MONS_DRACONIAN)
item_race = MAKE_ITEM_ELVEN;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(6);
item.sub_type = ((temp_rand > 3) ? WPN_LONG_SWORD : // 2 in 6
(temp_rand > 2) ? WPN_SHORT_SWORD :// 1 in 6
(temp_rand > 1) ? WPN_SABRE : // 1 in 6
(temp_rand > 0) ? WPN_DAGGER // 1 in 6
: WPN_WHIP); // 1 in 6
break;
}
case MONS_ORC_WARRIOR:
case MONS_ORC_HIGH_PRIEST:
case MONS_BLORK_THE_ORC:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through {dlb}
case MONS_DANCING_WEAPON: // give_level may have been adjusted above
case MONS_FRANCES:
case MONS_FRANCIS:
case MONS_HAROLD:
case MONS_JOSEPH:
case MONS_LOUISE:
case MONS_MICHAEL:
case MONS_NAGA:
case MONS_NAGA_MAGE:
case MONS_RUPERT:
case MONS_SKELETAL_WARRIOR:
case MONS_WAYNE:
case MONS_PALE_DRACONIAN:
case MONS_RED_DRACONIAN:
case MONS_WHITE_DRACONIAN:
case MONS_GREEN_DRACONIAN:
case MONS_MOTTLED_DRACONIAN:
case MONS_BLACK_DRACONIAN:
case MONS_YELLOW_DRACONIAN:
case MONS_PURPLE_DRACONIAN:
case MONS_TIAMAT:
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(120);
item.sub_type = ((temp_rand > 109) ? WPN_LONG_SWORD : // 8.33%
(temp_rand > 99) ? WPN_SHORT_SWORD : // 8.33%
(temp_rand > 89) ? WPN_SCIMITAR : // 8.33%
(temp_rand > 79) ? WPN_BATTLEAXE : // 8.33%
(temp_rand > 69) ? WPN_HAND_AXE : // 8.33%
(temp_rand > 59) ? WPN_HALBERD : // 8.33%
(temp_rand > 49) ? WPN_GLAIVE : // 8.33%
(temp_rand > 39) ? WPN_MORNINGSTAR : // 8.33%
(temp_rand > 29) ? WPN_GREAT_MACE : // 8.33%
(temp_rand > 19) ? WPN_TRIDENT : // 8.33%
(temp_rand > 10) ? WPN_WAR_AXE : // 7.50%
(temp_rand > 1) ? WPN_FLAIL : // 7.50%
(temp_rand > 0) ? WPN_BROAD_AXE // 0.83%
: WPN_SPIKED_FLAIL); // 0.83%
break;
}
case MONS_ORC_WARLORD:
// being at the top has its privileges
if (one_chance_in(3))
level = MAKE_GOOD_ITEM;
// deliberate fall-through
case MONS_ORC_KNIGHT:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through
case MONS_NORBERT:
case MONS_JOZEF:
case MONS_URUG:
case MONS_VAULT_GUARD:
case MONS_VAMPIRE_KNIGHT:
case MONS_DRACONIAN_KNIGHT:
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(25);
item.sub_type = ((temp_rand > 20) ? WPN_GREAT_SWORD : // 16%
(temp_rand > 16) ? WPN_LONG_SWORD : // 16%
(temp_rand > 12) ? WPN_BATTLEAXE : // 16%
(temp_rand > 8) ? WPN_WAR_AXE : // 16%
(temp_rand > 5) ? WPN_GREAT_MACE : // 12%
(temp_rand > 3) ? WPN_DIRE_FLAIL : // 8%
(temp_rand > 2) ? WPN_LOCHABER_AXE : // 4%
(temp_rand > 1) ? WPN_GLAIVE : // 4%
(temp_rand > 0) ? WPN_BROAD_AXE // 4%
: WPN_HALBERD); // 4%
if (one_chance_in(4))
item.plus += 1 + random2(3);
break;
}
case MONS_CYCLOPS:
case MONS_STONE_GIANT:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_MISSILES;
item.sub_type = MI_LARGE_ROCK;
break;
case MONS_TWO_HEADED_OGRE:
case MONS_ETTIN:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_GIANT_SPIKED_CLUB
: WPN_GIANT_CLUB);
if (one_chance_in(10) || mon->type == MONS_ETTIN)
{
item.sub_type = ((one_chance_in(10)) ? WPN_DIRE_FLAIL
: WPN_GREAT_MACE);
}
break;
case MONS_REAPER:
level = MAKE_GOOD_ITEM;
// intentional fall-through...
case MONS_SIGMUND:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_SCYTHE;
break;
case MONS_BALRUG:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_DEMON_WHIP;
break;
case MONS_RED_DEVIL:
if (!one_chance_in(3))
{
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_DEMON_TRIDENT
: WPN_TRIDENT);
}
break;
case MONS_OGRE:
case MONS_HILL_GIANT:
case MONS_EROLCHA:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_GIANT_SPIKED_CLUB
: WPN_GIANT_CLUB);
if (one_chance_in(10))
{
item.sub_type = (one_chance_in(10) ? WPN_DIRE_FLAIL
: WPN_GREAT_MACE);
}
break;
case MONS_CENTAUR:
case MONS_CENTAUR_WARRIOR:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BOW;
if (mon->type == MONS_CENTAUR_WARRIOR
&& one_chance_in(3))
item.sub_type = WPN_LONGBOW;
break;
case MONS_YAKTAUR:
case MONS_YAKTAUR_CAPTAIN:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_CROSSBOW;
break;
case MONS_EFREET:
case MONS_ERICA:
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_SCIMITAR;
item.plus = random2(5);
item.plus2 = random2(5);
item.colour = RED; // forced by force_item above {dlb}
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
break;
case MONS_ANGEL:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.colour = WHITE; // forced by force_item above {dlb}
set_equip_desc( item, ISFLAG_GLOWING );
if (one_chance_in(3))
{
item.sub_type = (one_chance_in(3) ? WPN_GREAT_MACE : WPN_MACE);
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_HOLY_WRATH );
}
else
{
item.sub_type = WPN_LONG_SWORD;
}
item.plus = 1 + random2(3);
item.plus2 = 1 + random2(3);
break;
case MONS_DAEVA:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.colour = WHITE; // forced by force_item above {dlb}
item.sub_type = (one_chance_in(4) ? WPN_BLESSED_BLADE
: WPN_LONG_SWORD);
set_equip_desc( item, ISFLAG_GLOWING );
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_HOLY_WRATH );
item.plus = 1 + random2(3);
item.plus2 = 1 + random2(3);
break;
case MONS_HELL_KNIGHT:
case MONS_MAUD:
case MONS_FREDERICK:
case MONS_MARGERY:
{
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_LONG_SWORD + random2(3);
if (one_chance_in(7))
item.sub_type = WPN_HALBERD;
if (one_chance_in(7))
item.sub_type = WPN_GLAIVE;
if (one_chance_in(7))
item.sub_type = WPN_GREAT_MACE;
if (one_chance_in(7))
item.sub_type = WPN_BATTLEAXE;
if (one_chance_in(7))
item.sub_type = WPN_WAR_AXE;
if (one_chance_in(7))
item.sub_type = WPN_BROAD_AXE;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_TRIDENT;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_BLADE;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_WHIP;
int temp_rand = random2(3);
set_equip_desc( item, (temp_rand == 1) ? ISFLAG_GLOWING :
(temp_rand == 2) ? ISFLAG_RUNED
: ISFLAG_NO_DESC );
if (one_chance_in(3))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
else if (one_chance_in(3))
{
temp_rand = random2(5);
set_item_ego_type( item, OBJ_WEAPONS,
((temp_rand == 0) ? SPWPN_DRAINING :
(temp_rand == 1) ? SPWPN_VORPAL :
(temp_rand == 2) ? SPWPN_PAIN :
(temp_rand == 3) ? SPWPN_DISTORTION
: SPWPN_SPEED) );
}
item.plus += random2(6);
item.plus2 += random2(6);
item.colour = RED; // forced by force_item above {dlb}
if (one_chance_in(3))
item.colour = DARKGREY;
if (one_chance_in(5))
item.colour = CYAN;
break;
}
case MONS_FIRE_GIANT:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_GREAT_SWORD;
item.plus = 0;
item.plus2 = 0;
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
item.colour = RED; // forced by force_item above {dlb}
if (one_chance_in(3))
item.colour = DARKGREY;
if (one_chance_in(5))
item.colour = CYAN;
break;
case MONS_FROST_GIANT:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BATTLEAXE;
item.plus = 0;
item.plus2 = 0;
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FREEZING );
// forced by force_item above {dlb}
item.colour = (one_chance_in(3) ? WHITE : CYAN);
break;
case MONS_KOBOLD_DEMONOLOGIST:
case MONS_ORC_WIZARD:
case MONS_ORC_SORCERER:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through, I guess {dlb}
case MONS_NECROMANCER:
case MONS_WIZARD:
case MONS_PSYCHE:
case MONS_DONALD:
case MONS_JOSEPHINE:
case MONS_AGNES:
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_DAGGER;
break;
case MONS_CEREBOV:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_SWORD_OF_CEREBOV );
break;
case MONS_DISPATER:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_STAFF_OF_DISPATER );
break;
case MONS_ASMODEUS:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_SCEPTRE_OF_ASMODEUS );
break;
case MONS_GERYON:
//mv: probably should be moved out of this switch,
//but it's not worth of it, unless we have more
//monsters with misc. items
item.base_type = OBJ_MISCELLANY;
item.sub_type = MISC_HORN_OF_GERYON;
break;
case MONS_SALAMANDER: //mv: new 8 Aug 2001
//Yes, they've got really nice items, but
//it's almost impossible to get them
{
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(6);
item.sub_type = ((temp_rand == 5) ? WPN_GREAT_SWORD :
(temp_rand == 4) ? WPN_TRIDENT :
(temp_rand == 3) ? WPN_SPEAR :
(temp_rand == 2) ? WPN_GLAIVE :
(temp_rand == 1) ? WPN_BOW
: WPN_HALBERD);
if (is_range_weapon(item))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAME );
else
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
item.plus = random2(5);
item.plus2 = random2(5);
item.colour = RED; // forced by force_item above {dlb}
break;
}
} // end "switch(mon->type)"
// only happens if something in above switch doesn't set it {dlb}
if (item.base_type == 101)
{
item.base_type = OBJ_UNASSIGNED;
return (item_race);
}
item.x = 0;
item.y = 0;
item.link = NON_ITEM;
if (force_item)
item.quantity = iquan;
else if (mons_is_unique( mon->type ))
{
if (random2(100) <= 9 + mon->hit_dice)
level = MAKE_GOOD_ITEM;
else if (level != MAKE_GOOD_ITEM)
level += 5;
}
const int xitc = item.base_type;
const int xitt = item.sub_type;
// Note this mess, all the work above doesn't mean much unless
// force_item is set... otherwise we're just going to take the
// base and subtypes and create a new item. -- bwr
const int thing_created =
((force_item) ? bp : items( 0, xitc, xitt, true,
level, item_race) );
if (thing_created == NON_ITEM)
return (item_race);
give_monster_item(mon, thing_created, force_item);
return (item_race);
}
static void give_ammo(monsters *mon, int level, int item_race)
{
// mv: gives ammunition
// note that item_race is not reset for this section
if (mon->inv[MSLOT_WEAPON] != NON_ITEM
&& is_range_weapon( mitm[mon->inv[MSLOT_WEAPON]] ))
{
const int xitc = OBJ_MISSILES;
const int xitt = fires_ammo_type(mitm[mon->inv[MSLOT_WEAPON]]);
const int thing_created =
items( 0, xitc, xitt, true, level, item_race );
if (thing_created == NON_ITEM)
return;
// monsters will always have poisoned needles -- otherwise
// they are just going to behave badly --GDL
if (xitt == MI_NEEDLE)
set_item_ego_type(mitm[thing_created], OBJ_MISSILES,
got_curare_roll(level)?
SPMSL_CURARE
: SPMSL_POISONED);
mitm[thing_created].x = 0;
mitm[thing_created].y = 0;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
} // end if needs ammo
}
void give_armour(monsters *mon, int level)
{
const int bp = get_item_slot();
if (bp == NON_ITEM)
return;
int item_race = MAKE_ITEM_RANDOM_RACE;
int force_colour = 0; //mv: important !!! Items with force_colour = 0
//are colored defaultly after following
//switch. Others will get force_colour.
switch (mon->type)
{
case MONS_DEEP_ELF_ANNIHILATOR:
case MONS_DEEP_ELF_CONJURER:
case MONS_DEEP_ELF_DEATH_MAGE:
case MONS_DEEP_ELF_DEMONOLOGIST:
case MONS_DEEP_ELF_FIGHTER:
case MONS_DEEP_ELF_HIGH_PRIEST:
case MONS_DEEP_ELF_KNIGHT:
case MONS_DEEP_ELF_MAGE:
case MONS_DEEP_ELF_PRIEST:
case MONS_DEEP_ELF_SOLDIER:
case MONS_DEEP_ELF_SORCERER:
case MONS_DEEP_ELF_SUMMONER:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ELVEN;
// deliberate fall through {dlb}
case MONS_IJYB:
case MONS_ORC:
case MONS_ORC_HIGH_PRIEST:
case MONS_ORC_PRIEST:
case MONS_ORC_SORCERER:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {dlb}
case MONS_ERICA:
case MONS_HAROLD:
case MONS_JOSEPH:
case MONS_JOSEPHINE:
case MONS_JOZEF:
case MONS_NORBERT:
case MONS_PSYCHE:
case MONS_TERENCE:
if (random2(5) < 2)
{
mitm[bp].base_type = OBJ_ARMOUR;
switch (random2(8))
{
case 0:
case 1:
case 2:
case 3:
mitm[bp].sub_type = ARM_LEATHER_ARMOUR;
break;
case 4:
case 5:
mitm[bp].sub_type = ARM_RING_MAIL;
break;
case 6:
mitm[bp].sub_type = ARM_SCALE_MAIL;
break;
case 7:
mitm[bp].sub_type = ARM_CHAIN_MAIL;
break;
}
}
else
return;
break;
case MONS_DUANE:
case MONS_EDMUND:
case MONS_RUPERT:
case MONS_URUG:
case MONS_WAYNE:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_LEATHER_ARMOUR + random2(4);
break;
case MONS_ORC_WARLORD:
// being at the top has its privileges
if (one_chance_in(3))
level = MAKE_GOOD_ITEM;
// deliberate fall through
case MONS_ORC_KNIGHT:
case MONS_ORC_WARRIOR:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {dlb}
case MONS_FREDERICK:
case MONS_HELL_KNIGHT:
case MONS_LOUISE:
case MONS_MARGERY:
case MONS_MAUD:
case MONS_VAMPIRE_KNIGHT:
case MONS_VAULT_GUARD:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_CHAIN_MAIL + random2(4);
break;
case MONS_ANGEL:
case MONS_SIGMUND:
case MONS_WIGHT:
item_race = MAKE_ITEM_NO_RACE;
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
force_colour = WHITE; //mv: always white
break;
case MONS_NAGA:
case MONS_NAGA_MAGE:
case MONS_NAGA_WARRIOR:
if (!one_chance_in(3))
return;
// deliberate fall through {dlb}
case MONS_DONALD:
case MONS_GREATER_NAGA:
case MONS_JESSICA:
case MONS_KOBOLD_DEMONOLOGIST:
case MONS_OGRE_MAGE:
case MONS_DRACONIAN:
case MONS_RED_DRACONIAN:
case MONS_WHITE_DRACONIAN:
case MONS_GREEN_DRACONIAN:
case MONS_PALE_DRACONIAN:
case MONS_MOTTLED_DRACONIAN:
case MONS_BLACK_DRACONIAN:
case MONS_YELLOW_DRACONIAN:
case MONS_PURPLE_DRACONIAN:
case MONS_DRACONIAN_SHIFTER:
case MONS_DRACONIAN_SCORCHER:
case MONS_DRACONIAN_ANNIHILATOR:
case MONS_DRACONIAN_CALLER:
case MONS_DRACONIAN_MONK:
case MONS_DRACONIAN_ZEALOT:
case MONS_DRACONIAN_KNIGHT:
case MONS_TIAMAT:
case MONS_ORC_WIZARD:
case MONS_WIZARD:
case MONS_BLORK_THE_ORC:
item_race = MAKE_ITEM_NO_RACE;
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
break;
case MONS_BORIS:
level = MAKE_GOOD_ITEM;
// fall-through
case MONS_AGNES:
case MONS_FRANCES:
case MONS_FRANCIS:
case MONS_NECROMANCER:
case MONS_VAMPIRE_MAGE:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
force_colour = DARKGREY; //mv: always darkgrey
break;
default:
return;
} // end of switch(menv [mid].type)
const int xitc = mitm[bp].base_type;
const int xitt = mitm[bp].sub_type;
if (mons_is_unique( mon->type ) && level != MAKE_GOOD_ITEM)
{
if (random2(100) < 9 + mon->hit_dice)
level = MAKE_GOOD_ITEM;
else
level = level * 2 + 5;
}
const int thing_created = items( 0, xitc, xitt, true, level, item_race );
if (thing_created == NON_ITEM)
return;
give_monster_item(mon, thing_created);
//mv: all items with force_colour = 0 are colored via items().
if (force_colour)
mitm[thing_created].colour = force_colour;
}
void give_item(int mid, int level_number) //mv: cleanup+minor changes
{
monsters *mons = &menv[mid];
give_scroll(mons, level_number);
give_wand(mons, level_number);
give_potion(mons, level_number);
const int item_race = give_weapon(mons, level_number);
give_ammo(mons, level_number, item_race);
give_armour(mons, 1 + level_number / 2);
} // end give_item()
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: abyss - debug - dungeon - effects - religion - spells4
* *********************************************************************** */
int items( int allow_uniques, int force_class, int force_type,
bool dont_place, int item_level, int item_race,
const dgn_region_list &forbidden = dgn_region_list() );
// last updated 13mar2001 {gdl}
/* ***********************************************************************
* called from: dungeon monplace
* *********************************************************************** */
void give_item(int mid, int level_number);
void init_rod_mp(item_def &item);
// last updated 13mar2001 {gdl}
/* ***********************************************************************
* called from: dungeon monplace
* *********************************************************************** */
}
static bool got_curare_roll(const int item_level)
{
return one_chance_in(item_level > 27? 6 :
item_level < 2 ? 15 :
(364 - 7 * item_level) / 25);
}
static bool got_distortion_roll(const int item_level)
{
return (one_chance_in(25));
void init_rod_mp(item_def &item)
{
if (!item_is_rod(item))
return;
if (item.sub_type == STAFF_STRIKING)
item.plus2 = random_range(6, 9) * ROD_CHARGE_MULT;
else
item.plus2 = random_range(9, 14) * ROD_CHARGE_MULT;
item.plus = item.plus2;
}
static bool weapon_is_visibly_special(const item_def &item)
{
const int brand = get_weapon_brand(item);
const bool visibly_branded =
brand != SPWPN_NORMAL && brand != SPWPN_DISTORTION;
return (((is_random_artefact(item) || visibly_branded)
&& !one_chance_in(10))
|| ((item.plus != 0 || item.plus2 != 0)
&& one_chance_in(3)
&& brand != SPWPN_DISTORTION))
&& item.sub_type != WPN_CLUB
&& item.sub_type != WPN_GIANT_CLUB
&& item.sub_type != WPN_GIANT_SPIKED_CLUB
&& get_equip_desc(item) == 0
&& get_equip_race(item) == 0;
}
// Returns item slot or NON_ITEM if it fails
int items( int allow_uniques, // not just true-false,
// because of BCR acquirement hack
int force_class, // desired OBJECTS class {dlb}
int force_type, // desired SUBTYPE - enum varies by OBJ
bool dont_place, // don't randomly place item on level
int item_level, // level of the item, can differ from global
int item_race, // weapon / armour racial categories
// item_race also gives type of rune!
const dgn_region_list &forbidden)
{
int temp_rand = 0; // probability determination {dlb}
int range_charges = 0; // for OBJ_WANDS charge count {dlb}
int temp_value = 0; // temporary value storage {dlb}
int loopy = 0; // just another loop variable {dlb}
int count = 0; // just another loop variable {dlb}
int race_plus = 0;
int race_plus2 = 0;
int x_pos, y_pos;
int quant = 0;
int icky = 0;
int p = 0;
// find an empty slot for the item (with culling if required)
p = get_item_slot(10);
if (p == NON_ITEM)
return (NON_ITEM);
// cap item_level unless an acquirement-level item {dlb}:
if (item_level > 50 && item_level != MAKE_GOOD_ITEM)
item_level = 50;
// determine base_type for item generated {dlb}:
if (force_class != OBJ_RANDOM)
mitm[p].base_type = force_class;
else
{
// nice and large for subtle differences {dlb}
temp_rand = random2(10000);
mitm[p].base_type = ((temp_rand < 50) ? OBJ_STAVES : // 0.50%
(temp_rand < 200) ? OBJ_BOOKS : // 1.50%
(temp_rand < 450) ? OBJ_JEWELLERY :// 2.50%
(temp_rand < 800) ? OBJ_WANDS : // 3.50%
(temp_rand < 1500) ? OBJ_FOOD : // 7.00%
(temp_rand < 2500) ? OBJ_ARMOUR : // 10.00%
(temp_rand < 3500) ? OBJ_WEAPONS : // 10.00%
(temp_rand < 4500) ? OBJ_POTIONS : // 10.00%
(temp_rand < 6000) ? OBJ_MISSILES : // 15.00%
(temp_rand < 8000) ? OBJ_SCROLLS // 20.00%
: OBJ_GOLD); // 20.00%
// misc items placement wholly dependent upon current depth {dlb}:
if (item_level > 7 && (20 + item_level) >= random2(3500))
mitm[p].base_type = OBJ_MISCELLANY;
if (item_level < 7
&& (mitm[p].base_type == OBJ_BOOKS
|| mitm[p].base_type == OBJ_STAVES
|| mitm[p].base_type == OBJ_WANDS)
&& random2(7) >= item_level)
{
mitm[p].base_type = coinflip() ? OBJ_POTIONS : OBJ_SCROLLS;
}
}
// determine sub_type accordingly {dlb}:
switch (mitm[p].base_type)
{
case OBJ_WEAPONS:
// generate initial weapon subtype using weighted function --
// indefinite loop now more evident and fewer array lookups {dlb}:
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
if (random2(20) < 20 - item_level)
{
// these are the common/low level weapon types
temp_rand = random2(12);
mitm[p].sub_type = ((temp_rand == 0) ? WPN_KNIFE :
(temp_rand == 1) ? WPN_QUARTERSTAFF :
(temp_rand == 2) ? WPN_SLING :
(temp_rand == 3) ? WPN_SPEAR :
(temp_rand == 4) ? WPN_HAND_AXE :
(temp_rand == 5) ? WPN_DAGGER :
(temp_rand == 6) ? WPN_MACE :
(temp_rand == 7) ? WPN_DAGGER :
(temp_rand == 8) ? WPN_CLUB :
(temp_rand == 9) ? WPN_HAMMER :
(temp_rand == 10) ? WPN_WHIP
: WPN_SABRE);
}
else if (item_level > 6 && random2(100) < (10 + item_level)
&& one_chance_in(30))
{
// place the rare_weapon() == 0 weapons
//
// this replaced the infinite loop (wasteful) -- may need
// to make into its own function to allow ease of tweaking
// distribution {dlb}:
temp_rand = random2(10);
mitm[p].sub_type = ((temp_rand == 9) ? WPN_LAJATANG :
(temp_rand == 8) ? WPN_DEMON_BLADE :
(temp_rand == 7) ? WPN_DEMON_TRIDENT :
(temp_rand == 6) ? WPN_DEMON_WHIP :
(temp_rand == 5) ? WPN_DOUBLE_SWORD :
(temp_rand == 4) ? WPN_EVENINGSTAR :
(temp_rand == 3) ? WPN_EXECUTIONERS_AXE :
(temp_rand == 2) ? WPN_KATANA :
(temp_rand == 1) ? WPN_QUICK_BLADE
/*(temp_rand == 0)*/: WPN_TRIPLE_SWORD);
}
else
{
// pick a weapon based on rarity
for (;;)
{
temp_value = (unsigned char) random2(NUM_WEAPONS);
if (weapon_rarity(temp_value) >= random2(10) + 1)
{
mitm[p].sub_type = temp_value;
break;
}
}
}
}
if (allow_uniques)
{
// Note there is nothing to stop randarts being reproduced,
// except vast improbability.
if (mitm[p].sub_type != WPN_CLUB && item_level > 2
&& random2(2000) <= 100 + (item_level * 3) && coinflip())
{
if (you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM
&& one_chance_in(50))
{
icky = find_okay_unrandart( OBJ_WEAPONS, force_type );
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
make_item_randart( mitm[p] );
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].plus += random2(7);
mitm[p].plus2 += random2(7);
if (one_chance_in(3))
mitm[p].plus += random2(7);
if (one_chance_in(3))
mitm[p].plus2 += random2(7);
if (one_chance_in(9))
mitm[p].plus -= random2(7);
if (one_chance_in(9))
mitm[p].plus2 -= random2(7);
quant = 1;
if (one_chance_in(4))
{
do_curse_item( mitm[p] );
mitm[p].plus = -random2(6);
mitm[p].plus2 = -random2(6);
}
else if ((mitm[p].plus < 0 || mitm[p].plus2 < 0)
&& !one_chance_in(3))
{
do_curse_item( mitm[p] );
}
break;
}
if (item_level > 6
&& random2(3000) <= 30 + (item_level * 3) && one_chance_in(12))
{
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Making fixed artifact.");
#endif
if (make_item_fixed_artefact( mitm[p], (item_level == 51) ))
{
quant = 1;
break;
}
}
}
ASSERT(!is_fixed_artefact(mitm[p]) && !is_random_artefact(mitm[p]));
if (item_level == MAKE_GOOD_ITEM
&& force_type != OBJ_RANDOM
&& (mitm[p].sub_type == WPN_CLUB || mitm[p].sub_type == WPN_SLING))
{
mitm[p].sub_type = WPN_LONG_SWORD;
}
quant = 1;
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].special = SPWPN_NORMAL;
if (item_race == MAKE_ITEM_RANDOM_RACE && coinflip())
{
switch (mitm[p].sub_type)
{
case WPN_CLUB:
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_MACE:
case WPN_FLAIL:
case WPN_SPIKED_FLAIL:
case WPN_GREAT_MACE:
case WPN_DIRE_FLAIL:
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_MORNINGSTAR:
case WPN_HAMMER:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_DAGGER:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_SHORT_SWORD:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_FALCHION:
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_LONG_SWORD:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_GREAT_SWORD:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_SCIMITAR:
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_WAR_AXE:
case WPN_HAND_AXE:
case WPN_BROAD_AXE:
case WPN_BATTLEAXE:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_SPEAR:
case WPN_TRIDENT:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_HALBERD:
case WPN_GLAIVE:
case WPN_EXECUTIONERS_AXE:
case WPN_LOCHABER_AXE:
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case WPN_QUICK_BLADE:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_KATANA:
case WPN_LAJATANG:
case WPN_KNIFE:
case WPN_SLING:
set_equip_race( mitm[p], ISFLAG_NO_RACE );
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
break;
case WPN_BOW:
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (coinflip())
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_LONGBOW:
set_equip_race( mitm[p], one_chance_in(3) ? ISFLAG_ELVEN
: ISFLAG_NO_RACE );
break;
case WPN_CROSSBOW:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case WPN_HAND_CROSSBOW:
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case WPN_BLOWGUN:
if (one_chance_in(10))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
}
// fine, but out-of-order relative to mitm[].special ordering {dlb}
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
// if we allow acquirement-type items to be orcish, then
// there's a good chance that we'll just strip them of
// their ego type at the bottom of this function. -- bwr
if (item_level == MAKE_GOOD_ITEM
&& get_equip_race( mitm[p] ) == ISFLAG_ORCISH)
{
set_equip_race( mitm[p], ISFLAG_NO_RACE );
}
switch (get_equip_race( mitm[p] ))
{
case ISFLAG_ORCISH:
if (coinflip())
race_plus--;
if (coinflip())
race_plus2++;
break;
case ISFLAG_ELVEN:
race_plus += random2(3);
break;
case ISFLAG_DWARVEN:
if (coinflip())
race_plus++;
if (coinflip())
race_plus2++;
break;
}
mitm[p].plus += race_plus;
mitm[p].plus2 += race_plus2;
if ((random2(200) <= 50 + item_level
|| item_level == MAKE_GOOD_ITEM
|| is_demonic(mitm[p]))
// nobody would bother enchanting a club
&& mitm[p].sub_type != WPN_CLUB
&& mitm[p].sub_type != WPN_GIANT_CLUB
&& mitm[p].sub_type != WPN_GIANT_SPIKED_CLUB)
{
count = 0;
do
{
if (random2(300) <= 100 + item_level
|| item_level == MAKE_GOOD_ITEM
|| is_demonic( mitm[p] ))
{
// note: this doesn't guarantee special enchantment
switch (mitm[p].sub_type)
{
case WPN_EVENINGSTAR:
if (coinflip())
set_weapon_special(p, SPWPN_DRAINING);
// **** intentional fall through here ****
case WPN_MORNINGSTAR:
if (one_chance_in(4))
set_weapon_special(p, SPWPN_VENOM);
if (one_chance_in(4))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(20))
set_weapon_special(p, SPWPN_VAMPIRICISM);
// **** intentional fall through here ****
case WPN_MACE:
case WPN_GREAT_MACE:
if ((mitm[p].sub_type == WPN_MACE
|| mitm[p].sub_type == WPN_GREAT_MACE)
&& one_chance_in(4))
{
set_weapon_special(p, SPWPN_DISRUPTION);
}
// **** intentional fall through here ****
case WPN_FLAIL:
case WPN_SPIKED_FLAIL:
case WPN_DIRE_FLAIL:
case WPN_HAMMER:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(3) &&
(!is_weapon_special(p) || one_chance_in(5)))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_DRAINING);
break;
case WPN_DAGGER:
if (one_chance_in(10))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_VENOM);
// **** intentional fall through here ****
case WPN_SHORT_SWORD:
case WPN_SABRE:
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(8))
{
set_weapon_special(p,(coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(12))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_FALCHION:
case WPN_LONG_SWORD:
if (one_chance_in(12))
set_weapon_special(p, SPWPN_VENOM);
// **** intentional fall through here ****
case WPN_SCIMITAR:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(7))
set_weapon_special(p, SPWPN_SPEED);
// **** intentional fall through here ****
case WPN_GREAT_SWORD:
case WPN_DOUBLE_SWORD:
case WPN_TRIPLE_SWORD:
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5))
{
set_weapon_special(p,(coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(7))
set_weapon_special(p, SPWPN_PROTECTION);
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(12))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(7))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(4)
&& (!is_weapon_special(p) || one_chance_in(3)))
{
set_weapon_special(p, SPWPN_VORPAL);
}
break;
case WPN_WAR_AXE:
case WPN_BROAD_AXE:
case WPN_BATTLEAXE:
case WPN_EXECUTIONERS_AXE:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(14))
set_weapon_special(p, SPWPN_DRAINING);
// **** intentional fall through here ****
case WPN_HAND_AXE:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(3)
&& (!is_weapon_special(p) || one_chance_in(5)))
{
set_weapon_special(p, SPWPN_VORPAL);
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(4))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(8))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(12))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_WHIP:
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(6))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
if (coinflip())
set_weapon_special(p, SPWPN_REACHING);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_ELECTROCUTION);
break;
case WPN_HALBERD:
case WPN_GLAIVE:
case WPN_SCYTHE:
case WPN_TRIDENT:
case WPN_LOCHABER_AXE:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_HOLY_WRATH);
if (one_chance_in(4))
set_weapon_special(p, SPWPN_PROTECTION);
// **** intentional fall through here ****
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
// **** intentional fall through here ****
case WPN_SPEAR:
if (one_chance_in(25))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5) &&
(!is_weapon_special(p) || one_chance_in(6)))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(6))
set_weapon_special(p, SPWPN_ORC_SLAYING);
if (one_chance_in(6))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(6))
set_weapon_special(p, SPWPN_VENOM);
if (one_chance_in(3))
set_weapon_special(p, SPWPN_REACHING);
break;
case WPN_SLING:
case WPN_HAND_CROSSBOW:
if (coinflip())
break;
// **** possible intentional fall through here ****
case WPN_BOW:
case WPN_LONGBOW:
case WPN_CROSSBOW:
{
const int tmp = random2(1000);
set_weapon_special( p, (tmp < 375) ? SPWPN_FLAME :
(tmp < 750) ? SPWPN_FROST :
(tmp < 920) ? SPWPN_PROTECTION :
(tmp < 980) ? SPWPN_VORPAL
: SPWPN_SPEED );
break;
}
// quarterstaff - not powerful, as this would make
// the 'staves' skill just too good
case WPN_QUARTERSTAFF:
if (one_chance_in(30))
set_weapon_special(p, SPWPN_PAIN);
if (got_distortion_roll(item_level))
set_weapon_special(p, SPWPN_DISTORTION);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_SPEED);
if (one_chance_in(10))
set_weapon_special(p, SPWPN_VORPAL);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_PROTECTION);
break;
case WPN_DEMON_TRIDENT:
case WPN_DEMON_WHIP:
case WPN_DEMON_BLADE:
set_equip_race( mitm[p], ISFLAG_NO_RACE );
if (one_chance_in(10))
set_weapon_special(p, SPWPN_PAIN);
if (one_chance_in(3)
&& (mitm[p].sub_type == WPN_DEMON_WHIP
|| mitm[p].sub_type == WPN_DEMON_TRIDENT))
{
set_weapon_special(p, SPWPN_REACHING);
}
if (one_chance_in(5))
set_weapon_special(p, SPWPN_DRAINING);
if (one_chance_in(5))
{
set_weapon_special(p, (coinflip() ? SPWPN_FLAMING
: SPWPN_FREEZING));
}
if (one_chance_in(5))
set_weapon_special(p, SPWPN_ELECTROCUTION);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_VAMPIRICISM);
if (one_chance_in(5))
set_weapon_special(p, SPWPN_VENOM);
break;
case WPN_BLESSED_BLADE: // special gift of TSO
set_weapon_special( p, SPWPN_HOLY_WRATH );
break;
// unlisted weapons have no associated, standard ego-types {dlb}
default:
break;
}
} // end if specially enchanted
count++;
}
while (item_level == MAKE_GOOD_ITEM
&& mitm[p].special == SPWPN_NORMAL
&& count < 5);
// if acquired item still not ego... enchant it up a bit.
if (item_level == MAKE_GOOD_ITEM && mitm[p].special == SPWPN_NORMAL)
{
mitm[p].plus += 2 + random2(3);
mitm[p].plus2 += 2 + random2(3);
}
const int chance = (item_level == MAKE_GOOD_ITEM) ? 200
: item_level;
// odd-looking, but this is how the algorithm compacts {dlb}:
for (loopy = 0; loopy < 4; loopy++)
{
mitm[p].plus += random2(3);
if (random2(350) > 20 + chance)
break;
}
// odd-looking, but this is how the algorithm compacts {dlb}:
for (loopy = 0; loopy < 4; loopy++)
{
mitm[p].plus2 += random2(3);
if (random2(500) > 50 + chance)
break;
}
}
else
{
if (one_chance_in(12))
{
do_curse_item( mitm[p] );
mitm[p].plus -= random2(4);
mitm[p].plus2 -= random2(4);
// clear specials {dlb}
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
}
}
// value was "0" comment said "orc" so I went with comment {dlb}
if (get_equip_race(mitm[p]) == ISFLAG_ORCISH)
{
// no holy wrath or slay orc and 1/2 the time no-ego
const int brand = get_weapon_brand( mitm[p] );
if (brand == SPWPN_HOLY_WRATH
|| brand == SPWPN_ORC_SLAYING
|| (brand != SPWPN_NORMAL && coinflip()))
{
// this makes no sense {dlb}
// Probably a remnant of the old code which used
// to decrement this when the electric attack happened -- bwr
// if (brand == SPWPN_ELECTROCUTION)
// mitm[p].plus = 0;
set_item_ego_type( mitm[p], OBJ_WEAPONS, SPWPN_NORMAL );
}
}
if (weapon_is_visibly_special(mitm[p]))
{
set_equip_desc( mitm[p], (coinflip() ? ISFLAG_GLOWING
: ISFLAG_RUNED) );
}
break;
case OBJ_MISSILES:
quant = 0;
mitm[p].plus = 0;
mitm[p].special = SPMSL_NORMAL;
temp_rand = random2(20);
mitm[p].sub_type = (temp_rand < 6) ? MI_STONE : // 30 %
(temp_rand < 10) ? MI_DART : // 20 %
(temp_rand < 14) ? MI_ARROW : // 20 %
(temp_rand < 18) ? MI_BOLT // 20 %
: MI_NEEDLE; // 10 %
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
// no fancy rocks -- break out before we get to racial/special stuff
if (mitm[p].sub_type == MI_LARGE_ROCK)
{
quant = 2 + random2avg(5,2);
break;
}
else if (mitm[p].sub_type == MI_STONE)
{
quant = 1 + random2(9) + random2(12) + random2(15) + random2(12);
break;
}
// set racial type:
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
case MAKE_ITEM_RANDOM_RACE:
if ((mitm[p].sub_type == MI_ARROW
|| mitm[p].sub_type == MI_DART)
&& one_chance_in(4))
{
// elven - not for bolts, though
set_equip_race( mitm[p], ISFLAG_ELVEN );
}
if ((mitm[p].sub_type == MI_ARROW
|| mitm[p].sub_type == MI_BOLT
|| mitm[p].sub_type == MI_DART)
&& one_chance_in(4))
{
set_equip_race( mitm[p], ISFLAG_ORCISH );
}
if ((mitm[p].sub_type == MI_DART
|| mitm[p].sub_type == MI_BOLT)
&& one_chance_in(6))
{
set_equip_race( mitm[p], ISFLAG_DWARVEN );
}
if (mitm[p].sub_type == MI_NEEDLE)
{
if (one_chance_in(10))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ORCISH );
}
break;
}
// note that needles can only be poisoned
//
// Actually, it'd be really nice if there where
// some paralysis or slowing poison needles, just
// so that blowguns have some added utility over
// the other launchers/throwing weapons. -- bwr
if (mitm[p].sub_type == MI_NEEDLE)
{
const int pois =
got_curare_roll(item_level) ? SPMSL_CURARE : SPMSL_POISONED;
set_item_ego_type( mitm[p], OBJ_MISSILES, pois );
}
else
{
// decide specials:
if (item_level == MAKE_GOOD_ITEM)
temp_rand = random2(150);
else
temp_rand = random2(2000 - 55 * item_level);
set_item_ego_type( mitm[p], OBJ_MISSILES,
(temp_rand < 60) ? SPMSL_FLAME :
(temp_rand < 120) ? SPMSL_ICE :
(temp_rand < 150) ? SPMSL_POISONED
: SPMSL_NORMAL );
}
// orcish ammo gets poisoned a lot more often -- in the original
// code it was poisoned every time!?
if (get_equip_race(mitm[p]) == ISFLAG_ORCISH && one_chance_in(3))
set_item_ego_type( mitm[p], OBJ_MISSILES, SPMSL_POISONED );
// reduced quantity if special
if (get_ammo_brand( mitm[p] ) == SPMSL_CURARE)
quant = 1 + random2(9) + random2(9);
else if (get_ammo_brand( mitm[p] ) != SPMSL_NORMAL )
quant = 1 + random2(9) + random2(12) + random2(12);
else
quant = 1 + random2(9) + random2(12) + random2(15) + random2(12);
if (10 + item_level >= random2(100))
mitm[p].plus += random2(5);
// elven arrows and dwarven bolts are quality items
if ((get_equip_race(mitm[p]) == ISFLAG_ELVEN
&& mitm[p].sub_type == MI_ARROW)
|| (get_equip_race(mitm[p]) == ISFLAG_DWARVEN
&& mitm[p].sub_type == MI_BOLT))
{
mitm[p].plus += random2(3);
}
break;
case OBJ_ARMOUR:
quant = 1;
mitm[p].plus = 0;
mitm[p].plus2 = 0;
mitm[p].special = SPARM_NORMAL;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2(3);
if (random2(35) <= item_level + 10)
{
mitm[p].sub_type = random2(5);
if (one_chance_in(4))
mitm[p].sub_type = ARM_ANIMAL_SKIN;
}
if (random2(60) <= item_level + 10)
mitm[p].sub_type = random2(8);
if (10 + item_level >= random2(400) && one_chance_in(20))
mitm[p].sub_type = ARM_DRAGON_HIDE + random2(7);
if (10 + item_level >= random2(500) && one_chance_in(20))
{
mitm[p].sub_type = ARM_STEAM_DRAGON_HIDE + random2(11);
if (mitm[p].sub_type == ARM_ANIMAL_SKIN && one_chance_in(20))
mitm[p].sub_type = ARM_CRYSTAL_PLATE_MAIL;
}
// secondary armours:
if (one_chance_in(5))
{
mitm[p].sub_type = ARM_SHIELD + random2(5);
if (mitm[p].sub_type == ARM_SHIELD) // 33.3%
{
if (coinflip())
mitm[p].sub_type = ARM_BUCKLER; // 50.0%
else if (one_chance_in(3))
mitm[p].sub_type = ARM_LARGE_SHIELD; // 16.7%
}
}
}
if (mitm[p].sub_type == ARM_HELMET)
{
set_helmet_type( mitm[p], THELM_HELMET );
set_helmet_desc( mitm[p], THELM_DESC_PLAIN );
if (one_chance_in(3))
set_helmet_type( mitm[p], random2( THELM_NUM_TYPES ) );
if (one_chance_in(3))
set_helmet_random_desc( mitm[p] );
}
if (allow_uniques == 1
&& item_level > 2
&& random2(2000) <= (100 + item_level * 3)
&& coinflip())
{
if ((you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM)
&& one_chance_in(50))
{
icky = find_okay_unrandart(OBJ_ARMOUR);
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
hide2armour(mitm[p]);
// mitm[p].special = SPARM_RANDART_II + random2(4);
make_item_randart( mitm[p] );
mitm[p].plus = 0;
if (mitm[p].sub_type == ARM_BOOTS
&& one_chance_in(10))
{
mitm[p].sub_type =
coinflip()? ARM_NAGA_BARDING
: ARM_CENTAUR_BARDING;
}
mitm[p].plus += random2(4);
if (one_chance_in(5))
mitm[p].plus += random2(4);
if (one_chance_in(6))
mitm[p].plus -= random2(8);
quant = 1;
if (one_chance_in(5))
{
do_curse_item( mitm[p] );
mitm[p].plus = -random2(6);
}
else if (mitm[p].plus < 0 && !one_chance_in(3))
{
do_curse_item( mitm[p] );
}
break;
}
mitm[p].plus = 0;
if (item_race == MAKE_ITEM_RANDOM_RACE && coinflip())
{
switch (mitm[p].sub_type)
{
case ARM_SHIELD: // shield - must do special things for this!
case ARM_BUCKLER:
case ARM_LARGE_SHIELD:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(3))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case ARM_CLOAK:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_GLOVES:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
case ARM_BOOTS:
if (mitm[p].sub_type == ARM_BOOTS)
{
if (one_chance_in(4))
{
mitm[p].sub_type = ARM_NAGA_BARDING;
break;
}
if (one_chance_in(4))
{
mitm[p].sub_type = ARM_CENTAUR_BARDING;
break;
}
}
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
break;
case ARM_HELMET:
if (get_helmet_type(mitm[p]) == THELM_CAP
|| get_helmet_type(mitm[p]) == THELM_WIZARD_HAT)
{
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
}
else
{
// helms and helmets
if (one_chance_in(8))
set_equip_race( mitm[p], ISFLAG_ORCISH );
if (one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
}
break;
case ARM_ROBE:
if (one_chance_in(4))
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case ARM_RING_MAIL:
case ARM_SCALE_MAIL:
case ARM_CHAIN_MAIL:
case ARM_SPLINT_MAIL:
case ARM_BANDED_MAIL:
case ARM_PLATE_MAIL:
if (mitm[p].sub_type <= ARM_CHAIN_MAIL && one_chance_in(6))
set_equip_race( mitm[p], ISFLAG_ELVEN );
if (mitm[p].sub_type >= ARM_RING_MAIL && one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (one_chance_in(5))
set_equip_race( mitm[p], ISFLAG_ORCISH );
default: // skins, hides, crystal plate are always plain
break;
}
}
switch (item_race)
{
case MAKE_ITEM_ELVEN:
set_equip_race( mitm[p], ISFLAG_ELVEN );
break;
case MAKE_ITEM_DWARVEN:
set_equip_race( mitm[p], ISFLAG_DWARVEN );
if (coinflip())
mitm[p].plus++;
break;
case MAKE_ITEM_ORCISH:
set_equip_race( mitm[p], ISFLAG_ORCISH );
break;
}
if (50 + item_level >= random2(250)
|| item_level == MAKE_GOOD_ITEM
|| (mitm[p].sub_type == ARM_HELMET
&& get_helmet_type(mitm[p]) == THELM_WIZARD_HAT))
{
mitm[p].plus += random2(3);
if (mitm[p].sub_type <= ARM_PLATE_MAIL && 20 + item_level >= random2(300))
mitm[p].plus += random2(3);
if (30 + item_level >= random2(350)
&& (item_level == MAKE_GOOD_ITEM
|| (!get_equip_race(mitm[p]) == ISFLAG_ORCISH
|| (mitm[p].sub_type <= ARM_PLATE_MAIL && coinflip()))))
{
switch (mitm[p].sub_type)
{
case ARM_SHIELD: // shield - must do special things for this!
case ARM_LARGE_SHIELD:
case ARM_BUCKLER:
{
const int tmp = random2(1000);
set_item_ego_type( mitm[p], OBJ_ARMOUR,
(tmp < 40) ? SPARM_RESISTANCE :
(tmp < 160) ? SPARM_FIRE_RESISTANCE :
(tmp < 280) ? SPARM_COLD_RESISTANCE :
(tmp < 400) ? SPARM_POISON_RESISTANCE :
(tmp < 520) ? SPARM_POSITIVE_ENERGY
: SPARM_PROTECTION );
break; // prot
//break;
}
case ARM_CLOAK:
if (get_equip_race(mitm[p]) == ISFLAG_DWARVEN)
break;
switch (random2(4))
{
case 0:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POISON_RESISTANCE );
break;
case 1:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_DARKNESS );
break;
case 2:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
break;
case 3:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_PRESERVATION );
break;
}
break;
case ARM_HELMET:
if (get_helmet_type(mitm[p]) == THELM_WIZARD_HAT && coinflip())
{
if (one_chance_in(3))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
}
else
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_INTELLIGENCE );
}
}
else
{
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_SEE_INVISIBLE
: SPARM_INTELLIGENCE );
}
break;
case ARM_GLOVES:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_DEXTERITY
: SPARM_STRENGTH );
break;
case ARM_BOOTS:
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
{
const int tmp = random2(600)
+ 200 * (mitm[p].sub_type != ARM_BOOTS);
set_item_ego_type( mitm[p], OBJ_ARMOUR,
(tmp < 200) ? SPARM_RUNNING :
(tmp < 400) ? SPARM_LEVITATION :
(tmp < 600) ? SPARM_STEALTH :
(tmp < 700) ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
break;
}
case ARM_ROBE:
switch (random2(4))
{
case 0:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
break;
case 1:
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
break;
case 2:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_POSITIVE_ENERGY
: SPARM_RESISTANCE );
break;
case 3:
if (force_type != OBJ_RANDOM
|| is_random_artefact( mitm[p] )
|| get_armour_ego_type( mitm[p] ) != SPARM_NORMAL
|| random2(50) > 10 + item_level)
{
break;
}
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_ARCHMAGI );
break;
}
break;
default: // other body armours:
set_item_ego_type( mitm[p], OBJ_ARMOUR,
coinflip() ? SPARM_COLD_RESISTANCE
: SPARM_FIRE_RESISTANCE );
if (one_chance_in(9))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POSITIVE_ENERGY );
}
if (one_chance_in(5))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_MAGIC_RESISTANCE );
}
if (one_chance_in(5))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_POISON_RESISTANCE );
}
if (mitm[p].sub_type == ARM_PLATE_MAIL
&& one_chance_in(15))
{
set_item_ego_type( mitm[p],
OBJ_ARMOUR, SPARM_PONDEROUSNESS );
mitm[p].plus += 3 + random2(4);
}
break;
}
}
}
else if (one_chance_in(12))
{
// mitm[p].plus = (coinflip() ? 99 : 98); // 98? 99?
do_curse_item( mitm[p] );
if (one_chance_in(5))
mitm[p].plus -= random2(3);
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_NORMAL );
}
// if not given a racial type, and special, give shiny/runed/etc desc.
if (get_equip_race(mitm[p]) == 0
&& get_equip_desc(mitm[p]) == 0
&& (((is_random_artefact(mitm[p])
|| get_armour_ego_type( mitm[p] ) != SPARM_NORMAL)
&& !one_chance_in(10))
|| (mitm[p].plus != 0 && one_chance_in(3))))
{
switch (random2(3))
{
case 0:
set_equip_desc( mitm[p], ISFLAG_GLOWING );
break;
case 1:
set_equip_desc( mitm[p], ISFLAG_RUNED );
break;
case 2:
default:
set_equip_desc( mitm[p], ISFLAG_EMBROIDERED_SHINY );
break;
}
}
// Make sure you don't get a hide from acquirement (since that
// would be an enchanted item which somehow didn't get converted
// into armour).
if (item_level == MAKE_GOOD_ITEM)
hide2armour(mitm[p]); // what of animal hides? {dlb}
// skin armours + Crystal PM don't get special enchantments
// or species, but can be randarts
if (mitm[p].sub_type >= ARM_DRAGON_HIDE
&& mitm[p].sub_type <= ARM_SWAMP_DRAGON_ARMOUR)
{
set_equip_race( mitm[p], ISFLAG_NO_RACE );
set_item_ego_type( mitm[p], OBJ_ARMOUR, SPARM_NORMAL );
}
break;
case OBJ_WANDS:
// determine sub_type:
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2( NUM_WANDS );
// Adjusted distribution here -- bwr
// Wands used to be uniform (5.26% each)
//
// Now:
// invis, hasting, healing (1.11% each)
// fireball, teleportaion (3.74% each)
// others (6.37% each)
if ((mitm[p].sub_type == WAND_INVISIBILITY
|| mitm[p].sub_type == WAND_HASTING
|| mitm[p].sub_type == WAND_HEALING)
|| ((mitm[p].sub_type == WAND_FIREBALL
|| mitm[p].sub_type == WAND_TELEPORTATION)
&& coinflip()))
{
mitm[p].sub_type = random2( NUM_WANDS );
}
}
// determine upper bound on charges:
range_charges = ((mitm[p].sub_type == WAND_HEALING
|| mitm[p].sub_type == WAND_HASTING
|| mitm[p].sub_type == WAND_INVISIBILITY) ? 8 :
(mitm[p].sub_type == WAND_FLAME
|| mitm[p].sub_type == WAND_FROST
|| mitm[p].sub_type == WAND_MAGIC_DARTS
|| mitm[p].sub_type == WAND_RANDOM_EFFECTS) ? 28
: 16);
// generate charges randomly:
mitm[p].plus = random2avg(range_charges, 3);
//
// set quantity to one:
quant = 1;
break;
case OBJ_FOOD: // this can be parsed out {dlb}
// determine sub_type:
if (force_type == OBJ_RANDOM)
{
temp_rand = random2(1000);
mitm[p].sub_type =
((temp_rand >= 750) ? FOOD_MEAT_RATION : // 25.00% chance
(temp_rand >= 450) ? FOOD_BREAD_RATION :// 30.00% chance
(temp_rand >= 350) ? FOOD_PEAR : // 10.00% chance
(temp_rand >= 250) ? FOOD_APPLE : // 10.00% chance
(temp_rand >= 150) ? FOOD_CHOKO : // 10.00% chance
(temp_rand >= 140) ? FOOD_CHEESE : // 1.00% chance
(temp_rand >= 130) ? FOOD_PIZZA : // 1.00% chance
(temp_rand >= 120) ? FOOD_SNOZZCUMBER : // 1.00% chance
(temp_rand >= 110) ? FOOD_APRICOT : // 1.00% chance
(temp_rand >= 100) ? FOOD_ORANGE : // 1.00% chance
(temp_rand >= 90) ? FOOD_BANANA : // 1.00% chance
(temp_rand >= 80) ? FOOD_STRAWBERRY : // 1.00% chance
(temp_rand >= 70) ? FOOD_RAMBUTAN : // 1.00% chance
(temp_rand >= 60) ? FOOD_LEMON : // 1.00% chance
(temp_rand >= 50) ? FOOD_GRAPE : // 1.00% chance
(temp_rand >= 40) ? FOOD_SULTANA : // 1.00% chance
(temp_rand >= 30) ? FOOD_LYCHEE : // 1.00% chance
(temp_rand >= 20) ? FOOD_BEEF_JERKY : // 1.00% chance
(temp_rand >= 10) ? FOOD_SAUSAGE : // 1.00% chance
(temp_rand >= 5) ? FOOD_HONEYCOMB // 0.50% chance
: FOOD_ROYAL_JELLY );// 0.50% chance
}
else
mitm[p].sub_type = force_type;
// Happens with ghoul food acquirement -- use place_chunks() outherwise
if (mitm[p].sub_type == FOOD_CHUNK)
{
for (count = 0; count < 1000; count++)
{
temp_rand = random2( NUM_MONSTERS ); // random monster
temp_rand = mons_species( temp_rand ); // corpse base type
if (mons_weight( temp_rand ) > 0) // drops a corpse
break;
}
// set chunk flavour (default to common dungeon rat steaks):
mitm[p].plus = (count == 1000) ? MONS_RAT : temp_rand;
// set duration
mitm[p].special = (10 + random2(11)) * 10;
}
// determine quantity:
if (allow_uniques > 1)
quant = allow_uniques;
else
{
quant = 1;
if (mitm[p].sub_type != FOOD_MEAT_RATION
&& mitm[p].sub_type != FOOD_BREAD_RATION)
{
if (one_chance_in(80))
quant += random2(3);
if (mitm[p].sub_type == FOOD_STRAWBERRY
|| mitm[p].sub_type == FOOD_GRAPE
|| mitm[p].sub_type == FOOD_SULTANA)
{
quant += 3 + random2avg(15,2);
}
}
}
break;
case OBJ_POTIONS:
quant = 1;
if (one_chance_in(18))
quant++;
if (one_chance_in(25))
quant++;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
temp_rand = random2(9); // general type of potion;
switch (temp_rand)
{
case 0:
case 1:
case 2:
case 8:
// healing potions
if (one_chance_in(3))
mitm[p].sub_type = POT_HEAL_WOUNDS; // 14.074%
else
mitm[p].sub_type = POT_HEALING; // 28.148%
if (one_chance_in(20))
mitm[p].sub_type = POT_CURE_MUTATION; // 2.222%
break;
case 3:
case 4:
// enhancements
if (coinflip())
mitm[p].sub_type = POT_SPEED; // 6.444%
else
mitm[p].sub_type = POT_MIGHT; // 6.444%
if (one_chance_in(10))
mitm[p].sub_type = POT_BERSERK_RAGE; // 1.432%
if (one_chance_in(5))
mitm[p].sub_type = POT_INVISIBILITY; // 3.580%
if (one_chance_in(6))
mitm[p].sub_type = POT_LEVITATION; // 3.580%
if (one_chance_in(30))
mitm[p].sub_type = POT_PORRIDGE; // 0.741%
break;
case 5:
// gain ability
mitm[p].sub_type = POT_GAIN_STRENGTH + random2(3); // 1.125%
// or 0.375% each
if (one_chance_in(10))
mitm[p].sub_type = POT_EXPERIENCE; // 0.125%
if (one_chance_in(10))
mitm[p].sub_type = POT_MAGIC; // 0.139%
if (!one_chance_in(8))
mitm[p].sub_type = POT_RESTORE_ABILITIES; // 9.722%
quant = 1;
break;
case 6:
case 7:
// bad things
switch (random2(6))
{
case 0:
case 4:
// is this not always the case? - no, level one is 0 {dlb}
if (item_level > 0)
{
mitm[p].sub_type = POT_POISON; // 6.475%
if (item_level > 10 && one_chance_in(4))
mitm[p].sub_type = POT_STRONG_POISON;
break;
}
/* **** intentional fall through **** */ // ignored for %
case 5:
if (item_level > 6)
{
mitm[p].sub_type = POT_MUTATION; // 3.237%
break;
}
/* **** intentional fall through **** */ // ignored for %
case 1:
mitm[p].sub_type = POT_SLOWING; // 3.237%
break;
case 2:
mitm[p].sub_type = POT_PARALYSIS; // 3.237%
break;
case 3:
mitm[p].sub_type = POT_CONFUSION; // 3.237%
break;
}
if (one_chance_in(8))
mitm[p].sub_type = POT_DEGENERATION; // 2.775%
if (one_chance_in(1000)) // 0.022%
mitm[p].sub_type = POT_DECAY;
break;
}
}
mitm[p].plus = 0;
break;
case OBJ_SCROLLS:
// determine sub_type:
if (force_type == OBJ_RANDOM)
{
// only used in certain cases {dlb}
int depth_mod = random2(1 + item_level);
temp_rand = random2(920);
mitm[p].sub_type =
((temp_rand > 751) ? SCR_IDENTIFY : // 18.26%
(temp_rand > 629) ? SCR_REMOVE_CURSE : // 13.26%
(temp_rand > 554) ? SCR_TELEPORTATION : // 8.15%
(temp_rand > 494) ? SCR_DETECT_CURSE : // 6.52%
(temp_rand > 464) ? SCR_FEAR : // 3.26%
(temp_rand > 434) ? SCR_NOISE : // 3.26%
(temp_rand > 404) ? SCR_MAGIC_MAPPING : // 3.26%
(temp_rand > 374) ? SCR_FORGETFULNESS : // 3.26%
(temp_rand > 344) ? SCR_RANDOM_USELESSNESS :// 3.26%
(temp_rand > 314) ? SCR_CURSE_WEAPON : // 3.26%
(temp_rand > 284) ? SCR_CURSE_ARMOUR : // 3.26%
(temp_rand > 254) ? SCR_RECHARGING : // 3.26%
(temp_rand > 224) ? SCR_BLINKING : // 3.26%
(temp_rand > 194) ? SCR_PAPER : // 3.26%
(temp_rand > 164) ? SCR_ENCHANT_ARMOUR : // 3.26%
(temp_rand > 134) ? SCR_ENCHANT_WEAPON_I : // 3.26%
(temp_rand > 104) ? SCR_ENCHANT_WEAPON_II : // 3.26%
// Crawl is kind to newbie adventurers {dlb}:
// yes -- these five are messy {dlb}:
// yes they are a hellish mess of tri-ops and long lines,
// this formating is somewhat better -- bwr
(temp_rand > 74) ?
((item_level < 4) ? SCR_TELEPORTATION
: SCR_IMMOLATION) : // 3.26%
(temp_rand > 59) ?
((depth_mod < 4) ? SCR_TELEPORTATION
: SCR_ACQUIREMENT) : // 1.63%
(temp_rand > 44) ?
((depth_mod < 4) ? SCR_DETECT_CURSE
: SCR_SUMMONING) : // 1.63%
(temp_rand > 29) ?
((depth_mod < 4) ? SCR_TELEPORTATION // 1.63%
: SCR_ENCHANT_WEAPON_III) :
(temp_rand > 14) ?
((depth_mod < 7) ? SCR_DETECT_CURSE
: SCR_TORMENT) // 1.63%
// default:
: ((depth_mod < 7) ? SCR_TELEPORTATION // 1.63%
: SCR_VORPALISE_WEAPON));
}
else
mitm[p].sub_type = force_type;
// determine quantity:
temp_rand = random2(48);
quant = ((temp_rand > 1
|| mitm[p].sub_type == SCR_VORPALISE_WEAPON
|| mitm[p].sub_type == SCR_ENCHANT_WEAPON_III
|| mitm[p].sub_type == SCR_ACQUIREMENT
|| mitm[p].sub_type == SCR_TORMENT) ? 1 : // 95.83%
(temp_rand == 0) ? 2 // 2.08%
: 3); // 2.08%
mitm[p].plus = 0;
break;
case OBJ_JEWELLERY:
// determine whether an unrandart will be generated {dlb}:
if (item_level > 2
&& you.level_type != LEVEL_ABYSS
&& you.level_type != LEVEL_PANDEMONIUM
&& random2(2000) <= 100 + (item_level * 3)
&& one_chance_in(20))
{
icky = find_okay_unrandart(OBJ_JEWELLERY);
if (icky != -1)
{
quant = 1;
make_item_unrandart( mitm[p], icky );
break;
}
}
// otherwise, determine jewellery type {dlb}:
if (force_type == OBJ_RANDOM)
{
mitm[p].sub_type = (!one_chance_in(4) ? random2(24) // rings
: AMU_RAGE + random2(10));
// Adjusted distribution here -- bwr
if ((mitm[p].sub_type == RING_INVISIBILITY
|| mitm[p].sub_type == RING_REGENERATION
|| mitm[p].sub_type == RING_TELEPORT_CONTROL
|| mitm[p].sub_type == RING_SLAYING)
&& !one_chance_in(3))
{
mitm[p].sub_type = random2(24);
}
}
else
mitm[p].sub_type = force_type;
// quantity is always one {dlb}:
quant = 1;
// everything begins as uncursed, unenchanted jewellery {dlb}:
mitm[p].plus = 0;
mitm[p].plus2 = 0;
// set pluses for rings that require them {dlb}:
switch (mitm[p].sub_type)
{
case RING_PROTECTION:
case RING_STRENGTH:
case RING_SLAYING:
case RING_EVASION:
case RING_DEXTERITY:
case RING_INTELLIGENCE:
if (one_chance_in(5)) // 20% of such rings are cursed {dlb}
{
do_curse_item( mitm[p] );
mitm[p].plus = (coinflip() ? -2 : -3);
if (one_chance_in(3))
mitm[p].plus -= random2(4);
}
else
{
mitm[p].plus += 1 + (one_chance_in(3) ? random2(3)
: random2avg(6, 2));
}
break;
default:
break;
}
// rings of slaying also require that pluses2 be set {dlb}:
if (mitm[p].sub_type == RING_SLAYING)
{
if (item_cursed( mitm[p] ) && !one_chance_in(20))
mitm[p].plus2 = -1 - random2avg(6, 2);
else
{
mitm[p].plus2 += 1 + (one_chance_in(3) ? random2(3)
: random2avg(6, 2));
if (random2(25) < 9) // 36% of such rings {dlb}
{
// make "ring of damage"
do_uncurse_item( mitm[p] );
mitm[p].plus = 0;
mitm[p].plus2 += 2;
}
}
}
// All jewellery base types should now work. -- bwr
if (allow_uniques == 1 && item_level > 2
&& random2(2000) <= 100 + (item_level * 3) && coinflip())
{
make_item_randart( mitm[p] );
break;
}
// rings of hunger and teleportation are always cursed {dlb}:
if (mitm[p].sub_type == RING_HUNGER
|| mitm[p].sub_type == RING_TELEPORTATION
|| one_chance_in(50))
{
do_curse_item( mitm[p] );
}
break;
case OBJ_BOOKS:
do
{
mitm[p].sub_type = random2(NUM_BOOKS);
if (mitm[p].sub_type != BOOK_DESTRUCTION &&
mitm[p].sub_type != BOOK_MANUAL &&
book_rarity(mitm[p].sub_type) != 100 &&
one_chance_in(10))
{
mitm[p].sub_type = coinflip() ? BOOK_WIZARDRY : BOOK_POWER;
}
if (!one_chance_in(100) &&
random2(item_level+1) + 1 < book_rarity(mitm[p].sub_type))
{
mitm[p].sub_type = BOOK_DESTRUCTION; // continue trying
}
}
while (mitm[p].sub_type == BOOK_DESTRUCTION ||
mitm[p].sub_type == BOOK_MANUAL ||
book_rarity(mitm[p].sub_type) == 100);
mitm[p].special = random2(5);
if (one_chance_in(10))
mitm[p].special += random2(8) * 10;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
quant = 1;
// tome of destruction : rare!
if (force_type == BOOK_DESTRUCTION
|| (random2(7000) <= item_level + 20 && item_level > 10
&& force_type == OBJ_RANDOM))
{
mitm[p].sub_type = BOOK_DESTRUCTION;
}
// skill manuals - also rare
// fixed to generate manuals for *all* extant skills - 14mar2000 {dlb}
if (force_type == BOOK_MANUAL
|| (random2(4000) <= item_level + 20 && item_level > 6
&& force_type == OBJ_RANDOM))
{
mitm[p].sub_type = BOOK_MANUAL;
if (one_chance_in(4))
{
mitm[p].plus = SK_SPELLCASTING
+ random2(NUM_SKILLS - SK_SPELLCASTING);
}
else
{
mitm[p].plus = random2(SK_UNARMED_COMBAT);
if (mitm[p].plus == SK_UNUSED_1)
mitm[p].plus = SK_UNARMED_COMBAT;
}
}
break;
case OBJ_STAVES: // this can be parsed, too {dlb}
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
else
{
mitm[p].sub_type = random2(13);
// top three non-spell staves are in separate block -- bwr
if (mitm[p].sub_type >= 10)
mitm[p].sub_type = STAFF_AIR + mitm[p].sub_type - 10;
// spell staves
if (one_chance_in(10))
mitm[p].sub_type = STAFF_SMITING + random2(10);
if ((mitm[p].sub_type == STAFF_ENERGY
|| mitm[p].sub_type == STAFF_CHANNELING) && one_chance_in(4))
{
mitm[p].sub_type = coinflip() ? STAFF_WIZARDRY : STAFF_POWER;
}
}
mitm[p].special = random2(NUM_STAVE_ADJ);
if (item_is_rod( mitm[p] ))
init_rod_mp( mitm[p] );
quant = 1;
break;
case OBJ_ORBS: // always forced in current setup {dlb}
quant = 1;
if (force_type != OBJ_RANDOM)
mitm[p].sub_type = force_type;
// I think we only have one type of orb now, so ... {dlb}
set_unique_item_status( OBJ_ORBS, mitm[p].sub_type, UNIQ_EXISTS );
break;
// I think these must always be forced, too ... {dlb}
case OBJ_MISCELLANY: //mv: rewrote with use of NUM_MISCELLANY (9 Aug 01)
if (force_type == OBJ_RANDOM)
{
do
mitm[p].sub_type = random2(NUM_MISCELLANY);
while //mv: never generated
((mitm[p].sub_type == MISC_RUNE_OF_ZOT)
|| (mitm[p].sub_type == MISC_HORN_OF_GERYON)
|| (mitm[p].sub_type == MISC_PORTABLE_ALTAR_OF_NEMELEX)
// mv: others are possible but less often
// btw. chances of generating decks are almost the same as
// before, other chances are now distributed more steadily
|| (mitm[p].sub_type == MISC_DECK_OF_POWER && !one_chance_in(12))
|| (mitm[p].sub_type == MISC_DECK_OF_SUMMONINGS && !one_chance_in(3))
|| (mitm[p].sub_type == MISC_DECK_OF_TRICKS && !one_chance_in(3))
|| (mitm[p].sub_type == MISC_DECK_OF_WONDERS && !one_chance_in(3))
);
// filling those silly empty boxes -- bwr
if (mitm[p].sub_type == MISC_EMPTY_EBONY_CASKET
&& !one_chance_in(20))
{
mitm[p].sub_type = MISC_BOX_OF_BEASTS;
}
}
else
{
mitm[p].sub_type = force_type;
}
if (mitm[p].sub_type == MISC_DECK_OF_WONDERS
|| mitm[p].sub_type == MISC_DECK_OF_SUMMONINGS
|| mitm[p].sub_type == MISC_DECK_OF_POWER)
{
mitm[p].plus = 4 + random2(10);
}
if (mitm[p].sub_type == MISC_DECK_OF_TRICKS)
mitm[p].plus = 6 + random2avg(15, 2);
if (mitm[p].sub_type == MISC_RUNE_OF_ZOT)
mitm[p].plus = item_race;
quant = 1;
break; // mv: end of rewrote;
// that is, everything turns to gold if not enumerated above, so ... {dlb}
default:
mitm[p].base_type = OBJ_GOLD;
// Note that acquirement level gold gives much less than the
// price of a scroll of acquirement (520 gold). -- bwr
if (item_level == MAKE_GOOD_ITEM)
quant = 50 + random2avg(100, 2) + random2avg(100, 2);
else
quant = 1 + random2avg(19, 2) + random2(item_level);
break;
}
mitm[p].quantity = quant;
// should really only be used for monster inventories.
if (dont_place)
{
mitm[p].x = 0;
mitm[p].y = 0;
mitm[p].link = NON_ITEM;
}
else
{
int tries = 500;
do
{
if (tries-- <= 0)
{
destroy_item(p);
return (NON_ITEM);
}
x_pos = random2(GXM);
y_pos = random2(GYM);
}
while (grd[x_pos][y_pos] != DNGN_FLOOR
|| !unforbidden(coord_def(x_pos, y_pos), forbidden));
move_item_to_grid( &p, x_pos, y_pos );
}
item_colour( mitm[p] );
// Okay, this check should be redundant since the purpose of
// this function is to create valid items. Still, we're adding
// this safety for fear that a report of Trog giving a non-existant
// item might symbolize something more serious. -- bwr
return (is_valid_item( mitm[p] ) ? p : NON_ITEM);
} // end items()
static void give_monster_item(monsters *mon, int thing, bool force_item = false)
{
item_def &mthing = mitm[thing];
mthing.x = 0;
mthing.y = 0;
mthing.link = NON_ITEM;
unset_ident_flags(mthing, ISFLAG_IDENT_MASK);
switch (mthing.base_type)
{
case OBJ_WEAPONS:
{
const int slot = mon->inv[MSLOT_WEAPON] == NON_ITEM? 0 : 1;
mon->inv[slot] = thing;
break;
}
case OBJ_MISSILES:
mon->inv[MSLOT_MISSILE] = thing;
break;
case OBJ_SCROLLS:
mon->inv[MSLOT_SCROLL] = thing;
break;
case OBJ_GOLD:
mon->inv[MSLOT_GOLD] = thing;
break;
case OBJ_POTIONS:
mon->inv[MSLOT_POTION] = thing;
break;
case OBJ_MISCELLANY:
mon->inv[MSLOT_MISCELLANY] = thing;
break;
case OBJ_WANDS:
mon->inv[MSLOT_WAND] = thing;
break;
case OBJ_ARMOUR:
{
mon->inv[MSLOT_ARMOUR] = thing;
mon->ac += property( mthing, PARM_AC );
const int armour_plus = mthing.plus;
ASSERT(abs(armour_plus) < 20);
if (abs(armour_plus) < 20)
mon->ac += armour_plus;
mon->ev += property( mthing, PARM_EVASION ) / 2;
if (mon->ev < 1)
mon->ev = 1; // This *shouldn't* happen.
break;
}
default:
break;
}
const mon_holy_type mholy = mons_holiness(mon);
if (get_weapon_brand( mthing ) == SPWPN_PROTECTION )
mon->ac += 5;
else if (get_weapon_brand(mthing) == SPWPN_DISRUPTION
&& mholy == MH_UNDEAD)
{
set_item_ego_type( mthing, OBJ_WEAPONS, SPWPN_NORMAL );
}
else if (get_weapon_brand(mthing) == SPWPN_HOLY_WRATH
&& (mholy == MH_UNDEAD || mholy == MH_DEMONIC))
{
set_item_ego_type( mthing, OBJ_WEAPONS, SPWPN_NORMAL );
}
if (!force_item || mthing.colour == BLACK)
item_colour( mthing );
}
static void give_scroll(monsters *mon, int level)
{
//mv - give scroll
if (mons_is_unique( mon->type ) && one_chance_in(3))
{
const int thing_created =
items(0, OBJ_SCROLLS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static void give_wand(monsters *mon, int level)
{
//mv - give wand
if (mons_is_unique( mon->type ) && one_chance_in(5))
{
const int thing_created =
items(0, OBJ_WANDS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
// don't give top-tier wands before 5 HD
if ( mon->hit_dice < 5 )
{
// technically these wands will be undercharged, but it
// doesn't really matter
if ( mitm[thing_created].sub_type == WAND_FIRE )
mitm[thing_created].sub_type = WAND_FLAME;
if ( mitm[thing_created].sub_type == WAND_COLD )
mitm[thing_created].sub_type = WAND_FROST;
if ( mitm[thing_created].sub_type == WAND_LIGHTNING )
mitm[thing_created].sub_type = (coinflip() ?
WAND_FLAME : WAND_FROST);
}
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static void give_potion(monsters *mon, int level)
{
//mv - give potion
if (mons_is_unique( mon->type ) && one_chance_in(3))
{
const int thing_created =
items(0, OBJ_POTIONS, OBJ_RANDOM, true, level, 0);
if (thing_created == NON_ITEM)
return;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
}
}
static int give_weapon(monsters *mon, int level)
{
const int bp = get_item_slot();
bool force_item = false;
if (bp == NON_ITEM)
return (MAKE_ITEM_RANDOM_RACE);
item_def &item = mitm[bp];
int item_race = MAKE_ITEM_RANDOM_RACE;
// this flags things to "goto give_armour" below ... {dlb}
item.base_type = 101;
if (mon->type == MONS_DANCING_WEAPON
&& player_in_branch( BRANCH_HALL_OF_BLADES ))
{
level = MAKE_GOOD_ITEM;
}
// moved setting of quantity here to keep it in mind {dlb}
int iquan = 1;
// I wonder if this is even used, given calls to item() {dlb}
switch (mon->type)
{
case MONS_KOBOLD:
// a few of the smarter kobolds have blowguns.
if (one_chance_in(10) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BLOWGUN;
break;
}
// intentional fallthrough
case MONS_BIG_KOBOLD:
if (random2(5) < 3) // give hand weapon
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(5);
item.sub_type = ((temp_rand > 2) ? WPN_DAGGER : // 40%
(temp_rand > 0) ? WPN_SHORT_SWORD // 40%
: WPN_CLUB); // 20%
}
else if (random2(5) < 2) // give darts
{
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_MISSILES;
item.sub_type = MI_DART;
iquan = 1 + random2(5);
}
else
return (item_race);
break;
case MONS_HOBGOBLIN:
if (one_chance_in(3))
item_race = MAKE_ITEM_ORCISH;
if (random2(5) < 3) // give hand weapon
{
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_CLUB;
}
else
return (item_race);
break;
case MONS_GOBLIN:
if (one_chance_in(3))
item_race = MAKE_ITEM_ORCISH;
if (one_chance_in(12) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.base_type = WPN_BLOWGUN;
break;
}
// deliberate fall through {dlb}
case MONS_JESSICA:
case MONS_IJYB:
if (random2(5) < 3) // < 1 // give hand weapon
{
item.base_type = OBJ_WEAPONS;
item.sub_type = (coinflip() ? WPN_DAGGER : WPN_CLUB);
}
else
return (item_race);
break;
case MONS_WIGHT:
case MONS_NORRIS:
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(6) ? WPN_WAR_AXE + random2(4)
: WPN_MACE + random2(12));
if (coinflip())
{
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.plus += 1 + random2(3);
item.plus2 += 1 + random2(3);
if (one_chance_in(5))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FREEZING );
}
if (one_chance_in(3))
do_curse_item( item );
break;
case MONS_GNOLL:
case MONS_OGRE_MAGE:
case MONS_NAGA_WARRIOR:
case MONS_GREATER_NAGA:
case MONS_EDMUND:
case MONS_DUANE:
item_race = MAKE_ITEM_NO_RACE;
if (!one_chance_in(5))
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(5);
item.sub_type = ((temp_rand > 2) ? WPN_SPEAR : // 40%
(temp_rand == 2) ? WPN_FLAIL : // 20%
(temp_rand == 1) ? WPN_HALBERD // 20%
: WPN_CLUB); // 20%
}
break;
case MONS_ORC:
if (one_chance_in(15) && level > 1)
{
item.base_type = OBJ_WEAPONS;
item.base_type = WPN_BLOWGUN;
break;
}
// deliberate fall through {gdl}
case MONS_ORC_PRIEST:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {gdl}
case MONS_TERENCE:
case MONS_DRACONIAN:
case MONS_DRACONIAN_ZEALOT:
if (!one_chance_in(5))
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(240);
item.sub_type = ((temp_rand > 209) ? WPN_DAGGER : //12.50%
(temp_rand > 179) ? WPN_CLUB : //12.50%
(temp_rand > 152) ? WPN_FLAIL : //11.25%
(temp_rand > 128) ? WPN_HAND_AXE : //10.00%
(temp_rand > 108) ? WPN_HAMMER : // 8.33%
(temp_rand > 88) ? WPN_HALBERD : // 8.33%
(temp_rand > 68) ? WPN_SHORT_SWORD : // 8.33%
(temp_rand > 48) ? WPN_MACE : // 8.33%
(temp_rand > 38) ? WPN_WHIP : // 4.17%
(temp_rand > 28) ? WPN_TRIDENT : // 4.17%
(temp_rand > 18) ? WPN_FALCHION : // 4.17%
(temp_rand > 8) ? WPN_MORNINGSTAR : // 4.17%
(temp_rand > 2) ? WPN_WAR_AXE // 2.50%
: WPN_SPIKED_FLAIL);// 1.25%
}
else
return (item_race);
break;
case MONS_DEEP_ELF_FIGHTER:
case MONS_DEEP_ELF_HIGH_PRIEST:
case MONS_DEEP_ELF_KNIGHT:
case MONS_DEEP_ELF_PRIEST:
case MONS_DEEP_ELF_SOLDIER:
{
item_race = MAKE_ITEM_ELVEN;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(100);
item.sub_type = ((temp_rand > 79) ? WPN_LONG_SWORD : // 20%
(temp_rand > 59) ? WPN_SHORT_SWORD : // 20%
(temp_rand > 45) ? WPN_SCIMITAR : // 14%
(temp_rand > 31) ? WPN_MACE : // 14%
(temp_rand > 18) ? WPN_BOW : // 13%
(temp_rand > 5) ? WPN_HAND_CROSSBOW // 13%
: WPN_LONGBOW); // 6%
break;
}
case MONS_DEEP_ELF_ANNIHILATOR:
case MONS_DEEP_ELF_CONJURER:
case MONS_DEEP_ELF_DEATH_MAGE:
case MONS_DEEP_ELF_DEMONOLOGIST:
case MONS_DEEP_ELF_MAGE:
case MONS_DEEP_ELF_SORCERER:
case MONS_DEEP_ELF_SUMMONER:
case MONS_DRACONIAN_SHIFTER:
case MONS_DRACONIAN_SCORCHER:
case MONS_DRACONIAN_ANNIHILATOR:
case MONS_DRACONIAN_CALLER:
{
if (mons_genus(mon->type) != MONS_DRACONIAN)
item_race = MAKE_ITEM_ELVEN;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(6);
item.sub_type = ((temp_rand > 3) ? WPN_LONG_SWORD : // 2 in 6
(temp_rand > 2) ? WPN_SHORT_SWORD :// 1 in 6
(temp_rand > 1) ? WPN_SABRE : // 1 in 6
(temp_rand > 0) ? WPN_DAGGER // 1 in 6
: WPN_WHIP); // 1 in 6
break;
}
case MONS_ORC_WARRIOR:
case MONS_ORC_HIGH_PRIEST:
case MONS_BLORK_THE_ORC:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through {dlb}
case MONS_DANCING_WEAPON: // give_level may have been adjusted above
case MONS_FRANCES:
case MONS_FRANCIS:
case MONS_HAROLD:
case MONS_JOSEPH:
case MONS_LOUISE:
case MONS_MICHAEL:
case MONS_NAGA:
case MONS_NAGA_MAGE:
case MONS_RUPERT:
case MONS_SKELETAL_WARRIOR:
case MONS_WAYNE:
case MONS_PALE_DRACONIAN:
case MONS_RED_DRACONIAN:
case MONS_WHITE_DRACONIAN:
case MONS_GREEN_DRACONIAN:
case MONS_MOTTLED_DRACONIAN:
case MONS_BLACK_DRACONIAN:
case MONS_YELLOW_DRACONIAN:
case MONS_PURPLE_DRACONIAN:
case MONS_TIAMAT:
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(120);
item.sub_type = ((temp_rand > 109) ? WPN_LONG_SWORD : // 8.33%
(temp_rand > 99) ? WPN_SHORT_SWORD : // 8.33%
(temp_rand > 89) ? WPN_SCIMITAR : // 8.33%
(temp_rand > 79) ? WPN_BATTLEAXE : // 8.33%
(temp_rand > 69) ? WPN_HAND_AXE : // 8.33%
(temp_rand > 59) ? WPN_HALBERD : // 8.33%
(temp_rand > 49) ? WPN_GLAIVE : // 8.33%
(temp_rand > 39) ? WPN_MORNINGSTAR : // 8.33%
(temp_rand > 29) ? WPN_GREAT_MACE : // 8.33%
(temp_rand > 19) ? WPN_TRIDENT : // 8.33%
(temp_rand > 10) ? WPN_WAR_AXE : // 7.50%
(temp_rand > 1) ? WPN_FLAIL : // 7.50%
(temp_rand > 0) ? WPN_BROAD_AXE // 0.83%
: WPN_SPIKED_FLAIL); // 0.83%
break;
}
case MONS_ORC_WARLORD:
// being at the top has its privileges
if (one_chance_in(3))
level = MAKE_GOOD_ITEM;
// deliberate fall-through
case MONS_ORC_KNIGHT:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through
case MONS_NORBERT:
case MONS_JOZEF:
case MONS_URUG:
case MONS_VAULT_GUARD:
case MONS_VAMPIRE_KNIGHT:
case MONS_DRACONIAN_KNIGHT:
{
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(25);
item.sub_type = ((temp_rand > 20) ? WPN_GREAT_SWORD : // 16%
(temp_rand > 16) ? WPN_LONG_SWORD : // 16%
(temp_rand > 12) ? WPN_BATTLEAXE : // 16%
(temp_rand > 8) ? WPN_WAR_AXE : // 16%
(temp_rand > 5) ? WPN_GREAT_MACE : // 12%
(temp_rand > 3) ? WPN_DIRE_FLAIL : // 8%
(temp_rand > 2) ? WPN_LOCHABER_AXE : // 4%
(temp_rand > 1) ? WPN_GLAIVE : // 4%
(temp_rand > 0) ? WPN_BROAD_AXE // 4%
: WPN_HALBERD); // 4%
if (one_chance_in(4))
item.plus += 1 + random2(3);
break;
}
case MONS_CYCLOPS:
case MONS_STONE_GIANT:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_MISSILES;
item.sub_type = MI_LARGE_ROCK;
break;
case MONS_TWO_HEADED_OGRE:
case MONS_ETTIN:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_GIANT_SPIKED_CLUB
: WPN_GIANT_CLUB);
if (one_chance_in(10) || mon->type == MONS_ETTIN)
{
item.sub_type = ((one_chance_in(10)) ? WPN_DIRE_FLAIL
: WPN_GREAT_MACE);
}
break;
case MONS_REAPER:
level = MAKE_GOOD_ITEM;
// intentional fall-through...
case MONS_SIGMUND:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_SCYTHE;
break;
case MONS_BALRUG:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_DEMON_WHIP;
break;
case MONS_RED_DEVIL:
if (!one_chance_in(3))
{
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_DEMON_TRIDENT
: WPN_TRIDENT);
}
break;
case MONS_OGRE:
case MONS_HILL_GIANT:
case MONS_EROLCHA:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = (one_chance_in(3) ? WPN_GIANT_SPIKED_CLUB
: WPN_GIANT_CLUB);
if (one_chance_in(10))
{
item.sub_type = (one_chance_in(10) ? WPN_DIRE_FLAIL
: WPN_GREAT_MACE);
}
break;
case MONS_CENTAUR:
case MONS_CENTAUR_WARRIOR:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BOW;
if (mon->type == MONS_CENTAUR_WARRIOR
&& one_chance_in(3))
item.sub_type = WPN_LONGBOW;
break;
case MONS_YAKTAUR:
case MONS_YAKTAUR_CAPTAIN:
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_CROSSBOW;
break;
case MONS_EFREET:
case MONS_ERICA:
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_SCIMITAR;
item.plus = random2(5);
item.plus2 = random2(5);
item.colour = RED; // forced by force_item above {dlb}
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
break;
case MONS_ANGEL:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.colour = WHITE; // forced by force_item above {dlb}
set_equip_desc( item, ISFLAG_GLOWING );
if (one_chance_in(3))
{
item.sub_type = (one_chance_in(3) ? WPN_GREAT_MACE : WPN_MACE);
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_HOLY_WRATH );
}
else
{
item.sub_type = WPN_LONG_SWORD;
}
item.plus = 1 + random2(3);
item.plus2 = 1 + random2(3);
break;
case MONS_DAEVA:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.colour = WHITE; // forced by force_item above {dlb}
item.sub_type = (one_chance_in(4) ? WPN_BLESSED_BLADE
: WPN_LONG_SWORD);
set_equip_desc( item, ISFLAG_GLOWING );
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_HOLY_WRATH );
item.plus = 1 + random2(3);
item.plus2 = 1 + random2(3);
break;
case MONS_HELL_KNIGHT:
case MONS_MAUD:
case MONS_FREDERICK:
case MONS_MARGERY:
{
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_LONG_SWORD + random2(3);
if (one_chance_in(7))
item.sub_type = WPN_HALBERD;
if (one_chance_in(7))
item.sub_type = WPN_GLAIVE;
if (one_chance_in(7))
item.sub_type = WPN_GREAT_MACE;
if (one_chance_in(7))
item.sub_type = WPN_BATTLEAXE;
if (one_chance_in(7))
item.sub_type = WPN_WAR_AXE;
if (one_chance_in(7))
item.sub_type = WPN_BROAD_AXE;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_TRIDENT;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_BLADE;
if (one_chance_in(7))
item.sub_type = WPN_DEMON_WHIP;
int temp_rand = random2(3);
set_equip_desc( item, (temp_rand == 1) ? ISFLAG_GLOWING :
(temp_rand == 2) ? ISFLAG_RUNED
: ISFLAG_NO_DESC );
if (one_chance_in(3))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
else if (one_chance_in(3))
{
temp_rand = random2(5);
set_item_ego_type( item, OBJ_WEAPONS,
((temp_rand == 0) ? SPWPN_DRAINING :
(temp_rand == 1) ? SPWPN_VORPAL :
(temp_rand == 2) ? SPWPN_PAIN :
(temp_rand == 3) ? SPWPN_DISTORTION
: SPWPN_SPEED) );
}
item.plus += random2(6);
item.plus2 += random2(6);
item.colour = RED; // forced by force_item above {dlb}
if (one_chance_in(3))
item.colour = DARKGREY;
if (one_chance_in(5))
item.colour = CYAN;
break;
}
case MONS_FIRE_GIANT:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_GREAT_SWORD;
item.plus = 0;
item.plus2 = 0;
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
item.colour = RED; // forced by force_item above {dlb}
if (one_chance_in(3))
item.colour = DARKGREY;
if (one_chance_in(5))
item.colour = CYAN;
break;
case MONS_FROST_GIANT:
force_item = true;
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_BATTLEAXE;
item.plus = 0;
item.plus2 = 0;
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FREEZING );
// forced by force_item above {dlb}
item.colour = (one_chance_in(3) ? WHITE : CYAN);
break;
case MONS_KOBOLD_DEMONOLOGIST:
case MONS_ORC_WIZARD:
case MONS_ORC_SORCERER:
item_race = MAKE_ITEM_ORCISH;
// deliberate fall-through, I guess {dlb}
case MONS_NECROMANCER:
case MONS_WIZARD:
case MONS_PSYCHE:
case MONS_DONALD:
case MONS_JOSEPHINE:
case MONS_AGNES:
item.base_type = OBJ_WEAPONS;
item.sub_type = WPN_DAGGER;
break;
case MONS_CEREBOV:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_SWORD_OF_CEREBOV );
break;
case MONS_DISPATER:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_STAFF_OF_DISPATER );
break;
case MONS_ASMODEUS:
force_item = true;
make_item_fixed_artefact( item, false, SPWPN_SCEPTRE_OF_ASMODEUS );
break;
case MONS_GERYON:
//mv: probably should be moved out of this switch,
//but it's not worth of it, unless we have more
//monsters with misc. items
item.base_type = OBJ_MISCELLANY;
item.sub_type = MISC_HORN_OF_GERYON;
break;
case MONS_SALAMANDER: //mv: new 8 Aug 2001
//Yes, they've got really nice items, but
//it's almost impossible to get them
{
force_item = true;
item_race = MAKE_ITEM_NO_RACE;
item.base_type = OBJ_WEAPONS;
const int temp_rand = random2(6);
item.sub_type = ((temp_rand == 5) ? WPN_GREAT_SWORD :
(temp_rand == 4) ? WPN_TRIDENT :
(temp_rand == 3) ? WPN_SPEAR :
(temp_rand == 2) ? WPN_GLAIVE :
(temp_rand == 1) ? WPN_BOW
: WPN_HALBERD);
if (is_range_weapon(item))
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAME );
else
set_item_ego_type( item, OBJ_WEAPONS, SPWPN_FLAMING );
item.plus = random2(5);
item.plus2 = random2(5);
item.colour = RED; // forced by force_item above {dlb}
break;
}
} // end "switch(mon->type)"
// only happens if something in above switch doesn't set it {dlb}
if (item.base_type == 101)
{
item.base_type = OBJ_UNASSIGNED;
return (item_race);
}
item.x = 0;
item.y = 0;
item.link = NON_ITEM;
if (force_item)
item.quantity = iquan;
else if (mons_is_unique( mon->type ))
{
if (random2(100) <= 9 + mon->hit_dice)
level = MAKE_GOOD_ITEM;
else if (level != MAKE_GOOD_ITEM)
level += 5;
}
const int xitc = item.base_type;
const int xitt = item.sub_type;
// Note this mess, all the work above doesn't mean much unless
// force_item is set... otherwise we're just going to take the
// base and subtypes and create a new item. -- bwr
const int thing_created =
((force_item) ? bp : items( 0, xitc, xitt, true,
level, item_race) );
if (thing_created == NON_ITEM)
return (item_race);
give_monster_item(mon, thing_created, force_item);
return (item_race);
}
static void give_ammo(monsters *mon, int level, int item_race)
{
// mv: gives ammunition
// note that item_race is not reset for this section
if (mon->inv[MSLOT_WEAPON] != NON_ITEM
&& is_range_weapon( mitm[mon->inv[MSLOT_WEAPON]] ))
{
const int xitc = OBJ_MISSILES;
const int xitt = fires_ammo_type(mitm[mon->inv[MSLOT_WEAPON]]);
const int thing_created =
items( 0, xitc, xitt, true, level, item_race );
if (thing_created == NON_ITEM)
return;
// monsters will always have poisoned needles -- otherwise
// they are just going to behave badly --GDL
if (xitt == MI_NEEDLE)
set_item_ego_type(mitm[thing_created], OBJ_MISSILES,
got_curare_roll(level)?
SPMSL_CURARE
: SPMSL_POISONED);
mitm[thing_created].x = 0;
mitm[thing_created].y = 0;
mitm[thing_created].flags = 0;
give_monster_item(mon, thing_created);
} // end if needs ammo
}
void give_armour(monsters *mon, int level)
{
const int bp = get_item_slot();
if (bp == NON_ITEM)
return;
int item_race = MAKE_ITEM_RANDOM_RACE;
int force_colour = 0; //mv: important !!! Items with force_colour = 0
//are colored defaultly after following
//switch. Others will get force_colour.
switch (mon->type)
{
case MONS_DEEP_ELF_ANNIHILATOR:
case MONS_DEEP_ELF_CONJURER:
case MONS_DEEP_ELF_DEATH_MAGE:
case MONS_DEEP_ELF_DEMONOLOGIST:
case MONS_DEEP_ELF_FIGHTER:
case MONS_DEEP_ELF_HIGH_PRIEST:
case MONS_DEEP_ELF_KNIGHT:
case MONS_DEEP_ELF_MAGE:
case MONS_DEEP_ELF_PRIEST:
case MONS_DEEP_ELF_SOLDIER:
case MONS_DEEP_ELF_SORCERER:
case MONS_DEEP_ELF_SUMMONER:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ELVEN;
// deliberate fall through {dlb}
case MONS_IJYB:
case MONS_ORC:
case MONS_ORC_HIGH_PRIEST:
case MONS_ORC_PRIEST:
case MONS_ORC_SORCERER:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {dlb}
case MONS_ERICA:
case MONS_HAROLD:
case MONS_JOSEPH:
case MONS_JOSEPHINE:
case MONS_JOZEF:
case MONS_NORBERT:
case MONS_PSYCHE:
case MONS_TERENCE:
if (random2(5) < 2)
{
mitm[bp].base_type = OBJ_ARMOUR;
switch (random2(8))
{
case 0:
case 1:
case 2:
case 3:
mitm[bp].sub_type = ARM_LEATHER_ARMOUR;
break;
case 4:
case 5:
mitm[bp].sub_type = ARM_RING_MAIL;
break;
case 6:
mitm[bp].sub_type = ARM_SCALE_MAIL;
break;
case 7:
mitm[bp].sub_type = ARM_CHAIN_MAIL;
break;
}
}
else
return;
break;
case MONS_DUANE:
case MONS_EDMUND:
case MONS_RUPERT:
case MONS_URUG:
case MONS_WAYNE:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_LEATHER_ARMOUR + random2(4);
break;
case MONS_ORC_WARLORD:
// being at the top has its privileges
if (one_chance_in(3))
level = MAKE_GOOD_ITEM;
// deliberate fall through
case MONS_ORC_KNIGHT:
case MONS_ORC_WARRIOR:
if (item_race == MAKE_ITEM_RANDOM_RACE)
item_race = MAKE_ITEM_ORCISH;
// deliberate fall through {dlb}
case MONS_FREDERICK:
case MONS_HELL_KNIGHT:
case MONS_LOUISE:
case MONS_MARGERY:
case MONS_MAUD:
case MONS_VAMPIRE_KNIGHT:
case MONS_VAULT_GUARD:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_CHAIN_MAIL + random2(4);
break;
case MONS_ANGEL:
case MONS_SIGMUND:
case MONS_WIGHT:
item_race = MAKE_ITEM_NO_RACE;
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
force_colour = WHITE; //mv: always white
break;
case MONS_NAGA:
case MONS_NAGA_MAGE:
case MONS_NAGA_WARRIOR:
if (!one_chance_in(3))
return;
// deliberate fall through {dlb}
case MONS_DONALD:
case MONS_GREATER_NAGA:
case MONS_JESSICA:
case MONS_KOBOLD_DEMONOLOGIST:
case MONS_OGRE_MAGE:
case MONS_DRACONIAN:
case MONS_RED_DRACONIAN:
case MONS_WHITE_DRACONIAN:
case MONS_GREEN_DRACONIAN:
case MONS_PALE_DRACONIAN:
case MONS_MOTTLED_DRACONIAN:
case MONS_BLACK_DRACONIAN:
case MONS_YELLOW_DRACONIAN:
case MONS_PURPLE_DRACONIAN:
case MONS_DRACONIAN_SHIFTER:
case MONS_DRACONIAN_SCORCHER:
case MONS_DRACONIAN_ANNIHILATOR:
case MONS_DRACONIAN_CALLER:
case MONS_DRACONIAN_MONK:
case MONS_DRACONIAN_ZEALOT:
case MONS_DRACONIAN_KNIGHT:
case MONS_TIAMAT:
case MONS_ORC_WIZARD:
case MONS_WIZARD:
case MONS_BLORK_THE_ORC:
item_race = MAKE_ITEM_NO_RACE;
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
break;
case MONS_BORIS:
level = MAKE_GOOD_ITEM;
// fall-through
case MONS_AGNES:
case MONS_FRANCES:
case MONS_FRANCIS:
case MONS_NECROMANCER:
case MONS_VAMPIRE_MAGE:
mitm[bp].base_type = OBJ_ARMOUR;
mitm[bp].sub_type = ARM_ROBE;
force_colour = DARKGREY; //mv: always darkgrey
break;
default:
return;
} // end of switch(menv [mid].type)
const int xitc = mitm[bp].base_type;
const int xitt = mitm[bp].sub_type;
if (mons_is_unique( mon->type ) && level != MAKE_GOOD_ITEM)
{
if (random2(100) < 9 + mon->hit_dice)
level = MAKE_GOOD_ITEM;
else
level = level * 2 + 5;
}
const int thing_created = items( 0, xitc, xitt, true, level, item_race );
if (thing_created == NON_ITEM)
return;
give_monster_item(mon, thing_created);
//mv: all items with force_colour = 0 are colored via items().
if (force_colour)
mitm[thing_created].colour = force_colour;
}
void give_item(int mid, int level_number) //mv: cleanup+minor changes
{
monsters *mons = &menv[mid];
give_scroll(mons, level_number);
give_wand(mons, level_number);
give_potion(mons, level_number);
const int item_race = give_weapon(mons, level_number);
give_ammo(mons, level_number, item_race);
give_armour(mons, 1 + level_number / 2);
} // end give_item()
//---------------------------------------------------------------------------
// PRIVATE HELPER FUNCTIONS
//---------------------------------------------------------------------------
static bool is_weapon_special(int the_weapon)
{
return (mitm[the_weapon].special != SPWPN_NORMAL);
} // end is_weapon_special()
static void set_weapon_special(int the_weapon, int spwpn)
{
set_item_ego_type( mitm[the_weapon], OBJ_WEAPONS, spwpn );
} // end set_weapon_special()
static int exciting_colour()
{
switch(random2(4))
{
case 0: return YELLOW;
case 1: return LIGHTGREEN;
case 2: return LIGHTRED;
case 3: return LIGHTMAGENTA;
default: return MAGENTA;
}
}
static int newwave_weapon_colour(const item_def &item)
{
int item_colour = BLACK;
// fixed artefacts get predefined colours
std::string itname = item_name( item, DESC_PLAIN );
lowercase(itname);
const bool item_runed = itname.find(" runed ") != std::string::npos;
const bool heav_runed = itname.find(" heavily ") != std::string::npos;
if ( is_random_artefact(item) && (!item_runed || heav_runed) )
return exciting_colour();
if (is_range_weapon( item ))
{
switch (range_skill(item))
{
case SK_BOWS:
item_colour = BLUE;
break;
case SK_CROSSBOWS:
item_colour = LIGHTBLUE;
break;
case SK_DARTS:
item_colour = WHITE;
break;
case SK_SLINGS:
item_colour = BROWN;
break;
default:
// huh?
item_colour = MAGENTA;
break;
}
}
else
{
switch (weapon_skill(item))
{
case SK_SHORT_BLADES:
item_colour = CYAN;
break;
case SK_LONG_SWORDS:
item_colour = LIGHTCYAN;
break;
case SK_AXES:
item_colour = DARKGREY;
break;
case SK_MACES_FLAILS:
item_colour = LIGHTGREY;
break;
case SK_POLEARMS:
item_colour = RED;
break;
case SK_STAVES:
item_colour = GREEN;
break;
default:
// huh?
item_colour = random_colour();
break;
}
}
return (item_colour);
}
static int classic_weapon_colour(const item_def &item)
{
int item_colour = BLACK;
if (is_range_weapon( item ))
item_colour = BROWN;
else
{
switch (item.sub_type)
{
case WPN_CLUB:
case WPN_GIANT_CLUB:
case WPN_GIANT_SPIKED_CLUB:
case WPN_ANCUS:
case WPN_WHIP:
case WPN_QUARTERSTAFF:
item_colour = BROWN;
break;
case WPN_QUICK_BLADE:
item_colour = LIGHTBLUE;
break;
case WPN_EXECUTIONERS_AXE:
item_colour = RED;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
}
return (item_colour);
}
static int weapon_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_weapon_colour(item) : newwave_weapon_colour(item));
}
static int newwave_missile_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case MI_STONE:
case MI_LARGE_ROCK:
item_colour = BROWN;
break;
case MI_ARROW:
item_colour = BLUE;
break;
case MI_NEEDLE:
item_colour = WHITE;
break;
case MI_BOLT:
item_colour = LIGHTBLUE;
break;
case MI_DART:
item_colour = CYAN;
break;
default:
// huh?
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int classic_missile_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case MI_STONE:
case MI_LARGE_ROCK:
case MI_ARROW:
item_colour = BROWN;
break;
case MI_NEEDLE:
item_colour = WHITE;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int missile_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_missile_colour(item) : newwave_missile_colour(item));
}
static int newwave_armour_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case ARM_CLOAK:
item_colour = WHITE;
break;
case ARM_NAGA_BARDING:
item_colour = LIGHTGREEN;
break;
case ARM_CENTAUR_BARDING:
item_colour = GREEN;
break;
case ARM_ROBE:
case ARM_CAP:
item_colour = random_uncommon_colour();
break;
case ARM_HELMET:
//caps and wizard's hats are random coloured
if (get_helmet_type(item) == THELM_CAP
|| get_helmet_type(item) == THELM_WIZARD_HAT)
{
item_colour = random_uncommon_colour();
}
else
item_colour = DARKGREY;
break;
case ARM_BOOTS:
item_colour = BLUE;
break;
case ARM_GLOVES:
item_colour = LIGHTBLUE;
break;
case ARM_LEATHER_ARMOUR:
item_colour = BROWN;
break;
case ARM_CRYSTAL_PLATE_MAIL:
item_colour = WHITE;
break;
case ARM_ANIMAL_SKIN:
item_colour = YELLOW;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int classic_armour_colour(const item_def &item)
{
int item_colour = BLACK;
switch (item.sub_type)
{
case ARM_CLOAK:
case ARM_ROBE:
case ARM_NAGA_BARDING:
case ARM_CENTAUR_BARDING:
case ARM_CAP:
item_colour = random_colour();
break;
case ARM_HELMET:
// caps and wizard's hats are random coloured
if (get_helmet_type(item) == THELM_CAP
|| get_helmet_type(item) == THELM_WIZARD_HAT)
{
item_colour = random_colour();
}
else
item_colour = LIGHTCYAN;
break;
case ARM_BOOTS: // maybe more interesting boot colours?
case ARM_GLOVES:
case ARM_LEATHER_ARMOUR:
item_colour = BROWN;
break;
case ARM_CRYSTAL_PLATE_MAIL:
item_colour = LIGHTGREY;
break;
case ARM_ANIMAL_SKIN:
item_colour = BROWN;
break;
default:
item_colour = LIGHTCYAN;
if (get_equip_race(item) == ISFLAG_DWARVEN)
item_colour = CYAN;
break;
}
return (item_colour);
}
static int armour_colour(const item_def &item)
{
return (Options.classic_item_colours?
classic_armour_colour(item) : newwave_armour_colour(item));
}
void item_colour( item_def &item )
{
int switchnum = 0;
int temp_value;
switch (item.base_type)
{
case OBJ_WEAPONS:
if (is_unrandom_artefact( item ))
break; // unrandarts already coloured
if (is_fixed_artefact( item ))
{
switch (item.special) // was: - 180, but that is *wrong* {dlb}
{
case SPWPN_SINGING_SWORD:
case SPWPN_SCEPTRE_OF_TORMENT:
item.colour = YELLOW;
break;
case SPWPN_WRATH_OF_TROG:
case SPWPN_SWORD_OF_POWER:
item.colour = RED;
break;
case SPWPN_SCYTHE_OF_CURSES:
item.colour = DARKGREY;
break;
case SPWPN_MACE_OF_VARIABILITY:
item.colour = random_colour();
break;
case SPWPN_GLAIVE_OF_PRUNE:
item.colour = MAGENTA;
break;
case SPWPN_SWORD_OF_ZONGULDROK:
item.colour = LIGHTGREY;
break;
case SPWPN_KNIFE_OF_ACCURACY:
item.colour = LIGHTCYAN;
break;
case SPWPN_STAFF_OF_OLGREB:
item.colour = GREEN;
break;
case SPWPN_VAMPIRES_TOOTH:
item.colour = WHITE;
break;
case SPWPN_STAFF_OF_WUCAD_MU:
item.colour = BROWN;
break;
}
break;
}
if (is_demonic( item ))
item.colour = random_uncommon_colour();
else
item.colour = weapon_colour(item);
if (is_random_artefact( item ) && one_chance_in(5)
&& Options.classic_item_colours)
item.colour = random_colour();
break;
case OBJ_MISSILES:
item.colour = missile_colour(item);
break;
case OBJ_ARMOUR:
if (is_unrandom_artefact( item ))
break; /* unrandarts have already been coloured */
switch (item.sub_type)
{
case ARM_DRAGON_HIDE:
case ARM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_DRAGON );
break;
case ARM_TROLL_HIDE:
case ARM_TROLL_LEATHER_ARMOUR:
item.colour = mons_class_colour( MONS_TROLL );
break;
case ARM_ICE_DRAGON_HIDE:
case ARM_ICE_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_ICE_DRAGON );
break;
case ARM_STEAM_DRAGON_HIDE:
case ARM_STEAM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_STEAM_DRAGON );
break;
case ARM_MOTTLED_DRAGON_HIDE:
case ARM_MOTTLED_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_MOTTLED_DRAGON );
break;
case ARM_STORM_DRAGON_HIDE:
case ARM_STORM_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_STORM_DRAGON );
break;
case ARM_GOLD_DRAGON_HIDE:
case ARM_GOLD_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_GOLDEN_DRAGON );
break;
case ARM_SWAMP_DRAGON_HIDE:
case ARM_SWAMP_DRAGON_ARMOUR:
item.colour = mons_class_colour( MONS_SWAMP_DRAGON );
break;
default:
item.colour = armour_colour(item);
break;
}
// I don't think this is ever done -- see start of case {dlb}:
if (is_random_artefact( item ) && one_chance_in(5))
item.colour = random_colour();
break;
case OBJ_WANDS:
item.special = you.item_description[IDESC_WANDS][item.sub_type];
switch (item.special % 12)
{
case 0: //"iron wand"
item.colour = CYAN;
break;
case 1: //"brass wand"
case 5: //"gold wand"
item.colour = YELLOW;
break;
case 2: //"bone wand"
case 8: //"ivory wand"
case 9: //"glass wand"
case 10: //"lead wand"
default:
item.colour = LIGHTGREY;
break;
case 3: //"wooden wand"
case 4: //"copper wand"
case 7: //"bronze wand"
item.colour = BROWN;
break;
case 6: //"silver wand"
item.colour = WHITE;
break;
case 11: //"plastic wand"
item.colour = random_colour();
break;
}
if (item.special / 12 == 9)
item.colour = DARKGREY;
// rare wands (eg disintegration - these will be very rare):
// maybe only 1 thing, like: crystal, shining, etc.
break;
case OBJ_POTIONS:
item.special = you.item_description[IDESC_POTIONS][item.sub_type];
switch (item.special % 14)
{
case 0: //"clear potion"
default:
item.colour = LIGHTGREY;
break;
case 1: //"blue potion"
case 7: //"inky potion"
item.colour = BLUE;
break;
case 2: //"black potion"
item.colour = DARKGREY;
break;
case 3: //"silvery potion"
case 13: //"white potion"
item.colour = WHITE;
break;
case 4: //"cyan potion"
item.colour = CYAN;
break;
case 5: //"purple potion"
item.colour = MAGENTA;
break;
case 6: //"orange potion"
item.colour = LIGHTRED;
break;
case 8: //"red potion"
item.colour = RED;
break;
case 9: //"yellow potion"
item.colour = YELLOW;
break;
case 10: //"green potion"
item.colour = GREEN;
break;
case 11: //"brown potion"
item.colour = BROWN;
break;
case 12: //"pink potion"
item.colour = LIGHTMAGENTA;
break;
}
break;
case OBJ_FOOD:
switch (item.sub_type)
{
case FOOD_BEEF_JERKY:
case FOOD_BREAD_RATION:
case FOOD_LYCHEE:
case FOOD_MEAT_RATION:
case FOOD_RAMBUTAN:
case FOOD_SAUSAGE:
case FOOD_SULTANA:
item.colour = BROWN;
break;
case FOOD_BANANA:
case FOOD_CHEESE:
case FOOD_HONEYCOMB:
case FOOD_LEMON:
case FOOD_PIZZA:
case FOOD_ROYAL_JELLY:
item.colour = YELLOW;
break;
case FOOD_PEAR:
item.colour = LIGHTGREEN;
break;
case FOOD_CHOKO:
case FOOD_SNOZZCUMBER:
item.colour = GREEN;
break;
case FOOD_APRICOT:
case FOOD_ORANGE:
item.colour = LIGHTRED;
break;
case FOOD_STRAWBERRY:
item.colour = RED;
break;
case FOOD_APPLE:
item.colour = (coinflip() ? RED : GREEN);
break;
case FOOD_GRAPE:
item.colour = (coinflip() ? MAGENTA : GREEN);
break;
case FOOD_CHUNK:
// set the appropriate colour of the meat:
temp_value = mons_class_colour( item.plus );
item.colour = (temp_value == BLACK) ? LIGHTRED : temp_value;
break;
default:
item.colour = BROWN;
}
break;
case OBJ_JEWELLERY:
/* unrandarts have already been coloured */
if (is_unrandom_artefact( item ))
break;
else if (is_random_artefact( item ))
{
item.colour = random_colour();
break;
}
item.colour = YELLOW;
item.special = you.item_description[IDESC_RINGS][item.sub_type];
switchnum = item.special % 13;
switch (switchnum)
{
case 0:
case 5:
item.colour = BROWN;
break;
case 1:
case 8:
case 11:
item.colour = LIGHTGREY;
break;
case 2:
case 6:
item.colour = YELLOW;
break;
case 3:
case 4:
item.colour = CYAN;
break;
case 7:
item.colour = BROWN;
break;
case 9:
case 10:
item.colour = WHITE;
break;
case 12:
item.colour = GREEN;
break;
case 13:
item.colour = LIGHTCYAN;
break;
}
if (item.sub_type >= AMU_RAGE)
{
switch (switchnum)
{
case 0: //"zirconium amulet"
case 9: //"ivory amulet"
case 11: //"platinum amulet"
item.colour = WHITE;
break;
case 1: //"sapphire amulet"
item.colour = LIGHTBLUE;
break;
case 2: //"golden amulet"
case 6: //"brass amulet"
item.colour = YELLOW;
break;
case 3: //"emerald amulet"
item.colour = GREEN;
break;
case 4: //"garnet amulet"
case 8: //"ruby amulet"
item.colour = RED;
break;
case 5: //"bronze amulet"
case 7: //"copper amulet"
item.colour = BROWN;
break;
case 10: //"bone amulet"
item.colour = LIGHTGREY;
break;
case 12: //"jade amulet"
item.colour = GREEN;
break;
case 13: //"plastic amulet"
item.colour = random_colour();
}
}
// blackened - same for both rings and amulets
if (item.special / 13 == 5)
item.colour = DARKGREY;
break;
case OBJ_SCROLLS:
item.colour = LIGHTGREY;
item.special = you.item_description[IDESC_SCROLLS][item.sub_type];
item.plus = you.item_description[IDESC_SCROLLS_II][item.sub_type];
break;
case OBJ_BOOKS:
switch (item.special % 10)
{
case 0:
case 1:
default:
item.colour = random_colour();
break;
case 2:
item.colour = (one_chance_in(3) ? BROWN : DARKGREY);
break;
case 3:
item.colour = CYAN;
break;
case 4:
item.colour = LIGHTGREY;
break;
}
break;
case OBJ_STAVES:
item.colour = BROWN;
break;
case OBJ_ORBS:
item.colour = LIGHTMAGENTA;
break;
case OBJ_MISCELLANY:
switch (item.sub_type)
{
case MISC_BOTTLED_EFREET:
case MISC_STONE_OF_EARTH_ELEMENTALS:
item.colour = BROWN;
break;
case MISC_AIR_ELEMENTAL_FAN:
case MISC_CRYSTAL_BALL_OF_ENERGY:
case MISC_CRYSTAL_BALL_OF_FIXATION:
case MISC_CRYSTAL_BALL_OF_SEEING:
case MISC_DISC_OF_STORMS:
case MISC_HORN_OF_GERYON:
case MISC_LANTERN_OF_SHADOWS:
item.colour = LIGHTGREY;
break;
case MISC_LAMP_OF_FIRE:
item.colour = YELLOW;
break;
case MISC_BOX_OF_BEASTS:
item.colour = DARKGREY;
break;
case MISC_RUNE_OF_ZOT:
switch (item.plus)
{
case RUNE_DIS: // iron
item.colour = CYAN;
break;
case RUNE_COCYTUS: // icy
item.colour = LIGHTBLUE;
break;
case RUNE_TARTARUS: // bone
item.colour = WHITE;
break;
case RUNE_SLIME_PITS: // slimy
item.colour = GREEN;
break;
case RUNE_SNAKE_PIT: // serpentine
case RUNE_ELVEN_HALLS: // elven
item.colour = LIGHTGREEN;
break;
case RUNE_VAULTS: // silver
item.colour = LIGHTGREY;
break;
case RUNE_TOMB: // golden
item.colour = YELLOW;
break;
case RUNE_SWAMP: // decaying
item.colour = BROWN;
break;
case RUNE_ISLANDS:
item.colour = BLUE; // liquid
// These two are hardly unique, but since colour isn't used for
// stacking, so we don't have to worry to much about this. -- bwr
case RUNE_DEMONIC: // random pandemonium demonlords
case RUNE_ABYSSAL: // random in abyss
item.colour = random_colour();
break;
case RUNE_MNOLEG: // glowing
item.colour = coinflip() ? MAGENTA : LIGHTMAGENTA;
break;
case RUNE_LOM_LOBON: // magical
item.colour = BLUE;
break;
case RUNE_CEREBOV: // fiery
item.colour = coinflip() ? RED : LIGHTRED;
break;
case RUNE_GEHENNA: // obsidian
case RUNE_GLOORX_VLOQ: // dark
default:
item.colour = DARKGREY;
break;
}
break;
case MISC_EMPTY_EBONY_CASKET:
item.colour = DARKGREY;
break;
case MISC_DECK_OF_SUMMONINGS:
case MISC_DECK_OF_WONDERS:
case MISC_DECK_OF_TRICKS:
case MISC_DECK_OF_POWER:
default:
item.colour = random_colour();
break;
}
break;
case OBJ_CORPSES:
// set the appropriate colour of the body:
temp_value = mons_class_colour( item.plus );
item.colour = (temp_value == BLACK) ? LIGHTRED : temp_value;
break;
case OBJ_GOLD:
item.colour = YELLOW;
break;
}
} // end item_colour()