OSDN Git Service

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