and leave him/her with at least N hp (it can still indirectly kill the player by causing the death of a mummy, giant spore or ball lightning). Doesn't cover the case of a level 3 transmigration miscast deleting the robust mutation or giving the frail mutation before causing hp damage.
The Xom bad effects code now requests (unless Xom is being nasty) that spell miscasts not directly kill the player, rather than avoiding miscasts alltogether if the player has low HP (which didn't cover things like miscasts leading to death via XP drain or stat loss, in addition to it avoiding spell miscasts much too often).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7894 c06c8d41-db1a-0410-9941-cceddc491573
2NVJIPJ5NMHUI2J4WOR6KE4XZOCJIVWHQK4M2M6KG7PL24PGBDGAC
7EVUGCRT2GSIOGJDV3TFOCBBFNLH2QPDDMAK4VKNN7MZHCM2BP4AC
B62VYOACXOBUGQZL4D72DME5PMT2RHOOKHY5NFOK5RUN37Y7LHYAC
XG7HS3PRUOW35OPBF5M3ZFURHPBUMQRQPZ7GIKZIVGQ2INEBMENAC
ETMGU6QJ37DEKIZKMZXDEO3GJ6F4WX5T7KQ52QK5XSABUZA2E5WQC
SOCJXX6MMOXLBEWBID4QN5FW2YNYULNNN7K3IRL7RSWK5EUNAZLQC
ERS7DYNAVCC7QUVG5FXJJRONYESLZU22CQGKCA5HLLLG6DMXYRLQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
ZNDS3LUJYJQJ7GUOHCQUDUAAYNQAOJMC2PTMRF7XXTHOPOFLMP3AC
5MGUZD2UACJCSG74TEZHI3Z4YL5KL6ZVUCQ3XVZKDOLKM7EMGWJAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
BYURAML2EPTULHH22Q5RPXYGDEYAJYESR6C72UMNPPYHTCJZUPFAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
AREBCIU2RU2RNHBWD4GARWEBKSL7HDFGDLII22H56OJO2AQUOMLQC
CLIEHAE2PP7ZIGLLIMYCWM4FC54KBOAN5AILOLAZJ5S26GTJM4RQC
JCWJWGMQIKQGSSFJUQRKNIWW3HBOJSHYDTOPPE5BWOJTIJTDYUTAC
UEEDQIFBOUZOXHCWGSEBED4Z3SYGN3DVHOVRJYQVWQQ6BIDLWAQAC
RWCCZ64BG3HSOTM54ANIGENC3F3AIR42LJFRYSAKMCPCIUSOZY5QC
I2PL54BONLM4RYG4OE7M2UEWDYXPVB4SYGTXZM3OPQPAQCG3VLTQC
CMNLYUECIMEZSOYG4KOSINOPER5OM7PPCGIHCM7LQVWEO77XFUYQC
std::vector<unsigned char> stat_types;
if ((you.strength - might - stat_loss) > 0)
stat_types.push_back(STAT_STRENGTH);
if ((you.intel - stat_loss) > 0)
stat_types.push_back(STAT_INTELLIGENCE);
if ((you.dex - stat_loss) > 0)
stat_types.push_back(STAT_DEXTERITY);
if (stat_types.size() == 0)
{
if (avoid_lethal(you.hp))
return (false);
else
return lose_stat(which_stat, stat_loss, false, cause);
}
which_stat = stat_types[random2(stat_types.size())];
}
int val;
switch(which_stat)
{
case STAT_STRENGTH: val = you.strength; break;
case STAT_INTELLIGENCE: val = you.intel; break;
case STAT_DEXTERITY: val = you.dex; break;
default: DEBUGSTR("Invalid stat type."); return (false);
}
if ((val - stat_loss) <= 0)
{
if (avoid_lethal(you.hp))
return (false);
}
return lose_stat(which_stat, stat_loss, false, cause);
}
if (recursion_depth == MAX_RECURSE)
{
#if DEBUG_DIAGNOSTICS || DEBUG_MISCAST
mpr("Couldn't avoid lethal miscast: too much recursion.",
MSGCH_ERROR);
#endif
return (false);
}
if (did_msg)
{
#if DEBUG_DIAGNOSTICS || DEBUG_MISCAST
mpr("Couldn't avoid lethal miscast: already printed message for this "
"miscast.", MSGCH_ERROR);
#endif
return (false);
}
#if DEBUG_DIAGNOSTICS || DEBUG_MISCAST
mpr("Avoided lethal miscast.", MSGCH_DIAGNOSTICS);
#endif
do_miscast();
return (true);
}
mpr("Your body is distorted in a weirdly horrible way!");
const bool failMsg = !give_bad_mutation();
you_msg = "Your body is distorted in a weirdly horrible way!";
const bool failMsg = !give_bad_mutation(true, false,
lethality_margin > 0);
_ouch(9 + random2avg(33, 2), BEAM_FIRE);
target->expose_to_element(BEAM_FIRE, 10);
if (_ouch(9 + random2avg(33, 2), BEAM_FIRE))
target->expose_to_element(BEAM_FIRE, 10);
switch (random2(13))
{
case 0: mutat = MUT_CARNIVOROUS; break;
case 1: mutat = MUT_HERBIVOROUS; break;
case 2: mutat = MUT_FAST_METABOLISM; break;
case 3: mutat = MUT_WEAK; break;
case 4: mutat = MUT_DOPEY; break;
case 5: mutat = MUT_CLUMSY; break;
case 6: mutat = MUT_TELEPORT; break;
case 7: mutat = MUT_DEFORMED; break;
case 8: mutat = MUT_SCREAM; break;
case 9: mutat = MUT_DETERIORATION; break;
case 10: mutat = MUT_BLURRY_VISION; break;
case 11: mutat = MUT_FRAIL; break;
case 12: mutat = MUT_LOW_MAGIC; break;
}
do {
switch (random2(13))
{
case 0: mutat = MUT_CARNIVOROUS; break;
case 1: mutat = MUT_HERBIVOROUS; break;
case 2: mutat = MUT_FAST_METABOLISM; break;
case 3: mutat = MUT_WEAK; break;
case 4: mutat = MUT_DOPEY; break;
case 5: mutat = MUT_CLUMSY; break;
case 6: mutat = MUT_TELEPORT; break;
case 7: mutat = MUT_DEFORMED; break;
case 8: mutat = MUT_SCREAM; break;
case 9: mutat = MUT_DETERIORATION; break;
case 10: mutat = MUT_BLURRY_VISION; break;
case 11: mutat = MUT_FRAIL; break;
case 12: mutat = MUT_LOW_MAGIC; break;
}
} while (non_fatal && !accept_mutation(mutat, true, true));