OSDN Git Service

Reworded English message for a monk's successful MA_SLOW attack.
[hengband/hengband.git] / src / cmd-action / cmd-mind.c
index 12073a1..378fb8b 100644 (file)
@@ -16,6 +16,7 @@
 #include "core/player-redraw-types.h"
 #include "core/window-redrawer.h"
 #include "effect/effect-characteristics.h"
+#include "effect/effect-processor.h"
 #include "game-option/disturbance-options.h"
 #include "game-option/input-options.h"
 #include "grid/grid.h"
 #include "mind/mind-mindcrafter.h"
 #include "mind/mind-mirror-master.h"
 #include "mind/mind-ninja.h"
+#include "mind/mind-numbers.h"
 #include "mind/mind-power-getter.h"
 #include "mind/mind-types.h"
 #include "player/player-class.h"
 #include "player/player-damage.h"
+#include "player/player-status-table.h"
 #include "spell-kind/spells-teleport.h"
-#include "spell/process-effect.h"
 #include "spell/spell-types.h"
 #include "status/bad-status-setter.h"
 #include "status/base-status.h"
@@ -109,12 +111,12 @@ static void decide_mind_ki_chance(player_type *caster_ptr, cm_type *cm_ptr)
 
     if (caster_ptr->icky_wield[0])
         cm_ptr->chance += 20;
-    else if (has_melee_weapon(caster_ptr, INVEN_RARM))
+    else if (has_melee_weapon(caster_ptr, INVEN_MAIN_HAND))
         cm_ptr->chance += 10;
 
     if (caster_ptr->icky_wield[1])
         cm_ptr->chance += 20;
-    else if (has_melee_weapon(caster_ptr, INVEN_LARM))
+    else if (has_melee_weapon(caster_ptr, INVEN_SUB_HAND))
         cm_ptr->chance += 10;
 
     if (cm_ptr->n == 5)
@@ -132,7 +134,7 @@ static bool check_mind_hp_mp_sufficiency(player_type *caster_ptr, cm_type *cm_pt
 
         return TRUE;
     }
-    
+
     if (cm_ptr->mana_cost <= caster_ptr->csp)
         return TRUE;
 
@@ -186,19 +188,19 @@ static void check_mind_mindcrafter(player_type *caster_ptr, cm_type *cm_ptr)
         lose_all_info(caster_ptr);
         return;
     }
-    
+
     if (cm_ptr->b < 15) {
         msg_print(_("奇妙な光景が目の前で踊っている...", "Weird visions seem to dance before your eyes..."));
         set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
         return;
     }
-    
+
     if (cm_ptr->b < 45) {
         msg_print(_("あなたの頭は混乱した!", "Your brain is addled!"));
         set_confused(caster_ptr, caster_ptr->confused + randint1(8));
         return;
     }
