git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2387 c06c8d41-db1a-0410-9941-cceddc491573
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
NRTBKC3AXWOHMSLJ2CTBGG3NQHSY6BLK7AOZ7TJV4FPWQ4PUZ7XAC
UB67ZWGT7FOPKZ7SO5PAO3V4PUBPWPWXKQIQIUABNB533XP4JUMQC
Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
ACKNLTFL2RI3PMRWLNRVLRWGQAMLRFKNGNS5LED6NFE5GVGFIHFAC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
CEK6M777MI5JVDC3KHE3JD3FETVSJ4VN6DGATBI5P3O6P5XHY4DAC
RGY2525RQH7SSGM6ZVI7CZL4WMNFZK2WRABOSIWRKQYYOU2RWN4QC
AOAJ6D3OKSELEYKAT55XCVU5LYJ7SMCZKC6DIEGLLB3TF2LEENWQC
QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
return (false);
}
bool orc_battle_cry(monsters *chief)
{
const actor *foe = chief->get_foe();
if (foe && chief->can_see(foe) && coinflip())
{
const int boss_index = monster_index(chief);
const int level = chief->hit_dice > 12? 2 : 1;
std::vector<monsters*> affected;
for (int i = 0; i < MAX_MONSTERS; ++i)
{
monsters *mons = &menv[i];
if (mons != chief
&& mons->alive()
&& mons_species(mons->type) == MONS_ORC
&& mons_aligned(boss_index, i)
&& mons->hit_dice < chief->hit_dice
&& chief->can_see(mons))
{
mon_enchant ench = mons->get_ench(ENCH_BATTLE_FRENZY);
if (ench.ench == ENCH_NONE || ench.degree < level)
{
const int dur =
random_range(5, 10) * speed_to_duration(mons->speed);
if (ench.ench != ENCH_NONE)
{
ench.degree = level;
ench.duration = std::max(ench.duration, dur);
mons->update_ench(ench);
}
else
{
mons->add_ench(
mon_enchant(ENCH_BATTLE_FRENZY, level,
KC_OTHER,
dur));
}
affected.push_back(mons);
}
}
}
if (!affected.empty())
{
if (you.can_see(chief))
mprf("%s roars a battle-cry!",
chief->name(DESC_CAP_THE).c_str());
// Disabling detailed frenzy announcement because it's so spammy.
#ifdef ANNOUNCE_BATTLE_FRENZY
std::map<std::string, int> names;
for (int i = 0, size = affected.size(); i < size; ++i)
{
if (you.can_see(affected[i]))
names[affected[i]->name(DESC_PLAIN)]++;
}
for (std::map<std::string,int>::const_iterator i = names.begin();
i != names.end(); ++i)
{
const std::string s =
i->second> 1? pluralise(i->first) : i->first;
mprf("The %s go%s into a battle-frenzy!",
s.c_str(), i->second == 1? "es" : "");
}
#endif
}
}
// Orc battle cry doesn't cost the monster an action.
bool mons_monster_visible( struct monsters *mon, struct monsters *targ );
bool mons_player_visible( struct monsters *mon );
bool mons_monster_visible( const monsters *mon, const monsters *targ );
bool mons_player_visible( const monsters *mon );
else if (atk->has_ench(ENCH_BATTLE_FRENZY))
{
const mon_enchant ench = atk->get_ench(ENCH_BATTLE_FRENZY);
#ifdef DEBUG_DIAGNOSTICS
const int orig_damage = damage;
#endif
damage = damage * (115 + ench.degree * 15) / 100;
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "%s frenzy damage: %d->%d",
attacker->name(DESC_PLAIN).c_str(), orig_damage, damage);
#endif
}
// Only one ghost allowed per level
if (mspec.mid == MONS_PLAYER_GHOST)
{
for (int i = 0; i < MAX_MONSTERS; i++)
if (menv[i].type == MONS_PLAYER_GHOST
&& menv[i].alive())
{
mpr("Only one player ghost per level allowed, "
"and this level already has one.");
return;
}
}
// Only one pandemonium lord allowed per level as well.
else if (mspec.mid == MONS_PANDEMONIUM_DEMON)
{
for (int i = 0; i < MAX_MONSTERS; i++)
if (menv[i].type == MONS_PANDEMONIUM_DEMON
&& menv[i].alive())
{
mpr("Only one Pandemonium lord per level allowed, "
"and this level already has one.");
return;
}
}