Triple contamination decay
authorNicholas Feinberg <pleasingfung@gmail.com>
Sat, 1 Aug 2020 05:07:56 +0000 (22:07 -0700)
committerNicholas Feinberg <pleasingfung@gmail.com>
Sat, 1 Aug 2020 05:15:06 +0000 (22:15 -0700)
Decay contamination three times as quickly (from -25/turn to -75),
and apply negative contamination effects correspondingly three times
as often.

It's quite easy to spend huge numbers of turns resting off
contamination, which is neither exciting nor meaningful. Now that the
zot clock exists, it makes sense to rationalize the amounts of time
involved. If invisiblity-based strategies are powerful, we have better
knobs to tweak them with.

Some notable effects:
- +Inv took between 50 to 150 turns to rest off at ~17 Evocations;
  now it takes 16-50 turns.
- Spell Invisibility took between 50 to 120 turns to rest off at 50
  power; now it takes 16-40 turns.
- One cast of Irradiate took 40-60 turns to rest off; now it takes
  13-20 turns.
- It took 200 turns to go from the edge yellow contam to no contam;
  now it takes 70ish.

crawl-ref/source/timed-effects.cc

index f6eaf07..d8e000b 100644 (file)
@@ -214,26 +214,22 @@ static void _hell_effects(int /*time_delta*/)
         _minor_hell_summons();
 }
 
-static void _handle_magic_contamination()
+static void _apply_contam_over_time()
 {
     int added_contamination = 0;
 
-    // Scale has been increased by a factor of 1000, but the effect now happens
-    // every turn instead of every 20 turns, so everything has been multiplied
-    // by 50 and scaled to you.time_taken.
-
     //Increase contamination each turn while invisible
     if (you.duration[DUR_INVIS])
         added_contamination += INVIS_CONTAM_PER_TURN;
     //If not invisible, normal dissipation
     else
-        added_contamination -= 25;
+        added_contamination -= 75;
 
     // The Orb halves dissipation (well a bit more, I had to round it),
     // but won't cause glow on its own -- otherwise it'd spam the player
     // with messages about contamination oscillating near zero.
     if (you.magic_contamination && player_has_orb())
-        added_contamination += 13;
+        added_contamination += 38;
 
     // Scaling to turn length
     added_contamination = div_rand_round(added_contamination * you.time_taken,
@@ -284,9 +280,8 @@ static void _magic_contamination_effects()
 }
 // Checks if the player should be hit with magic contaimination effects,
 // then actually does it if they should be.
-static void _handle_magic_contamination(int /*time_delta*/)
+static void _check_contamination_effects(int /*time_delta*/)
 {
-    // [ds] Move magic contamination effects closer to b26 again.
     const bool glow_effect = player_severe_contamination()
                              && x_chance_in_y(you.magic_contamination, 12000);
 
@@ -434,7 +429,7 @@ static struct timed_effect timed_effects[] =
 #if TAG_MAJOR_VERSION == 34
     { nullptr,                         0,     0, false },
 #endif
-    { _handle_magic_contamination,   200,   600, false },
+    { _check_contamination_effects,   70,   200, false },
 #if TAG_MAJOR_VERSION == 34
     { nullptr,                         0,     0, false },
 #endif
@@ -480,7 +475,7 @@ void handle_time()
 
     // Magic contamination from spells and Orb.
     if (!crawl_state.game_is_arena())
-        _handle_magic_contamination();
+        _apply_contam_over_time();
 
     for (unsigned int i = 0; i < ARRAYSZ(timed_effects); i++)
     {