OSDN Git Service

Reworded English message for a monk's successful MA_SLOW attack.
[hengband/hengband.git] / src / cmd-action / cmd-mind.c
index d8b8a6e..378fb8b 100644 (file)
 
 #include "cmd-action/cmd-mind.h"
 #include "action/action-limited.h"
-#include "effect/effect-characteristics.h"
 #include "core/asking-player.h"
 #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 "io/input-key-acceptor.h"
 #include "inventory/inventory-slot-types.h"
+#include "io/input-key-acceptor.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/mind-berserker.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"
 #include "util/buffer-shaper.h"
 #include "view/display-messages.h"
 
-/*!
- * @brief 特殊技能コマンドのメインルーチン /
- * @return なし
- */
-void do_cmd_mind(player_type *caster_ptr)
-{
-    SPELL_IDX n = 0;
-    int b = 0;
+typedef struct cm_type {
+    mind_kind_type use_mind;
+    concptr mind_explanation;
+    SPELL_IDX n;
+    int b;
     PERCENTAGE chance;
-    PERCENTAGE minfail = 0;
-    PLAYER_LEVEL plev = caster_ptr->lev;
-    int old_csp = caster_ptr->csp;
+    PERCENTAGE minfail;
+    PLAYER_LEVEL plev;
+    int old_csp;
     mind_type spell;
     bool cast;
-    int use_mind, mana_cost;
-    concptr p;
-    bool on_mirror = FALSE;
+    int mana_cost;
+    bool on_mirror;
+} cm_type;
 
-    if (cmd_limit_confused(caster_ptr) || !get_mind_power(caster_ptr, &n, FALSE))
-        return;
+static cm_type *initialize_cm_type(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    cm_ptr->n = 0;
+    cm_ptr->b = 0;
+    cm_ptr->minfail = 0;
+    cm_ptr->plev = caster_ptr->lev;
+    cm_ptr->old_csp = caster_ptr->csp;
+    cm_ptr->on_mirror = FALSE;
+    return cm_ptr;
+}
 
+static void switch_mind_kind(player_type *caster_ptr, cm_type *cm_ptr)
+{
     switch (caster_ptr->pclass) {
     case CLASS_MINDCRAFTER:
-        use_mind = MIND_MINDCRAFTER;
-        p = _("精神", "skill");
+        cm_ptr->use_mind = MIND_MINDCRAFTER;
+        cm_ptr->mind_explanation = _("精神", "skill");
         break;
     case CLASS_FORCETRAINER:
-        use_mind = MIND_KI;
-        p = _("気", "skill");
+        cm_ptr->use_mind = MIND_KI;
+        cm_ptr->mind_explanation = _("気", "skill");
         break;
     case CLASS_BERSERKER:
-        use_mind = MIND_BERSERKER;
-        p = _("怒り", "skill");
+        cm_ptr->use_mind = MIND_BERSERKER;
+        cm_ptr->mind_explanation = _("怒り", "skill");
         break;
     case CLASS_MIRROR_MASTER:
-        use_mind = MIND_MIRROR_MASTER;
-        p = _("鏡魔法", "skill");
+        cm_ptr->use_mind = MIND_MIRROR_MASTER;
+        cm_ptr->mind_explanation = _("鏡魔法", "skill");
         break;
     case CLASS_NINJA:
-        use_mind = MIND_NINJUTSU;
-        p = _("精神", "skill");
+        cm_ptr->use_mind = MIND_NINJUTSU;
+        cm_ptr->mind_explanation = _("精神", "skill");
         break;
     default:
-        use_mind = 0;
-        p = _("超能力", "skill");
+        cm_ptr->use_mind = (mind_kind_type)0;
+        cm_ptr->mind_explanation = _("超能力", "skill");
         break;
     }
+}
 
-    spell = mind_powers[use_mind].info[n];
-    chance = spell.fail;
-    mana_cost = spell.mana_cost;
-    if (use_mind == MIND_KI) {
-        if (heavy_armor(caster_ptr))
-            chance += 20;
-
-        if (caster_ptr->icky_wield[0])
-            chance += 20;
-        else if (has_melee_weapon(caster_ptr, INVEN_RARM))
-            chance += 10;
-
-        if (caster_ptr->icky_wield[1])
-            chance += 20;
-        else if (has_melee_weapon(caster_ptr, INVEN_LARM))
-            chance += 10;
-
-        if (n == 5) {
-            for (int j = 0; j < get_current_ki(caster_ptr) / 50; j++)
-                mana_cost += (j + 1) * 3 / 2;
-        }
-    }
+static void decide_mind_ki_chance(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if (cm_ptr->use_mind != MIND_KI)
+        return;
 
-    if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) {
-        if (mana_cost > caster_ptr->chp) {
+    if (heavy_armor(caster_ptr))
+        cm_ptr->chance += 20;
+
+    if (caster_ptr->icky_wield[0])
+        cm_ptr->chance += 20;
+    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_SUB_HAND))
+        cm_ptr->chance += 10;
+
+    if (cm_ptr->n == 5)
+        for (int j = 0; j < get_current_ki(caster_ptr) / 50; j++)
+            cm_ptr->mana_cost += (j + 1) * 3 / 2;
+}
+
+static bool check_mind_hp_mp_sufficiency(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if ((cm_ptr->use_mind == MIND_BERSERKER) || (cm_ptr->use_mind == MIND_NINJUTSU)) {
+        if (cm_ptr->mana_cost > caster_ptr->chp) {
             msg_print(_("HPが足りません。", "You do not have enough hp to use this power."));
-            return;
+            return FALSE;
         }
-    } else if (mana_cost > caster_ptr->csp) {
-        msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
-        if (!over_exert)
-            return;
 
-        if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? ")))
-            return;
+        return TRUE;
     }
 
-    if (chance) {
-        chance -= 3 * (plev - spell.min_lev);
-        chance += caster_ptr->to_m_chance;
-        chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
-        if ((mana_cost > caster_ptr->csp) && (use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
-            chance += 5 * (mana_cost - caster_ptr->csp);
-
-        minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
-        if (chance < minfail)
-            chance = minfail;
-
-        if (caster_ptr->stun > 50)
-            chance += 25;
-        else if (caster_ptr->stun)
-            chance += 15;
-
-        if (use_mind == MIND_KI) {
-            if (heavy_armor(caster_ptr))
-                chance += 5;
-            if (caster_ptr->icky_wield[0])
-                chance += 5;
-            if (caster_ptr->icky_wield[1])
-                chance += 5;
-        }
+    if (cm_ptr->mana_cost <= caster_ptr->csp)
+        return TRUE;
+
+    msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
+    if (!over_exert)
+        return FALSE;
+
+    return get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "));
+}
+
+static void decide_mind_chance(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if (cm_ptr->chance == 0)
+        return;
+
+    cm_ptr->chance -= 3 * (cm_ptr->plev - cm_ptr->spell.min_lev);
+    cm_ptr->chance += caster_ptr->to_m_chance;
+    cm_ptr->chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
+    if ((cm_ptr->mana_cost > caster_ptr->csp) && (cm_ptr->use_mind != MIND_BERSERKER) && (cm_ptr->use_mind != MIND_NINJUTSU))
+        cm_ptr->chance += 5 * (cm_ptr->mana_cost - caster_ptr->csp);
+
+    cm_ptr->minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
+    if (cm_ptr->chance < cm_ptr->minfail)
+        cm_ptr->chance = cm_ptr->minfail;
+
+    if (caster_ptr->stun > 50)
+        cm_ptr->chance += 25;
+    else if (caster_ptr->stun)
+        cm_ptr->chance += 15;
+
+    if (cm_ptr->use_mind != MIND_KI)
+        return;
+
+    if (heavy_armor(caster_ptr))
+        cm_ptr->chance += 5;
+
+    if (caster_ptr->icky_wield[0])
+        cm_ptr->chance += 5;
+
+    if (caster_ptr->icky_wield[1])
+        cm_ptr->chance += 5;
+}
+
+static void check_mind_mindcrafter(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if (cm_ptr->use_mind != MIND_MINDCRAFTER)
+        return;
+
+    if (cm_ptr->b < 5) {
+        msg_print(_("なんてこった!頭の中が真っ白になった!", "Oh, no! Your mind has gone blank!"));
+        lose_all_info(caster_ptr);
+        return;
     }
 
-    if (chance > 95)
-        chance = 95;
-
-    if (randint0(100) < chance) {
-        if (flush_failure)
-            flush();
-
-        msg_format(_("%sの集中に失敗した!", "You failed to concentrate hard enough for %s!"), p);
-        sound(SOUND_FAIL);
-        if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU)) {
-            if ((use_mind == MIND_KI) && (n != 5) && get_current_ki(caster_ptr)) {
-                msg_print(_("気が散ってしまった...", "Your improved Force has gone away..."));
-                set_current_ki(caster_ptr, TRUE, 0);
-            }
-
-            if (randint1(100) < (chance / 2)) {
-                b = randint1(100);
-                if (use_mind == MIND_MINDCRAFTER) {
-                    if (b < 5) {
-                        msg_print(_("なんてこった!頭の中が真っ白になった!", "Oh, no! Your mind has gone blank!"));
-                        lose_all_info(caster_ptr);
-                    } else if (b < 15) {
-                        msg_print(_("奇妙な光景が目の前で踊っている...", "Weird visions seem to dance before your eyes..."));
-                        set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
-                    } else if (b < 45) {
-                        msg_print(_("あなたの頭は混乱した!", "Your brain is addled!"));
-                        set_confused(caster_ptr, caster_ptr->confused + randint1(8));
-                    } else if (b < 90) {
-                        set_stun(caster_ptr, caster_ptr->stun + randint1(8));
-                    } else {
-                        msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
-                        project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2, GF_MANA,
-                            PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
-                        caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
-                    }
-                }
-
-                if (use_mind == MIND_MIRROR_MASTER) {
-                    if (b < 51) {
-                    } else if (b < 81) {
-                        msg_print(_("鏡の世界の干渉を受けた!", "Weird visions seem to dance before your eyes..."));
-                        teleport_player(caster_ptr, 10, TELEPORT_PASSIVE);
-                    } else if (b < 96) {
-                        msg_print(_("まわりのものがキラキラ輝いている!", "Your brain is addled!"));
-                        set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
-                    } else {
-                        msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
-                        project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2, GF_MANA,
-                            PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
-                        caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
-                    }
-                }
-            }
-        }
-    } else {
-        sound(SOUND_ZAP);
-        switch (use_mind) {
-        case MIND_MINDCRAFTER:
-            cast = cast_mindcrafter_spell(caster_ptr, n);
-            break;
-        case MIND_KI:
-            cast = cast_force_spell(caster_ptr, n);
-            break;
-        case MIND_BERSERKER:
-            cast = cast_berserk_spell(caster_ptr, n);
-            break;
-        case MIND_MIRROR_MASTER:
-            if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]))
-                on_mirror = TRUE;
+    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;
+    }
 
