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 "view/display-messages.h"
21 void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_ptr)
23 switch (monap_ptr->effect) {
25 monap_ptr->obvious = TRUE;
26 monap_ptr->damage = 0;
29 case RBE_SUPERHURT: { /* AC軽減あり / Player armor reduces total damage */
30 if (((randint1(monap_ptr->rlev * 2 + 300) > (monap_ptr->ac + 200)) || one_in_(13)) && !check_multishadow(target_ptr)) {
31 int tmp_damage = monap_ptr->damage - (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
32 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
33 tmp_damage = MAX(monap_ptr->damage, tmp_damage * 2);
34 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, monap_ptr->ddesc, -1);
39 case RBE_HURT: { /* AC軽減あり / Player armor reduces total damage */
40 monap_ptr->obvious = TRUE;
41 monap_ptr->damage -= (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
42 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
46 if (monap_ptr->explode)
49 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)) {
50 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) {
51 monap_ptr->obvious = TRUE;
55 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
56 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_POIS);
60 if (monap_ptr->explode)
63 if (!target_ptr->resist_disen && !check_multishadow(target_ptr)) {
64 if (apply_disenchant(target_ptr, 0)) {
65 update_creature(target_ptr);
66 monap_ptr->obvious = TRUE;
70 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
71 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_DISEN);
75 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
76 if (target_ptr->is_dead || check_multishadow(target_ptr))
79 for (int i = 0; i < 10; i++) {
80 INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK);
81 monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx];
82 if (monap_ptr->o_ptr->k_idx == 0)
85 if (process_un_power(target_ptr, monap_ptr))
92 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
93 if (monster_confused_remaining(monap_ptr->m_ptr))
96 if (target_ptr->is_dead || check_multishadow(target_ptr))
99 monap_ptr->obvious = TRUE;
100 process_eat_gold(target_ptr, monap_ptr);
104 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
105 if (!check_eat_item(target_ptr, monap_ptr))
108 process_eat_item(target_ptr, monap_ptr);
113 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
114 if (target_ptr->is_dead || check_multishadow(target_ptr))
117 process_eat_food(target_ptr, monap_ptr);
121 monap_ptr->o_ptr = &target_ptr->inventory_list[INVEN_LITE];
122 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
123 if (target_ptr->is_dead || check_multishadow(target_ptr))
126 process_eat_lite(target_ptr, monap_ptr);
130 if (monap_ptr->explode)
133 monap_ptr->obvious = TRUE;
134 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
135 monap_ptr->get_damage += acid_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
136 update_creature(target_ptr);
137 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_ACID);
141 if (monap_ptr->explode)
143 monap_ptr->obvious = TRUE;
144 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
145 monap_ptr->get_damage += elec_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
146 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_ELEC);
150 if (monap_ptr->explode)
152 monap_ptr->obvious = TRUE;
153 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
154 monap_ptr->get_damage += fire_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
155 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FIRE);
159 if (monap_ptr->explode)
161 monap_ptr->obvious = TRUE;
162 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
163 monap_ptr->get_damage += cold_dam(target_ptr, monap_ptr->damage, monap_ptr->ddesc, -1, FALSE);
164 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_COLD);
168 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
169 if (target_ptr->is_dead)
172 process_blind_attack(target_ptr, monap_ptr);
173 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_BLIND);
177 if (monap_ptr->explode)
180 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
181 if (target_ptr->is_dead)
184 if (!target_ptr->resist_conf && !check_multishadow(target_ptr)) {
185 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev))) {
186 monap_ptr->obvious = TRUE;
190 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_CONF);
194 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
195 if (target_ptr->is_dead)
198 process_terrify_attack(target_ptr, monap_ptr);
199 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FEAR);
203 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
205 if (target_ptr->is_dead)
208 process_paralyze_attack(target_ptr, monap_ptr);
209 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FREE);
213 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
214 if (target_ptr->is_dead || check_multishadow(target_ptr))
217 if (do_dec_stat(target_ptr, A_STR))
218 monap_ptr->obvious = TRUE;
223 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
224 if (target_ptr->is_dead || check_multishadow(target_ptr))
227 if (do_dec_stat(target_ptr, A_INT))
228 monap_ptr->obvious = TRUE;
233 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
234 if (target_ptr->is_dead || check_multishadow(target_ptr))
237 if (do_dec_stat(target_ptr, A_WIS))
238 monap_ptr->obvious = TRUE;
243 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
244 if (target_ptr->is_dead || check_multishadow(target_ptr))
247 if (do_dec_stat(target_ptr, A_DEX))
248 monap_ptr->obvious = TRUE;
253 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
254 if (target_ptr->is_dead || check_multishadow(target_ptr))
257 if (do_dec_stat(target_ptr, A_CON))
258 monap_ptr->obvious = TRUE;
263 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
264 if (target_ptr->is_dead || check_multishadow(target_ptr))
267 if (do_dec_stat(target_ptr, A_CHR))
268 monap_ptr->obvious = TRUE;
273 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
274 if (target_ptr->is_dead || check_multishadow(target_ptr))
277 process_lose_all_attack(target_ptr, monap_ptr);
280 case RBE_SHATTER: { /* AC軽減あり / Player armor reduces total damage */
281 monap_ptr->obvious = TRUE;
282 monap_ptr->damage -= (monap_ptr->damage * ((monap_ptr->ac < 150) ? monap_ptr->ac : 150) / 250);
283 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
284 if (monap_ptr->damage > 23 || monap_ptr->explode)
285 earthquake(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, 8, monap_ptr->m_idx);
290 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
291 monap_ptr->obvious = TRUE;
292 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
293 if (target_ptr->is_dead || check_multishadow(target_ptr))
296 (void)drain_exp(target_ptr, d, d / 10, 95);
300 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
301 monap_ptr->obvious = TRUE;
302 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
303 if (target_ptr->is_dead || check_multishadow(target_ptr))
306 (void)drain_exp(target_ptr, d, d / 10, 90);
310 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
311 monap_ptr->obvious = TRUE;
312 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
313 if (target_ptr->is_dead || check_multishadow(target_ptr))
316 (void)drain_exp(target_ptr, d, d / 10, 75);
320 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
321 monap_ptr->obvious = TRUE;
322 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
323 if (target_ptr->is_dead || check_multishadow(target_ptr))
326 (void)drain_exp(target_ptr, d, d / 10, 50);
330 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
331 if (target_ptr->is_dead || check_multishadow(target_ptr))
334 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr))) {
335 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) {
336 monap_ptr->obvious = TRUE;
340 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID)) {
341 bool perm = one_in_(10);
342 if (dec_stat(target_ptr, A_CON, randint1(10), perm)) {
343 msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
344 monap_ptr->obvious = TRUE;
351 if (monap_ptr->explode)
354 process_monster_attack_time(target_ptr, monap_ptr);
355 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
359 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
360 monap_ptr->obvious = TRUE;
361 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
362 if (target_ptr->is_dead || check_multishadow(target_ptr))
365 bool resist_drain = check_drain_hp(target_ptr, d);
366 process_drain_life(target_ptr, monap_ptr, resist_drain);
370 monap_ptr->obvious = TRUE;
371 process_drain_mana(target_ptr, monap_ptr);
372 update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_MANA);
376 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
377 if (target_ptr->is_dead)
380 if (check_multishadow(target_ptr)) {
383 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(monap_ptr->rlev / 10)), FALSE)) {
384 monap_ptr->obvious = TRUE;
391 monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
392 if (target_ptr->is_dead)
395 process_stun_attack(target_ptr, monap_ptr);