#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"
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)
return TRUE;
}
-
+
if (cm_ptr->mana_cost <= caster_ptr->csp)
return TRUE;
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;
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));
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);
}
/*!
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;
break;
}
}
-}
+}
\ No newline at end of file