-            cast = cast_mirror_spell(caster_ptr, n);
-            break;
-        case MIND_NINJUTSU:
-            cast = cast_ninja_spell(caster_ptr, n);
-            break;
-        default:
-            msg_format(_("謎の能力:%d, %d", "Mystery power:%d, %d"), use_mind, n);
+    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;
+    }
+
+    msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), cm_ptr->mind_explanation);
+    project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + cm_ptr->plev / 10, caster_ptr->y, caster_ptr->x, cm_ptr->plev * 2, GF_MANA,
+        PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
+    caster_ptr->csp = MAX(0, caster_ptr->csp - cm_ptr->plev * MAX(1, cm_ptr->plev / 10));
+}
+
+static void check_mind_mirror_master(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if (cm_ptr->use_mind != MIND_MIRROR_MASTER)
+        return;
+
+    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));
+        return;
+    }
+
+    msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), cm_ptr->mind_explanation);
+    project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + cm_ptr->plev / 10, caster_ptr->y, caster_ptr->x, cm_ptr->plev * 2, GF_MANA,
+        PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
+    caster_ptr->csp = MAX(0, caster_ptr->csp - cm_ptr->plev * MAX(1, cm_ptr->plev / 10));
+}
+
+static void check_mind_class(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    if ((cm_ptr->use_mind == MIND_BERSERKER) || (cm_ptr->use_mind == MIND_NINJUTSU))
+        return;
+
+    if ((cm_ptr->use_mind == MIND_KI) && (cm_ptr->n != 5) && get_current_ki(caster_ptr)) {
+        msg_print(_("気が散ってしまった...", "Your improved Force has gone away..."));
+        set_current_ki(caster_ptr, TRUE, 0);
+    }
+
+    if (randint1(100) >= (cm_ptr->chance / 2))
+        return;
+
+    cm_ptr->b = randint1(100);
+    check_mind_mindcrafter(caster_ptr, cm_ptr);
+    check_mind_mirror_master(caster_ptr, cm_ptr);
+}
+
+static bool switch_mind_class(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    switch (cm_ptr->use_mind) {
+    case MIND_MINDCRAFTER:
+        cm_ptr->cast = cast_mindcrafter_spell(caster_ptr, cm_ptr->n);
+        return TRUE;
+    case MIND_KI:
+        cm_ptr->cast = cast_force_spell(caster_ptr, cm_ptr->n);
+        return TRUE;
+    case MIND_BERSERKER:
+        cm_ptr->cast = cast_berserk_spell(caster_ptr, cm_ptr->n);
+        return TRUE;
+    case MIND_MIRROR_MASTER:
+        if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]))
+            cm_ptr->on_mirror = TRUE;
+
+        cm_ptr->cast = cast_mirror_spell(caster_ptr, cm_ptr->n);
+        return TRUE;
+    case MIND_NINJUTSU:
+        cm_ptr->cast = cast_ninja_spell(caster_ptr, cm_ptr->n);
+        return TRUE;
+    default:
+        msg_format(_("謎の能力:%d, %d", "Mystery power:%d, %d"), cm_ptr->use_mind, cm_ptr->n);
+        return FALSE;
+    }
+}
+
+static void mind_turn_passing(player_type *caster_ptr, cm_type *cm_ptr)
+{
+    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;
         }
