OSDN Git Service

[Refactor] #38862 Moved angband.h, h-*.h and system-variables.c/h
[hengband/hengband.git] / src / effect / effect-player-spirit.c
1 #include "system/angband.h"
2 #include "effect/effect-player-util.h"
3 #include "effect/effect-player-spirit.h"
4 #include "monster-spell.h"
5 #include "player/player-damage.h"
6 #include "player/player-effects.h"
7 #include "world/world.h"
8
9 void effect_player_drain_mana(player_type *target_ptr,
10                               effect_player_type *ep_ptr) {
11   if (CHECK_MULTISHADOW(target_ptr)) {
12     msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。",
13                 "The attack hits Shadow, but you are unharmed!"));
14     ep_ptr->dam = 0;
15     return;
16   }
17
18   if (target_ptr->csp == 0) {
19     ep_ptr->dam = 0;
20     return;
21   }
22
23   if (ep_ptr->who > 0)
24     msg_format(_("%^sに精神エネルギーを吸い取られてしまった!",
25                  "%^s draws psychic energy from you!"),
26                ep_ptr->m_name);
27   else
28     msg_print(_("精神エネルギーを吸い取られてしまった!",
29                 "Your psychic energy is drawn!"));
30
31   if (ep_ptr->dam >= target_ptr->csp) {
32     ep_ptr->dam = target_ptr->csp;
33     target_ptr->csp = 0;
34     target_ptr->csp_frac = 0;
35   } else {
36     target_ptr->csp -= ep_ptr->dam;
37   }
38
39   learn_spell(target_ptr, ep_ptr->monspell);
40   target_ptr->redraw |= (PR_MANA);
41   target_ptr->window |= (PW_PLAYER | PW_SPELL);
42
43   if ((ep_ptr->who <= 0) || (ep_ptr->m_ptr->hp >= ep_ptr->m_ptr->maxhp)) {
44     ep_ptr->dam = 0;
45     return;
46   }
47
48   ep_ptr->m_ptr->hp += ep_ptr->dam;
49   if (ep_ptr->m_ptr->hp > ep_ptr->m_ptr->maxhp)
50     ep_ptr->m_ptr->hp = ep_ptr->m_ptr->maxhp;
51
52   if (target_ptr->health_who == ep_ptr->who)
53     target_ptr->redraw |= (PR_HEALTH);
54   if (target_ptr->riding == ep_ptr->who)
55     target_ptr->redraw |= (PR_UHEALTH);
56
57   if (ep_ptr->m_ptr->ml) {
58     msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."),
59                ep_ptr->m_name);
60   }
61
62   ep_ptr->dam = 0;
63 }
64
65 void effect_player_mind_blast(player_type *target_ptr,
66                               effect_player_type *ep_ptr) {
67   if ((randint0(100 + ep_ptr->rlev / 2) < MAX(5, target_ptr->skill_sav)) &&
68       !CHECK_MULTISHADOW(target_ptr)) {
69     msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
70     learn_spell(target_ptr, ep_ptr->monspell);
71     return;
72   }
73
74   if (CHECK_MULTISHADOW(target_ptr)) {
75     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
76                                   ep_ptr->killer, ep_ptr->monspell);
77     return;
78   }
79
80   msg_print(_("霊的エネルギーで精神が攻撃された。",
81               "Your mind is blasted by psionic energy."));
82   if (!target_ptr->resist_conf) {
83     (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4);
84   }
85
86   if (!target_ptr->resist_chaos && one_in_(3)) {
87     (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150);
88   }
89
90   target_ptr->csp -= 50;
91   if (target_ptr->csp < 0) {
92     target_ptr->csp = 0;
93     target_ptr->csp_frac = 0;
94   }
95
96   target_ptr->redraw |= PR_MANA;
97   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
98                                 ep_ptr->killer, ep_ptr->monspell);
99 }
100
101 void effect_player_brain_smash(player_type *target_ptr,
102                                effect_player_type *ep_ptr) {
103   if ((randint0(100 + ep_ptr->rlev / 2) < MAX(5, target_ptr->skill_sav)) &&
104       !CHECK_MULTISHADOW(target_ptr)) {
105     msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
106     learn_spell(target_ptr, ep_ptr->monspell);
107     return;
108   }
109
110   if (!CHECK_MULTISHADOW(target_ptr)) {
111     msg_print(_("霊的エネルギーで精神が攻撃された。",
112                 "Your mind is blasted by psionic energy."));
113
114     target_ptr->csp -= 100;
115     if (target_ptr->csp < 0) {
116       target_ptr->csp = 0;
117       target_ptr->csp_frac = 0;
118     }
119     target_ptr->redraw |= PR_MANA;
120   }
121
122   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
123                                 ep_ptr->killer, ep_ptr->monspell);
124   if (CHECK_MULTISHADOW(target_ptr))
125     return;
126
127   if (!target_ptr->resist_blind) {
128     (void)set_blind(target_ptr, target_ptr->blind + 8 + randint0(8));
129   }
130
131   if (!target_ptr->resist_conf) {
132     (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4);
133   }
134
135   if (!target_ptr->free_act) {
136     (void)set_paralyzed(target_ptr, target_ptr->paralyzed + randint0(4) + 4);
137   }
138
139   (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE);
140
141   while (randint0(100 + ep_ptr->rlev / 2) > (MAX(5, target_ptr->skill_sav)))
142     (void)do_dec_stat(target_ptr, A_INT);
143   while (randint0(100 + ep_ptr->rlev / 2) > (MAX(5, target_ptr->skill_sav)))
144     (void)do_dec_stat(target_ptr, A_WIS);
145
146   if (!target_ptr->resist_chaos) {
147     (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150);
148   }
149 }