OSDN Git Service

[Refactor] #2523 PlayerType::blind をPlayerBlindnessの呼び出しに差し替えた
[hengbandforosx/hengbandosx.git] / src / effect / effect-player-resist-hurt.cpp
1 #include "effect/effect-player-resist-hurt.h"
2 #include "artifact/fixed-art-types.h"
3 #include "blue-magic/blue-magic-checker.h"
4 #include "core/player-redraw-types.h"
5 #include "core/player-update-types.h"
6 #include "core/window-redrawer.h"
7 #include "effect/effect-player.h"
8 #include "hpmp/hp-mp-processor.h"
9 #include "inventory/inventory-damage.h"
10 #include "inventory/inventory-slot-types.h"
11 #include "main/sound-definitions-table.h"
12 #include "main/sound-of-music.h"
13 #include "mind/mind-mirror-master.h"
14 #include "monster-race/race-indice-types.h"
15 #include "mutation/mutation-investor-remover.h"
16 #include "object-enchant/object-curse.h"
17 #include "object/object-broken.h"
18 #include "player-base/player-race.h"
19 #include "player-info/race-info.h"
20 #include "player/player-damage.h"
21 #include "player/player-status-flags.h"
22 #include "player/player-status-resist.h"
23 #include "spell-kind/spells-equipment.h"
24 #include "spell-kind/spells-teleport.h"
25 #include "spell/spells-status.h"
26 #include "status/bad-status-setter.h"
27 #include "status/base-status.h"
28 #include "status/element-resistance.h"
29 #include "status/experience.h"
30 #include "status/shape-changer.h"
31 #include "system/object-type-definition.h"
32 #include "system/player-type-definition.h"
33 #include "timed-effect/player-blindness.h"
34 #include "timed-effect/timed-effects.h"
35 #include "view/display-messages.h"
36 #include "world/world.h"
37
38 // 毒を除く4元素.
39 void effect_player_elements(
40     PlayerType *player_ptr, EffectPlayerType *ep_ptr, concptr attack_message, int (*damage_func)(PlayerType *, int, concptr, bool))
41 {
42     if (player_ptr->effects()->blindness()->is_blind()) {
43         msg_print(attack_message);
44     }
45
46     ep_ptr->get_damage = (*damage_func)(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
47 }
48
49 void effect_player_poison(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
50 {
51     bool double_resist = is_oppose_pois(player_ptr);
52     if (player_ptr->effects()->blindness()->is_blind()) {
53         msg_print(_("毒で攻撃された!", "You are hit by poison!"));
54     }
55
56     ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
57
58     if ((!(double_resist || has_resist_pois(player_ptr))) && one_in_(HURT_CHANCE) && !check_multishadow(player_ptr)) {
59         do_dec_stat(player_ptr, A_CON);
60     }
61
62     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
63
64     if (!(double_resist || has_resist_pois(player_ptr)) && !check_multishadow(player_ptr)) {
65         (void)BadStatusSetter(player_ptr).mod_poison(randint0(ep_ptr->dam) + 10);
66     }
67 }
68
69 void effect_player_nuke(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
70 {
71     bool double_resist = is_oppose_pois(player_ptr);
72     if (player_ptr->effects()->blindness()->is_blind()) {
73         msg_print(_("放射能で攻撃された!", "You are hit by radiation!"));
74     }
75
76     ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
77
78     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
79     if ((double_resist || has_resist_pois(player_ptr)) || check_multishadow(player_ptr)) {
80         return;
81     }
82
83     (void)BadStatusSetter(player_ptr).mod_poison(randint0(ep_ptr->dam) + 10);
84     if (one_in_(5)) /* 6 */
85     {
86         msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!"));
87         if (one_in_(4)) { /* 4 */
88             do_poly_self(player_ptr);
89         } else {
90             status_shuffle(player_ptr);
91         }
92     }
93
94     if (one_in_(6)) {
95         inventory_damage(player_ptr, BreakerAcid(), 2);
96     }
97 }
98
99 void effect_player_missile(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
100 {
101     if (player_ptr->effects()->blindness()->is_blind()) {
102         msg_print(_("何かで攻撃された!", "You are hit by something!"));
103     }
104
105     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
106 }
107
108 void effect_player_holy_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
109 {
110     if (player_ptr->effects()->blindness()->is_blind()) {
111         msg_print(_("何かで攻撃された!", "You are hit by something!"));
112     }
113
114     ep_ptr->dam = ep_ptr->dam * calc_holy_fire_damage_rate(player_ptr, CALC_RAND) / 100;
115
116     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
117 }
118
119 void effect_player_hell_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
120 {
121     if (player_ptr->effects()->blindness()->is_blind()) {
122         msg_print(_("何かで攻撃された!", "You are hit by something!"));
123     }
124
125     ep_ptr->dam = ep_ptr->dam * calc_hell_fire_damage_rate(player_ptr, CALC_RAND) / 100;
126
127     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
128 }
129
130 void effect_player_arrow(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
131 {
132     if (player_ptr->effects()->blindness()->is_blind()) {
133         sound(SOUND_SHOOT_HIT);
134         msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
135         ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
136         return;
137     }
138
139     if (has_invuln_arrow(player_ptr)) {
140         msg_print(_("矢を斬り捨てた!", "You cut down the arrow!"));
141         return;
142     }
143
144     sound(SOUND_SHOOT_HIT);
145     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
146 }
147
148 void effect_player_plasma(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
149 {
150     if (player_ptr->effects()->blindness()->is_blind()) {
151         msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!"));
152     }
153
154     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
155
156     if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
157         TIME_EFFECT plus_stun = (randint1((ep_ptr->dam > 40) ? 35 : (ep_ptr->dam * 3 / 4 + 5)));
158         (void)BadStatusSetter(player_ptr).mod_stun(plus_stun);
159     }
160
161     if (!(has_resist_fire(player_ptr) || is_oppose_fire(player_ptr) || has_immune_fire(player_ptr))) {
162         inventory_damage(player_ptr, BreakerAcid(), 3);
163     }
164 }
165
166 /*!
167  * @brief 地獄属性によるダメージを受ける
168  * @param player_ptr プレイヤー情報への参照ポインタ
169  * @param em_ptr プレイヤー効果情報への参照ポインタ
170  * @details
171  * 幽霊は回復する。追加効果で経験値吸収。
172  */
173
174 void effect_player_nether(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
175 {
176     if (player_ptr->effects()->blindness()->is_blind()) {
177         msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!"));
178     }
179
180     bool evaded = check_multishadow(player_ptr);
181
182     if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
183         if (!evaded) {
184             hp_player(player_ptr, ep_ptr->dam / 4);
185         }
186         ep_ptr->get_damage = 0;
187         return;
188     }
189
190     ep_ptr->dam = ep_ptr->dam * calc_nether_damage_rate(player_ptr, CALC_RAND) / 100;
191
192     if (!has_resist_neth(player_ptr) && !evaded) {
193         drain_exp(player_ptr, 200 + (player_ptr->exp / 100), 200 + (player_ptr->exp / 1000), 75);
194     }
195
196     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
197 }
198
199 /*!
200  * @brief 水流属性によるダメージを受ける
201  * @param player_ptr プレイヤー情報への参照ポインタ
202  * @param em_ptr プレイヤー効果情報への参照ポインタ
203  * @details
204  * 追加効果で朦朧と混乱、冷気同様のインベントリ破壊。
205  */
206 void effect_player_water(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
207 {
208     if (player_ptr->effects()->blindness()->is_blind()) {
209         msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!"));
210     }
211
212     if (check_multishadow(player_ptr)) {
213         ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
214         return;
215     }
216
217     ep_ptr->dam = ep_ptr->dam * calc_water_damage_rate(player_ptr, CALC_RAND) / 100;
218
219     BIT_FLAGS has_res_water = has_resist_water(player_ptr);
220     BadStatusSetter bss(player_ptr);
221     if (!check_multishadow(player_ptr)) {
222         if (!has_resist_sound(player_ptr) && !has_res_water) {
223             (void)bss.mod_stun(randint1(40));
224         }
225
226         if (!has_resist_conf(player_ptr) && !has_res_water) {
227             (void)bss.mod_confusion(randint1(5) + 5);
228         }
229
230         if (one_in_(5) && !has_res_water) {
231             inventory_damage(player_ptr, BreakerCold(), 3);
232         }
233     }
234
235     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
236 }
237
238 void effect_player_chaos(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
239 {
240     if (player_ptr->effects()->blindness()->is_blind()) {
241         msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!"));
242     }
243
244     ep_ptr->dam = ep_ptr->dam * calc_chaos_damage_rate(player_ptr, CALC_RAND) / 100;
245     if (check_multishadow(player_ptr)) {
246         ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
247         return;
248     }
249
250     BadStatusSetter bss(player_ptr);
251     if (!has_resist_conf(player_ptr)) {
252         (void)bss.mod_confusion(randint0(20) + 10);
253     }
254
255     if (!has_resist_chaos(player_ptr)) {
256         (void)bss.mod_hallucination(randint1(10));
257         if (one_in_(3)) {
258             msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!"));
259             (void)gain_mutation(player_ptr, 0);
260         }
261     }
262     if (!has_resist_neth(player_ptr) && !has_resist_chaos(player_ptr)) {
263         drain_exp(player_ptr, 5000 + (player_ptr->exp / 100), 500 + (player_ptr->exp / 1000), 75);
264     }
265
266     if (!has_resist_chaos(player_ptr) || one_in_(9)) {
267         inventory_damage(player_ptr, BreakerElec(), 2);
268         inventory_damage(player_ptr, BreakerFire(), 2);
269     }
270
271     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
272 }
273
274 void effect_player_shards(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
275 {
276     if (player_ptr->effects()->blindness()->is_blind()) {
277         msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
278     }
279
280     ep_ptr->dam = ep_ptr->dam * calc_shards_damage_rate(player_ptr, CALC_RAND) / 100;
281
282     if (!has_resist_shard(player_ptr) && !check_multishadow(player_ptr)) {
283         (void)BadStatusSetter(player_ptr).mod_cut(static_cast<TIME_EFFECT>(ep_ptr->dam));
284     }
285
286     if (!has_resist_shard(player_ptr) || one_in_(13)) {
287         inventory_damage(player_ptr, BreakerCold(), 2);
288     }
289
290     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
291 }
292
293 void effect_player_sound(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
294 {
295     if (player_ptr->effects()->blindness()->is_blind()) {
296         msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!"));
297     }
298
299     ep_ptr->dam = ep_ptr->dam * calc_sound_damage_rate(player_ptr, CALC_RAND) / 100;
300
301     if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
302         TIME_EFFECT plus_stun = (randint1((ep_ptr->dam > 90) ? 35 : (ep_ptr->dam / 3 + 5)));
303         (void)BadStatusSetter(player_ptr).mod_stun(plus_stun);
304     }
305
306     if (!has_resist_sound(player_ptr) || one_in_(13)) {
307         inventory_damage(player_ptr, BreakerCold(), 2);
308     }
309
310     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
311 }
312
313 void effect_player_confusion(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
314 {
315     if (player_ptr->effects()->blindness()->is_blind()) {
316         msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!"));
317     }
318
319     ep_ptr->dam = ep_ptr->dam * calc_conf_damage_rate(player_ptr, CALC_RAND) / 100;
320     BadStatusSetter bss(player_ptr);
321     if (!has_resist_conf(player_ptr) && !check_multishadow(player_ptr)) {
322         (void)bss.mod_confusion(randint1(20) + 10);
323     }
324
325     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
326 }
327
328 void effect_player_disenchant(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
329 {
330     if (player_ptr->effects()->blindness()->is_blind()) {
331         msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!"));
332     }
333
334     ep_ptr->dam = ep_ptr->dam * calc_disenchant_damage_rate(player_ptr, CALC_RAND) / 100;
335
336     if (!has_resist_disen(player_ptr) && !check_multishadow(player_ptr)) {
337         (void)apply_disenchant(player_ptr, 0);
338     }
339
340     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
341 }
342
343 void effect_player_nexus(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
344 {
345     if (player_ptr->effects()->blindness()->is_blind()) {
346         msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!"));
347     }
348
349     ep_ptr->dam = ep_ptr->dam * calc_nexus_damage_rate(player_ptr, CALC_RAND) / 100;
350
351     if (!has_resist_nexus(player_ptr) && !check_multishadow(player_ptr)) {
352         apply_nexus(ep_ptr->m_ptr, player_ptr);
353     }
354
355     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
356 }
357
358 void effect_player_force(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
359 {
360     if (player_ptr->effects()->blindness()->is_blind()) {
361         msg_print(_("運動エネルギーで攻撃された!", "You are hit by kinetic force!"));
362     }
363     if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
364         (void)BadStatusSetter(player_ptr).mod_stun(randint1(20));
365     }
366
367     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
368 }
369
370 void effect_player_rocket(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
371 {
372     if (player_ptr->effects()->blindness()->is_blind()) {
373         msg_print(_("爆発があった!", "There is an explosion!"));
374     }
375
376     BadStatusSetter bss(player_ptr);
377     if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
378         (void)bss.mod_stun(randint1(20));
379     }
380
381     ep_ptr->dam = ep_ptr->dam * calc_rocket_damage_rate(player_ptr, CALC_RAND) / 100;
382     if (!has_resist_shard(player_ptr) && !check_multishadow(player_ptr)) {
383         (void)bss.mod_cut((ep_ptr->dam / 2));
384     }
385
386     if (!has_resist_shard(player_ptr) || one_in_(12)) {
387         inventory_damage(player_ptr, BreakerCold(), 3);
388     }
389
390     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
391 }
392
393 void effect_player_inertial(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
394 {
395     if (player_ptr->effects()->blindness()->is_blind()) {
396         msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!"));
397     }
398
399     if (!check_multishadow(player_ptr)) {
400         (void)BadStatusSetter(player_ptr).mod_deceleration(randint0(4) + 4, false);
401     }
402
403     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
404 }
405
406 void effect_player_lite(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
407 {
408     const auto is_blind = player_ptr->effects()->blindness()->is_blind();
409     if (is_blind) {
410         msg_print(_("何かで攻撃された!", "You are hit by something!"));
411     }
412
413     if (!is_blind && !has_resist_lite(player_ptr) && !has_resist_blind(player_ptr) && !check_multishadow(player_ptr)) {
414         (void)BadStatusSetter(player_ptr).mod_blindness(randint1(5) + 2);
415     }
416
417     ep_ptr->dam = ep_ptr->dam * calc_lite_damage_rate(player_ptr, CALC_RAND) / 100;
418
419     PlayerRace race(player_ptr);
420     if (race.life() == PlayerRaceLifeType::UNDEAD && race.tr_flags().has(TR_VUL_LITE)) {
421         if (!check_multishadow(player_ptr)) {
422             msg_print(_("光で肉体が焦がされた!", "The light scorches your flesh!"));
423         }
424     }
425
426     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
427
428     if (!player_ptr->wraith_form || check_multishadow(player_ptr)) {
429         return;
430     }
431
432     player_ptr->wraith_form = 0;
433     msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form."));
434
435     player_ptr->redraw |= (PR_MAP | PR_STATUS);
436     player_ptr->update |= (PU_MONSTERS);
437     player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
438 }
439
440 void effect_player_dark(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
441 {
442     const auto is_blind = player_ptr->effects()->blindness()->is_blind();
443     if (is_blind) {
444         msg_print(_("何かで攻撃された!", "You are hit by something!"));
445     }
446
447     ep_ptr->dam = ep_ptr->dam * calc_dark_damage_rate(player_ptr, CALC_RAND) / 100;
448
449     auto go_blind = is_blind;
450     go_blind &= !has_resist_blind(player_ptr);
451     go_blind &= !(has_resist_dark(player_ptr) || has_immune_dark(player_ptr));
452     go_blind &= !check_multishadow(player_ptr);
453
454     if (go_blind) {
455         (void)BadStatusSetter(player_ptr).mod_blindness(randint1(5) + 2);
456     }
457
458     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
459 }
460
461 static void effect_player_time_one_disability(PlayerType *player_ptr)
462 {
463     int k = 0;
464     concptr act = nullptr;
465     switch (randint1(6)) {
466     case 1:
467         k = A_STR;
468         act = _("強く", "strong");
469         break;
470     case 2:
471         k = A_INT;
472         act = _("聡明で", "bright");
473         break;
474     case 3:
475         k = A_WIS;
476         act = _("賢明で", "wise");
477         break;
478     case 4:
479         k = A_DEX;
480         act = _("器用で", "agile");
481         break;
482     case 5:
483         k = A_CON;
484         act = _("健康で", "hale");
485         break;
486     case 6:
487         k = A_CHR;
488         act = _("美しく", "beautiful");
489         break;
490     }
491
492     msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
493     player_ptr->stat_cur[k] = (player_ptr->stat_cur[k] * 3) / 4;
494     if (player_ptr->stat_cur[k] < 3) {
495         player_ptr->stat_cur[k] = 3;
496     }
497
498     player_ptr->update |= (PU_BONUS);
499 }
500
501 static void effect_player_time_all_disabilities(PlayerType *player_ptr)
502 {
503     msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
504     for (int k = 0; k < A_MAX; k++) {
505         player_ptr->stat_cur[k] = (player_ptr->stat_cur[k] * 7) / 8;
506         if (player_ptr->stat_cur[k] < 3) {
507             player_ptr->stat_cur[k] = 3;
508         }
509     }
510
511     player_ptr->update |= (PU_BONUS);
512 }
513
514 static void effect_player_time_addition(PlayerType *player_ptr)
515 {
516     switch (randint1(10)) {
517     case 1:
518     case 2:
519     case 3:
520     case 4:
521     case 5: {
522         if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
523             break;
524         }
525
526         msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
527         lose_exp(player_ptr, 100 + (player_ptr->exp / 100) * MON_DRAIN_LIFE);
528         break;
529     }
530     case 6:
531     case 7:
532     case 8:
533     case 9:
534         effect_player_time_one_disability(player_ptr);
535         break;
536     case 10:
537         effect_player_time_all_disabilities(player_ptr);
538         break;
539     }
540 }
541
542 /*!
543  * @brief 時間逆転属性によるダメージを受ける
544  * @param player_ptr プレイヤー情報への参照ポインタ
545  * @param em_ptr プレイヤー効果情報への参照ポインタ
546  */
547 void effect_player_time(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
548 {
549     if (player_ptr->effects()->blindness()->is_blind()) {
550         msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!"));
551     }
552
553     ep_ptr->dam = ep_ptr->dam * calc_time_damage_rate(player_ptr, CALC_RAND) / 100;
554
555     bool evaded = check_multishadow(player_ptr);
556
557     if (has_resist_time(player_ptr) && !evaded) {
558         msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by."));
559     }
560
561     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
562
563     if (!has_resist_time(player_ptr) && !evaded) {
564         effect_player_time_addition(player_ptr);
565     }
566 }
567
568 void effect_player_gravity(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
569 {
570     if (player_ptr->effects()->blindness()->is_blind()) {
571         msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!"));
572     }
573
574     msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you."));
575
576     if (!check_multishadow(player_ptr)) {
577         teleport_player(player_ptr, 5, TELEPORT_PASSIVE);
578         BadStatusSetter bss(player_ptr);
579         if (!player_ptr->levitation) {
580             (void)bss.mod_deceleration(randint0(4) + 4, false);
581         }
582
583         if (!(has_resist_sound(player_ptr) || player_ptr->levitation)) {
584             TIME_EFFECT plus_stun = (randint1((ep_ptr->dam > 90) ? 35 : (ep_ptr->dam / 3 + 5)));
585             (void)bss.mod_stun(plus_stun);
586         }
587     }
588
589     ep_ptr->dam = ep_ptr->dam * calc_gravity_damage_rate(player_ptr, CALC_RAND) / 100;
590     if (!player_ptr->levitation || one_in_(13)) {
591         inventory_damage(player_ptr, BreakerCold(), 2);
592     }
593
594     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
595 }
596
597 void effect_player_disintegration(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
598 {
599     if (player_ptr->effects()->blindness()->is_blind()) {
600         msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!"));
601     }
602
603     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
604 }
605
606 void effect_player_death_ray(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
607 {
608     if (player_ptr->effects()->blindness()->is_blind()) {
609         msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!"));
610     }
611
612     ep_ptr->dam = ep_ptr->dam * calc_deathray_damage_rate(player_ptr, CALC_RAND) / 100;
613     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
614 }
615
616 void effect_player_mana(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
617 {
618     if (player_ptr->effects()->blindness()->is_blind()) {
619         msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!"));
620     }
621
622     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
623 }
624
625 void effect_player_psy_spear(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
626 {
627     if (player_ptr->effects()->blindness()->is_blind()) {
628         msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!"));
629     }
630
631     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_FORCE, ep_ptr->dam, ep_ptr->killer);
632 }
633
634 void effect_player_meteor(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
635 {
636     if (player_ptr->effects()->blindness()->is_blind()) {
637         msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!"));
638     }
639
640     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
641     if (!has_resist_shard(player_ptr) || one_in_(13)) {
642         if (!has_immune_fire(player_ptr)) {
643             inventory_damage(player_ptr, BreakerFire(), 2);
644         }
645         inventory_damage(player_ptr, BreakerCold(), 2);
646     }
647 }
648
649 void effect_player_icee(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
650 {
651     if (player_ptr->effects()->blindness()->is_blind()) {
652         msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!"));
653     }
654
655     ep_ptr->get_damage = cold_dam(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
656     if (check_multishadow(player_ptr)) {
657         return;
658     }
659
660     BadStatusSetter bss(player_ptr);
661     if (!has_resist_shard(player_ptr)) {
662         (void)bss.mod_cut(damroll(5, 8));
663     }
664
665     if (!has_resist_sound(player_ptr)) {
666         (void)bss.mod_stun(randint1(15));
667     }
668
669     if ((!(has_resist_cold(player_ptr) || is_oppose_cold(player_ptr))) || one_in_(12)) {
670         if (!has_immune_cold(player_ptr)) {
671             inventory_damage(player_ptr, BreakerCold(), 3);
672         }
673     }
674 }
675
676 void effect_player_hand_doom(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
677 {
678     if ((randint0(100 + ep_ptr->rlev / 2) < player_ptr->skill_sav) && !check_multishadow(player_ptr)) {
679         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
680     } else {
681         if (!check_multishadow(player_ptr)) {
682             msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!"));
683             curse_equipment(player_ptr, 40, 20);
684         }
685
686         ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->m_name);
687
688         if (player_ptr->chp < 1) {
689             player_ptr->chp = 1;
690         }
691     }
692 }
693
694 void effect_player_void(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
695 {
696     auto effect_mes = player_ptr->effects()->blindness()->is_blind() ? _("何かに身体が引っ張りこまれる!", "Something absorbs you!")
697                                                                      : _("周辺の空間が歪んだ。", "Sight warps around you.");
698     msg_print(effect_mes);
699     if (!check_multishadow(player_ptr) && !player_ptr->levitation && !player_ptr->anti_tele) {
700         (void)BadStatusSetter(player_ptr).mod_deceleration(randint0(4) + 4, false);
701     }
702
703     ep_ptr->dam = ep_ptr->dam * calc_void_damage_rate(player_ptr, CALC_RAND) / 100;
704     if (!player_ptr->levitation || one_in_(13)) {
705         inventory_damage(player_ptr, BreakerCold(), 2);
706     }
707     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
708 }
709
710 void effect_player_abyss(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
711 {
712     const auto is_blind = player_ptr->effects()->blindness()->is_blind();
713     const auto effect_mes = is_blind ? _("身体が沈み込む気がする!", "You feel you are sinking into something!")
714                                      : _("深淵があなたを誘い込んでいる!", "You are falling into the abyss!");
715     msg_print(effect_mes);
716     ep_ptr->dam = ep_ptr->dam * calc_abyss_damage_rate(player_ptr, CALC_RAND) / 100;
717     BadStatusSetter bss(player_ptr);
718     if (check_multishadow(player_ptr)) {
719         return;
720     }
721
722     if (!player_ptr->levitation) {
723         (void)bss.mod_deceleration(randint0(4) + 4, false);
724     }
725
726     if (is_blind) {
727         return;
728     }
729
730     msg_print(_("深淵から何かがあなたを覗き込んでいる!", "Something gazes at you from the abyss!"));
731     if (!has_resist_chaos(player_ptr)) {
732         (void)bss.mod_hallucination(randint1(10));
733     }
734
735     if (!has_resist_conf(player_ptr)) {
736         (void)bss.mod_confusion(randint1(10));
737     }
738
739     if (!has_resist_fear(player_ptr)) {
740         (void)bss.mod_fear(randint1(10));
741     }
742     ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
743 }