git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2727 c06c8d41-db1a-0410-9941-cceddc491573
YX2LDGNQNB6AQRKAVXNYQ473X6EVPQEBT5AJKBIIWFIMS3U2BNQQC
NVK2OISSU4XF2CGSK2BAWZE2OPCLTXYHNSE6UDJ5M54EHY2I7BLAC
NLQNXH3SVJ52CWXEV35FSSZP32VHC4QFGN3HINF4KO5GZHZMOBKQC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC
Q5SFQO7ANODRI6OXKHPFQ4QWKGQ367S64DPURQW2TWK7ANTYO4NQC
UKSYWIOMOVYPUG6FXRWC7FCAWKHRNSHZKUU5GDP5XPEUJVEJE5IAC
2RSY5J2ED2GM5R564UF5NEPDAEJDGLJJ6U3YO6UBQOX4KSLGNY7QC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
const int armour_plus = item.plus;
ASSERT(abs(armour_plus) < 20);
if (abs(armour_plus) < 20)
ac += armour_plus;
const int armour_plus = item.plus;
ASSERT(abs(armour_plus) < 20);
if (abs(armour_plus) < 20)
ac += armour_plus;
}
// Shields can affect evasion.
// XXX: Monsters can only equip body armour (as of 0.3).
if (get_armour_slot(item) != EQ_BODY_ARMOUR)
const equipment_type eq = get_armour_slot(item);
// XXX: Monsters can only equip body armour and shields (as of 0.4).
// They can still be forced to wear stuff - this is needed for bardings.
if (!force && eq != EQ_BODY_ARMOUR && eq != EQ_SHIELD)
}
}
static mon_inv_type equip_slot_to_mslot(equipment_type eq)
{
switch (eq)
{
case EQ_WEAPON: return MSLOT_WEAPON;
case EQ_BODY_ARMOUR: return MSLOT_ARMOUR;
default: return (NUM_MONSTER_SLOTS);
(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%
(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%
static bool make_item_for_monster(
monsters *mons,
object_class_type base,
int subtype,
int level,
item_make_species_type race = MAKE_ITEM_NO_RACE,
int allow_uniques = 0)
{
const int bp = get_item_slot();
if (bp == NON_ITEM)
return (false);
const int thing_created =
items( allow_uniques, base, subtype, true, level, race );
if (thing_created == NON_ITEM)
return (false);
give_monster_item(mons, thing_created);
return (true);
}
void give_shield(monsters *mon, int level)
{
switch (mon->type)
{
case MONS_DAEVA:
make_item_for_monster(mon, OBJ_ARMOUR, ARM_LARGE_SHIELD,
level * 2 + 1, MAKE_ITEM_RANDOM_RACE, 1);
break;
case MONS_DEEP_ELF_SOLDIER:
case MONS_DEEP_ELF_FIGHTER:
if (one_chance_in(5))
make_item_for_monster(mon, OBJ_ARMOUR, ARM_BUCKLER,
level, MAKE_ITEM_ELVEN);
break;
case MONS_NAGA_WARRIOR:
case MONS_VAULT_GUARD:
if (one_chance_in(3))
make_item_for_monster(mon, OBJ_ARMOUR,
one_chance_in(3)? ARM_LARGE_SHIELD
: ARM_SHIELD,
level, MAKE_ITEM_NO_RACE);
break;
case MONS_DRACONIAN_KNIGHT:
if (coinflip())
make_item_for_monster(mon, OBJ_ARMOUR,
coinflip()? ARM_LARGE_SHIELD : ARM_SHIELD,
level, MAKE_ITEM_NO_RACE);
break;
case MONS_DEEP_ELF_KNIGHT:
if (coinflip())
make_item_for_monster(mon, OBJ_ARMOUR, ARM_BUCKLER,
level, MAKE_ITEM_ELVEN);
break;
case MONS_NORRIS:
make_item_for_monster(mon, OBJ_ARMOUR, ARM_BUCKLER,
level * 2 + 1, MAKE_ITEM_RANDOM_RACE, 1);
break;
case MONS_NORBERT:
case MONS_LOUISE:
make_item_for_monster(mon, OBJ_ARMOUR, ARM_LARGE_SHIELD,
level * 2 + 1, MAKE_ITEM_RANDOM_RACE, 1);
break;
case MONS_DONALD:
make_item_for_monster(mon, OBJ_ARMOUR, ARM_SHIELD,
level * 2 + 1, MAKE_ITEM_RANDOM_RACE, 1);
break;
}
}
// This actually does more than calculate damage - it also sets up
// messages, etc.
player_calc_hit_damage();
if (shield_blocked)
damage_done = 0;
else
{
// This actually does more than calculate damage - it also sets up
// messages, etc.
player_calc_hit_damage();
}
}
// The monster may block the beam.
if (!engulfs && beam_is_blockable(beam))
{
const int shield_block = mon->shield_bonus();
if (shield_block > 0)
{
const int hit = random2( beam.hit * 130 / 100
+ mon->shield_block_penalty() );
if (hit < shield_block && mons_near(mon)
&& player_monster_visible(mon))
{
mprf("%s blocks the %s.",
mon->name(DESC_CAP_THE).c_str(),
beam.name.c_str());
mon->shield_block_succeeded();
return (BEAM_STOP);
}
}