Don't reduce the bounce range of spells with items
authorAlexanderPosch <49498206+AlexanderPosch@users.noreply.github.com>
Thu, 8 Apr 2021 17:22:29 +0000 (19:22 +0200)
committerEdgar A. Bering IV <trizor@gmail.com>
Tue, 20 Apr 2021 07:34:38 +0000 (10:34 +0300)
Resolves #1800. The code checks how long a bounced spell would have been
if los had not been restricted and then increases the range of bounced
the spell. (Kobolds nightstalker mutation does not count as a los
restriction).

[ Committer's note: Closes #1885. Squashed and rebased. Re-wrote some
  checks based on the change to how mutations interact with normal
  vision. Changed the range display to always display the normal-vision
  range (the symbol strings are rather cryptic, and the UI communicates
  things well enough with beam path highlighting). Re-wrote the commit
  message; adjusted style to fit our style guidelines. ]

crawl-ref/source/beam.cc
crawl-ref/source/spl-cast.cc
crawl-ref/source/spl-cast.h
crawl-ref/source/spl-util.cc
crawl-ref/source/spl-util.h

index 20387cc..03666a8 100644 (file)
@@ -838,6 +838,14 @@ void bolt::bounce()
     ray.bounce(rg);
     extra_range_used += 2;
 
+    // Keep length of bounced spells constant despite reduced los (scarf of
+    // shadows, Robe of Night)
+    if (bounces == 1)
+    {
+        extra_range_used -= spell_range(origin_spell, ench_power, true, true)
+                            - range;
+    }
+
     ASSERT(!cell_is_solid(ray.pos()));
 }
 
index c3b36d7..78d11cc 100644 (file)
@@ -2706,11 +2706,12 @@ string spell_power_string(spell_type spell)
         return make_stringf("%d%%", percent);
 }
 
-int calc_spell_range(spell_type spell, int power, bool allow_bonus)
+int calc_spell_range(spell_type spell, int power, bool allow_bonus,
+                     bool ignore_shadows)
 {
     if (power == 0)
         power = calc_spell_power(spell, true, false, false);
-    const int range = spell_range(spell, power, allow_bonus);
+    const int range = spell_range(spell, power, allow_bonus, ignore_shadows);
 
     return range;
 }
@@ -2729,7 +2730,7 @@ string spell_range_string(spell_type spell)
 
     const int cap      = spell_power_cap(spell);
     const int range    = calc_spell_range(spell, 0);
-    const int maxrange = spell_range(spell, cap);
+    const int maxrange = calc_spell_range(spell, cap, true, true);
 
     return range_string(range, maxrange, '@');
 }
index bfc7843..90199d8 100644 (file)
@@ -99,7 +99,8 @@ int stepdown_spellpower(int power, int scale = 1);
 int calc_spell_power(spell_type spell, bool apply_intel,
                      bool fail_rate_chk = false, bool cap_power = true,
                      int scale = 1);
-int calc_spell_range(spell_type spell, int power = 0, bool allow_bonus = true);
+int calc_spell_range(spell_type spell, int power = 0, bool allow_bonus = true,
+                     bool ignore_shadows = false);
 
 bool cast_a_spell(bool check_range, spell_type spell = SPELL_NO_SPELL, dist *_target = nullptr);
 
index 3783807..b9bd775 100644 (file)
@@ -985,10 +985,15 @@ int spell_power_cap(spell_type spell)
     }
 }
 
-int spell_range(spell_type spell, int pow, bool allow_bonus)
+int spell_range(spell_type spell, int pow,
+                bool allow_bonus, bool ignore_shadows)
 {
     int minrange = _seekspell(spell)->min_range;
     int maxrange = _seekspell(spell)->max_range;
+
+    const int range_cap = ignore_shadows ? you.normal_vision
+                                         : you.current_vision;
+
     ASSERT(maxrange >= minrange);
 
     // spells with no range have maxrange == minrange == -1
@@ -1007,15 +1012,15 @@ int spell_range(spell_type spell, int pow, bool allow_bonus)
     }
 
     if (minrange == maxrange)
-        return min(minrange, (int)you.current_vision);
+        return min(minrange, range_cap);
 
     const int powercap = spell_power_cap(spell);
 
     if (powercap <= pow)
-        return min(maxrange, (int)you.current_vision);
+        return min(maxrange, range_cap);
 
     // Round appropriately.
-    return min((int)you.current_vision,
+    return min(range_cap,
            (pow * (maxrange - minrange) + powercap / 2) / powercap + minrange);
 }
 
index bdddfd6..02cb173 100644 (file)
@@ -71,7 +71,8 @@ bool del_spell_from_memory(spell_type spell);
 int spell_mana(spell_type which_spell, bool real_spell = true);
 int spell_difficulty(spell_type which_spell);
 int spell_power_cap(spell_type spell);
-int spell_range(spell_type spell, int pow, bool allow_bonus = true);
+int spell_range(spell_type spell, int pow, bool allow_bonus = true,
+                bool ignore_shadows = false);
 int spell_noise(spell_type spell);
 int spell_effect_noise(spell_type spell, bool random = true);