-    
+
     if (cm_ptr->b < 90) {
         set_stun(caster_ptr, caster_ptr->stun + randint1(8));
         return;
@@ -217,13 +219,13 @@ static void check_mind_mirror_master(player_type *caster_ptr, cm_type *cm_ptr)
 
     if (cm_ptr->b < 51)
         return;
-    
+
     if (cm_ptr->b < 81) {
         msg_print(_("鏡の世界の干渉を受けた!", "Weird visions seem to dance before your eyes..."));
         teleport_player(caster_ptr, 10, TELEPORT_PASSIVE);
         return;
     }
-    
+
     if (cm_ptr->b < 96) {
         msg_print(_("まわりのものがキラキラ輝いている!", "Your brain is addled!"));
         set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
@@ -283,13 +285,70 @@ static bool switch_mind_class(player_type *caster_ptr, cm_type *cm_ptr)
 
 static void mind_turn_passing(player_type *caster_ptr, cm_type *cm_ptr)
 {
-    if (!cm_ptr->on_mirror || (caster_ptr->pclass != CLASS_MIRROR_MASTER)) {
-        take_turn(caster_ptr, 100);
-        return;    
+    if (cm_ptr->on_mirror && (caster_ptr->pclass == CLASS_MIRROR_MASTER)) {
+        if (cm_ptr->n == 3 || cm_ptr->n == 5 || cm_ptr->n == 7 || cm_ptr->n == 16) {
+            take_turn(caster_ptr, 50);
+            return;
+        }
+    }
+
+    take_turn(caster_ptr, 100);
+}
+
+static bool judge_mind_chance(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if (randint0(100) >= cm_ptr->chance) {
+        sound(SOUND_ZAP);
+        return switch_mind_class(caster_ptr, cm_ptr) && cm_ptr->cast;
+    }
+
+    if (flush_failure)
+        flush();
+
+    msg_format(_("%sの集中に失敗した!", "You failed to concentrate hard enough for %s!"), cm_ptr->mind_explanation);
+    sound(SOUND_FAIL);
+    check_mind_class(caster_ptr, cm_ptr);
+    return TRUE;
+}
+
+static void mind_reflection(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    int oops = cm_ptr->mana_cost - cm_ptr->old_csp;
+    if ((caster_ptr->csp - cm_ptr->mana_cost) < 0)
+        caster_ptr->csp_frac = 0;
+
+    caster_ptr->csp = MAX(0, caster_ptr->csp - cm_ptr->mana_cost);
+    msg_format(_("%sを集中しすぎて気を失ってしまった!", "You faint from the effort!"), cm_ptr->mind_explanation);
+    (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
+    if (randint0(100) >= 50)
+        return;
+
+    bool perm = randint0(100) < 25;
+    msg_print(_("自分の精神を攻撃してしまった!", "You have damaged your mind!"));
+    (void)dec_stat(caster_ptr, A_WIS, 15 + randint1(10), perm);
+}
+
+static void process_hard_concentration(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if ((cm_ptr->use_mind == MIND_BERSERKER) || (cm_ptr->use_mind == MIND_NINJUTSU)) {
+        take_hit(caster_ptr, DAMAGE_USELIFE, cm_ptr->mana_cost, _("過度の集中", "concentrating too hard"), -1);
+        caster_ptr->redraw |= PR_HP;
+        return;
+    }
+
+    if (cm_ptr->mana_cost > cm_ptr->old_csp) {
+        mind_reflection(caster_ptr, cm_ptr);
+        return;
+    }
+
+    caster_ptr->csp -= cm_ptr->mana_cost;
+    if (caster_ptr->csp < 0)
+        caster_ptr->csp = 0;
+
+    if ((cm_ptr->use_mind == MIND_MINDCRAFTER) && (cm_ptr->n == 13)) {
+        caster_ptr->csp = 0;
+        caster_ptr->csp_frac = 0;
     }
-        
-    if (cm_ptr->n == 3 || cm_ptr->n == 5 || cm_ptr->n == 7 || cm_ptr->n == 16)
-        take_turn(caster_ptr, 50);
 }
 
 /*!
@@ -315,47 +374,11 @@ void do_cmd_mind(player_type *caster_ptr)
     if (cm_ptr->chance > 95)
         cm_ptr->chance = 95;
 
-    if (randint0(100) < cm_ptr->chance) {
-        if (flush_failure)
-            flush();
-
-        msg_format(_("%sの集中に失敗した!", "You failed to concentrate hard enough for %s!"), cm_ptr->mind_explanation);
-        sound(SOUND_FAIL);
-        check_mind_class(caster_ptr, cm_ptr);
-    } else {
-        sound(SOUND_ZAP);
-        if (!switch_mind_class(caster_ptr, cm_ptr) || !cm_ptr->cast)
-            return;
-    }
+    if (!judge_mind_chance(caster_ptr, cm_ptr))
+        return;
 
     mind_turn_passing(caster_ptr, cm_ptr);
-    if ((cm_ptr->use_mind == MIND_BERSERKER) || (cm_ptr->use_mind == MIND_NINJUTSU)) {
-        take_hit(caster_ptr, DAMAGE_USELIFE, cm_ptr->mana_cost, _("過度の集中", "concentrating too hard"), -1);
-        caster_ptr->redraw |= PR_HP;
-    } else if (cm_ptr->mana_cost <= cm_ptr->old_csp) {
-        caster_ptr->csp -= cm_ptr->mana_cost;
-        if (caster_ptr->csp < 0)
-            caster_ptr->csp = 0;
-
-        if ((cm_ptr->use_mind == MIND_MINDCRAFTER) && (cm_ptr->n == 13)) {
-            caster_ptr->csp = 0;
-            caster_ptr->csp_frac = 0;
-        }
-    } else {
-        int oops = cm_ptr->mana_cost - cm_ptr->old_csp;
-        if ((caster_ptr->csp - cm_ptr->mana_cost) < 0)
-            caster_ptr->csp_frac = 0;
-
-        caster_ptr->csp = MAX(0, caster_ptr->csp - cm_ptr->mana_cost);
-        msg_format(_("%sを集中しすぎて気を失ってしまった!", "You faint from the effort!"), cm_ptr->mind_explanation);
-        (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
-        if (randint0(100) < 50) {
-            bool perm = (randint0(100) < 25);
-            msg_print(_("自分の精神を攻撃してしまった!", "You have damaged your mind!"));
-            (void)dec_stat(caster_ptr, A_WIS, 15 + randint1(10), perm);
-        }
-    }
-
+    process_hard_concentration(caster_ptr, cm_ptr);
     caster_ptr->redraw |= PR_MANA;
     caster_ptr->window |= PW_PLAYER;
     caster_ptr->window |= PW_SPELL;
@@ -417,4 +440,4 @@ void do_cmd_mind_browse(player_type *caster_ptr)
             break;
         }
     }
-}
+}
\ No newline at end of file