OSDN Git Service

Merge branch 'develop' into feature-elementalist
[hengbandforosx/hengbandosx.git] / src / melee / melee-switcher.cpp
1 /*!
2  * @brief モンスター同士が乱闘を起こした時の攻撃種別をスイッチングする
3  * @date 2020/05/30
4  * @author Hourier
5  */
6
7 #include "melee/melee-switcher.h"
8 #include "core/disturbance.h"
9 #include "monster-attack/monster-attack-effect.h"
10 #include "monster/monster-status-setter.h"
11 #include "spell-kind/earthquake.h"
12 #include "view/display-messages.h"
13
14 void describe_melee_method(player_type *subject_ptr, mam_type *mam_ptr)
15 {
16     switch (mam_ptr->method) {
17     case RBM_HIT: {
18         mam_ptr->act = _("%sを殴った。", "hits %s.");
19         mam_ptr->touched = TRUE;
20         break;
21     }
22     case RBM_TOUCH: {
23         mam_ptr->act = _("%sを触った。", "touches %s.");
24         mam_ptr->touched = TRUE;
25         break;
26     }
27     case RBM_PUNCH: {
28         mam_ptr->act = _("%sをパンチした。", "punches %s.");
29         mam_ptr->touched = TRUE;
30         break;
31     }
32     case RBM_KICK: {
33         mam_ptr->act = _("%sを蹴った。", "kicks %s.");
34         mam_ptr->touched = TRUE;
35         break;
36     }
37     case RBM_CLAW: {
38         mam_ptr->act = _("%sをひっかいた。", "claws %s.");
39         mam_ptr->touched = TRUE;
40         break;
41     }
42     case RBM_BITE: {
43         mam_ptr->act = _("%sを噛んだ。", "bites %s.");
44         mam_ptr->touched = TRUE;
45         break;
46     }
47     case RBM_STING: {
48         mam_ptr->act = _("%sを刺した。", "stings %s.");
49         mam_ptr->touched = TRUE;
50         break;
51     }
52     case RBM_SLASH: {
53         mam_ptr->act = _("%sを斬った。", "slashes %s.");
54         break;
55     }
56     case RBM_BUTT: {
57         mam_ptr->act = _("%sを角で突いた。", "butts %s.");
58         mam_ptr->touched = TRUE;
59         break;
60     }
61     case RBM_CRUSH: {
62         mam_ptr->act = _("%sに体当りした。", "crushes %s.");
63         mam_ptr->touched = TRUE;
64         break;
65     }
66     case RBM_ENGULF: {
67         mam_ptr->act = _("%sを飲み込んだ。", "engulfs %s.");
68         mam_ptr->touched = TRUE;
69         break;
70     }
71     case RBM_CHARGE: {
72         mam_ptr->act = _("%sに請求書をよこした。", "charges %s.");
73         mam_ptr->touched = TRUE;
74         break;
75     }
76     case RBM_CRAWL: {
77         mam_ptr->act = _("%sの体の上を這い回った。", "crawls on %s.");
78         mam_ptr->touched = TRUE;
79         break;
80     }
81     case RBM_DROOL: {
82         mam_ptr->act = _("%sによだれをたらした。", "drools on %s.");
83         mam_ptr->touched = FALSE;
84         break;
85     }
86     case RBM_SPIT: {
87         mam_ptr->act = _("%sに唾を吐いた。", "spits on %s.");
88         mam_ptr->touched = FALSE;
89         break;
90     }
91     case RBM_EXPLODE: {
92         if (mam_ptr->see_either)
93             disturb(subject_ptr, TRUE, TRUE);
94
95         mam_ptr->act = _("爆発した。", "explodes.");
96         mam_ptr->explode = TRUE;
97         mam_ptr->touched = FALSE;
98         break;
99     }
100     case RBM_GAZE: {
101         mam_ptr->act = _("%sをにらんだ。", "gazes at %s.");
102         mam_ptr->touched = FALSE;
103         break;
104     }
105     case RBM_WAIL: {
106         mam_ptr->act = _("%sに泣きついた。", "wails at %s.");
107         mam_ptr->touched = FALSE;
108         break;
109     }
110     case RBM_SPORE: {
111         mam_ptr->act = _("%sに胞子を飛ばした。", "releases spores at %s.");
112         mam_ptr->touched = FALSE;
113         break;
114     }
115     case RBM_XXX4: {
116         mam_ptr->act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
117         mam_ptr->touched = FALSE;
118         break;
119     }
120     case RBM_BEG: {
121         mam_ptr->act = _("%sに金をせがんだ。", "begs %s for money.");
122         mam_ptr->touched = FALSE;
123         break;
124     }
125     case RBM_INSULT: {
126         mam_ptr->act = _("%sを侮辱した。", "insults %s.");
127         mam_ptr->touched = FALSE;
128         break;
129     }
130     case RBM_MOAN: {
131         mam_ptr->act = _("%sにむかってうめいた。", "moans at %s.");
132         mam_ptr->touched = FALSE;
133         break;
134     }
135     case RBM_SHOW: {
136         mam_ptr->act = _("%sにむかって歌った。", "sings to %s.");
137         mam_ptr->touched = FALSE;
138         break;
139     }
140
141     case RBM_NONE:
142     case RBM_SHOOT:
143     case NB_RBM_TYPE:
144         break;
145     }
146 }
147
148 void decide_monster_attack_effect(player_type *subject_ptr, mam_type *mam_ptr)
149 {
150     switch (mam_ptr->effect) {
151     case 0:
152     case RBE_DR_MANA:
153         mam_ptr->damage = 0;
154         mam_ptr->pt = GF_NONE;
155         break;
156     case RBE_SUPERHURT:
157         if ((randint1(mam_ptr->rlev * 2 + 250) > (mam_ptr->ac + 200)) || one_in_(13)) {
158             int tmp_damage = mam_ptr->damage - (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
159             mam_ptr->damage = MAX(mam_ptr->damage, tmp_damage * 2);
160             break;
161         }
162
163         /* Fall through */
164     case RBE_HURT:
165         mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
166         break;
167     case RBE_POISON:
168     case RBE_DISEASE:
169         mam_ptr->pt = GF_POIS;
170         break;
171     case RBE_UN_BONUS:
172     case RBE_UN_POWER:
173         mam_ptr->pt = GF_DISENCHANT;
174         break;
175     case RBE_EAT_ITEM:
176     case RBE_EAT_GOLD:
177         if ((subject_ptr->riding != mam_ptr->m_idx) && one_in_(2))
178             mam_ptr->blinked = TRUE;
179
180         break;
181     case RBE_EAT_FOOD:
182     case RBE_EAT_LITE:
183     case RBE_BLIND:
184     case RBE_LOSE_STR:
185     case RBE_LOSE_INT:
186     case RBE_LOSE_WIS:
187     case RBE_LOSE_DEX:
188     case RBE_LOSE_CON:
189     case RBE_LOSE_CHR:
190     case RBE_LOSE_ALL:
191         break;
192     case RBE_ACID:
193         mam_ptr->pt = GF_ACID;
194         break;
195     case RBE_ELEC:
196         mam_ptr->pt = GF_ELEC;
197         break;
198     case RBE_FIRE:
199         mam_ptr->pt = GF_FIRE;
200         break;
201     case RBE_COLD:
202         mam_ptr->pt = GF_COLD;
203         break;
204     case RBE_CONFUSE:
205         mam_ptr->pt = GF_CONFUSION;
206         break;
207     case RBE_TERRIFY:
208         mam_ptr->effect_type = BLOW_EFFECT_TYPE_FEAR;
209         break;
210     case RBE_PARALYZE:
211         mam_ptr->effect_type = BLOW_EFFECT_TYPE_SLEEP;
212         break;
213     case RBE_SHATTER:
214         mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
215         if (mam_ptr->damage > 23)
216             earthquake(subject_ptr, mam_ptr->m_ptr->fy, mam_ptr->m_ptr->fx, 8, mam_ptr->m_idx);
217
218         break;
219     case RBE_EXP_10:
220     case RBE_EXP_20:
221     case RBE_EXP_40:
222     case RBE_EXP_80:
223         mam_ptr->pt = GF_NETHER;
224         break;
225     case RBE_TIME:
226         mam_ptr->pt = GF_TIME;
227         break;
228     case RBE_DR_LIFE:
229         mam_ptr->pt = GF_HYPODYNAMIA;
230         mam_ptr->effect_type = BLOW_EFFECT_TYPE_HEAL;
231         break;
232     case RBE_INERTIA:
233         mam_ptr->pt = GF_INERTIAL;
234         break;
235     case RBE_STUN:
236         mam_ptr->pt = GF_SOUND;
237         break;
238     case RBE_FLAVOR:
239         // フレーバー打撃には何の効果もない。
240         mam_ptr->pt = GF_NONE;
241         break;
242     default:
243         mam_ptr->pt = GF_NONE;
244         break;
245     }
246 }
247
248 void describe_monster_missed_monster(player_type *subject_ptr, mam_type *mam_ptr)
249 {
250     switch (mam_ptr->method) {
251     case RBM_HIT:
252     case RBM_TOUCH:
253     case RBM_PUNCH:
254     case RBM_KICK:
255     case RBM_CLAW:
256     case RBM_BITE:
257     case RBM_STING:
258     case RBM_SLASH:
259     case RBM_BUTT:
260     case RBM_CRUSH:
261     case RBM_ENGULF:
262     case RBM_CHARGE: {
263         (void)set_monster_csleep(subject_ptr, mam_ptr->t_idx, 0);
264         if (mam_ptr->see_m) {
265 #ifdef JP
266             msg_format("%sは%^sの攻撃をかわした。", mam_ptr->t_name, mam_ptr->m_name);
267 #else
268             msg_format("%^s misses %s.", mam_ptr->m_name, mam_ptr->t_name);
269 #endif
270         }
271
272         return;
273     }
274     default:
275         return;
276     }
277 }