Be less nice when a god gifts a negative mutation: clear away the appropriate positive mutation (e.g., eliminate Regeneration if a god gifts Slow Healing), instead of the previous behaviour, which was to fail. Fix bug where demonspawn with the genetically-stable mutation could get conflicting mutations. Clean up mutation code.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9333 c06c8d41-db1a-0410-9941-cceddc491573
4LFTDJY3DK6S7C7SQLLML6UIZ42GZOWK2EIMZZSNEKBWSA3YNUZAC
PEUZZFISVFBBT4VAJXIMVHTWCILA6ZWQRRJQAU7GN53PB5UMSVDQC
X55CKEKNO5RD2JMQ4MYX6PXQLDMLH4U4PPKSBK5EQ622J5HOPD2AC
HJ3US5VP52DTQXGRCUWP5XCN4EVILANCM5PIRHDRJC72AT5EQ55AC
UJLJE3HEDOO6ZOAVNALEFCNO73EWRBC3RIBLTKRUH26K6DWTD44AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
X3B7EVFL3GJOEID2C42QJQIQBJS4YLA4R2HT4LXGDPIBKHGDDEHQC
S6ADNAPM545WP3FRHCU6UWKX5VEMY5TPSIZYSZ3XE76VCBTVIN5QC
KPWRUHZWXG5TEDDAUCRTLGQGTAS27WYWODM3LXQ4E7XLHZEEY27AC
GA7RSKRL2B7OYL4NWCCMULF2QXJ27NALF7KWTSVXY272NS5KFGJQC
7CMQLE4XIFMWDEUZAOKIKDW7BHAJCK5S26APMEZ6TEFEH63TEZ6AC
3UDBQWJX7TIIV3WJWCOIETL7NYQ4GPEU5SUXA247SUZXNEAQQMBQC
FBK5ECMQ6HJSQSN7C3DICKJIRJ3CSO3CHCQ3ONPBKLLSHDGPBQ7QC
AR63P3QDQ6EU3CU4ECRGARNXTQFHOFGRAOSSQAZZ32TOFU6OFD2AC
ZCRK2DJ5VKECRQXZTWT4NUDL2VT5ZHUK7NT6NQPLRJ56TDX5PJSAC
AQ36MO7VNGSGQ5KK7JCQA2WEHUELAFLSU2QBUWROVJFOTPMGFGMQC
EWFP6RFDHTEGD6SX36LYRLQB3APIKGAHNBKWPD56RGYBUE4FWJUQC
UEEDQIFBOUZOXHCWGSEBED4Z3SYGN3DVHOVRJYQVWQQ6BIDLWAQAC
3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC
GEELBQH44QMV53JU7NT6XZOCRD2CYFRC5T4L3S3GO2CDS7DE4IXAC
WJVAUEVWY54A25BSDECBXUEQRQERE73ZZTZWZ5RQJRATMACX3YKAC
CQMX53TEZCRYKPNWUSNMMRRYBTRDF4Z4LXZWD7CSCZH6GDVDEK7QC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
VOVNQ3LJN6OK7WMMOH33SI45XYJSJKNCB6PVZUNP2TOZ45UPW5MQC
KVDUZCENP2TCYLWIGUOS4JD4PK4TIJE5GGCAXVUBAYSF5YZFADVAC
CLIEHAE2PP7ZIGLLIMYCWM4FC54KBOAN5AILOLAZJ5S26GTJM4RQC
6CWMT6I76TMTHT7BVOVZJ7ATDMZ3VBKKICIRRZBOSGLHJMDS2DWQC
EXHPY35NEM77IOLYIVBK5UV5NHEH6SRDJUI3F7IIDB6RDLBTBGTQC
CJZ3R6IPU766AVGO2QHTEHY6BGM375IUL4W2XA33F2G2SGIAD2KQC
6CZYPP67SB2M3SQS3QIPJWHZY7PJIRTTBH5CLORV3AALVTJIL5MQC
6BCD3B7SZ4T2VPOGO562767LMFCVMKBAUMF4PQ7T5XNKSXVY7F6QC
2Z77SMM425BA7PW3JIFR4IGV5YVON4MLY5VFTLFLF66KESOQEIHQC
OYU6GVAWXVQMFTNVQSY4VBAT53UJC6SKFFXEJYSX55LQAOHYR4ZQC
4PJLE5SRBVGBVEKGZZIKGYZH6VJ3JBWJMNGVOIDXT3QG7M6OB2SAC
VCRHZX4OD42RQ6MIMXL6UXII46APZCHKPWV3TCFMYCKMIEK3GX2QC
PDK36YVNNJ76LDXLK3NBHHLE47GZRVYGAXDY2FWLD5H7HR4Q6WRAC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
SYOKJY5QJ6Q45KSF6Z2ADNGOS5CIRIY6CS5ZFKWZKV5J57Q7QMGAC
3YX6L7FRX6HJVP6QX7VRWBJ6S2JZNRINKHOTPQGQAOGX2PS7H3JQC
CMNLYUECIMEZSOYG4KOSINOPER5OM7PPCGIHCM7LQVWEO77XFUYQC
63UCVTP63JTSBOG2SWB27RHOGKVSTRQL6XHF7D4GW2LNRDRZJ6FQC
I2PL54BONLM4RYG4OE7M2UEWDYXPVB4SYGTXZM3OPQPAQCG3VLTQC
2NVJIPJ5NMHUI2J4WOR6KE4XZOCJIVWHQK4M2M6KG7PL24PGBDGAC
{"You are partially covered in green scales (AC + 1).",
"You are mostly covered in green scales (AC + 3).",
"You are covered in green scales (AC + 5)."},
{"You are partially covered in green scales (AC +1).",
"You are mostly covered in green scales (AC +3).",
"You are covered in green scales (AC +5)."},
{"You are partially covered in thick black scales (AC + 3, Dex - 1).",
"You are mostly covered in thick black scales (AC + 6, Dex - 2).",
"You are completely covered in thick black scales (AC + 9, Dex - 3)."},
{"You are partially covered in thick black scales (AC +3, Dex -1).",
"You are mostly covered in thick black scales (AC +6, Dex -2).",
"You are completely covered in thick black scales (AC +9, Dex -3)."},
{"You are partially covered in supple grey scales (AC + 1).",
"You are mostly covered in supple grey scales (AC + 2).",
"You are completely covered in supple grey scales (AC + 3)."},
{"You are partially covered in supple grey scales (AC +1).",
"You are mostly covered in supple grey scales (AC +2).",
"You are completely covered in supple grey scales (AC +3)."},
{"You are protected by plates of bone (AC + 2, Dex -1).",
"You are protected by plates of bone (AC + 3, Dex -2).",
"You are protected by plates of bone (AC + 4, Dex -3)."},
{"You are protected by plates of bone (AC +2, Dex -1).",
"You are protected by plates of bone (AC +3, Dex -2).",
"You are protected by plates of bone (AC +4, Dex -3)."},
{"You are covered in fur (AC + 1).",
"You are covered in thick fur (AC + 2).",
"Your thick and shaggy fur keeps you warm (AC + 3, cold resistant)."},
{"You are covered in fur (AC +1).",
"You are covered in thick fur (AC +2).",
"Your thick and shaggy fur keeps you warm (AC +3, cold resistant)."},
{"You are partially covered in red scales (AC + 1).",
"You are mostly covered in red scales (AC + 2).",
"You are covered in red scales (AC + 4)."},
{"You are partially covered in red scales (AC +1).",
"You are mostly covered in red scales (AC +2).",
"You are covered in red scales (AC +4)."},
{"You are partially covered in smooth nacreous scales (AC + 1).",
"You are mostly covered in smooth nacreous scales (AC + 3).",
"You are completely covered in smooth nacreous scales (AC + 5)."},
{"You are partially covered in smooth nacreous scales (AC +1).",
"You are mostly covered in smooth nacreous scales (AC +3).",
"You are completely covered in smooth nacreous scales (AC +5)."},
{"You are partially covered in ridged grey scales (AC + 2, Dex -1).",
"You are mostly covered in ridged grey scales (AC + 4, Dex -1).",
"You are completely covered in ridged grey scales (AC + 6, Dex -2)."},
{"You are partially covered in ridged grey scales (AC +2, Dex -1).",
"You are mostly covered in ridged grey scales (AC +4, Dex -1).",
"You are completely covered in ridged grey scales (AC +6, Dex -2)."},
{"You are partially covered in metallic scales (AC + 3, Dex -2).",
"You are mostly covered in metallic scales (AC + 7, Dex -3).",
"You are completely covered in metallic scales (AC + 10, Dex -4)."},
{"You are partially covered in metallic scales (AC +3, Dex -2).",
"You are mostly covered in metallic scales (AC +7, Dex -3).",
"You are completely covered in metallic scales (AC +10, Dex -4)."},
{"You are partially covered in black scales (AC + 1).",
"You are mostly covered in black scales (AC + 3).",
"You are completely covered in black scales (AC + 5)."},
{"You are partially covered in black scales (AC +1).",
"You are mostly covered in black scales (AC +3).",
"You are completely covered in black scales (AC +5)."},
{"You are partially covered in white scales (AC + 1).",
"You are mostly covered in white scales (AC + 3).",
"You are completely covered in white scales (AC + 5)."},
{"You are partially covered in white scales (AC +1).",
"You are mostly covered in white scales (AC +3).",
"You are completely covered in white scales (AC +5)."},
{"You are partially covered in yellow scales (AC + 2).",
"You are mostly covered in yellow scales (AC + 4, Dex -1).",
"You are completely covered in yellow scales (AC + 6, Dex -2)."},
{"You are partially covered in yellow scales (AC +2).",
"You are mostly covered in yellow scales (AC +4, Dex -1).",
"You are completely covered in yellow scales (AC +6, Dex -2)."},
{"You are partially covered in brown scales (AC + 2).",
"You are mostly covered in brown scales (AC + 4).",
"You are completely covered in brown scales (AC + 5)."},
{"You are partially covered in brown scales (AC +2).",
"You are mostly covered in brown scales (AC +4).",
"You are completely covered in brown scales (AC +5)."},
{"You are partially covered in blue scales (AC + 1).",
"You are mostly covered in blue scales (AC + 2).",
"You are completely covered in blue scales (AC + 3)."},
{"You are partially covered in blue scales (AC +1).",
"You are mostly covered in blue scales (AC +2).",
"You are completely covered in blue scales (AC +3)."},
{"You are partially covered in purple scales (AC + 2).",
"You are mostly covered in purple scales (AC + 4).",
"You are completely covered in purple scales (AC + 6)."},
{"You are partially covered in purple scales (AC +2).",
"You are mostly covered in purple scales (AC +4).",
"You are completely covered in purple scales (AC +6)."},
{"You are partially covered in speckled scales (AC + 1).",
"You are mostly covered in speckled scales (AC + 2).",
"You are covered in speckled scales (AC + 3)."},
{"You are partially covered in speckled scales (AC +1).",
"You are mostly covered in speckled scales (AC +2).",
"You are covered in speckled scales (AC +3)."},
{"You are partially covered in orange scales (AC + 1).",
"You are mostly covered in orange scales (AC + 3).",
"You are completely covered in orange scales (AC + 4)."},
{"You are partially covered in orange scales (AC +1).",
"You are mostly covered in orange scales (AC +3).",
"You are completely covered in orange scales (AC +4)."},
{"You are partially covered in indigo scales (AC + 2).",
"You are mostly covered in indigo scales (AC + 3).",
"You are completely covered in indigo scales (AC + 5)."},
{"You are partially covered in indigo scales (AC +2).",
"You are mostly covered in indigo scales (AC +3).",
"You are completely covered in indigo scales (AC +5)."},
{"You are partially covered in knobbly red scales (AC + 2).",
"You are mostly covered in knobbly red scales (AC + 5, Dex -1).",
"You are completely covered in knobbly red scales (AC + 7, Dex -2)."},
{"You are partially covered in knobbly red scales (AC +2).",
"You are mostly covered in knobbly red scales (AC +5, Dex -1).",
"You are completely covered in knobbly red scales (AC +7, Dex -2)."},
{"You are partially covered in iridescent scales (AC + 1).",
"You are mostly covered in iridescent scales (AC + 2).",
"You are completely covered in iridescent scales (AC + 3)."},
{"You are partially covered in iridescent scales (AC +1).",
"You are mostly covered in iridescent scales (AC +2).",
"You are completely covered in iridescent scales (AC +3)."},
{"You are partially covered in patterned scales (AC + 1).",
"You are mostly covered in patterned scales (AC + 2).",
"You are completely covered in patterned scales (AC + 3)."},
{"You are partially covered in patterned scales (AC +1).",
"You are mostly covered in patterned scales (AC +2).",
"You are completely covered in patterned scales (AC +3)."},
if (one_chance_in(5))
{
switch (random2(8))
{
case 0: mutat = MUT_WEAK; break;
case 1: mutat = MUT_DOPEY; break;
case 2: mutat = MUT_CLUMSY; break;
case 3: mutat = MUT_DEFORMED; break;
case 4: mutat = MUT_SCREAM; break;
case 5: mutat = MUT_DETERIORATION; break;
case 6: mutat = MUT_BLURRY_VISION; break;
case 7: mutat = MUT_FRAIL; break;
}
}
else if (one_chance_in(5))
mutat = RANDOM_ELEMENT(bad_muts);
// Tries to give you the mutation by deleting a conflicting
// one, or clears out conflicting mutations if we should give
// you the mutation anyway.
// Return:
// 1 if we should stop processing (success);
// 0 if we should continue processing;
// -1 if we should stop processing (failure).
static int _handle_conflicting_mutations(mutation_type mutation,
bool override)
{
if (override)
{
// These are mutations which should be cleared away if
// forced.
const mutation_type override_conflict[][2] = {
{ MUT_REGENERATION, MUT_SLOW_METABOLISM },
{ MUT_REGENERATION, MUT_SLOW_HEALING },
{ MUT_ACUTE_VISION, MUT_BLURRY_VISION }
};
// If we have one of the pair, delete all levels of
// the other, and continue processing.
for (unsigned i = 0; i < ARRAYSZ(override_conflict); ++i)
{
for (int j = 0; j < 2; ++j)
{
const mutation_type a = override_conflict[i][j];
const mutation_type b = override_conflict[i][1-j];
if (mutation == a)
while (delete_mutation(b, true, true))
;
}
}
}
// These are mutations which can't be traded off against each
// other, so we just fail.
const mutation_type fail_conflict[][2] = {
{ MUT_REGENERATION, MUT_SLOW_METABOLISM },
{ MUT_FANGS, MUT_BEAK }
};
for (unsigned i = 0; i < ARRAYSZ(fail_conflict); ++i)
{
for (int j = 0; j < 2; ++j)
{
const mutation_type a = fail_conflict[i][j];
const mutation_type b = fail_conflict[i][1-j];
if (mutation == a && you.mutation[b] > 0)
return (-1); // Fail.
}
}
// These are mutations which trade off against each other.
const mutation_type simple_conflict[][2] = {
{ MUT_STRONG, MUT_WEAK },
{ MUT_CLEVER, MUT_DOPEY },
{ MUT_AGILE, MUT_CLUMSY },
{ MUT_STRONG_STIFF, MUT_FLEXIBLE_WEAK },
{ MUT_ROBUST, MUT_FRAIL },
{ MUT_HIGH_MAGIC, MUT_LOW_MAGIC },
{ MUT_CARNIVOROUS, MUT_HERBIVOROUS },
{ MUT_SLOW_METABOLISM, MUT_FAST_METABOLISM },
{ MUT_REGENERATION, MUT_SLOW_HEALING },
{ MUT_ACUTE_VISION, MUT_BLURRY_VISION }
};
for (unsigned i = 0; i < ARRAYSZ(simple_conflict); ++i)
{
for (int j = 0; j < 2; ++j)
{
// If we have one of the pair, delete a level of the
// other, and that's it.
const mutation_type a = simple_conflict[i][j];
const mutation_type b = simple_conflict[i][1-j];
if (mutation == a && you.mutation[b] > 0)
{
delete_mutation(b);
return (1); // Nothing more to do
}
}
}
return (0);
}
}
// This one can be forced by demonspawn or god gifts.
if (mutat == MUT_REGENERATION
&& you.mutation[MUT_SLOW_METABOLISM] > 0 && !god_gift
&& !force_mutation)
{
// If you have a slow metabolism, no regeneration.
return (false);
// If you have regeneration, no slow metabolism.
if (mutat == MUT_SLOW_METABOLISM && you.mutation[MUT_REGENERATION] > 0)
return (false);
// If you have slow healing, no regeneration.
if (mutat == MUT_REGENERATION && you.mutation[MUT_SLOW_HEALING] > 0)
return (false);
// This one can be forced by demonspawn or god gifts.
if (mutat == MUT_ACUTE_VISION
&& you.mutation[MUT_BLURRY_VISION] > 0 && !god_gift
&& !force_mutation)
{
return (false);
}
// No blurred vision with see invisible.
if (mutat == MUT_BLURRY_VISION && you.mutation[MUT_ACUTE_VISION] > 0)
return (false);
bool need_msg = true;
stat_type change_stat = STAT_RANDOM;
int change_amount = 0;
switch (mutat)
{
case MUT_STRONG:
if (you.mutation[MUT_WEAK] > 0)
{
delete_mutation(MUT_WEAK);
return (true);
}
change_stat = STAT_STRENGTH;
change_amount = 1;
break;
case MUT_CLEVER:
if (you.mutation[MUT_DOPEY] > 0)
{
delete_mutation(MUT_DOPEY);
return (true);
}
change_stat = STAT_INTELLIGENCE;
change_amount = 1;
break;
case MUT_AGILE:
if (you.mutation[MUT_CLUMSY] > 0)
{
delete_mutation(MUT_CLUMSY);
return (true);
}
change_stat = STAT_DEXTERITY;
change_amount = 1;
break;
case MUT_WEAK:
if (you.mutation[MUT_STRONG] > 0)
{
delete_mutation(MUT_STRONG);
return (true);
}
change_stat = STAT_STRENGTH;
change_amount = -1;
break;
case MUT_DOPEY:
if (you.mutation[MUT_CLEVER] > 0)
{
delete_mutation(MUT_CLEVER);
return (true);
}
change_stat = STAT_INTELLIGENCE;
change_amount = -1;
break;
case MUT_CLUMSY:
if (you.mutation[MUT_AGILE] > 0)
{
delete_mutation(MUT_AGILE);
return (true);
}
change_stat = STAT_DEXTERITY;
change_amount = -1;
break;
case MUT_REGENERATION:
if (you.mutation[MUT_SLOW_METABOLISM] > 0)
{
// Should only get here from demonspawn or a god gift, where
// our innate ability will clear away the counter-mutation.
while (delete_mutation(MUT_SLOW_METABOLISM))
;
}
break;
case MUT_ACUTE_VISION:
if (you.mutation[MUT_BLURRY_VISION] > 0)
{
// Should only get here from demonspawn or a god gift, where
// our innate ability will clear away the counter-mutation.
while (delete_mutation(MUT_BLURRY_VISION))
;
}
break;
// God gifts and forced mutations clear away conflicting mutations.
int rc =_handle_conflicting_mutations(mutat, god_gift || force_mutation);
if (rc == 1)
return (true);
if (rc == -1)
return (false);
ASSERT(rc == 0);
case MUT_CARNIVOROUS:
if (you.mutation[MUT_HERBIVOROUS] > 0)
{
delete_mutation(MUT_HERBIVOROUS);
return (true);
}
break;
bool gain_msg = true;
bool stat_msg = false;
case MUT_HERBIVOROUS:
if (you.mutation[MUT_CARNIVOROUS] > 0)
{
delete_mutation(MUT_CARNIVOROUS);
return (true);
}
break;
// Save original stats.
const stat_type stats[] = {STAT_STRENGTH, STAT_DEXTERITY,
STAT_INTELLIGENCE};
int modifiers[3];
case MUT_FAST_METABOLISM:
if (you.mutation[MUT_SLOW_METABOLISM] > 0)
{
delete_mutation(MUT_SLOW_METABOLISM);
return (true);
}
break;
for (int i = 0; i < 3; ++i)
modifiers[i] = stat_modifier(stats[i]);
case MUT_SLOW_METABOLISM:
if (you.mutation[MUT_FAST_METABOLISM] > 0)
{
delete_mutation(MUT_FAST_METABOLISM);
return (true);
}
switch (mutat)
{
case MUT_STRONG: case MUT_AGILE: case MUT_CLEVER:
case MUT_WEAK: case MUT_CLUMSY: case MUT_DOPEY:
stat_msg = true;
gain_msg = false;
}
break;
case MUT_STRONG_STIFF:
if (you.mutation[MUT_FLEXIBLE_WEAK] > 0)
{
delete_mutation(MUT_FLEXIBLE_WEAK);
return (true);
}
modify_stat(STAT_STRENGTH, 1, true, "gaining a mutation");
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
break;
case MUT_FLEXIBLE_WEAK:
if (you.mutation[MUT_STRONG_STIFF] > 0)
{
delete_mutation(MUT_STRONG_STIFF);
return (true);
case MUT_FRAIL:
if (you.mutation[MUT_ROBUST] > 0)
{
delete_mutation(MUT_ROBUST);
return (true);
}
// special-case check
you.mutation[mutat]++;
calc_hp();
you.mutation[mutat]--;
you.redraw_hit_points = true;
default:
case MUT_ROBUST:
if (you.mutation[MUT_FRAIL] > 0)
{
delete_mutation(MUT_FRAIL);
return (true);
}
// special-case check
you.mutation[mutat]++;
calc_hp();
you.mutation[mutat]--;
you.redraw_hit_points = true;
break;
// For all those scale mutations.
you.redraw_armour_class = true;
case MUT_LOW_MAGIC:
if (you.mutation[MUT_HIGH_MAGIC] > 0)
{
delete_mutation(MUT_HIGH_MAGIC);
return (true);
}
// special-case check
you.mutation[mutat]++;
calc_mp();
you.mutation[mutat]--;
you.redraw_magic_points = true;
break;
you.mutation[mutat]++;
// special-case check
you.mutation[mutat]++;
calc_mp();
you.mutation[mutat]--;
you.redraw_magic_points = true;
break;
case MUT_BLACK_SCALES:
case MUT_BONEY_PLATES:
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
break;
case MUT_GREY2_SCALES:
if (you.mutation[mutat] != 1)
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
break;
case MUT_METALLIC_SCALES:
if (you.mutation[mutat] == 0)
modify_stat(STAT_DEXTERITY, -2, true, "gaining a mutation");
else
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
break;
case MUT_RED2_SCALES:
case MUT_YELLOW_SCALES:
if (you.mutation[mutat] != 0)
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
break;
default:
break;
if (change_stat != STAT_RANDOM && change_amount != 0)
modify_stat(change_stat, change_amount, false, "losing a mutation");
else if (need_msg)
mpr(mdef.gain[you.mutation[mutat]], MSGCH_MUTATION);
// Do post-mutation effects.
if (mutat == MUT_FRAIL || mutat == MUT_ROBUST)
calc_hp();
if (mutat == MUT_LOW_MAGIC || mutat == MUT_HIGH_MAGIC)
calc_mp();
stat_type change_stat = STAT_RANDOM;
int change_amount = 0;
switch (mutat)
{
case MUT_STRONG:
change_stat = STAT_STRENGTH;
change_amount = -1;
break;
case MUT_CLEVER:
change_stat = STAT_INTELLIGENCE;
change_amount = -1;
break;
case MUT_AGILE:
change_stat = STAT_DEXTERITY;
change_amount = -1;
break;
case MUT_WEAK:
change_stat = STAT_STRENGTH;
change_amount = 1;
break;
case MUT_DOPEY:
change_stat = STAT_INTELLIGENCE;
change_amount = 1;
break;
case MUT_CLUMSY:
change_stat = STAT_DEXTERITY;
change_amount = 1;
break;
case MUT_STRONG_STIFF:
modify_stat(STAT_STRENGTH, -1, true, "losing a mutation");
modify_stat(STAT_DEXTERITY, 1, true, "losing a mutation");
break;
case MUT_FLEXIBLE_WEAK:
modify_stat(STAT_STRENGTH, 1, true, "losing a mutation");
modify_stat(STAT_DEXTERITY, -1, true, "losing a mutation");
break;
case MUT_FRAIL:
case MUT_ROBUST:
// special-case check
you.mutation[mutat]--;
calc_hp();
you.mutation[mutat]++;
you.redraw_hit_points = true;
break;
bool lose_msg = true;
bool stat_msg = false;
case MUT_LOW_MAGIC:
case MUT_HIGH_MAGIC:
// special-case check
you.mutation[mutat]--;
calc_mp();
you.mutation[mutat]++;
you.redraw_magic_points = true;
break;
case MUT_BLACK_SCALES:
case MUT_BONEY_PLATES:
modify_stat(STAT_DEXTERITY, 1, true, "losing a mutation");
break;
// Save original stats.
const stat_type stats[] = {STAT_STRENGTH, STAT_DEXTERITY,
STAT_INTELLIGENCE};
int modifiers[3];
case MUT_GREY2_SCALES:
if (you.mutation[mutat] != 2)
modify_stat(STAT_DEXTERITY, 1, true, "losing a mutation");
break;
for (int i = 0; i < 3; ++i)
modifiers[i] = stat_modifier(stats[i]);
case MUT_METALLIC_SCALES:
if (you.mutation[mutat] == 1)
modify_stat(STAT_DEXTERITY, 2, true, "losing a mutation");
else
modify_stat(STAT_DEXTERITY, 1, true, "losing a mutation");
switch (mutat)
{
case MUT_STRONG: case MUT_AGILE: case MUT_CLEVER:
case MUT_WEAK: case MUT_CLUMSY: case MUT_DOPEY:
stat_msg = true;
lose_msg = false;
covered += you.mutation[MUT_GREEN_SCALES];
covered += you.mutation[MUT_BLACK_SCALES];
covered += you.mutation[MUT_GREY_SCALES];
covered += you.mutation[MUT_BONEY_PLATES];
covered += you.mutation[MUT_SHAGGY_FUR];
covered += you.mutation[MUT_RED_SCALES];
covered += you.mutation[MUT_NACREOUS_SCALES];
covered += you.mutation[MUT_GREY2_SCALES];
covered += you.mutation[MUT_METALLIC_SCALES];
covered += you.mutation[MUT_BLACK2_SCALES];
covered += you.mutation[MUT_WHITE_SCALES];
covered += you.mutation[MUT_YELLOW_SCALES];
covered += you.mutation[MUT_BROWN_SCALES];
covered += you.mutation[MUT_BLUE_SCALES];
covered += you.mutation[MUT_PURPLE_SCALES];
covered += you.mutation[MUT_SPECKLED_SCALES];
covered += you.mutation[MUT_ORANGE_SCALES];
covered += you.mutation[MUT_INDIGO_SCALES];
covered += you.mutation[MUT_RED2_SCALES];
covered += you.mutation[MUT_IRIDESCENT_SCALES];
covered += you.mutation[MUT_PATTERNED_SCALES];
MUT_BONEY_PLATES, MUT_GREEN_SCALES, MUT_BLACK_SCALES,
MUT_GREY_SCALES, MUT_RED_SCALES, MUT_NACREOUS_SCALES,
MUT_GREY2_SCALES, MUT_METALLIC_SCALES, MUT_BLACK2_SCALES,
MUT_WHITE_SCALES, MUT_YELLOW_SCALES, MUT_BROWN_SCALES,
MUT_BLUE_SCALES, MUT_PURPLE_SCALES, MUT_SPECKLED_SCALES,
MUT_ORANGE_SCALES, MUT_INDIGO_SCALES, MUT_RED2_SCALES,
MUT_IRIDESCENT_SCALES, MUT_PATTERNED_SCALES
};
for (unsigned i = 0; i < ARRAYSZ(scales); ++i)
covered += you.mutation[scales[i]];
mutation_type mutat = NUM_MUTATIONS;
const mutation_type bad_muts[] = {
MUT_CARNIVOROUS, MUT_HERBIVOROUS, MUT_FAST_METABOLISM,
MUT_WEAK, MUT_DOPEY, MUT_CLUMSY,
MUT_TELEPORT, MUT_DEFORMED, MUT_SCREAM,
MUT_DETERIORATION, MUT_BLURRY_VISION, MUT_FRAIL,
MUT_LOW_MAGIC, MUT_SLOW_HEALING
};
mutation_type mutat;
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;
}
mutat = RANDOM_ELEMENT(bad_muts);