summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-28 15:15:21 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-28 15:15:21 +0000
commit9357fd185f60e255c8b876b305f3f31e3b279975 (patch)
treea784e4a29fc68552b65f94a5883a0126848d0190 /crawl-ref/source
parentf041f603574aa87804c80067da8dce67d9927b9f (diff)
downloadcrawl-ref-9357fd185f60e255c8b876b305f3f31e3b279975.tar.gz
crawl-ref-9357fd185f60e255c8b876b305f3f31e3b279975.zip
Another mutation commit. Sorry, I couldn't resist.
I'm replacing the (stupid, I agree) "extra eyes" mutation with the more Crawlific "shaggy fur" mutation. It currently doesn't count towards the scales counter, but that could be changed. Also, maybe it could replace one of the scales with a similar AC bonus. Oh, and trolls start out with this at level 1 because I think it fits them. Adding the percentage bonus (rarity 1) and penalty (rarity 9) for mana. Maybe the bonus (+10%, +20%, +30%) should be abolished entirely as David suggested; for now I've left it as a mutation pair. As a third change I'm including the experimental sleepiness mutation that makes you randomly fall asleep. Being hit, loud noises and starving will make you wake up. Again, may break mutations of existing save files. --------------------------------- To answer David's question on balancing (or rather, make everything more complicated, I'm afraid) I've counted mutations in 0.3 and as of this commit, to compare them. Rarity influences the chance a mutation, once randomly chosen, will be considered acceptable, with a chance of rarity/10. Each round of trying to find an acceptable mutation there's a 1/1000 chance of just giving up. In brackets I will list the average probability of a good/bad mutation being chosen in a given round. (The difference to 100 is the chance of having to reroll.) in 0.3: 46 good mutations of average rarity 3.2 (23.72%) 12 bad mutations of average rarity 8 (15.47%) 4 in-between mutations of average rarity 7 (4.51%) (56.3% chance of rerolling) new: 48 good mutations of average rarity 3.1 (21.72%) 14 bad mutations of average rarity 7.6 (15.71%) 6 in-between mutations of average rarity 5 (4.41%) (58.16% chance of rerolling) By in-between mutations I mean ones with advantages and drawbacks, namely weak_flexible, strong_stiff, horns, hooves, talons and paws. (The last four are probably seen as mostly negative by a lot of players due to losing an equipment slot.) Because of the lower rarity of the new mutations (including drifting) the overall chance of _not_ receiving a mutation has slightly increased (1/1000 chance per reroll necessary). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2640 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/acr.cc10
-rw-r--r--crawl-ref/source/beam.cc2
-rw-r--r--crawl-ref/source/debug.cc8
-rw-r--r--crawl-ref/source/enum.h8
-rw-r--r--crawl-ref/source/fight.cc5
-rw-r--r--crawl-ref/source/food.cc1
-rw-r--r--crawl-ref/source/item_use.cc2
-rw-r--r--crawl-ref/source/items.cc5
-rw-r--r--crawl-ref/source/mutation.cc115
-rw-r--r--crawl-ref/source/newgame.cc1
-rw-r--r--crawl-ref/source/output.cc47
-rw-r--r--crawl-ref/source/player.cc15
-rw-r--r--crawl-ref/source/skills2.cc4
13 files changed, 161 insertions, 62 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index c6f72ef6dd..aee9c4f90b 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -1227,6 +1227,7 @@ static bool cmd_is_repeatable(command_type cmd, bool is_again = false)
of round */
bool apply_berserk_penalty = false;
+static void drift_player(int move_x, int move_y);
/*
* This function handles the player's input. It's called from main(),
* from inside an endless loop.
@@ -1291,6 +1292,13 @@ static void input()
crawl_state.cancel_cmd_repeat("Cannot move, cancelling command "
"repetition.");
+ // may sleep walk
+ if (!you.paralysed() && you.mutation[MUT_DRIFTING]
+ && (random2(100) <= you.mutation[MUT_DRIFTING] * 5) )
+ {
+ drift_player(0, 0);
+ }
+
world_reacts();
return;
}
@@ -3606,7 +3614,7 @@ static void do_berserk_no_combat_penalty(void)
} // end do_berserk_no_combat_penalty()
-static void drift_player(int move_x, int move_y)
+void drift_player(int move_x, int move_y)
{
int drift_dir = -1;
int okay_dirs = 0;
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 9c54dc65e5..be1542defe 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -1221,8 +1221,6 @@ static void zappy( zap_type z_type, int power, bolt &pbolt )
break;
} // end of switch
- pbolt.hit += you.mutation[MUT_EXTRA_EYES] * 2;
-
if ( wearing_amulet(AMU_INACCURACY) )
{
pbolt.hit -= 5;
diff --git a/crawl-ref/source/debug.cc b/crawl-ref/source/debug.cc
index bf4beb8a9c..c06df78603 100644
--- a/crawl-ref/source/debug.cc
+++ b/crawl-ref/source/debug.cc
@@ -1854,10 +1854,10 @@ static const char *mutation_type_names[] = {
"green marks",
"drifting",
"saprovorous",
- "extra eyes",
- "",
- "",
- "",
+ "shaggy fur",
+ "high mp",
+ "low mp",
+ "sleepiness",
"",
// from here on scales
"red scales",
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 4fd367f028..2595d53732 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -2014,9 +2014,13 @@ enum mutation_type
MUT_BIG_WINGS, // 65
MUT_BLUE_MARKS, // decorative, as in "mark of the devil"
MUT_GREEN_MARKS,
- MUT_DRIFTING,
+ MUT_DRIFTING, // new in 0.4
MUT_SAPROVOROUS,
- MUT_EXTRA_EYES, // new in 0.4 -- 70
+ MUT_SHAGGY_FUR, // new in 0.4 -- 70
+ MUT_HIGH_MAGIC, // new in 0.4
+ MUT_LOW_MAGIC, // new in 0.4
+ MUT_SLEEPINESS, // new in 0.4
+
// several types of scales (affect AC and sometimes more)
MUT_RED_SCALES = 75, // 75
MUT_NACREOUS_SCALES,
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 12f4a370b1..072cbe0bbd 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -176,8 +176,7 @@ static int calc_your_to_hit_unarmed(int uattack = UNAT_NO_ATTACK,
int your_to_hit;
your_to_hit = 13 + you.dex / 2 + you.skills[SK_UNARMED_COMBAT] / 2
- + you.skills[SK_FIGHTING] / 5
- + 2 * you.mutation[MUT_EXTRA_EYES];
+ + you.skills[SK_FIGHTING] / 5;
if (wearing_amulet(AMU_INACCURACY))
your_to_hit -= 5;
@@ -2365,8 +2364,6 @@ int melee_attack::player_to_hit(bool random_factor)
if (water_attack)
your_to_hit += 5;
- your_to_hit += you.mutation[MUT_EXTRA_EYES] * 2;
-
if (wearing_amulet(AMU_INACCURACY))
your_to_hit -= 5;
diff --git a/crawl-ref/source/food.cc b/crawl-ref/source/food.cc
index 58f887e91d..7ab07cd9c7 100644
--- a/crawl-ref/source/food.cc
+++ b/crawl-ref/source/food.cc
@@ -571,6 +571,7 @@ static bool food_change(bool suppress_message)
case HS_STARVING:
mpr("You are starving!", MSGCH_FOOD);
learned_something_new(TUT_YOU_STARVING);
+ you.check_awaken(500);
break;
case HS_HUNGRY:
mpr("You are feeling hungry.", MSGCH_FOOD);
diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc
index 8113033a6b..4854d0fcb3 100644
--- a/crawl-ref/source/item_use.cc
+++ b/crawl-ref/source/item_use.cc
@@ -1708,8 +1708,6 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
ammoHitBonus = item.plus;
ammoDamBonus = item.plus2;
- ammoHitBonus += you.mutation[MUT_EXTRA_EYES];
-
// CALCULATIONS FOR LAUNCHED WEAPONS
if (projected == LRET_LAUNCHED)
{
diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc
index c0dc3cf054..f0b055b05b 100644
--- a/crawl-ref/source/items.cc
+++ b/crawl-ref/source/items.cc
@@ -2678,6 +2678,11 @@ void handle_time( long time_delta )
{
yell(true);
}
+ else if (you.mutation[MUT_SLEEPINESS]
+ && random2(100) < you.mutation[MUT_SLEEPINESS] * 5)
+ {
+ you.put_to_sleep();
+ }
// Update all of the corpses and food chunks on the floor
update_corpses(time_delta);
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index ef9756e7d8..f794bdd5cf 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -226,7 +226,8 @@ const char *mutation_descrip[][3] = {
"You are somewhat resistant to both further mutation and mutation removal.",
"Your current mutations are irrevocably fixed, and you can mutate no more."},
- {"You are frail (-10 percent hp).", "You are very frail (-20 percent hp).",
+ {"You are frail (-10 percent hp).",
+ "You are very frail (-20 percent hp).",
"You are extremely frail (-30 percent hp)."},
{"You are robust (+10 percent hp).",
@@ -302,13 +303,22 @@ const char *mutation_descrip[][3] = {
"You thrive on rotten meat."},
// 70
- {"You have a third eye on your forehead.",
- "You have two additional eyes on your forehead.",
- "You have three additional eyes on your forehead."},
+ {"You are covered in fur.",
+ "You are covered in thick fur.",
+ "Your thick and shaggy fur keeps you warm."},
+
+ {"You have an increased reservoir of magic (+10 percent mp).",
+ "You have an strongly increased reservoir of magic (+20 percent mp).",
+ "You have an extremely increased reservoir of magic (+30 percent mp)."},
- {"", "", ""},
- {"", "", ""},
- {"", "", ""},
+ {"Your magical capacity is low (-10 percent mp).",
+ "Your magical capacity is very low (-20 percent mp).",
+ "Your magical capacity is extremy low (-30 percent mp)."},
+
+ {"You occasionally fall asleep.",
+ "You sometimes fall asleep.",
+ "You frequently fall asleep."},
+
{"", "", ""},
// 75
@@ -375,7 +385,7 @@ const char *mutation_descrip[][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 completely covered in patterned scales (AC + 3)."}
};
/*
@@ -563,13 +573,18 @@ const char *gain_mutation[][3] = {
{"", "", ""},
// 70
- {"You sprout an extra eye.",
- "You sprout another eye.",
- "You sprout another eye."},
+ {"Fur sprouts all over your body.",
+ "Your fur grows into a thick mane.",
+ "Your thick fur grows shaggy and warm."},
+
+ {"You feel more energetic.", "You feel more energetic.",
+ "You feel more energetic."},
- {"", "", ""},
- {"", "", ""},
- {"", "", ""},
+ {"You feel less energetic.", "You feel less energetic.",
+ "You feel less energetic."},
+
+ {"You feel a bit tired.", "You feel drowsy.", "You feel really drowsy."},
+
{"", "", ""},
// 75
@@ -622,7 +637,7 @@ const char *gain_mutation[][3] = {
"Iridescent scales cover you completely."},
{"Patterned scales grow over part of your body.",
"Patterned scales spread over more of your body.",
- "Patterned scales cover you completely."},
+ "Patterned scales cover you completely."}
};
const char *lose_mutation[][3] = {
@@ -794,13 +809,18 @@ const char *lose_mutation[][3] = {
{"", "", ""},
// 70
- {"Your extra eye disappears.",
- "One of your extra eyes disappears.",
- "One of your extra eyes disappears."},
+ {"You shed all your fur.",
+ "Your thick fur recedes somewhat.",
+ "Your shaggy fur recedes somewhat."},
- {"", "", ""},
- {"", "", ""},
- {"", "", ""},
+ {"You feel less energetic.", "You feel less energetic.",
+ "You feel less energetic."},
+
+ {"You feel more energetic.", "You feel more energetic.",
+ "You feel more energetic."},
+
+ {"You feel wide awake.", "You feel more awake.", "You feel more awake."},
+
{"", "", ""},
// 75
@@ -858,7 +878,7 @@ const char *lose_mutation[][3] = {
{"Your patterned scales disappear.",
"Your patterned scales recede somewhat.",
- "Your patterned scales recede somewhat."},
+ "Your patterned scales recede somewhat."}
};
/* mutation definitions:
@@ -946,13 +966,14 @@ static const mutation_def mutation_defs[] = {
{ MUT_BLUE_MARKS, 0, 3 }, // used by evil gods to mark followers
{ MUT_GREEN_MARKS, 0, 3 },
- { MUT_DRIFTING, 3, 3 },
+ { MUT_DRIFTING, 2, 3 },
{ MUT_SAPROVOROUS, 0, 3 }, // species-dependent innate mutation
- { MUT_EXTRA_EYES, 1, 3 },
- { RANDOM_MUTATION, 0, 3 },
- { RANDOM_MUTATION, 0, 3 },
- { RANDOM_MUTATION, 0, 3 },
+// 70
+ { MUT_SHAGGY_FUR, 2, 3 },
+ { MUT_HIGH_MAGIC, 1, 3 },
+ { MUT_LOW_MAGIC, 9, 3 },
+ { MUT_SLEEPINESS, 3, 3 },
{ RANDOM_MUTATION, 0, 3 },
// 75 -- scales of various colours and effects
@@ -972,7 +993,7 @@ static const mutation_def mutation_defs[] = {
{ MUT_INDIGO_SCALES, 2, 3 },
{ MUT_RED2_SCALES, 1, 3 },
{ MUT_IRIDESCENT_SCALES, 1, 3 },
- { MUT_PATTERNED_SCALES, 1, 3 },
+ { MUT_PATTERNED_SCALES, 1, 3 }
};
#ifdef DEBUG_DIAGNOSTICS
@@ -1354,6 +1375,7 @@ static int calc_mutation_amusement_value(mutation_type which_mutation)
case MUT_DETERIORATION:
case MUT_BLURRY_VISION:
case MUT_FRAIL:
+ case MUT_LOW_MAGIC:
case MUT_CLAWS:
case MUT_FANGS:
case MUT_HOOVES:
@@ -1365,7 +1387,6 @@ static int calc_mutation_amusement_value(mutation_type which_mutation)
case MUT_BLUE_MARKS:
case MUT_GREEN_MARKS:
case MUT_DRIFTING:
- case MUT_EXTRA_EYES:
amusement *= 2; // funny!
break;
@@ -1737,10 +1758,6 @@ bool mutate(mutation_type which_mutation, bool failMsg, bool force_mutation,
}
break;
- case MUT_EXTRA_EYES:
- mpr(gain_mutation[mutat][you.mutation[mutat]], MSGCH_MUTATION);
- break;
-
case MUT_STRONG_STIFF:
if (you.mutation[MUT_FLEXIBLE_WEAK] > 0)
{
@@ -1789,6 +1806,32 @@ bool mutate(mutation_type which_mutation, bool failMsg, bool force_mutation,
take_note(Note(NOTE_GET_MUTATION, mutat, you.mutation[mutat]));
return true;
+ case MUT_LOW_MAGIC:
+ if (you.mutation[MUT_HIGH_MAGIC] > 0)
+ {
+ delete_mutation(MUT_HIGH_MAGIC);
+ return true;
+ }
+ mpr(gain_mutation[mutat][you.mutation[mutat]], MSGCH_MUTATION);
+ you.mutation[mutat]++;
+ calc_mp();
+ /* special-case check */
+ take_note(Note(NOTE_GET_MUTATION, mutat, you.mutation[mutat]));
+ return true;
+
+ case MUT_HIGH_MAGIC:
+ if (you.mutation[MUT_LOW_MAGIC] > 0)
+ {
+ delete_mutation(MUT_LOW_MAGIC);
+ return true;
+ }
+ mpr(gain_mutation[mutat][you.mutation[mutat]], MSGCH_MUTATION);
+ you.mutation[mutat]++;
+ calc_mp();
+ /* special-case check */
+ take_note(Note(NOTE_GET_MUTATION, mutat, you.mutation[mutat]));
+ return true;
+
case MUT_BLACK_SCALES:
case MUT_BONEY_PLATES:
modify_stat(STAT_DEXTERITY, -1, true, "gaining a mutation");
@@ -1941,6 +1984,7 @@ bool delete_mutation(mutation_type which_mutation, bool force)
break;
case MUT_FRAIL:
+ case MUT_ROBUST:
mpr(lose_mutation[mutat][0], MSGCH_MUTATION);
if (you.mutation[mutat] > 0)
you.mutation[mutat]--;
@@ -1949,11 +1993,12 @@ bool delete_mutation(mutation_type which_mutation, bool force)
take_note(Note(NOTE_LOSE_MUTATION, mutat, you.mutation[mutat]));
return true;
- case MUT_ROBUST:
+ case MUT_LOW_MAGIC:
+ case MUT_HIGH_MAGIC:
mpr(lose_mutation[mutat][0], MSGCH_MUTATION);
if (you.mutation[mutat] > 0)
you.mutation[mutat]--;
- calc_hp();
+ calc_mp();
/* special-case check */
take_note(Note(NOTE_LOSE_MUTATION, mutat, you.mutation[mutat]));
return true;
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index ac2f204805..0a78efbf2a 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -1946,6 +1946,7 @@ static void give_basic_mutations(species_type speci)
you.mutation[MUT_REGENERATION] = 2;
you.mutation[MUT_FAST_METABOLISM] = 3;
you.mutation[MUT_SAPROVOROUS] = 2;
+ you.mutation[MUT_SHAGGY_FUR] = 1;
break;
case SP_KOBOLD:
you.mutation[MUT_SAPROVOROUS] = 2;
diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc
index 465640177a..47eb274478 100644
--- a/crawl-ref/source/output.cc
+++ b/crawl-ref/source/output.cc
@@ -1363,8 +1363,11 @@ std::string status_mut_abilities()
if (you.duration[DUR_CONF])
text += "confused, ";
+ // how exactly did you get to show the status?
if (you.duration[DUR_PARALYSIS])
text += "paralysed, ";
+ if (you.duration[DUR_SLEEP])
+ text += "sleeping, ";
if (you.duration[DUR_EXHAUSTED])
text += "exhausted, ";
@@ -1945,6 +1948,36 @@ std::string status_mut_abilities()
text += info;
have_any = true;
break;
+ case MUT_LOW_MAGIC:
+ if (have_any)
+ text += ", ";
+ snprintf(info, INFO_SIZE, "-%d%% mp", level*10);
+ text += info;
+ have_any = true;
+ break;
+ case MUT_HIGH_MAGIC:
+ if (have_any)
+ text += ", ";
+ snprintf(info, INFO_SIZE, "+%d mp%%", level*10);
+ text += info;
+ have_any = true;
+ break;
+ case MUT_DRIFTING:
+ if (have_any)
+ text += ", ";
+ snprintf(info, INFO_SIZE, "drifting %d", level);
+ text += info;
+ have_any = true;
+ break;
+ case MUT_SLEEPINESS:
+ if (have_any)
+ text += ", ";
+ snprintf(info, INFO_SIZE, "sleepiness %d", level);
+ text += info;
+ have_any = true;
+ break;
+
+ /* demonspawn mutations */
case MUT_TORMENT_RESISTANCE:
if (have_any)
text += ", ";
@@ -2036,6 +2069,7 @@ std::string status_mut_abilities()
text += "invoke powers of Tartarus";
have_any = true;
break;
+ /* end of demonspawn mutations */
case MUT_CLAWS:
if (have_any)
text += ", ";
@@ -2101,16 +2135,8 @@ std::string status_mut_abilities()
text += info;
have_any = true;
break;
- case MUT_EXTRA_EYES:
- if (have_any)
- text += ", ";
- snprintf(info, INFO_SIZE, "%d extra eye%s",
- level, level > 1? "s" : "");
- text += info;
- have_any = true;
- break;
- // scales -> calculate sum of AC bonus
+ // scales etc. -> calculate sum of AC bonus
case MUT_RED_SCALES:
AC_change += level;
if (level == 3)
@@ -2177,6 +2203,9 @@ std::string status_mut_abilities()
case MUT_PATTERNED_SCALES:
AC_change += level;
break;
+ case MUT_SHAGGY_FUR:
+ AC_change += level;
+ break;
default: break;
}
}
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index a56f8e51a5..68a9b48d8d 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -1099,6 +1099,9 @@ int player_res_cold(bool calc_unid)
// mutations:
rc += you.mutation[MUT_COLD_RESISTANCE];
+
+ if (you.mutation[MUT_SHAGGY_FUR] == 3)
+ rc++;
if (you.duration[DUR_FIRE_SHIELD])
rc -= 2;
@@ -1783,6 +1786,7 @@ int player_AC(void)
AC += 100 * you.mutation[MUT_IRIDESCENT_SCALES];
AC += 100 * you.mutation[MUT_PATTERNED_SCALES];
AC += 100 * you.mutation[MUT_BLUE_SCALES];
+ AC += 100 * you.mutation[MUT_SHAGGY_FUR];
// these gives: +1, +3, +5
if (you.mutation[MUT_GREEN_SCALES] > 0)
@@ -3457,9 +3461,12 @@ void display_char_status()
if (you.duration[DUR_BEHELD])
mpr( "You are beheld." );
+ // how exactly did you get to show the status?
if (you.duration[DUR_PARALYSIS])
mpr( "You are paralysed." );
-
+ if (you.duration[DUR_SLEEP])
+ mpr( "You are asleep." );
+
if (you.duration[DUR_EXHAUSTED])
mpr( "You are exhausted." );
@@ -4750,6 +4757,7 @@ bool confuse_player( int amount, bool resistable )
if (you.duration[DUR_CONF] > old_value)
{
// XXX: which message channel for this message?
+ you.check_awaken(500);
mprf("You are %sconfused.", (old_value > 0) ? "more " : "" );
learned_something_new(TUT_YOU_ENCHANTED);
@@ -5481,7 +5489,7 @@ bool player::cannot_speak() const
if (silenced(x_pos, y_pos))
return (true);
- if (you.duration[DUR_PARALYSIS])
+ if (you.duration[DUR_PARALYSIS]) // we allow talking during sleep ;)
return (true);
// No transform that prevents the player from speaking yet.
@@ -6127,7 +6135,7 @@ void player::moveto(const coord_def &c)
bool player::asleep() const
{
- return duration[DUR_SLEEP] > 0;
+ return (duration[DUR_SLEEP] > 0);
}
bool player::cannot_act() const
@@ -6152,6 +6160,7 @@ void player::put_to_sleep(int)
return;
mpr("You fall asleep.");
+ stop_delay();
you.flash_colour = DARKGREY;
viewwindow(true, false);
diff --git a/crawl-ref/source/skills2.cc b/crawl-ref/source/skills2.cc
index bb3ea4b4d2..6cff23559f 100644
--- a/crawl-ref/source/skills2.cc
+++ b/crawl-ref/source/skills2.cc
@@ -2243,6 +2243,10 @@ int calc_mp(bool real_mp)
if (!real_mp)
you.max_magic_points += player_magical_power();
+ // analogous to ROBUST/FRAIL
+ you.max_magic_points *= (10 + you.mutation[MUT_HIGH_MAGIC] - you.mutation[MUT_LOW_MAGIC]);
+ you.max_magic_points /= 10;
+
if (you.max_magic_points > 50)
you.max_magic_points = 50 + ((you.max_magic_points - 50) / 2);