OSDN Git Service

[move] ソースファイルの拡張子を .c から .cpp に変更
[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 }
142
143 void decide_monster_attack_effect(player_type *subject_ptr, mam_type *mam_ptr)
144 {
145     switch (mam_ptr->effect) {
146     case 0:
147     case RBE_DR_MANA:
148         mam_ptr->damage = 0;
149         mam_ptr->pt = GF_NONE;
150         break;
151     case RBE_SUPERHURT:
152         if ((randint1(mam_ptr->rlev * 2 + 250) > (mam_ptr->ac + 200)) || one_in_(13)) {
153             int tmp_damage = mam_ptr->damage - (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
154             mam_ptr->damage = MAX(mam_ptr->damage, tmp_damage * 2);
155             break;
156         }
157
158         /* Fall through */
159     case RBE_HURT:
160         mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
161         break;
162     case RBE_POISON:
163     case RBE_DISEASE:
164         mam_ptr->pt = GF_POIS;
165         break;
166     case RBE_UN_BONUS:
167     case RBE_UN_POWER:
168         mam_ptr->pt = GF_DISENCHANT;
169         break;
170     case RBE_EAT_ITEM:
171     case RBE_EAT_GOLD:
172         if ((subject_ptr->riding != mam_ptr->m_idx) && one_in_(2))
173             mam_ptr->blinked = TRUE;
174
175         break;
176     case RBE_EAT_FOOD:
177     case RBE_EAT_LITE:
178     case RBE_BLIND:
179     case RBE_LOSE_STR:
180     case RBE_LOSE_INT:
181     case RBE_LOSE_WIS:
182     case RBE_LOSE_DEX:
183     case RBE_LOSE_CON:
184     case RBE_LOSE_CHR:
185     case RBE_LOSE_ALL:
186         break;
187     case RBE_ACID:
188         mam_ptr->pt = GF_ACID;
189         break;
190     case RBE_ELEC:
191         mam_ptr->pt = GF_ELEC;
192         break;
193     case RBE_FIRE:
194         mam_ptr->pt = GF_FIRE;
195         break;
196     case RBE_COLD:
197         mam_ptr->pt = GF_COLD;
198         break;
199     case RBE_CONFUSE:
200         mam_ptr->pt = GF_CONFUSION;
201         break;
202     case RBE_TERRIFY:
203         mam_ptr->effect_type = BLOW_EFFECT_TYPE_FEAR;
204         break;
205     case RBE_PARALYZE:
206         mam_ptr->effect_type = BLOW_EFFECT_TYPE_SLEEP;
207         break;
208     case RBE_SHATTER:
209         mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
210         if (mam_ptr->damage > 23)
211             earthquake(subject_ptr, mam_ptr->m_ptr->fy, mam_ptr->m_ptr->fx, 8, mam_ptr->m_idx);
212
213         break;
214     case RBE_EXP_10:
215     case RBE_EXP_20:
216     case RBE_EXP_40:
217     case RBE_EXP_80:
218         mam_ptr->pt = GF_NETHER;
219         break;
220     case RBE_TIME:
221         mam_ptr->pt = GF_TIME;
222         break;
223     case RBE_DR_LIFE:
224         mam_ptr->pt = GF_HYPODYNAMIA;
225         mam_ptr->effect_type = BLOW_EFFECT_TYPE_HEAL;
226         break;
227     case RBE_INERTIA:
228         mam_ptr->pt = GF_INERTIAL;
229         break;
230     case RBE_STUN:
231         mam_ptr->pt = GF_SOUND;
232         break;
233     case RBE_FLAVOR:
234         // フレーバー打撃には何の効果もない。
235         mam_ptr->pt = GF_NONE;
236         break;
237     default:
238         mam_ptr->pt = GF_NONE;
239         break;
240     }
241 }
242
243 void describe_monster_missed_monster(player_type *subject_ptr, mam_type *mam_ptr)
244 {
245     switch (mam_ptr->method) {
246     case RBM_HIT:
247     case RBM_TOUCH:
248     case RBM_PUNCH:
249     case RBM_KICK:
250     case RBM_CLAW:
251     case RBM_BITE:
252     case RBM_STING:
253     case RBM_SLASH:
254     case RBM_BUTT:
255     case RBM_CRUSH:
256     case RBM_ENGULF:
257     case RBM_CHARGE: {
258         (void)set_monster_csleep(subject_ptr, mam_ptr->t_idx, 0);
259         if (mam_ptr->see_m) {
260 #ifdef JP
261             msg_format("%sは%^sの攻撃をかわした。", mam_ptr->t_name, mam_ptr->m_name);
262 #else
263             msg_format("%^s misses %s.", mam_ptr->m_name, mam_ptr->t_name);
264 #endif
265         }
266
267         return;
268     }
269     default:
270         return;
271     }
272 }