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"
39 void effect_player_elements(
40 PlayerType *player_ptr, EffectPlayerType *ep_ptr, concptr attack_message, int (*damage_func)(PlayerType *, int, concptr, bool))
42 if (player_ptr->effects()->blindness()->is_blind()) {
43 msg_print(attack_message);
46 ep_ptr->get_damage = (*damage_func)(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
49 void effect_player_poison(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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!"));
56 ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
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);
62 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
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);
69 void effect_player_nuke(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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!"));
76 ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
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)) {
83 (void)BadStatusSetter(player_ptr).mod_poison(randint0(ep_ptr->dam) + 10);
84 if (one_in_(5)) /* 6 */
86 msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!"));
87 if (one_in_(4)) { /* 4 */
88 do_poly_self(player_ptr);
90 status_shuffle(player_ptr);
95 inventory_damage(player_ptr, BreakerAcid(), 2);
99 void effect_player_missile(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
101 if (player_ptr->effects()->blindness()->is_blind()) {
102 msg_print(_("何かで攻撃された!", "You are hit by something!"));
105 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
108 void effect_player_holy_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
110 if (player_ptr->effects()->blindness()->is_blind()) {
111 msg_print(_("何かで攻撃された!", "You are hit by something!"));
114 ep_ptr->dam = ep_ptr->dam * calc_holy_fire_damage_rate(player_ptr, CALC_RAND) / 100;
116 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
119 void effect_player_hell_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
121 if (player_ptr->effects()->blindness()->is_blind()) {
122 msg_print(_("何かで攻撃された!", "You are hit by something!"));
125 ep_ptr->dam = ep_ptr->dam * calc_hell_fire_damage_rate(player_ptr, CALC_RAND) / 100;
127 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
130 void effect_player_arrow(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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);
139 if (has_invuln_arrow(player_ptr)) {
140 msg_print(_("矢を斬り捨てた!", "You cut down the arrow!"));
144 sound(SOUND_SHOOT_HIT);
145 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
148 void effect_player_plasma(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
150 if (player_ptr->effects()->blindness()->is_blind()) {
151 msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!"));
154 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
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);
161 if (!(has_resist_fire(player_ptr) || is_oppose_fire(player_ptr) || has_immune_fire(player_ptr))) {
162 inventory_damage(player_ptr, BreakerAcid(), 3);
167 * @brief 地獄属性によるダメージを受ける
168 * @param player_ptr プレイヤー情報への参照ポインタ
169 * @param em_ptr プレイヤー効果情報への参照ポインタ
171 * 幽霊は回復する。追加効果で経験値吸収。
174 void effect_player_nether(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
176 if (player_ptr->effects()->blindness()->is_blind()) {
177 msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!"));
180 bool evaded = check_multishadow(player_ptr);
182 if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
184 hp_player(player_ptr, ep_ptr->dam / 4);
186 ep_ptr->get_damage = 0;
190 ep_ptr->dam = ep_ptr->dam * calc_nether_damage_rate(player_ptr, CALC_RAND) / 100;
192 if (!has_resist_neth(player_ptr) && !evaded) {
193 drain_exp(player_ptr, 200 + (player_ptr->exp / 100), 200 + (player_ptr->exp / 1000), 75);
196 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
200 * @brief 水流属性によるダメージを受ける
201 * @param player_ptr プレイヤー情報への参照ポインタ
202 * @param em_ptr プレイヤー効果情報への参照ポインタ
204 * 追加効果で朦朧と混乱、冷気同様のインベントリ破壊。
206 void effect_player_water(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
208 if (player_ptr->effects()->blindness()->is_blind()) {
209 msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!"));
212 if (check_multishadow(player_ptr)) {
213 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
217 ep_ptr->dam = ep_ptr->dam * calc_water_damage_rate(player_ptr, CALC_RAND) / 100;
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));
226 if (!has_resist_conf(player_ptr) && !has_res_water) {
227 (void)bss.mod_confusion(randint1(5) + 5);
230 if (one_in_(5) && !has_res_water) {
231 inventory_damage(player_ptr, BreakerCold(), 3);
235 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
238 void effect_player_chaos(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
240 if (player_ptr->effects()->blindness()->is_blind()) {
241 msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!"));
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);
250 BadStatusSetter bss(player_ptr);
251 if (!has_resist_conf(player_ptr)) {
252 (void)bss.mod_confusion(randint0(20) + 10);
255 if (!has_resist_chaos(player_ptr)) {
256 (void)bss.mod_hallucination(randint1(10));
258 msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!"));
259 (void)gain_mutation(player_ptr, 0);
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);
266 if (!has_resist_chaos(player_ptr) || one_in_(9)) {
267 inventory_damage(player_ptr, BreakerElec(), 2);
268 inventory_damage(player_ptr, BreakerFire(), 2);
271 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
274 void effect_player_shards(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
276 if (player_ptr->effects()->blindness()->is_blind()) {
277 msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
280 ep_ptr->dam = ep_ptr->dam * calc_shards_damage_rate(player_ptr, CALC_RAND) / 100;
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));
286 if (!has_resist_shard(player_ptr) || one_in_(13)) {
287 inventory_damage(player_ptr, BreakerCold(), 2);
290 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
293 void effect_player_sound(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
295 if (player_ptr->effects()->blindness()->is_blind()) {
296 msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!"));
299 ep_ptr->dam = ep_ptr->dam * calc_sound_damage_rate(player_ptr, CALC_RAND) / 100;
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);
306 if (!has_resist_sound(player_ptr) || one_in_(13)) {
307 inventory_damage(player_ptr, BreakerCold(), 2);
310 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
313 void effect_player_confusion(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
315 if (player_ptr->effects()->blindness()->is_blind()) {
316 msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!"));
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);
325 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
328 void effect_player_disenchant(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
330 if (player_ptr->effects()->blindness()->is_blind()) {
331 msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!"));
334 ep_ptr->dam = ep_ptr->dam * calc_disenchant_damage_rate(player_ptr, CALC_RAND) / 100;
336 if (!has_resist_disen(player_ptr) && !check_multishadow(player_ptr)) {
337 (void)apply_disenchant(player_ptr, 0);
340 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
343 void effect_player_nexus(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
345 if (player_ptr->effects()->blindness()->is_blind()) {
346 msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!"));
349 ep_ptr->dam = ep_ptr->dam * calc_nexus_damage_rate(player_ptr, CALC_RAND) / 100;
351 if (!has_resist_nexus(player_ptr) && !check_multishadow(player_ptr)) {
352 apply_nexus(ep_ptr->m_ptr, player_ptr);
355 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
358 void effect_player_force(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
360 if (player_ptr->effects()->blindness()->is_blind()) {
361 msg_print(_("運動エネルギーで攻撃された!", "You are hit by kinetic force!"));
363 if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
364 (void)BadStatusSetter(player_ptr).mod_stun(randint1(20));
367 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
370 void effect_player_rocket(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
372 if (player_ptr->effects()->blindness()->is_blind()) {
373 msg_print(_("爆発があった!", "There is an explosion!"));
376 BadStatusSetter bss(player_ptr);
377 if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
378 (void)bss.mod_stun(randint1(20));
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));
386 if (!has_resist_shard(player_ptr) || one_in_(12)) {
387 inventory_damage(player_ptr, BreakerCold(), 3);
390 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
393 void effect_player_inertial(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
395 if (player_ptr->effects()->blindness()->is_blind()) {
396 msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!"));
399 if (!check_multishadow(player_ptr)) {
400 (void)BadStatusSetter(player_ptr).mod_deceleration(randint0(4) + 4, false);
403 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
406 void effect_player_lite(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
408 const auto is_blind = player_ptr->effects()->blindness()->is_blind();
410 msg_print(_("何かで攻撃された!", "You are hit by something!"));
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);
417 ep_ptr->dam = ep_ptr->dam * calc_lite_damage_rate(player_ptr, CALC_RAND) / 100;
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!"));
426 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
428 if (!player_ptr->wraith_form || check_multishadow(player_ptr)) {
432 player_ptr->wraith_form = 0;
433 msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form."));
435 player_ptr->redraw |= (PR_MAP | PR_STATUS);
436 player_ptr->update |= (PU_MONSTERS);
437 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
440 void effect_player_dark(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
442 const auto is_blind = player_ptr->effects()->blindness()->is_blind();
444 msg_print(_("何かで攻撃された!", "You are hit by something!"));
447 ep_ptr->dam = ep_ptr->dam * calc_dark_damage_rate(player_ptr, CALC_RAND) / 100;
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);
455 (void)BadStatusSetter(player_ptr).mod_blindness(randint1(5) + 2);
458 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
461 static void effect_player_time_one_disability(PlayerType *player_ptr)
464 concptr act = nullptr;
465 switch (randint1(6)) {
468 act = _("強く", "strong");
472 act = _("聡明で", "bright");
476 act = _("賢明で", "wise");
480 act = _("器用で", "agile");
484 act = _("健康で", "hale");
488 act = _("美しく", "beautiful");
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;
498 player_ptr->update |= (PU_BONUS);
501 static void effect_player_time_all_disabilities(PlayerType *player_ptr)
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;
511 player_ptr->update |= (PU_BONUS);
514 static void effect_player_time_addition(PlayerType *player_ptr)
516 switch (randint1(10)) {
522 if (PlayerRace(player_ptr).equals(PlayerRaceType::ANDROID)) {
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);
534 effect_player_time_one_disability(player_ptr);
537 effect_player_time_all_disabilities(player_ptr);
543 * @brief 時間逆転属性によるダメージを受ける
544 * @param player_ptr プレイヤー情報への参照ポインタ
545 * @param em_ptr プレイヤー効果情報への参照ポインタ
547 void effect_player_time(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
549 if (player_ptr->effects()->blindness()->is_blind()) {
550 msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!"));
553 ep_ptr->dam = ep_ptr->dam * calc_time_damage_rate(player_ptr, CALC_RAND) / 100;
555 bool evaded = check_multishadow(player_ptr);
557 if (has_resist_time(player_ptr) && !evaded) {
558 msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by."));
561 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
563 if (!has_resist_time(player_ptr) && !evaded) {
564 effect_player_time_addition(player_ptr);
568 void effect_player_gravity(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
570 if (player_ptr->effects()->blindness()->is_blind()) {
571 msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!"));
574 msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you."));
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);
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);
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);
594 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
597 void effect_player_disintegration(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
599 if (player_ptr->effects()->blindness()->is_blind()) {
600 msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!"));
603 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
606 void effect_player_death_ray(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
608 if (player_ptr->effects()->blindness()->is_blind()) {
609 msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!"));
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);
616 void effect_player_mana(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
618 if (player_ptr->effects()->blindness()->is_blind()) {
619 msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!"));
622 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
625 void effect_player_psy_spear(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
627 if (player_ptr->effects()->blindness()->is_blind()) {
628 msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!"));
631 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_FORCE, ep_ptr->dam, ep_ptr->killer);
634 void effect_player_meteor(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
636 if (player_ptr->effects()->blindness()->is_blind()) {
637 msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!"));
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);
645 inventory_damage(player_ptr, BreakerCold(), 2);
649 void effect_player_icee(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
651 if (player_ptr->effects()->blindness()->is_blind()) {
652 msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!"));
655 ep_ptr->get_damage = cold_dam(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
656 if (check_multishadow(player_ptr)) {
660 BadStatusSetter bss(player_ptr);
661 if (!has_resist_shard(player_ptr)) {
662 (void)bss.mod_cut(damroll(5, 8));
665 if (!has_resist_sound(player_ptr)) {
666 (void)bss.mod_stun(randint1(15));
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);
676 void effect_player_hand_doom(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
678 if ((randint0(100 + ep_ptr->rlev / 2) < player_ptr->skill_sav) && !check_multishadow(player_ptr)) {
679 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
681 if (!check_multishadow(player_ptr)) {
682 msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!"));
683 curse_equipment(player_ptr, 40, 20);
686 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->m_name);
688 if (player_ptr->chp < 1) {
694 void effect_player_void(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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);
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);
707 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
710 void effect_player_abyss(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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)) {
722 if (!player_ptr->levitation) {
723 (void)bss.mod_deceleration(randint0(4) + 4, false);
730 msg_print(_("深淵から何かがあなたを覗き込んでいる!", "Something gazes at you from the abyss!"));
731 if (!has_resist_chaos(player_ptr)) {
732 (void)bss.mod_hallucination(randint1(10));
735 if (!has_resist_conf(player_ptr)) {
736 (void)bss.mod_confusion(randint1(10));
739 if (!has_resist_fear(player_ptr)) {
740 (void)bss.mod_fear(randint1(10));
742 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);