and piety) with monsters' magic resistance. If the latter exceeds the former or you get a bad roll, the bad effects (haste or berserk) will happen. Otherwise you get one of a number of good effects the choice of which depends on your power again. This is probably still too strict, but much better than the older system.
Unfortunately I had to cut the influene of the number of attempts as apply_area_visible currently only transfers power. So it's a clear 50% chance of "nothing happens" each turn, leaving us at 12.5% of nothing happening during 3 turns, plus a saving throw from bad effects.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3379 c06c8d41-db1a-0410-9941-cceddc491573
G4TVXOLIF5X2MWV7I4UPT3MSQHRMGME6QRIIFAQ64C45JGYK7SIAC
3ZE757JEFAUED26M4MVEA7XXEHFNKLKAAHMVYOZSHKKBZ563AHMQC
4EZVKDQA5GM3QDTNTCKEKGH4F6LGAYNLBT756PXODKZ2B7C4ZVHAC
23PFLB2E4QHL5SF3Q2YV5FXRH6MFHENEU2ACVC572ZCYDXCBZVQAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
if (!resist)
{
if (one_chance_in(3) && mons->add_ench(mon_enchant(ENCH_CONFUSION,
0, KC_YOU, (16 + random2avg(13, 2)) * 10)))
{
simple_monster_message(mons, " looks confused.");
return (1);
}
if (one_chance_in(4) && mons->add_ench(ENCH_FEAR))
{
simple_monster_message(mons, " turns to flee.");
return (1);
}
if (one_chance_in(4))
{
mons->put_to_sleep();
simple_monster_message(mons, " falls asleep!");
return (1);
}
}
if (one_chance_in(3) && mons->add_ench(mon_enchant(ENCH_HASTE, 0,
KC_YOU, (16 + random2avg(13, 2)) * 10)))
{
simple_monster_message(mons, " is annoyed!");
return (1);
}
if (mons->can_go_berserk()) // seriously annoyed now
{
if (one_chance_in(resist+1)) // nothing happens, whew!
return (0);
if (one_chance_in(4) && mons->can_go_berserk())
simple_monster_message(mons, " resists!");
return (0);
}
switch (random2(pow))
{
default: // nothing happens
return (0);
case 0:
return (0); // handled above
case 1:
case 2:
case 3:
case 4:
if (!mons->add_ench(mon_enchant(ENCH_CONFUSION, 0, KC_YOU,
(16 + random2avg(13, 2)) * 10)))
return (0);
simple_monster_message(mons, " looks confused.");
break;
case 5:
if (mons->add_ench(mon_enchant(ENCH_CONFUSION, 0, KC_YOU,
(16 + random2avg(13, 2)) * 10)))
{
simple_monster_message(mons, " looks confused.");
return (1);
}
break;
if (!mons->add_ench(ENCH_NEUTRAL))
return (0);
simple_monster_message(mons, " seems impressed!");
break;
case 18:
if (mons->add_ench(ENCH_NEUTRAL))
{
simple_monster_message(mons, " seems impressed!");
return (1);
}
break;
case 19:
case 20:
mons->attitude = ATT_NEUTRAL; // but same message as above
simple_monster_message(mons, " seems impressed!");
return (1);
if (!mons->add_ench(mon_enchant(ENCH_PARALYSIS, 0, KC_YOU,
(16 + random2avg(13, 2)) * 10)))
return (0);
simple_monster_message(mons, " freezes in fright!");
break;
default:
// permanently neutral, but same message as enchantment
mons->attitude = ATT_NEUTRAL;
simple_monster_message(mons, " seems impressed!");
break;