+    }
 
-        if (!cast)
-            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 (on_mirror && caster_ptr->pclass == CLASS_MIRROR_MASTER) {
-        if (n == 3 || n == 5 || n == 7 || n == 16)
-            take_turn(caster_ptr, 50);
-    } else
-        take_turn(caster_ptr, 100);
+    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);
+}
 
-    if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) {
-        take_hit(caster_ptr, DAMAGE_USELIFE, mana_cost, _("過度の集中", "concentrating too hard"), -1);
+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;
-    } else if (mana_cost <= old_csp) {
-        caster_ptr->csp -= mana_cost;
-        if (caster_ptr->csp < 0)
-            caster_ptr->csp = 0;
-
-        if ((use_mind == MIND_MINDCRAFTER) && (n == 13)) {
-            caster_ptr->csp = 0;
-            caster_ptr->csp_frac = 0;
-        }
-    } else {
-        int oops = mana_cost - old_csp;
-        if ((caster_ptr->csp - mana_cost) < 0)
-            caster_ptr->csp_frac = 0;
-
-        caster_ptr->csp = MAX(0, caster_ptr->csp - mana_cost);
-        msg_format(_("%sを集中しすぎて気を失ってしまった!", "You faint from the effort!"), p);
-        (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);
-        }
+        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;
+    }
+}
+
+/*!
+ * @brief 特殊技能コマンドのメインルーチン /
+ * @return なし
+ */
+void do_cmd_mind(player_type *caster_ptr)
+{
+    cm_type tmp_cm;
+    cm_type *cm_ptr = initialize_cm_type(caster_ptr, &tmp_cm);
+    if (cmd_limit_confused(caster_ptr) || !get_mind_power(caster_ptr, &cm_ptr->n, FALSE))
+        return;
+
+    switch_mind_kind(caster_ptr, cm_ptr);
+    cm_ptr->spell = mind_powers[cm_ptr->use_mind].info[cm_ptr->n];
+    cm_ptr->chance = cm_ptr->spell.fail;
+    cm_ptr->mana_cost = cm_ptr->spell.mana_cost;
+    decide_mind_ki_chance(caster_ptr, cm_ptr);
+    if (!check_mind_hp_mp_sufficiency(caster_ptr, cm_ptr))
+        return;
+
+    decide_mind_chance(caster_ptr, cm_ptr);
+    if (cm_ptr->chance > 95)
+        cm_ptr->chance = 95;
+
+    if (!judge_mind_chance(caster_ptr, cm_ptr))
+        return;
+
+    mind_turn_passing(caster_ptr, cm_ptr);
+    process_hard_concentration(caster_ptr, cm_ptr);
     caster_ptr->redraw |= PR_MANA;
     caster_ptr->window |= PW_PLAYER;
     caster_ptr->window |= PW_SPELL;
 }
 
