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-entity.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);
99 mam_ptr->act = _("爆発した。", "explodes.");
100 mam_ptr->explode = true;
101 mam_ptr->touched = false;
104 case RaceBlowMethodType::GAZE: {
105 mam_ptr->act = _("%sをにらんだ。", "gazes at %s.");
106 mam_ptr->touched = false;
109 case RaceBlowMethodType::WAIL: {
110 mam_ptr->act = _("%sに泣きついた。", "wails at %s.");
111 mam_ptr->touched = false;
114 case RaceBlowMethodType::SPORE: {
115 mam_ptr->act = _("%sに胞子を飛ばした。", "releases spores at %s.");
116 mam_ptr->touched = false;
119 case RaceBlowMethodType::XXX4: {
120 mam_ptr->act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
121 mam_ptr->touched = false;
124 case RaceBlowMethodType::BEG: {
125 mam_ptr->act = _("%sに金をせがんだ。", "begs %s for money.");
126 mam_ptr->touched = false;
129 case RaceBlowMethodType::INSULT: {
130 mam_ptr->act = _("%sを侮辱した。", "insults %s.");
131 mam_ptr->touched = false;
134 case RaceBlowMethodType::MOAN: {
135 mam_ptr->act = _("%sにむかってうめいた。", "moans at %s.");
136 mam_ptr->touched = false;
139 case RaceBlowMethodType::SHOW: {
140 mam_ptr->act = _("%sにむかって歌った。", "sings to %s.");
141 mam_ptr->touched = false;
145 case RaceBlowMethodType::NONE:
146 case RaceBlowMethodType::SHOOT:
147 case RaceBlowMethodType::MAX:
152 void decide_monster_attack_effect(PlayerType *player_ptr, mam_type *mam_ptr)
154 switch (mam_ptr->effect) {
155 case RaceBlowEffectType::NONE:
156 case RaceBlowEffectType::DR_MANA:
158 mam_ptr->pt = AttributeType::NONE;
160 case RaceBlowEffectType::SUPERHURT:
161 if ((randint1(mam_ptr->rlev * 2 + 250) > (mam_ptr->ac + 200)) || one_in_(13)) {
162 int tmp_damage = mam_ptr->damage - (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
163 mam_ptr->damage = std::max(mam_ptr->damage, tmp_damage * 2);
168 case RaceBlowEffectType::HURT:
169 mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
171 case RaceBlowEffectType::POISON:
172 case RaceBlowEffectType::DISEASE:
173 mam_ptr->pt = AttributeType::POIS;
175 case RaceBlowEffectType::UN_BONUS:
176 case RaceBlowEffectType::UN_POWER:
177 mam_ptr->pt = AttributeType::DISENCHANT;
179 case RaceBlowEffectType::EAT_ITEM:
180 case RaceBlowEffectType::EAT_GOLD:
181 if ((player_ptr->riding != mam_ptr->m_idx) && one_in_(2)) {
182 mam_ptr->blinked = true;
186 case RaceBlowEffectType::EAT_FOOD:
187 case RaceBlowEffectType::EAT_LITE:
188 case RaceBlowEffectType::BLIND:
189 case RaceBlowEffectType::LOSE_STR:
190 case RaceBlowEffectType::LOSE_INT:
191 case RaceBlowEffectType::LOSE_WIS:
192 case RaceBlowEffectType::LOSE_DEX:
193 case RaceBlowEffectType::LOSE_CON:
194 case RaceBlowEffectType::LOSE_CHR:
195 case RaceBlowEffectType::LOSE_ALL:
197 case RaceBlowEffectType::ACID:
198 mam_ptr->pt = AttributeType::ACID;
200 case RaceBlowEffectType::ELEC:
201 mam_ptr->pt = AttributeType::ELEC;
203 case RaceBlowEffectType::FIRE:
204 mam_ptr->pt = AttributeType::FIRE;
206 case RaceBlowEffectType::COLD:
207 mam_ptr->pt = AttributeType::COLD;
209 case RaceBlowEffectType::CONFUSE:
210 mam_ptr->pt = AttributeType::CONFUSION;
212 case RaceBlowEffectType::TERRIFY:
213 mam_ptr->attribute = BlowEffectType::FEAR;
215 case RaceBlowEffectType::PARALYZE:
216 mam_ptr->attribute = BlowEffectType::SLEEP;
218 case RaceBlowEffectType::SHATTER:
219 mam_ptr->damage -= (mam_ptr->damage * ((mam_ptr->ac < 150) ? mam_ptr->ac : 150) / 250);
220 if (mam_ptr->damage > 23) {
221 earthquake(player_ptr, mam_ptr->m_ptr->fy, mam_ptr->m_ptr->fx, 8, mam_ptr->m_idx);
225 case RaceBlowEffectType::EXP_10:
226 case RaceBlowEffectType::EXP_20:
227 case RaceBlowEffectType::EXP_40:
228 case RaceBlowEffectType::EXP_80:
229 mam_ptr->pt = AttributeType::NETHER;
231 case RaceBlowEffectType::TIME:
232 mam_ptr->pt = AttributeType::TIME;
234 case RaceBlowEffectType::DR_LIFE:
235 mam_ptr->pt = AttributeType::HYPODYNAMIA;
236 mam_ptr->attribute = BlowEffectType::HEAL;
238 case RaceBlowEffectType::INERTIA:
239 mam_ptr->pt = AttributeType::INERTIAL;
241 case RaceBlowEffectType::STUN:
242 mam_ptr->pt = AttributeType::SOUND;
244 case RaceBlowEffectType::HUNGRY:
245 mam_ptr->pt = AttributeType::HUNGRY;
247 case RaceBlowEffectType::FLAVOR:
249 mam_ptr->pt = AttributeType::NONE;
252 mam_ptr->pt = AttributeType::NONE;
257 void describe_monster_missed_monster(PlayerType *player_ptr, mam_type *mam_ptr)
259 switch (mam_ptr->method) {
260 case RaceBlowMethodType::HIT:
261 case RaceBlowMethodType::TOUCH:
262 case RaceBlowMethodType::PUNCH:
263 case RaceBlowMethodType::KICK:
264 case RaceBlowMethodType::CLAW:
265 case RaceBlowMethodType::BITE:
266 case RaceBlowMethodType::STING:
267 case RaceBlowMethodType::SLASH:
268 case RaceBlowMethodType::BUTT:
269 case RaceBlowMethodType::CRUSH:
270 case RaceBlowMethodType::ENGULF:
271 case RaceBlowMethodType::CHARGE: {
272 (void)set_monster_csleep(player_ptr, mam_ptr->t_idx, 0);
273 if (mam_ptr->see_m) {
275 msg_format("%sは%s^の攻撃をかわした。", mam_ptr->t_name, mam_ptr->m_name);
277 msg_format("%s^ misses %s.", mam_ptr->m_name, mam_ptr->t_name);