2 * @brief モンスター同士が乱闘を起こした時の攻撃種別をスイッチングする
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"
17 void describe_melee_method(PlayerType *player_ptr, mam_type *mam_ptr)
19 switch (mam_ptr->method) {
20 case RaceBlowMethodType::HIT: {
21 mam_ptr->act = _("%sを殴った。", "hits %s.");
22 mam_ptr->touched = true;
25 case RaceBlowMethodType::TOUCH: {
26 mam_ptr->act = _("%sを触った。", "touches %s.");
27 mam_ptr->touched = true;
30 case RaceBlowMethodType::PUNCH: {
31 mam_ptr->act = _("%sをパンチした。", "punches %s.");
32 mam_ptr->touched = true;
35 case RaceBlowMethodType::KICK: {
36 mam_ptr->act = _("%sを蹴った。", "kicks %s.");
37 mam_ptr->touched = true;
40 case RaceBlowMethodType::CLAW: {
41 mam_ptr->act = _("%sをひっかいた。", "claws %s.");
42 mam_ptr->touched = true;
45 case RaceBlowMethodType::BITE: {
46 mam_ptr->act = _("%sを噛んだ。", "bites %s.");
47 mam_ptr->touched = true;
50 case RaceBlowMethodType::STING: {
51 mam_ptr->act = _("%sを刺した。", "stings %s.");
52 mam_ptr->touched = true;
55 case RaceBlowMethodType::SLASH: {
56 mam_ptr->act = _("%sを斬った。", "slashes %s.");
59 case RaceBlowMethodType::BUTT: {
60 mam_ptr->act = _("%sを角で突いた。", "butts %s.");
61 mam_ptr->touched = true;
64 case RaceBlowMethodType::CRUSH: {
65 mam_ptr->act = _("%sに体当りした。", "crushes %s.");
66 mam_ptr->touched = true;
69 case RaceBlowMethodType::ENGULF: {
70 mam_ptr->act = _("%sを飲み込んだ。", "engulfs %s.");
71 mam_ptr->touched = true;
74 case RaceBlowMethodType::CHARGE: {
75 mam_ptr->act = _("%sに請求書をよこした。", "charges %s.");
76 mam_ptr->touched = true;
79 case RaceBlowMethodType::CRAWL: {
80 mam_ptr->act = _("%sの体の上を這い回った。", "crawls on %s.");
81 mam_ptr->touched = true;
84 case RaceBlowMethodType::DROOL: {
85 mam_ptr->act = _("%sによだれをたらした。", "drools on %s.");
86 mam_ptr->touched = false;
89 case RaceBlowMethodType::SPIT: {
90 mam_ptr->act = _("%sに唾を吐いた。", "spits on %s.");
91 mam_ptr->touched = false;
94 case RaceBlowMethodType::EXPLODE: {
95 if (mam_ptr->see_either)
96 disturb(player_ptr, true, true);
98 mam_ptr->act = _("爆発した。", "explodes.");
99 mam_ptr->explode = true;
100 mam_ptr->touched = false;
103 case RaceBlowMethodType::GAZE: {
104 mam_ptr->act = _("%sをにらんだ。", "gazes at %s.");
105 mam_ptr->touched = false;
108 case RaceBlowMethodType::WAIL: {
109 mam_ptr->act = _("%sに泣きついた。", "wails at %s.");
110 mam_ptr->touched = false;
113 case RaceBlowMethodType::SPORE: {
114 mam_ptr->act = _("%sに胞子を飛ばした。", "releases spores at %s.");
115 mam_ptr->touched = false;
118 case RaceBlowMethodType::XXX4: {
119 mam_ptr->act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
120 mam_ptr->touched = false;
123 case RaceBlowMethodType::BEG: {
124 mam_ptr->act = _("%sに金をせがんだ。", "begs %s for money.");
125 mam_ptr->touched = false;
128 case RaceBlowMethodType::INSULT: {
129 mam_ptr->act = _("%sを侮辱した。", "insults %s.");
130 mam_ptr->touched = false;
133 case RaceBlowMethodType::MOAN: {
134 mam_ptr->act = _("%sにむかってうめいた。", "moans at %s.");
135 mam_ptr->touched = false;
138 case RaceBlowMethodType::SHOW: {
139 mam_ptr->act = _("%sにむかって歌った。", "sings to %s.");
140 mam_ptr->touched = false;
144 case RaceBlowMethodType::NONE:
145 case RaceBlowMethodType::SHOOT:
146 case RaceBlowMethodType::MAX:
151 void decide_monster_attack_effect(PlayerType *player_ptr, mam_type *mam_ptr)
153 switch (mam_ptr->effect) {
154 case RaceBlowEffectType::NONE:
155 case RaceBlowEffectType::DR_MANA:
157 mam_ptr->pt = AttributeType::NONE;
159 case RaceBlowEffectType::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 = std::max(mam_ptr->damage, tmp_damage * 2);
167 case RaceBlowEffectType::HURT:
168 mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
170 case RaceBlowEffectType::POISON:
171 case RaceBlowEffectType::DISEASE:
172 mam_ptr->pt = AttributeType::POIS;
174 case RaceBlowEffectType::UN_BONUS:
175 case RaceBlowEffectType::UN_POWER:
176 mam_ptr->pt = AttributeType::DISENCHANT;
178 case RaceBlowEffectType::EAT_ITEM:
179 case RaceBlowEffectType::EAT_GOLD:
180 if ((player_ptr->riding != mam_ptr->m_idx) && one_in_(2))
181 mam_ptr->blinked = true;
184 case RaceBlowEffectType::EAT_FOOD:
185 case RaceBlowEffectType::EAT_LITE:
186 case RaceBlowEffectType::BLIND:
187 case RaceBlowEffectType::LOSE_STR:
188 case RaceBlowEffectType::LOSE_INT:
189 case RaceBlowEffectType::LOSE_WIS:
190 case RaceBlowEffectType::LOSE_DEX:
191 case RaceBlowEffectType::LOSE_CON:
192 case RaceBlowEffectType::LOSE_CHR:
193 case RaceBlowEffectType::LOSE_ALL:
195 case RaceBlowEffectType::ACID:
196 mam_ptr->pt = AttributeType::ACID;
198 case RaceBlowEffectType::ELEC:
199 mam_ptr->pt = AttributeType::ELEC;
201 case RaceBlowEffectType::FIRE:
202 mam_ptr->pt = AttributeType::FIRE;
204 case RaceBlowEffectType::COLD:
205 mam_ptr->pt = AttributeType::COLD;
207 case RaceBlowEffectType::CONFUSE:
208 mam_ptr->pt = AttributeType::CONFUSION;
210 case RaceBlowEffectType::TERRIFY:
211 mam_ptr->attribute = BLOW_EFFECT_TYPE_FEAR;
213 case RaceBlowEffectType::PARALYZE:
214 mam_ptr->attribute = BLOW_EFFECT_TYPE_SLEEP;
216 case RaceBlowEffectType::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(player_ptr, mam_ptr->m_ptr->fy, mam_ptr->m_ptr->fx, 8, mam_ptr->m_idx);
222 case RaceBlowEffectType::EXP_10:
223 case RaceBlowEffectType::EXP_20:
224 case RaceBlowEffectType::EXP_40:
225 case RaceBlowEffectType::EXP_80:
226 mam_ptr->pt = AttributeType::NETHER;
228 case RaceBlowEffectType::TIME:
229 mam_ptr->pt = AttributeType::TIME;
231 case RaceBlowEffectType::DR_LIFE:
232 mam_ptr->pt = AttributeType::HYPODYNAMIA;
233 mam_ptr->attribute = BLOW_EFFECT_TYPE_HEAL;
235 case RaceBlowEffectType::INERTIA:
236 mam_ptr->pt = AttributeType::INERTIAL;
238 case RaceBlowEffectType::STUN:
239 mam_ptr->pt = AttributeType::SOUND;
241 case RaceBlowEffectType::HUNGRY:
242 mam_ptr->pt = AttributeType::HUNGRY;
244 case RaceBlowEffectType::FLAVOR:
246 mam_ptr->pt = AttributeType::NONE;
249 mam_ptr->pt = AttributeType::NONE;
254 void describe_monster_missed_monster(PlayerType *player_ptr, mam_type *mam_ptr)
256 switch (mam_ptr->method) {
257 case RaceBlowMethodType::HIT:
258 case RaceBlowMethodType::TOUCH:
259 case RaceBlowMethodType::PUNCH:
260 case RaceBlowMethodType::KICK:
261 case RaceBlowMethodType::CLAW:
262 case RaceBlowMethodType::BITE:
263 case RaceBlowMethodType::STING:
264 case RaceBlowMethodType::SLASH:
265 case RaceBlowMethodType::BUTT:
266 case RaceBlowMethodType::CRUSH:
267 case RaceBlowMethodType::ENGULF:
268 case RaceBlowMethodType::CHARGE: {
269 (void)set_monster_csleep(player_ptr, mam_ptr->t_idx, 0);
270 if (mam_ptr->see_m) {
272 msg_format("%sは%^sの攻撃をかわした。", mam_ptr->t_name, mam_ptr->m_name);
274 msg_format("%^s misses %s.", mam_ptr->m_name, mam_ptr->t_name);