diff options
Diffstat (limited to 'crawl-ref/source/decks.cc')
-rw-r--r-- | crawl-ref/source/decks.cc | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc index b3cb6a3e39..beaa76ebf2 100644 --- a/crawl-ref/source/decks.cc +++ b/crawl-ref/source/decks.cc @@ -1465,14 +1465,26 @@ static void _flight_card(int power, deck_rarity_type rarity) { const int power_level = get_power_level(power, rarity); - if ( power_level == 0 ) - transform(random2(power/4), coinflip() ? TRAN_SPIDER : TRAN_BAT); - if ( power_level >= 1 ) + // Assume something _will_ happen. + bool success = true; + + if (power_level == 0) + { + if (!transform(random2(power/4), coinflip() ? TRAN_SPIDER : TRAN_BAT, + true)) + { + // Oops, something went wrong here (either because of cursed + // equipment or the possibility of stat loss). + success = false; + } + } + else if (power_level >= 1) { cast_fly(random2(power/4)); cast_swiftness(random2(power/4)); } - if ( power_level == 2 ) + + if (power_level == 2) // Stacks with the above. { if (is_valid_shaft_level() && grd[you.x_pos][you.y_pos] == DNGN_FLOOR) { @@ -1484,8 +1496,10 @@ static void _flight_card(int power, deck_rarity_type rarity) } } } - if ( one_chance_in(4 - power_level) ) + if (one_chance_in(4 - power_level)) potion_effect(POT_INVISIBILITY, random2(power)/4); + else if (!success) + canned_msg(MSG_NOTHING_HAPPENS); } static void _minefield_card(int power, deck_rarity_type rarity) @@ -1682,9 +1696,6 @@ static void _battle_lust_card(int power, deck_rarity_type rarity) potion_effect(POT_MIGHT, random2(power/4)); } -// Doesn't allow transformation into bat. -// The sudden stat drain of Str-5 would be fatal to some characters! -// XXX: Maybe we could allow it if it would be non-fatal, at least. static void _metamorphosis_card(int power, deck_rarity_type rarity) { const int power_level = get_power_level(power, rarity); @@ -1695,9 +1706,16 @@ static void _metamorphosis_card(int power, deck_rarity_type rarity) else if (power_level == 1) trans = coinflip() ? TRAN_STATUE : TRAN_BLADE_HANDS; else - trans = coinflip() ? TRAN_SPIDER : TRAN_ICE_BEAST; + { + trans = one_chance_in(3) ? TRAN_SPIDER : + coinflip() ? TRAN_ICE_BEAST + : TRAN_BAT; + } - transform(random2(power/4), trans); + // Might fail, e.g. because of cursed equipment or potential death by + // stat loss. Aren't we being nice? + if (!transform(random2(power/4), trans, true)) + canned_msg(MSG_NOTHING_HAPPENS); } static void _helm_card(int power, deck_rarity_type rarity) |