Fix a tension check for runic seals (8085, 10542)
authorEdgar A. Bering IV <trizor@gmail.com>
Thu, 14 Jan 2021 17:22:03 +0000 (19:22 +0200)
committerEdgar A. Bering IV <trizor@gmail.com>
Thu, 14 Jan 2021 17:22:03 +0000 (19:22 +0200)
The previous tension check for closing doors had an incorrect
conditional, so that if tension were *increased* by the closure, the
warden would not decide to close the door! Additionally, this check
returned true in situations where the tension was 0 before and after the
closure. The result of the latter behavior was often locking the player
in with their allies away from the warden.

Closes #1534

crawl-ref/source/mon-cast.cc

index a75782b..de2fd5b 100644 (file)
@@ -2232,12 +2232,19 @@ static bool _should_force_door_shut(const coord_def& door)
     if (player_in_door)
         you.move_to_pos(oldpos);
 
+    dprf("Considering sealing cur tension: %d, new tension: %d",
+         cur_tension, new_tension);
+
     // If closing the door would reduce player tension by too much, probably
     // it is scarier for the player to leave it open and thus it should be left
     // open
-
-    // Currently won't allow tension to be lowered by more than 33%
-    return ((cur_tension - new_tension) * 3) <= cur_tension;
+    //
+    // Currently won't allow tension to be lowered by more than 33%.
+    //
+    // Also, if there's 0 tension, we require the door closure to create
+    // tensiion, otherwise we'll probably just lock the player away from the
+    // warden.
+    return 1 + cur_tension * 66 <= new_tension * 100;
 }
 
 static bool _seal_doors_and_stairs(const monster* warden,