2 * @brief モンスターからプレーヤーへの直接攻撃をその種別において振り分ける
5 * @details 長い処理はインクルード先の別ファイルにて行っている
8 #include "monster-attack/monster-attack-switcher.h"
9 #include "monster-attack/monster-attack-status.h"
10 #include "monster-attack/monster-eating.h"
11 #include "mind/drs-types.h"
12 #include "mind/mind-mirror-master.h"
13 #include "monster/monster-status.h"
14 #include "monster/monster-update.h"
15 #include "player/player-damage.h"
16 #include "player/player-effects.h"
17 #include "spell-kind/earthquake.h"
18 #include "spell/spells3.h"
19 #include "status/bad-status-setter.h"
20 #include "status/element-resistance.h"
21 #include "system/object-type-definition.h"
22 #include "view/display-messages.h"
24 void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_ptr)
26 switch (monap_ptr->effect) {
28 monap_ptr->obvious = TRUE;
29 monap_ptr->damage = 0;
32 case RBE_SUPERHURT: { /* AC軽減あり / Player armor reduces total damage */
33 if (((randint1(monap_ptr->rlev * 2 + 300) > (monap_ptr->ac + 200)) || one_in_(13)) && !check_multishadow(target_ptr)) {
34 int tmp_damage = monap_ptr->damage - (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
35 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
36 tmp_damage = MAX(monap_ptr->damage, tmp_damage * 2);
37 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, monap_ptr->ddesc, -1);
42 case RBE_HURT: { /* AC軽減あり / Player armor reduces total damage */
43 monap_ptr->obvious = TRUE;
44 monap_ptr->damage -= (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
45 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
49 if (monap_ptr->explode)
52 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)) {
53 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) {
54 monap_ptr->obvious = TRUE;
58 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
59 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_POIS);
63 if (monap_ptr->explode)
66 if (!target_ptr->resist_disen && !check_multishadow(target_ptr)) {
67 if (apply_disenchant(target_ptr, 0)) {
68 update_creature(target_ptr);
69 monap_ptr->obvious = TRUE;
73 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
74 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_DISEN);
78 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
79 if (target_ptr->is_dead || check_multishadow(target_ptr))
82 for (int i = 0; i < 10; i++) {
83 INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
84 monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
85 if (monap_ptr->o_ptr->k_idx == 0)
88 if (process_un_power(target_ptr, monap_ptr))
95 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
96 if (monster_confused_remaining(monap_ptr->m_ptr))
99 if (target_ptr->is_dead || check_multishadow(target_ptr))
102 monap_ptr->obvious = TRUE;
103 process_eat_gold(target_ptr, monap_ptr);
107 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
108 if (!check_eat_item(target_ptr, monap_ptr))
111 process_eat_item(target_ptr, monap_ptr);
116 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
117 if (target_ptr->is_dead || check_multishadow(target_ptr))
120 process_eat_food(target_ptr, monap_ptr);
124 monap_ptr->o_ptr = &target_ptr->inventory_list[INVEN_LITE];
125 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
126 if (target_ptr->is_dead || check_multishadow(target_ptr))
129 process_eat_lite(target_ptr, monap_ptr);
133 if (monap_ptr->explode)
136 monap_ptr->obvious = TRUE;
137 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
138 monap_ptr->get_damage += acid_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
139 update_creature(target_ptr);
140 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_ACID);
144 if (monap_ptr->explode)
146 monap_ptr->obvious = TRUE;
147 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
148 monap_ptr->get_damage += elec_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
149 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_ELEC);
153 if (monap_ptr->explode)
155 monap_ptr->obvious = TRUE;
156 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
157 monap_ptr->get_damage += fire_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
158 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FIRE);
162 if (monap_ptr->explode)
164 monap_ptr->obvious = TRUE;
165 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
166 monap_ptr->get_damage += cold_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
167 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_COLD);
171 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
172 if (target_ptr->is_dead)
175 process_blind_attack(target_ptr, monap_ptr);
176 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_BLIND);
180 if (monap_ptr->explode)
183 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
184 if (target_ptr->is_dead)
187 if (!target_ptr->resist_conf && !check_multishadow(target_ptr)) {
188 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev))) {
189 monap_ptr->obvious = TRUE;
193 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_CONF);
197 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
198 if (target_ptr->is_dead)
201 process_terrify_attack(target_ptr, monap_ptr);
202 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FEAR);
206 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
208 if (target_ptr->is_dead)
211 process_paralyze_attack(target_ptr, monap_ptr);
212 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FREE);
216 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
217 if (target_ptr->is_dead || check_multishadow(target_ptr))
220 if (do_dec_stat(target_ptr, A_STR))
221 monap_ptr->obvious = TRUE;
226 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
227 if (target_ptr->is_dead || check_multishadow(target_ptr))
230 if (do_dec_stat(target_ptr, A_INT))
231 monap_ptr->obvious = TRUE;
236 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
237 if (target_ptr->is_dead || check_multishadow(target_ptr))
240 if (do_dec_stat(target_ptr, A_WIS))
241 monap_ptr->obvious = TRUE;
246 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
247 if (target_ptr->is_dead || check_multishadow(target_ptr))
250 if (do_dec_stat(target_ptr, A_DEX))
251 monap_ptr->obvious = TRUE;
256 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
257 if (target_ptr->is_dead || check_multishadow(target_ptr))
260 if (do_dec_stat(target_ptr, A_CON))
261 monap_ptr->obvious = TRUE;
266 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
267 if (target_ptr->is_dead || check_multishadow(target_ptr))
270 if (do_dec_stat(target_ptr, A_CHR))
271 monap_ptr->obvious = TRUE;
276 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
277 if (target_ptr->is_dead || check_multishadow(target_ptr))
280 process_lose_all_attack(target_ptr, monap_ptr);
283 case RBE_SHATTER: { /* AC軽減あり / Player armor reduces total damage */
284 monap_ptr->obvious = TRUE;
285 monap_ptr->damage -= (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
286 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
287 if (monap_ptr->damage > 23 || monap_ptr->explode)
288 earthquake(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, 8, monap_ptr->m_idx);
293 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
294 monap_ptr->obvious = TRUE;
295 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
296 if (target_ptr->is_dead || check_multishadow(target_ptr))
299 (void)drain_exp(target_ptr, d, d / 10, 95);
303 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
304 monap_ptr->obvious = TRUE;
305 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
306 if (target_ptr->is_dead || check_multishadow(target_ptr))
309 (void)drain_exp(target_ptr, d, d / 10, 90);
313 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
314 monap_ptr->obvious = TRUE;
315 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
316 if (target_ptr->is_dead || check_multishadow(target_ptr))
319 (void)drain_exp(target_ptr, d, d / 10, 75);
323 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
324 monap_ptr->obvious = TRUE;
325 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
326 if (target_ptr->is_dead || check_multishadow(target_ptr))
329 (void)drain_exp(target_ptr, d, d / 10, 50);
333 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
334 if (target_ptr->is_dead || check_multishadow(target_ptr))
337 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr))) {
338 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) {
339 monap_ptr->obvious = TRUE;
343 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID)) {
344 bool perm = one_in_(10);
345 if (dec_stat(target_ptr, A_CON, randint1(10), perm)) {
346 msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
347 monap_ptr->obvious = TRUE;
354 if (monap_ptr->explode)
357 process_monster_attack_time(target_ptr, monap_ptr);
358 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
362 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
363 monap_ptr->obvious = TRUE;
364 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
365 if (target_ptr->is_dead || check_multishadow(target_ptr))
368 bool resist_drain = check_drain_hp(target_ptr, d);
369 process_drain_life(target_ptr, monap_ptr, resist_drain);
373 monap_ptr->obvious = TRUE;
374 process_drain_mana(target_ptr, monap_ptr);
375 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_MANA);
379 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
380 if (target_ptr->is_dead)
383 if (check_multishadow(target_ptr)) {
386 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(monap_ptr->rlev / 10)), FALSE)) {
387 monap_ptr->obvious = TRUE;
394 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
395 if (target_ptr->is_dead)
398 process_stun_attack(target_ptr, monap_ptr);