And while I was at it… improved monster pickup handling.
As before, pickup only takes place if a monster happens to be on a square with items and only the top items of stashes are checked - monsters won't make a beeline for items or search stashes for goodies. Also, neutrals and friendlies still won't pick up anything at all; this might have to be changed.
Unrelated: fixed an ASSERT for divine retribution during penance.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4255 c06c8d41-db1a-0410-9941-cceddc491573
ASH5CK6CPBKMLGGIRJ5GKTWMS5W3OBVHTL66RTYZIPFM6KFBYA3QC
P4SJCLGJJZ4HF5WTOKBJRKI2HFJYAGFAV2P3NWRKEYCJDLNRVU5QC
R5ZMN5IBYAMKCWHD7GVBSQ5IUCJFYXNESMPU2NWHPZXL5FSKYGWQC
AY3CBJCAR4XMZODH5N4DVJXXJF3B5HUKICRGO7KCTCFACAYVGN4QC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
RKFHYYANUZQHOWOE6YHVFFJNCZU7X67FWUQPQFF6KJKMNIKXFWEAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
SE6T5ILU7BD6ICIOP7BTIQIBNBDEJX3J5OBO7Z2DZA336ETTHYJAC
SWOYPTHJAWFEDBMB3ROT33VQZIXGZD5UOXEV456DDUENW2HGA66QC
HVFAA245ZWF7IALC2ZFCJREYGHIZQ2FTW2VO4Z7FTET2B3JZIZCAC
NH3RJG3CNJVBJURYHMUSTKRYSQU6TJJ6VRFGP3VPNE3OPQ7AMXXQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
3IJHKZOTXLU7B6F4UIKXCQCPXEVLKRX2M3VWAAPGRLL24IIP2T2QC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
SJDOBXECX7F3ZPPVR7FPURE53D47PP2TFIF4SB6XPS456PZV3DQAC
3BJ2OOF4F524G6UKVGOZVT6W3FSTSHHTKRJADUBZCHDXZWV3KANQC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
YX2LDGNQNB6AQRKAVXNYQ473X6EVPQEBT5AJKBIIWFIMS3U2BNQQC
NVK2OISSU4XF2CGSK2BAWZE2OPCLTXYHNSE6UDJ5M54EHY2I7BLAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
6FOJLFMHFOIDE6F47OSS3N5PDPVP6MEBOP3JJ3QQ4RRGSDMVAE5AC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
45FTVJJ5FMXBXQ2GVUZVJZU6Y6NUYG2JZIHWVMONA7QYYCZQSM2QC
GRVGLW4QW6BMLK4E3HY7YMHFV2PWGV7BPVFMOTX5APYKCWNUELOQC
UUQ5U2OURPGWPHSHKJPLB6L4BWULX7VYCOUV6RNBIGALAZTWFHUQC
UBJ3K77N3ESM5ZHZAND4FDTONECSSB3NUNL6QQA7ATSESSCW5QUQC
ZMED4SUEZTGX762DHBTMAZYNJZDV7RFFKMELFSTCM4KZFX553H5AC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
WMHFDQKUDCUGM3R245LLVZ5NNEZSCXFDSTNMVS2O5EFUHHO7HU3AC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
6XJP54KUBUB46BX7ANY5DHMN24Q7EHJSQKS7U2BHCAUQUKNJD7DQC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
if ( event == ME_WHACK ||
((isFriendly != sourceFriendly || isSmart) &&
(mon->behaviour != BEH_FLEE && mon->behaviour != BEH_PANIC)))
if (event == ME_WHACK
|| ((isFriendly != sourceFriendly || isSmart)
&& mon->behaviour != BEH_FLEE && mon->behaviour != BEH_PANIC))
if (!finalAnswer && _enemies_around(monster) && mons_is_caught(monster)
&& one_chance_in(4))
if (!finalAnswer && mon_enemies_around(monster)
&& mons_is_caught(monster) && one_chance_in(4))
const equipment_type eq = get_armour_slot(item);
equipment_type eq = EQ_NONE;
// Hack to allow nagas/centaurs to wear bardings. (jpeg)
switch(item.sub_type)
{
case ARM_NAGA_BARDING:
if (::mons_species(this->type) == MONS_NAGA)
eq = EQ_BODY_ARMOUR;
break;
case ARM_CENTAUR_BARDING:
if (::mons_species(this->type) == MONS_CENTAUR
|| ::mons_species(this->type) == MONS_YAKTAUR)
{
eq = EQ_BODY_ARMOUR;
}
break;
default:
eq = get_armour_slot(item);
}
// Bardings are only wearable by the appropriate monster.
if (eq == EQ_NONE)
return false;
// only allow monsters to pick up healing potions
// if they can actually use them
if ((item.sub_type == POT_HEALING || item.sub_type == POT_HEAL_WOUNDS)
&& (mons_holiness(this) == MH_UNDEAD
// Only allow monsters to pick up potions if they can actually use them.
switch(item.sub_type)
{
case POT_HEALING:
case POT_HEAL_WOUNDS:
if (mons_holiness(this) == MH_UNDEAD
|| mons_holiness(this) == MH_PLANT))
{
return false;
}
if (::mons_species(this->type) != MONS_VAMPIRE
&& (item.sub_type == POT_BLOOD
|| item.sub_type == POT_BLOOD_COAGULATED))
{
|| mons_holiness(this) == MH_PLANT)
{
return false;
}
break;
case POT_BLOOD:
case POT_BLOOD_COAGULATED:
if (::mons_species(this->type) != MONS_VAMPIRE)
return false;
break;
case POT_SPEED:
case POT_INVISIBILITY:
break;
default:
if (!force && (behaviour != BEH_WANDER || attitude == ATT_NEUTRAL))
return (false);
// if (!force && (behaviour != BEH_WANDER || attitude == ATT_NEUTRAL))
// return (false);
if (!force)
{
if (attitude == ATT_NEUTRAL)
return (false);
bool wandering = (behaviour == BEH_WANDER);
// Weak(ened) monsters won't stop to pick up things as long as they
// feel unsafe.
if (!wandering && (hit_points * 10 < max_hit_points || hit_points <= 10)
&& mon_enemies_around(this))
{
return false;
}
// These are not important enough for pickup when seeking, fleeing etc.
const int itype = item.base_type;
if (!wandering
&& (itype == OBJ_ARMOUR || itype == OBJ_CORPSES
|| itype == OBJ_MISCELLANY || itype == OBJ_GOLD))
{
return false;
}
}
// pickup some stuff only if WANDERING
case OBJ_ARMOUR:
return pickup_armour(item, near, force);
case OBJ_CORPSES:
return eat_corpse(item, near);
case OBJ_MISCELLANY:
return pickup_misc(item, near);
case OBJ_GOLD:
return pickup_gold(item, near);
// other types can always be picked up
// (barring other checks depending on subtype, of course)
case OBJ_CORPSES:
return eat_corpse(item, near);
case OBJ_MISCELLANY:
return pickup_misc(item, near);
case OBJ_GOLD:
return pickup_gold(item, near);
From MONUSE_STARTING_EQUIPMENT on, monsters are capable of handling items.
Contrary to what one might expect MONUSE_WEAPONS_ARMOUR also means a
monster is capable of using wands and will also pick them up, something
that those with MONUSE_STARTING_EQUIPMENT won't do.
MONUSE_MAGIC_ITEMS is currently never used anywhere.