OSDN Git Service

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