OSDN Git Service

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