name (but not spells, yet), and use their old speech text if it makes sense for them to be able to do so.
Polymorphed monsters now retain some of their old flags, like MF_CREATED_FRIENDLY and MF_GOT_HALF_XP.
If the Royal Jelly is polymorphed into something else then the Slime:6 vaults will unlock when that monster is killed.
If the Royal Jelly is banished the player will be given a hint that it's gone and that the vaults will remain locked.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7970 c06c8d41-db1a-0410-9941-cceddc491573
HM6NOS7BN5665KWIFGBXOHZIDMRSVCESN72GMGI6NVBFZGCF3L6QC
ALIE3JM7NTE4KYN7TOPI32MCVZRAZF4ENAS5HVA3RX6PB6GSQNMQC
J7VTRSN2BLWL7QJMHG73LBUOUL6WNNT2ZAVEDMGYB6SDX3L5GGYQC
LSSZR3VAY26MK7AEMX3BKJXX22SY3DS6HROZFDIDIJM7TUENIP2QC
LJK2V4ZRJJL7ZGOZEL26MO5CJQVR7H6D75FZ556UWL7QYXM22QPQC
KVPP3CYPEFADQCL5Y56ELSUBA47SFNAJNCSVCSOK2GF67DHVMBCQC
UVGFF3QPZKZNMWFDDANQRBTVOROTA4TZFXGYDPV4GQXZKHZY2EXAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
N6J4ANT3WFBQYTFDPZFVF2PWS2S7CK4GHHX4UV3JW4VWAKETZR5AC
F2YWDQUXULLS2WKLVMNEJKEGSGG2MPEREVI2RKH7ROS2YYKKMXHAC
6XSOB55JCEWQK7OANHLEIPOIUGH32ZEB35A7XLBKSFJ5YH5GCZ4AC
NO2HRD7RZS42S55UG4FQ5EFQDY6WYWKGIXHUKYLWF36HHE3VZ7WAC
T6TL6NTIOBYNUIONGK3JFZJ5ONWV6S4CTIRDC5JMKMCBGG5IY3EAC
DZ2GM3MGYCEOQ24AMGGYIF2U4PAFHIACEPS7MUQ7TM35OL2YFQVAC
CRUW4EVU3UDWNKXBCPWWHWXXGE7EMEHKK3PLLUD7NWPYY4K2R3YAC
HQSI2RK5QGNSOR5Y67GZDK4ZWFZ5DSRPASXAV4VHYVB5TUXFZWJQC
BINKDWGFGUPTOA7IE5KK4ZIELGU5WC3X47MYXOWU4X43EGAC5DUAC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
MX2KOWAIE37VLSQJWXVEDVQVB3DL325Q7YFUSSHYMAIH53Y74IJQC
C3OUSRCHDUOJ6ELVDX6YWMQQVXDJLNEXTXWCDDAYWTKNPFPNSONAC
4QESHLDUAX3C2NFFYA3AGFUFW6DN2ZN25RQW7ZC5QA7R7R3E4A2QC
542UIZKI65UDRNEMGFFDBWYD5XC7AYLTZ3JZQRR2GHYJALD3YY6QC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
V7IKAPO5OY7CJTT62GMHQOD3EQW42FTTY3KDBOTJUODPS5WMBCHAC
USSKCWQTF6BTE3SFLQVCT6RZHU2R7URWFC7EPO2EN3Z6U4IEQ7GQC
VOR2QOT3R3BC3H74GMW4PUBY77QBJXE5QGQNBIINBE3MPSH6CXWQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
HOPP345EQLSF24XJYE3625VKU23PBKM5ZZKNCXBXUWYYORYPMDAAC
UQFNR6PCRYPSUWMFF7KHITOVE4DZJ4CEAHFSXO7NG6GYZRF5JKUAC
YPD42V7VOQFGAVLLOSQAQ4SD77L5L3LZHPLFVZIAOHBNDKPO3O4QC
3QLM46S44Z7GDLWPH3VHBMW2RSWZAOLGJMG2BDKNGUOZIM4IX6WAC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
5B36ULBPPMKZJBURDAAVN4VBMKY3PIZIIDY3LAZYSIVTWGW4CRIAC
47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC
BYURAML2EPTULHH22Q5RPXYGDEYAJYESR6C72UMNPPYHTCJZUPFAC
RWCCZ64BG3HSOTM54ANIGENC3F3AIR42LJFRYSAKMCPCIUSOZY5QC
BNRY5YIXLFE2TDNU2JQHWWXJQVWNSEWQ52DU7XUWIT5DZWKGBDDAC
T4FNOPMWYYJHJBTTY33PB43HTJPKEC46L62YERTWIX73HYZSELXQC
PEZFWKRHDHV4UJTPK5XJZ3CGTZ3LPTDYSPTYBENLQ7VRSP7YFSIQC
GVW4OBPGXY2Q75HB7QHADZIOHKL22FI2BSJ2TM4K5SBJENBFTQKAC
NRIZKLUO26UHNKB4IERXI6ECMD2IJYZACQNIUU3SH6BPLGHAJYVAC
T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC
FU663V7RFZNSMG5P2E7TZJZWSGXWLCCFXSVGH4Z222FIJTH4R3KAC
ZKBPM2G7BTRIXQMFPWFIQY5U7CV2GEXSOBCGFN6UBE27IBIJAMRAC
NFA3X64V4NWHJMUDDPSQSYZ4R65TXVYPNZNW6BUUDB35LVLJR3CQC
VMDHEP2MGV6D5MTWNNTUYV4SY45JC3ITDEZLHT4HDJ4N2GXM755AC
TYCM7ZQG5JPPK4A5K6IBVRKJYQS2F2A3SESBC53MUNXHMZCKYF5QC
SHFSQYLN7WPQC35V3XYYEIZ4CQMREASUNR474CIKFG3C2FYI4SHQC
WXZQJUZXMYS7R6ORNB7DWE5KEUXT262GXWMRPOJYYB4I3BFGYLLAC
BMHUBADDGIOZRVN4P3O5QKIDUYD4RFWBS7MP5X6LZWAYHUBRVD2QC
{
out << m_mon->name(DESC_PLAIN);
if (!(m_mon->mname).empty() && m_mon->type != MONS_PLAYER_GHOST)
out << " the " << mons_type_name(m_mon->type, DESC_PLAIN);
}
out << m_mon->full_name(DESC_PLAIN);
dungeon_events.fire_event(
dgn_event(DET_MONSTER_DIED, monster->pos(), 0,
monster_index(monster), killer));
// Give player a hint that banishing the Royal Jelly means the
// Slime:6 vaults stay locked.
if (type == MONS_ROYAL_JELLY)
{
if (you.can_see(monster))
mpr("You feel a great sense of loss.");
else
mpr("You feel a great sense of loss, and the brush of the "
"Abyss.");
}
return;
}
dungeon_events.fire_event(
dgn_event(DET_MONSTER_DIED, monster->pos(), 0,
monster_index(monster), killer));
if (monster->type == MONS_ROYAL_JELLY)
// Don't unlock the Slime:6 vaults if the "death" was actually the
// Royal Jelly polymorphing into something else; the player still
// has to kill whatever it polymorphed into.
if (type == MONS_ROYAL_JELLY && !polymorph)
{
const level_id target(BRANCH_SLIME_PITS, 6);
if (is_existing_level(target))
const level_id target(BRANCH_SLIME_PITS, 6);
if (is_existing_level(target))
{
apply_to_level(
target,
true,
target == level_id::current() ? _slime_pit_unlock_onlevel
: _slime_pit_unlock_offlevel);
}
apply_to_level(
target,
true,
target == level_id::current() ? _slime_pit_unlock_onlevel
: _slime_pit_unlock_offlevel);
// Inform listeners that the original monster is gone (and
// unlock the vaults on Slime:6 if it's the Royal Jelly which
// was changed).
_fire_monster_death_event(monster, KILL_MISC, NON_MONSTER);
// Inform listeners that the original monster is gone.
_fire_monster_death_event(monster, KILL_MISC, NON_MONSTER, true);
unsigned long flags =
monster->flags & ~(MF_INTERESTING | MF_SEEN | MF_ATT_CHANGE_ATTEMPT
| MF_WAS_IN_VIEW | MF_BAND_MEMBER
| MF_HONORARY_UNDEAD);
std::string name;
// Preserve the names of uniques and named monsters.
if (!monster->mname.empty())
name = monster->mname;
else if (mons_is_unique(monster->type))
{
flags |= MF_INTERESTING;
name = monster->name(DESC_PLAIN, true);
if (monster->type == MONS_ROYAL_JELLY)
{
name = "shaped Royal Jelly";
flags |= MF_NAME_SUFFIX;
}
// "Blork the orc" and similar.
const size_t the_pos = name.find(" the ");
if (the_pos != std::string::npos)
name = name.substr(0, the_pos);
}
// deal with mons_sec
monster->type = targetc;
monster->base_monster = MONS_PROGRAM_BUG;
monster->number = 0;
// If the monster was originally a unique which has been polymorphed into
// a non-unique, is its current monter type capable of using it's old
// speech?
static bool _polyd_can_speak(const monsters* monster)
{
// Wizard and priest monsters can always speak.
if (mons_class_flag(monster->type, M_ACTUAL_SPELLS | M_PRIEST))
return (true);
// Silent or non-sentient monsters can't use the original speech.
if (mons_intel(monster) < I_NORMAL
|| mons_shouts(monster->type) == S_SILENT)
{
return (false);
}
msg = _get_speak_string(prefixes, monster->name(DESC_PLAIN), monster);
{
if (!monster->mname.empty() && _polyd_can_speak(monster))
msg = _get_speak_string(prefixes, monster->name(DESC_PLAIN),
monster);
if (msg.empty())
msg = _get_speak_string(prefixes, monster->base_name(DESC_PLAIN),
monster);
}
if (has_base_name())
{
const unsigned long flag = flags & MF_NAME_MASK;
if (flag == MF_NAME_SUFFIX)
{
title = base_name(desc, true);
title += " ";
title += mname;
}
else if (flag == MF_NAME_NO_THE)
{
title += " ";
title += base_name(DESC_PLAIN, true);
}
else if (flag == MF_NAME_REPLACE)
;
else
{
if (use_comma)
title += ",";
title += " ";
title += base_name(DESC_NOCAP_THE, true);
}
}
return (title);
}
desc = mon->name(mondtype);
// For named monsters also mention the base type in the form of
// "Morbeogh the orc priest", "Sigmund the human zombie".
// Note that the only difference between DESC_BASENAME and DESC_PLAIN
// is that basename will ignore mname, so the monster _must_ be named
// for this to make any sense.
if (mon->has_base_name())
desc += " the " + mon->name(DESC_BASENAME);
desc = mon->full_name(mondtype);
const std::string capname = mons.name(DESC_CAP_A);
title = capname;
if (mons.has_base_name())
{
title += ", ";
title += mons.base_name(DESC_NOCAP_THE, false);
}
title = mons.full_name(DESC_CAP_A, true);