diff options
Diffstat (limited to 'crawl-ref/source')
-rw-r--r-- | crawl-ref/source/abyss.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/acr.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/debug.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/dungeon.cc | 3861 | ||||
-rw-r--r-- | crawl-ref/source/dungeon.h | 27 | ||||
-rw-r--r-- | crawl-ref/source/effects.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/makefile.obj | 1 | ||||
-rw-r--r-- | crawl-ref/source/makeitem.cc | 3870 | ||||
-rw-r--r-- | crawl-ref/source/makeitem.h | 14 | ||||
-rw-r--r-- | crawl-ref/source/misc.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/monplace.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 5 | ||||
-rw-r--r-- | crawl-ref/source/newgame.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/spells4.cc | 1 |
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" |