1 #include "effect/effect-monster-psi.h"
2 #include "core/player-redraw-types.h"
3 #include "core/window-redrawer.h"
4 #include "effect/effect-monster-util.h"
5 #include "floor/line-of-sight.h"
6 #include "mind/mind-mirror-master.h"
7 #include "monster-race/monster-race.h"
8 #include "monster-race/race-flags1.h"
9 #include "monster-race/race-flags2.h"
10 #include "monster-race/race-flags3.h"
11 #include "monster/monster-describer.h"
12 #include "monster/monster-description-types.h"
13 #include "monster/monster-info.h"
14 #include "status/bad-status-setter.h"
15 #include "player/player-damage.h"
16 #include "view/display-messages.h"
17 #include "world/world.h"
19 static bool effect_monster_psi_empty_mind(player_type *caster_ptr, effect_monster_type *em_ptr)
21 if ((em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND) == 0) return FALSE;
24 em_ptr->note = _("には完全な耐性がある!", " is immune.");
25 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
26 em_ptr->r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
32 static bool effect_monster_psi_weird_mind(effect_monster_type *em_ptr)
34 bool has_resistance = ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) != 0) ||
35 ((em_ptr->r_ptr->flags3 & RF3_ANIMAL) != 0) ||
36 (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam));
37 if (!has_resistance) return FALSE;
39 em_ptr->note = _("には耐性がある!", " resists!");
45 static bool effect_monster_psi_corrupted(player_type *caster_ptr, effect_monster_type *em_ptr)
47 bool is_powerful = ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) != 0) &&
48 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
50 if (!is_powerful) return FALSE;
53 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
54 (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
55 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
60 static void effect_monster_psi_resist_addition(player_type *caster_ptr, effect_monster_type *em_ptr)
65 set_confused(caster_ptr, caster_ptr->confused + 3 + randint1(em_ptr->dam));
68 set_stun(caster_ptr, caster_ptr->stun + randint1(em_ptr->dam));
72 if (em_ptr->r_ptr->flags3 & RF3_NO_FEAR)
73 em_ptr->note = _("には効果がなかった。", " is unaffected.");
75 set_afraid(caster_ptr, caster_ptr->afraid + 3 + randint1(em_ptr->dam));
80 if (!caster_ptr->free_act)
81 (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(em_ptr->dam));
88 // Powerful demons & undead can turn a mindcrafter's attacks back on them.
89 static void effect_monster_psi_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
91 if (effect_monster_psi_empty_mind(caster_ptr, em_ptr)) return;
92 if (effect_monster_psi_weird_mind(em_ptr)) return;
93 if (!effect_monster_psi_corrupted(caster_ptr, em_ptr)) return;
95 if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !check_multishadow(caster_ptr))
97 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
102 /* Injure +/- confusion */
103 monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
104 take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
105 if (!one_in_(4) || check_multishadow(caster_ptr))
111 effect_monster_psi_resist_addition(caster_ptr, em_ptr);
116 static void effect_monster_psi_addition(effect_monster_type *em_ptr)
118 if ((em_ptr->dam <= 0) || !one_in_(4)) return;
123 em_ptr->do_conf = 3 + randint1(em_ptr->dam);
126 em_ptr->do_stun = 3 + randint1(em_ptr->dam);
129 em_ptr->do_fear = 3 + randint1(em_ptr->dam);
132 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
133 em_ptr->do_sleep = 3 + randint1(em_ptr->dam);
139 process_result effect_monster_psi(player_type *caster_ptr, effect_monster_type *em_ptr)
141 if (em_ptr->seen) em_ptr->obvious = TRUE;
142 if (!(los(caster_ptr, em_ptr->m_ptr->fy, em_ptr->m_ptr->fx, caster_ptr->y, caster_ptr->x)))
144 if (em_ptr->seen_msg)
145 msg_format(_("%sはあなたが見えないので影響されない!", "%^s can't see you, and isn't affected!"), em_ptr->m_name);
147 em_ptr->skipped = TRUE;
148 return PROCESS_CONTINUE;
151 effect_monster_psi_resist(caster_ptr, em_ptr);
152 effect_monster_psi_addition(em_ptr);
153 em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
154 return PROCESS_CONTINUE;
158 static bool effect_monster_psi_drain_corrupted(player_type *caster_ptr, effect_monster_type *em_ptr)
160 bool is_corrupted = ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) != 0) &&
161 (em_ptr->r_ptr->level > caster_ptr->lev / 2) &&
163 if (!is_corrupted) return FALSE;
166 msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!",
167 (em_ptr->seen ? "%^s's corrupted mind backlashes your attack!" :
168 "%^ss corrupted mind backlashes your attack!")), em_ptr->m_name);
173 // Powerful demons & undead can turn a mindcrafter's attacks back on them.
174 static void effect_monster_psi_drain_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
176 em_ptr->note = _("には耐性がある!", " resists!");
178 if (effect_monster_psi_drain_corrupted(caster_ptr, em_ptr)) return;
180 if ((randint0(100 + em_ptr->r_ptr->level / 2) < caster_ptr->skill_sav) && !check_multishadow(caster_ptr))
182 msg_print(_("あなたは効力を跳ね返した!", "You resist the effects!"));
187 monster_desc(caster_ptr, em_ptr->killer, em_ptr->m_ptr, MD_WRONGDOER_NAME);
188 if (check_multishadow(caster_ptr))
190 take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
195 msg_print(_("超能力パワーを吸いとられた!", "Your psychic energy is drained!"));
196 caster_ptr->csp -= damroll(5, em_ptr->dam) / 2;
197 if (caster_ptr->csp < 0) caster_ptr->csp = 0;
199 caster_ptr->redraw |= PR_MANA;
200 caster_ptr->window |= (PW_SPELL);
201 take_hit(caster_ptr, DAMAGE_ATTACK, em_ptr->dam, em_ptr->killer, -1);
206 static void effect_monster_psi_drain_change_power(player_type *caster_ptr, effect_monster_type *em_ptr)
208 int b = damroll(5, em_ptr->dam) / 4;
209 concptr str = (caster_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana");
210 concptr msg = _("あなたは%sの苦痛を%sに変換した!",
211 (em_ptr->seen ? "You convert %s's pain into %s!" : "You convert %ss pain into %s!"));
212 msg_format(msg, em_ptr->m_name, str);
214 b = MIN(caster_ptr->msp, caster_ptr->csp + b);
216 caster_ptr->redraw |= PR_MANA;
217 caster_ptr->window |= (PW_SPELL);
221 process_result effect_monster_psi_drain(player_type *caster_ptr, effect_monster_type *em_ptr)
223 if (em_ptr->seen) em_ptr->obvious = TRUE;
225 if (em_ptr->r_ptr->flags2 & RF2_EMPTY_MIND)
228 em_ptr->note = _("には完全な耐性がある!", " is immune.");
230 else if ((em_ptr->r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) ||
231 (em_ptr->r_ptr->flags3 & RF3_ANIMAL) ||
232 (em_ptr->r_ptr->level > randint1(3 * em_ptr->dam)))
234 effect_monster_psi_drain_resist(caster_ptr, em_ptr);
236 else if (em_ptr->dam > 0)
238 effect_monster_psi_drain_change_power(caster_ptr, em_ptr);
241 em_ptr->note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk.");
242 return PROCESS_CONTINUE;
246 process_result effect_monster_telekinesis(player_type *caster_ptr, effect_monster_type *em_ptr)
248 if (em_ptr->seen) em_ptr->obvious = TRUE;
251 if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
252 else em_ptr->do_dist = 7;
255 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, em_ptr->dam) + 1;
256 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
257 (em_ptr->r_ptr->level > 5 + randint1(em_ptr->dam)))
260 em_ptr->obvious = FALSE;
263 return PROCESS_CONTINUE;