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.");elsempr("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_secmonster->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);