duration system. Also strengthened monster abjuration, which became terribly weak after the 0.2 nerf.
Monster abjuration now applies in a circle around the caster, squares adjacent to the caster getting full blast, and weaker abjuration effects going outwards. Player abjuration stays unchanged.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1836 c06c8d41-db1a-0410-9941-cceddc491573
VQZEJTCSRZ5RVLCCKUCIS3IVZPFYRC26I74X4WIJAPEY7NYID2UQC
5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC
OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
3Q3LKWVLZ52PG62XVAWU5Y2CA4TGOYC7HZWXUVQWOWOFLGFKQMFQC
GSPF5B42JJ22DWZYXUHVQO42DWDZ524KLTXXCYZQRXJHU6MROKGQC
3HMZIQCJSWUYTWQDWRQYPI5VOSRIAGGBOM7LIMF7362RJ2LRMZAAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
monster->lose_ench_levels(abj, 1 + (random2(pow) / 8));
if (monster->has_ench(ENCH_ABJ))
simple_monster_message(monster, " shudders.");
{
const int sockage = std::max(fuzz_value(abjdur, 60, 30), 40);
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "%s abj: dur: %d, abj: %d",
monster->name(DESC_PLAIN).c_str(), abj.duration, sockage);
#endif
if (!monster->lose_ench_duration(abj, sockage))
simple_monster_message(monster, " shudders.");
}
int abjure_str = 1 + (random2(pow / 3));
if (abjure_str > 6)
abjure_str = 6;
if (test_only)
return (power > abj.duration? 5 : 1);
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Abj: dur: %d, pow: %d, ndur: %d",
abj.duration, power, abj.duration - power);
#endif
if (friendly == mons_friendly(monster))
continue;
static int apply_radius_around_square(
const coord_def &c, int radius,
int (*fn)(const coord_def &, int, int, int),
int pow, int par1, int par2)
{
int res = 0;
for (int yi = -radius; yi <= radius; ++yi)
{
const coord_def c1(c.x - radius, c.y + yi);
const coord_def c2(c.x + radius, c.y + yi);
if (in_bounds(c1))
res += fn(c1, pow, par1, par2);
if (in_bounds(c2))
res += fn(c2, pow, par1, par2);
}
mon_enchant abjLevel = monster->get_ench(ENCH_ABJ);
if (abjLevel.ench == ENCH_NONE)
continue;
for (int xi = -radius + 1; xi < radius; ++xi)
{
const coord_def c1(c.x + xi, c.y - radius);
const coord_def c2(c.x + xi, c.y + radius);
if (in_bounds(c1))
res += fn(c1, pow, par1, par2);
if (in_bounds(c2))
res += fn(c2, pow, par1, par2);
}
return (res);
}
abjLevel.degree -= abjure_str;
if (abjLevel.degree <= 0)
monster_die(monster, KILL_RESET, 0);
else
{
simple_monster_message(monster, " shudders.");
monster->update_ench(abjLevel);
}
int pow = std::min(caster->hit_dice * 90, 2500);
if (!(abjure_str = div_rand_round(abjure_str, 2)))
break;
// Abjure radius.
for (int rad = 1; rad < 5 && pow >= 30; ++rad)
{
maffected +=
apply_radius_around_square(
caster->pos(), rad, monster_abjure_square,
pow, test, friendly);
pow = pow * 2 / 5;