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_DIAGNOSTICSmprf(MSGCH_DIAGNOSTICS, "%s abj: dur: %d, abj: %d",monster->name(DESC_PLAIN).c_str(), abj.duration, sockage);#endifif (!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_DIAGNOSTICSmprf(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;