Adjust timing for evoked unrand HP/MP costs
authorKate <601195+semitonal@users.noreply.github.com>
Sun, 17 Jan 2021 03:37:17 +0000 (03:37 +0000)
committerKate <601195+semitonal@users.noreply.github.com>
Sun, 17 Jan 2021 03:39:46 +0000 (03:39 +0000)
As with the Majin-Bo in 0fe236c, reduce HP and MP as a cost before activating
the ability, and refund it if the ability is aborted.

crawl-ref/source/art-func.h

index c367e7b..74a2760 100644 (file)
@@ -41,6 +41,7 @@
 #include "mon-death.h"     // For demon axe's SAME_ATTITUDE
 #include "mon-place.h"     // For Sceptre of Asmodeus evoke
 #include "nearby-danger.h" // For Zhor
+#include "output.h"
 #include "player.h"
 #include "player-stats.h"
 #include "showsymb.h"      // For Cigotuvi's Embrace
@@ -184,31 +185,41 @@ static void _CURSES_melee_effects(item_def* /*weapon*/, actor* attacker,
 
 static bool _DISPATER_targeted_evoke(item_def */*item*/, bool* did_work, bool* unevokable, dist* target)
 {
-    if (!enough_hp(14, true))
+    const int hp_cost = 14;
+    const int mp_cost = 4;
+
+    if (!enough_hp(hp_cost, true))
     {
         mpr("You're too close to death to use this item.");
         *unevokable = true;
         return true;
     }
 
-    if (!enough_mp(4, false))
+    if (!enough_mp(mp_cost, false))
     {
         *unevokable = true;
         return true;
     }
 
     *did_work = true;
+    dec_hp(hp_cost, false);
+    dec_mp(mp_cost);
+
     int power = you.skill(SK_EVOCATIONS, 8);
 
-    if (your_spells(SPELL_HURL_DAMNATION, power, false, nullptr, target) == spret::abort)
+    if (your_spells(SPELL_HURL_DAMNATION, power, false, nullptr, target)
+        == spret::abort)
     {
         *unevokable = true;
+        inc_hp(hp_cost);
+        inc_mp(mp_cost, true);
+
+        redraw_screen();
+        update_screen();
         return false;
     }
 
     mpr("You feel the staff feeding on your energy!");
-    dec_hp(14, false);
-    dec_mp(4);
     practise_evoking(random_range(1, 2));
 
     return false;
@@ -261,7 +272,9 @@ static void _OLGREB_unequip(item_def */*item*/, bool *show_msgs)
 // targeter work
 static bool _OLGREB_targeted_evoke(item_def */*item*/, bool* did_work, bool* unevokable, dist* target)
 {
-    if (!enough_mp(4, false))
+    const int mp_cost = 4;
+
+    if (!enough_mp(mp_cost, false))
     {
         *unevokable = true;
         return true;
@@ -271,6 +284,7 @@ static bool _OLGREB_targeted_evoke(item_def */*item*/, bool* did_work, bool* une
         return false;
 
     *did_work = true;
+    dec_mp(mp_cost);
 
     int power = div_rand_round(20 + you.skill(SK_EVOCATIONS, 20), 4);
 
@@ -279,10 +293,13 @@ static bool _OLGREB_targeted_evoke(item_def */*item*/, bool* did_work, bool* une
         target) == spret::abort)
     {
         *unevokable = true;
+        inc_mp(mp_cost, true);
+
+        redraw_screen();
+        update_screen();
         return false;
     }
 
-    dec_mp(4);
     practise_evoking(1);
     did_god_conduct(DID_WIZARDLY_ITEM, 10);