This has two effecs:
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2024 c06c8d41-db1a-0410-9941-cceddc491573
QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC
YPFLDK2SJCAN5GETC7E6VYUBLYIJ6QISL2J34GVDTCGYEQBCCEZQC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
ESWIM76FGJL4QFLSHU6AC4D74PT7OPLQ7ZCJYWLZS5UCBAJDXYHAC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
T2AYVN57EFJQLFUFLAZDXKDAFDGTDLQIEQWQZNYFWJZBYSTYH4QQC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
TAHSTXR7ROOMDFUSBUU4ZAIEWQLAS5CIRCTARLD4Q2BGNLSL7E5QC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
XRZPPYWPWUOM4SFNI6BHKH2UKJQNLKOV6Y7XIEPEZXE5QYRT26PAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
3GSAVTNKEG45AT2U734R5STSRP22WJZL3H6KUFRUWCIA6A4CZE5QC
5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC
2G55UEHQ7554OPNSZVTUCZTWSHIFKGT56QEGSYFKCTX547I4AL3AC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
Y56C5OMUQ5XF2G6DKDV4R5MED44UOIUPTBBQVWQBUHYIXYA5MOZAC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
45QV77UI6QFW4234P365LD3FGJYRVWTT5455DPB324NG2NFQMKTQC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC
RYT42Z6CED4KV5CCJ45CHZ3DQGLFMDCVH6CSQZNXOILULDG4MXVQC
IDTLZ6PEPJP67PO7K5TODLXTBFAEVIE4C3HZCXIQK6OIAQKRVDUQC
5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC
ITQ2EXDFLN3EHCURKYHZYVWFACD4KW7NA6CMHNKGWTDKHCHQAE6AC
static void describe_monster(const monsters *mon)
{
// first print type and equipment
std::string text = get_monster_desc(mon);
text += ".";
print_formatted_paragraph(text, get_number_of_cols());
if (mon->type == MONS_HYDRA)
{
mprf("It has %d head%s.", mon->number,
(mon->number > 1? "s" : ""));
}
print_wounds(mon);
if (!mons_is_mimic(mon->type) && mons_behaviour_perceptible(mon))
{
if (mon->behaviour == BEH_SLEEP)
{
mprf("%s appears to be resting.",
mons_pronoun(mon->type, PRONOUN_CAP));
}
// Applies to both friendlies and hostiles
else if (mon->behaviour == BEH_FLEE)
{
mprf("%s is retreating.",
mons_pronoun(mon->type, PRONOUN_CAP));
}
// hostile with target != you
else if (!mons_friendly(mon) && mon->foe != MHITYOU)
{
// special case: batty monsters get set to BEH_WANDER as
// part of their special behaviour.
if (!testbits(mon->flags, MF_BATTY))
{
mprf("%s doesn't appear to have noticed you.",
mons_pronoun(mon->type, PRONOUN_CAP));
}
}
}
if (mon->attitude == ATT_FRIENDLY)
mprf("%s is friendly.", mons_pronoun(mon->type, PRONOUN_CAP));
else if (mon->attitude == ATT_NEUTRAL)
mprf("%s is indifferent to you.",
mons_pronoun(mon->type, PRONOUN_CAP));
std::string desc = "";
std::string last_desc = "";
std::string tmp = "";
const bool paralysed = mons_is_paralysed(mon);
if (paralysed)
last_desc += "paralysed";
for (mon_enchant_list::const_iterator e = mon->enchantments.begin();
e != mon->enchantments.end(); ++e)
{
tmp = describe_mons_enchantment(*mon, e->second, paralysed);
if (!tmp.empty())
{
if (!desc.empty())
desc += ", ";
desc += last_desc;
last_desc = tmp;
}
}
if (!last_desc.empty())
{
if (!desc.empty())
desc += ", and ";
desc += last_desc;
}
if (!desc.empty())
{
text = mons_pronoun(mon->type, PRONOUN_CAP);
text += " is ";
text += desc;
text += ".";
print_formatted_paragraph(text, get_number_of_cols());
}
}
std::string get_monster_desc(const monsters *mon, bool full_desc)
{
std::string desc = mon->name(DESC_CAP_A);
const int mon_arm = mon->inv[MSLOT_ARMOUR];
std::string weap = "";
if (mon->type != MONS_DANCING_WEAPON)
weap = describe_monster_weapon(mon);
if (!weap.empty())
{
if (full_desc)
desc += ",";
desc += weap;
}
if (full_desc && mon_arm != NON_ITEM)
{
desc += ", ";
if (!weap.empty())
desc += "and ";
desc += "wearing ";
desc += mitm[mon_arm].name(DESC_NOCAP_A);
}
return desc;
}
const int mon_arm = menv[i].inv[MSLOT_ARMOUR];
mprf("%s.", menv[i].name(DESC_CAP_A).c_str());
if (menv[i].type != MONS_DANCING_WEAPON)
describe_monster_weapon(&menv[i]);
if (mon_arm != NON_ITEM)
mprf("%s is wearing %s.",
mons_pronoun(menv[i].type, PRONOUN_CAP),
mitm[mon_arm].name(DESC_NOCAP_A).c_str());
if (menv[i].type == MONS_HYDRA)
mprf("It has %d head%s.", menv[i].number,
(menv[i].number > 1? "s" : ""));;
print_wounds(&menv[i]);
describe_monster(&menv[i]);
else if (mons_behaviour_perceptible(&menv[i]))
{
if (menv[i].behaviour == BEH_SLEEP)
{
mprf("%s appears to be resting.",
mons_pronoun(menv[i].type, PRONOUN_CAP));
}
// Applies to both friendlies and hostiles
else if (menv[i].behaviour == BEH_FLEE)
{
mprf("%s is retreating.",
mons_pronoun(menv[i].type, PRONOUN_CAP));
}
// hostile with target != you
else if (!mons_friendly(&menv[i]) && menv[i].foe != MHITYOU)
{
// special case: batty monsters get set to BEH_WANDER as
// part of their special behaviour.
if (!testbits(menv[i].flags, MF_BATTY))
mprf("%s doesn't appear to have noticed you.",
mons_pronoun(menv[i].type, PRONOUN_CAP));
}
}
if (menv[i].attitude == ATT_FRIENDLY)
mprf("%s is friendly.", mons_pronoun(menv[i].type, PRONOUN_CAP));
else if (menv[i].attitude == ATT_NEUTRAL)
mprf("%s is indifferent to you.",
mons_pronoun(menv[i].type, PRONOUN_CAP));
const bool paralysed = mons_is_paralysed(&menv[i]);
if (paralysed)
mprf("%s is paralysed.", mons_pronoun(menv[i].type, PRONOUN_CAP));
for (mon_enchant_list::const_iterator e = menv[i].enchantments.begin();
e != menv[i].enchantments.end(); ++e)
{
describe_mons_enchantment(menv[i], e->second, paralysed);
}