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