OSDN Git Service

[Refactor] #40457 Moved the files relating monster's attack from combat/ to monster...
[hengband/hengband.git] / src / monster-attack / monster-attack-status.c
1 /*!
2  * @brief プレーヤーのステータス (麻痺等)に影響を与えるモンスターの打撃処理
3  * @date 2020/05/31
4  * @author Hourier
5  */
6
7 #include "monster-attack/monster-attack-status.h"
8 #include "mind/mind-mirror-master.h"
9 #include "player/player-effects.h"
10
11 void process_blind_attack(player_type *target_ptr, monap_type *monap_ptr)
12 {
13     if (target_ptr->resist_blind || check_multishadow(target_ptr))
14         return;
15
16     if (!set_blind(target_ptr, target_ptr->blind + 10 + randint1(monap_ptr->rlev)))
17         return;
18
19     if (monap_ptr->m_ptr->r_idx == MON_DIO)
20         msg_print(_("どうだッ!この血の目潰しはッ!", "How is it! This blood-blinding!"));
21
22     monap_ptr->obvious = TRUE;
23 }
24
25 void process_terrify_attack(player_type *target_ptr, monap_type *monap_ptr)
26 {
27     if (check_multishadow(target_ptr))
28         return;
29
30     monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx];
31     if (target_ptr->resist_fear) {
32         msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
33         monap_ptr->obvious = TRUE;
34         return;
35     }
36
37     if (randint0(100 + r_ptr->level / 2) < target_ptr->skill_sav) {
38         msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
39         monap_ptr->obvious = TRUE;
40         return;
41     }
42
43     if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(monap_ptr->rlev)))
44         monap_ptr->obvious = TRUE;
45 }
46
47 void process_paralyze_attack(player_type *target_ptr, monap_type *monap_ptr)
48 {
49     if (check_multishadow(target_ptr))
50         return;
51
52     monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx];
53     if (target_ptr->free_act) {
54         msg_print(_("しかし効果がなかった!", "You are unaffected!"));
55         monap_ptr->obvious = TRUE;
56         return;
57     }
58
59     if (randint0(100 + r_ptr->level / 2) < target_ptr->skill_sav) {
60         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
61         monap_ptr->obvious = TRUE;
62         return;
63     }
64
65     if (!target_ptr->paralyzed && set_paralyzed(target_ptr, 3 + randint1(monap_ptr->rlev)))
66         monap_ptr->obvious = TRUE;
67 }
68
69 void process_lose_all_attack(player_type *target_ptr, monap_type *monap_ptr)
70 {
71     if (do_dec_stat(target_ptr, A_STR))
72         monap_ptr->obvious = TRUE;
73
74     if (do_dec_stat(target_ptr, A_DEX))
75         monap_ptr->obvious = TRUE;
76
77     if (do_dec_stat(target_ptr, A_CON))
78         monap_ptr->obvious = TRUE;
79
80     if (do_dec_stat(target_ptr, A_INT))
81         monap_ptr->obvious = TRUE;
82
83     if (do_dec_stat(target_ptr, A_WIS))
84         monap_ptr->obvious = TRUE;
85
86     if (do_dec_stat(target_ptr, A_CHR))
87         monap_ptr->obvious = TRUE;
88 }
89
90 void process_stun_attack(player_type *target_ptr, monap_type *monap_ptr)
91 {
92     if (target_ptr->resist_sound || check_multishadow(target_ptr))
93         return;
94
95     monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx];
96     if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
97         monap_ptr->obvious = TRUE;
98 }
99
100 /*!
101  * @brief 時間逆転攻撃による能力低下
102  * @param target_ptr プレーヤーへの参照ポインタ
103  * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ
104  * @return なし
105  */
106 static void describe_disability(player_type *target_ptr, monap_type *monap_ptr)
107 {
108     int stat = randint0(6);
109     switch (stat) {
110     case A_STR:
111         monap_ptr->act = _("強く", "strong");
112         break;
113     case A_INT:
114         monap_ptr->act = _("聡明で", "bright");
115         break;
116     case A_WIS:
117         monap_ptr->act = _("賢明で", "wise");
118         break;
119     case A_DEX:
120         monap_ptr->act = _("器用で", "agile");
121         break;
122     case A_CON:
123         monap_ptr->act = _("健康で", "hale");
124         break;
125     case A_CHR:
126         monap_ptr->act = _("美しく", "beautiful");
127         break;
128     }
129
130     msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), monap_ptr->act);
131     target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
132     if (target_ptr->stat_cur[stat] < 3)
133         target_ptr->stat_cur[stat] = 3;
134 }
135
136 void process_monster_attack_time(player_type *target_ptr, monap_type *monap_ptr)
137 {
138     if (target_ptr->resist_time || check_multishadow(target_ptr))
139         return;
140
141     switch (randint1(10)) {
142     case 1:
143     case 2:
144     case 3:
145     case 4:
146     case 5: {
147         if (target_ptr->prace == RACE_ANDROID)
148             break;
149
150         msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
151         lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
152         break;
153     }
154     case 6:
155     case 7:
156     case 8:
157     case 9: {
158         describe_disability(target_ptr, monap_ptr);
159         target_ptr->update |= (PU_BONUS);
160         break;
161     }
162     case 10: {
163         msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
164         for (int i = 0; i < A_MAX; i++) {
165             target_ptr->stat_cur[i] = (target_ptr->stat_cur[i] * 7) / 8;
166             if (target_ptr->stat_cur[i] < 3)
167                 target_ptr->stat_cur[i] = 3;
168         }
169
170         target_ptr->update |= (PU_BONUS);
171         break;
172     }
173     }
174 }