OSDN Git Service

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