+static mind_kind_type decide_use_mind_browse(player_type *caster_ptr)
+{
+    switch (caster_ptr->pclass) {
+    case CLASS_MINDCRAFTER:
+        return MIND_MINDCRAFTER;
+    case CLASS_FORCETRAINER:
+        return MIND_KI;
+    case CLASS_BERSERKER:
+        return MIND_BERSERKER;
+    case CLASS_NINJA:
+        return MIND_NINJUTSU;
+    case CLASS_MIRROR_MASTER:
+        return MIND_MIRROR_MASTER;
+    default:
+        return (mind_kind_type)0; // 実質CLASS_MINDCRAFTERと同じ.
+    }
+}
+
 /*!
  * @brief 現在プレイヤーが使用可能な特殊技能の一覧表示 /
  * @return なし
@@ -284,18 +410,7 @@ void do_cmd_mind_browse(player_type *caster_ptr)
 {
     SPELL_IDX n = 0;
     char temp[62 * 5];
-    int use_mind = 0;
-    if (caster_ptr->pclass == CLASS_MINDCRAFTER)
-        use_mind = MIND_MINDCRAFTER;
-    else if (caster_ptr->pclass == CLASS_FORCETRAINER)
-        use_mind = MIND_KI;
-    else if (caster_ptr->pclass == CLASS_BERSERKER)
-        use_mind = MIND_BERSERKER;
-    else if (caster_ptr->pclass == CLASS_NINJA)
-        use_mind = MIND_NINJUTSU;
-    else if (caster_ptr->pclass == CLASS_MIRROR_MASTER)
-        use_mind = MIND_MIRROR_MASTER;
-
+    mind_kind_type use_mind = decide_use_mind_browse(caster_ptr);
     screen_save();
     while (TRUE) {
         if (!get_mind_power(caster_ptr, &n, TRUE)) {
@@ -325,4 +440,4 @@ void do_cmd_mind_browse(player_type *caster_ptr)
             break;
         }
     }
-}
+}
\ No newline at end of file