summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/abyss.cc1
-rw-r--r--crawl-ref/source/acr.cc1
-rw-r--r--crawl-ref/source/debug.cc1
-rw-r--r--crawl-ref/source/dungeon.cc3861
-rw-r--r--crawl-ref/source/dungeon.h27
-rw-r--r--crawl-ref/source/effects.cc3
-rw-r--r--crawl-ref/source/makefile.obj1
-rw-r--r--crawl-ref/source/makeitem.cc3870
-rw-r--r--crawl-ref/source/makeitem.h14
-rw-r--r--crawl-ref/source/misc.cc1
-rw-r--r--crawl-ref/source/monplace.cc3
-rw-r--r--crawl-ref/source/monstuff.cc5
-rw-r--r--crawl-ref/source/newgame.cc3
-rw-r--r--crawl-ref/source/religion.cc3
-rw-r--r--crawl-ref/source/spells4.cc1
15 files changed, 3902 insertions, 3893 deletions
diff --git a/crawl-ref/source/abyss.cc b/crawl-ref/source/abyss.cc
index e20875375c..68b64edfcc 100644
--- a/crawl-ref/source/abyss.cc
+++ b/crawl-ref/source/abyss.cc
@@ -19,6 +19,7 @@
#include "externs.h"
#include "cloud.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "mtransit.h"
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 0442ede796..e711d91f4c 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -96,6 +96,7 @@
#include "items.h"
#include "lev-pand.h"
#include "macro.h"
+#include "makeitem.h"
#include "maps.h"
#include "misc.h"
#include "monplace.h"
diff --git a/crawl-ref/source/debug.cc b/crawl-ref/source/debug.cc
index 5423c874f9..2243dabc0e 100644
--- a/crawl-ref/source/debug.cc
+++ b/crawl-ref/source/debug.cc
@@ -45,6 +45,7 @@
#include "itemprop.h"
#include "item_use.h"
#include "items.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "monstuff.h"
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 8597e53ac3..1c40e0e0d1 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -41,6 +41,7 @@
#include "itemname.h"
#include "itemprop.h"
#include "items.h"
+#include "makeitem.h"
#include "mapdef.h"
#include "maps.h"
#include "misc.h"
@@ -141,8 +142,6 @@ static object_class_type item_in_shop(unsigned char shop_type);
static bool treasure_area(int level_number, unsigned char ta1_x,
unsigned char ta2_x, unsigned char ta1_y,
unsigned char ta2_y);
-static bool is_weapon_special(int the_weapon);
-static void set_weapon_special(int the_weapon, int spwpn);
static void big_room(int level_number);
static void chequerboard(spec_room &sr, unsigned char target,
unsigned char floor1, unsigned char floor2);
@@ -188,18 +187,6 @@ static std::string level_name(int subdepth)
you.where_are_you, subdepth, you.level_type ) );
}
-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 void place_altars()
{
// No altars before level 5.
@@ -591,3073 +578,6 @@ static void build_dungeon_level(int level_number, int level_type)
prepare_water( level_number );
} // end builder()
-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 void check_doors()
{
for (int x = 1; x < GXM-1; x++)
@@ -6771,785 +3691,6 @@ static void many_pools(unsigned char pool_type)
while (pools < no_pools);
} // end many_pools()
-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()
-
//jmf: generate altar based on where you are, or possibly randomly
static dungeon_feature_type pick_an_altar()
{
diff --git a/crawl-ref/source/dungeon.h b/crawl-ref/source/dungeon.h
index 576b89059e..226be99c82 100644
--- a/crawl-ref/source/dungeon.h
+++ b/crawl-ref/source/dungeon.h
@@ -77,35 +77,8 @@ struct dgn_region
bool overlaps_any(const dgn_region_list &others) const;
};
-void item_colour( item_def &item );
-
-// last updated 12may2000 {dlb}
-/* ***********************************************************************
- * called from: files
- * *********************************************************************** */
void builder(int level_number, int level_type);
-
-// 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
- * *********************************************************************** */
void define_zombie(int mid, int ztype, int cs, int power);
bool is_wall(int feature);
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index b3e4a42f52..fd82b37e24 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -21,11 +21,12 @@
#include "beam.h"
#include "direct.h"
-#include "dungeon.h"
+//#include "dungeon.h"
#include "hiscores.h"
#include "itemname.h"
#include "itemprop.h"
#include "items.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "monstuff.h"
diff --git a/crawl-ref/source/makefile.obj b/crawl-ref/source/makefile.obj
index 650431459f..281868f023 100644
--- a/crawl-ref/source/makefile.obj
+++ b/crawl-ref/source/makefile.obj
@@ -35,6 +35,7 @@ items.o \
lev-pand.o \
libutil.o \
macro.o \
+makeitem.o \
mapdef.o \
maps.o \
menu.o \
diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc
new file mode 100644
index 0000000000..7d24aa0d47
--- /dev/null
+++ b/crawl-ref/source/makeitem.cc
@@ -0,0 +1,3870 @@
+#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()
diff --git a/crawl-ref/source/makeitem.h b/crawl-ref/source/makeitem.h
new file mode 100644
index 0000000000..e672f8f262
--- /dev/null
+++ b/crawl-ref/source/makeitem.h
@@ -0,0 +1,14 @@
+#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
diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc
index 09daf676ca..863dd3ea82 100644
--- a/crawl-ref/source/misc.cc
+++ b/crawl-ref/source/misc.cc
@@ -49,6 +49,7 @@
#include "itemname.h"
#include "lev-pand.h"
#include "macro.h"
+#include "makeitem.h"
#include "monplace.h"
#include "mon-util.h"
#include "monstuff.h"
diff --git a/crawl-ref/source/monplace.cc b/crawl-ref/source/monplace.cc
index f0831b3b0a..40bcd01a53 100644
--- a/crawl-ref/source/monplace.cc
+++ b/crawl-ref/source/monplace.cc
@@ -14,7 +14,8 @@
#include "monplace.h"
#include "externs.h"
-#include "dungeon.h"
+//#include "dungeon.h"
+#include "makeitem.h"
#include "monstuff.h"
#include "mon-pick.h"
#include "mon-util.h"
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 64ee31a7d2..9dc3e235c0 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -35,12 +35,13 @@
#include "cloud.h"
#include "debug.h"
#include "describe.h"
-#include "dungeon.h"
+//#include "dungeon.h"
#include "fight.h"
#include "hiscores.h"
#include "itemname.h"
#include "items.h"
#include "itemprop.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "monspeak.h"
@@ -171,7 +172,7 @@ void get_mimic_item( const monsters *mimic, item_def &item )
break;
}
- item_colour( item ); // also sets special vals for scrolls/poitions
+ item_colour( item ); // also sets special vals for scrolls/potions
}
// Sets the colour of a mimic to match its description... should be called
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 6c6dfd09d6..f6521f9302 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -72,7 +72,7 @@
#include "abl-show.h"
#include "branch.h"
#include "command.h"
-#include "dungeon.h"
+//#include "dungeon.h"
#include "files.h"
#include "fight.h"
#include "initfile.h"
@@ -80,6 +80,7 @@
#include "itemprop.h"
#include "items.h"
#include "macro.h"
+#include "makeitem.h"
#include "menu.h"
#include "player.h"
#include "randart.h"
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index d185ed1733..f2aff8b816 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -39,7 +39,7 @@
#include "debug.h"
#include "decks.h"
#include "describe.h"
-#include "dungeon.h"
+//#include "dungeon.h"
#include "effects.h"
#include "food.h"
#include "it_use2.h"
@@ -47,6 +47,7 @@
#include "itemprop.h"
#include "item_use.h"
#include "items.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "mutation.h"
diff --git a/crawl-ref/source/spells4.cc b/crawl-ref/source/spells4.cc
index 254428d263..a5e3c7564f 100644
--- a/crawl-ref/source/spells4.cc
+++ b/crawl-ref/source/spells4.cc
@@ -33,6 +33,7 @@
#include "itemprop.h"
#include "items.h"
#include "invent.h"
+#include "makeitem.h"
#include "misc.h"
#include "monplace.h"
#include "monstuff.h"