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 checkyou.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 checkyou.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 checkyou.mutation[mutat]++;calc_mp();you.mutation[mutat]--;you.redraw_magic_points = true;break;
you.mutation[mutat]++;
// special-case checkyou.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");elsemodify_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 checkyou.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 checkyou.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");elsemodify_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);