diff options
author | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-04-21 11:31:42 +0000 |
---|---|---|
committer | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-04-21 11:31:42 +0000 |
commit | b2ea8143ccf52a2cacfa48d19ce2ea603ddaab5e (patch) | |
tree | 6d5883da623580048298ae62a0408c509ed42f10 /crawl-ref/source/dungeon.cc | |
parent | 8f474f6a0858eddfa1a6552858f6d79fbf7473cb (diff) | |
download | crawl-ref-b2ea8143ccf52a2cacfa48d19ce2ea603ddaab5e.tar.gz crawl-ref-b2ea8143ccf52a2cacfa48d19ce2ea603ddaab5e.zip |
Moved items() into a separate makeitem file.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1340 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r-- | crawl-ref/source/dungeon.cc | 3861 |
1 files changed, 1 insertions, 3860 deletions
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() { |