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"
37 void effect_player_elements(
38 PlayerType *player_ptr, EffectPlayerType *ep_ptr, concptr attack_message, HIT_POINT (*damage_func)(PlayerType *, HIT_POINT, concptr, bool))
40 if (player_ptr->blind)
41 msg_print(attack_message);
43 ep_ptr->get_damage = (*damage_func)(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
46 void effect_player_poison(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
48 bool double_resist = is_oppose_pois(player_ptr);
49 if (player_ptr->blind)
50 msg_print(_("毒で攻撃された!", "You are hit by poison!"));
52 ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
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);
58 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
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);
65 void effect_player_nuke(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
67 bool double_resist = is_oppose_pois(player_ptr);
68 if (player_ptr->blind)
69 msg_print(_("放射能で攻撃された!", "You are hit by radiation!"));
71 ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(player_ptr) / 100;
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))
77 (void)BadStatusSetter(player_ptr).mod_poison(randint0(ep_ptr->dam) + 10);
78 if (one_in_(5)) /* 6 */
80 msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!"));
81 if (one_in_(4)) /* 4 */
82 do_poly_self(player_ptr);
84 status_shuffle(player_ptr);
88 inventory_damage(player_ptr, BreakerAcid(), 2);
91 void effect_player_missile(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
93 if (player_ptr->blind)
94 msg_print(_("何かで攻撃された!", "You are hit by something!"));
96 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
99 void effect_player_holy_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
101 if (player_ptr->blind)
102 msg_print(_("何かで攻撃された!", "You are hit by something!"));
104 ep_ptr->dam = ep_ptr->dam * calc_holy_fire_damage_rate(player_ptr, CALC_RAND) / 100;
106 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
109 void effect_player_hell_fire(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
111 if (player_ptr->blind)
112 msg_print(_("何かで攻撃された!", "You are hit by something!"));
114 ep_ptr->dam = ep_ptr->dam * calc_hell_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_arrow(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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);
128 if (has_invuln_arrow(player_ptr)) {
129 msg_print(_("矢を斬り捨てた!", "You cut down the arrow!"));
133 sound(SOUND_SHOOT_HIT);
134 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
137 void effect_player_plasma(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
139 if (player_ptr->blind)
140 msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!"));
142 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
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);
149 if (!(has_resist_fire(player_ptr) || is_oppose_fire(player_ptr) || has_immune_fire(player_ptr)))
150 inventory_damage(player_ptr, BreakerAcid(), 3);
154 * @brief 地獄属性によるダメージを受ける
155 * @param player_ptr プレイヤー情報への参照ポインタ
156 * @param em_ptr プレイヤー効果情報への参照ポインタ
158 * 幽霊は回復する。追加効果で経験値吸収。
161 void effect_player_nether(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
163 if (player_ptr->blind)
164 msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!"));
166 bool evaded = check_multishadow(player_ptr);
168 if (PlayerRace(player_ptr).equals(PlayerRaceType::SPECTRE)) {
170 msg_print(_("気分がよくなった。", "You feel invigorated!"));
171 hp_player(player_ptr, ep_ptr->dam / 4);
173 ep_ptr->get_damage = 0;
177 ep_ptr->dam = ep_ptr->dam * calc_nether_damage_rate(player_ptr, CALC_RAND) / 100;
179 if (!has_resist_neth(player_ptr) && !evaded)
180 drain_exp(player_ptr, 200 + (player_ptr->exp / 100), 200 + (player_ptr->exp / 1000), 75);
182 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
186 * @brief 水流属性によるダメージを受ける
187 * @param player_ptr プレイヤー情報への参照ポインタ
188 * @param em_ptr プレイヤー効果情報への参照ポインタ
190 * 追加効果で朦朧と混乱、冷気同様のインベントリ破壊。
192 void effect_player_water(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
194 if (player_ptr->blind) {
195 msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!"));
198 if (check_multishadow(player_ptr)) {
199 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
203 ep_ptr->dam = ep_ptr->dam * calc_water_damage_rate(player_ptr, CALC_RAND) / 100;
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));
212 if (!has_resist_conf(player_ptr) && !has_res_water) {
213 (void)bss.mod_confusion(randint1(5) + 5);
216 if (one_in_(5) && !has_res_water) {
217 inventory_damage(player_ptr, BreakerCold(), 3);
221 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
224 void effect_player_chaos(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
226 if (player_ptr->blind) {
227 msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!"));
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);
236 BadStatusSetter bss(player_ptr);
237 if (!has_resist_conf(player_ptr)) {
238 (void)bss.mod_confusion(randint0(20) + 10);
241 if (!has_resist_chaos(player_ptr)) {
242 (void)bss.mod_hallucination(randint1(10));
244 msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!"));
245 (void)gain_mutation(player_ptr, 0);
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);
252 if (!has_resist_chaos(player_ptr) || one_in_(9)) {
253 inventory_damage(player_ptr, BreakerElec(), 2);
254 inventory_damage(player_ptr, BreakerFire(), 2);
257 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
260 void effect_player_shards(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
262 if (player_ptr->blind)
263 msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
265 ep_ptr->dam = ep_ptr->dam * calc_shards_damage_rate(player_ptr, CALC_RAND) / 100;
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));
271 if (!has_resist_shard(player_ptr) || one_in_(13))
272 inventory_damage(player_ptr, BreakerCold(), 2);
274 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
277 void effect_player_sound(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
279 if (player_ptr->blind)
280 msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!"));
282 ep_ptr->dam = ep_ptr->dam * calc_sound_damage_rate(player_ptr, CALC_RAND) / 100;
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);
289 if (!has_resist_sound(player_ptr) || one_in_(13))
290 inventory_damage(player_ptr, BreakerCold(), 2);
292 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
295 void effect_player_confusion(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
297 if (player_ptr->blind) {
298 msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!"));
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);
307 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
310 void effect_player_disenchant(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
312 if (player_ptr->blind)
313 msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!"));
315 ep_ptr->dam = ep_ptr->dam * calc_disenchant_damage_rate(player_ptr, CALC_RAND) / 100;
317 if (!has_resist_disen(player_ptr) && !check_multishadow(player_ptr)) {
318 (void)apply_disenchant(player_ptr, 0);
321 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
324 void effect_player_nexus(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
326 if (player_ptr->blind)
327 msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!"));
329 ep_ptr->dam = ep_ptr->dam * calc_nexus_damage_rate(player_ptr, CALC_RAND) / 100;
331 if (!has_resist_nexus(player_ptr) && !check_multishadow(player_ptr)) {
332 apply_nexus(ep_ptr->m_ptr, player_ptr);
335 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
338 void effect_player_force(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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));
346 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
349 void effect_player_rocket(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
351 if (player_ptr->blind) {
352 msg_print(_("爆発があった!", "There is an explosion!"));
355 BadStatusSetter bss(player_ptr);
356 if (!has_resist_sound(player_ptr) && !check_multishadow(player_ptr)) {
357 (void)bss.mod_stun(randint1(20));
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));
365 if (!has_resist_shard(player_ptr) || one_in_(12)) {
366 inventory_damage(player_ptr, BreakerCold(), 3);
369 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
372 void effect_player_inertial(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
374 if (player_ptr->blind) {
375 msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!"));
378 if (!check_multishadow(player_ptr)) {
379 (void)BadStatusSetter(player_ptr).mod_slowness(randint0(4) + 4, false);
382 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
385 void effect_player_lite(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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);
393 ep_ptr->dam = ep_ptr->dam * calc_lite_damage_rate(player_ptr, CALC_RAND) / 100;
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!"));
401 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
403 if (!player_ptr->wraith_form || check_multishadow(player_ptr))
406 player_ptr->wraith_form = 0;
407 msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form."));
409 player_ptr->redraw |= (PR_MAP | PR_STATUS);
410 player_ptr->update |= (PU_MONSTERS);
411 player_ptr->window_flags |= (PW_OVERHEAD | PW_DUNGEON);
414 void effect_player_dark(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
416 if (player_ptr->blind)
417 msg_print(_("何かで攻撃された!", "You are hit by something!"));
419 ep_ptr->dam = ep_ptr->dam * calc_dark_damage_rate(player_ptr, CALC_RAND) / 100;
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);
425 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
428 static void effect_player_time_one_disability(PlayerType *player_ptr)
431 concptr act = nullptr;
432 switch (randint1(6)) {
435 act = _("強く", "strong");
439 act = _("聡明で", "bright");
443 act = _("賢明で", "wise");
447 act = _("器用で", "agile");
451 act = _("健康で", "hale");
455 act = _("美しく", "beautiful");
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;
464 player_ptr->update |= (PU_BONUS);
467 static void effect_player_time_all_disabilities(PlayerType *player_ptr)
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;
476 player_ptr->update |= (PU_BONUS);
479 static void effect_player_time_addition(PlayerType *player_ptr)
481 switch (randint1(10)) {
487 if (player_ptr->prace == PlayerRaceType::ANDROID)
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);
498 effect_player_time_one_disability(player_ptr);
501 effect_player_time_all_disabilities(player_ptr);
507 * @brief 時間逆転属性によるダメージを受ける
508 * @param player_ptr プレイヤー情報への参照ポインタ
509 * @param em_ptr プレイヤー効果情報への参照ポインタ
511 void effect_player_time(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
513 if (player_ptr->blind)
514 msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!"));
516 ep_ptr->dam = ep_ptr->dam * calc_time_damage_rate(player_ptr, CALC_RAND) / 100;
518 bool evaded = check_multishadow(player_ptr);
520 if (has_resist_time(player_ptr) && !evaded)
521 msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by."));
523 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
525 if (!has_resist_time(player_ptr) && !evaded)
526 effect_player_time_addition(player_ptr);
529 void effect_player_gravity(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
531 if (player_ptr->blind) {
532 msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!"));
535 msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you."));
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);
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);
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);
555 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
558 void effect_player_disintegration(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
560 if (player_ptr->blind)
561 msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!"));
563 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
566 void effect_player_death_ray(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
568 if (player_ptr->blind)
569 msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!"));
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);
575 void effect_player_mana(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
577 if (player_ptr->blind)
578 msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!"));
580 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
583 void effect_player_psy_spear(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
585 if (player_ptr->blind)
586 msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!"));
588 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_FORCE, ep_ptr->dam, ep_ptr->killer);
591 void effect_player_meteor(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
593 if (player_ptr->blind)
594 msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!"));
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);
604 void effect_player_icee(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
606 if (player_ptr->blind) {
607 msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!"));
610 ep_ptr->get_damage = cold_dam(player_ptr, ep_ptr->dam, ep_ptr->killer, false);
611 if (check_multishadow(player_ptr)) {
615 BadStatusSetter bss(player_ptr);
616 if (!has_resist_shard(player_ptr)) {
617 (void)bss.mod_cut(damroll(5, 8));
620 if (!has_resist_sound(player_ptr)) {
621 (void)bss.mod_stun(randint1(15));
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);
631 void effect_player_hand_doom(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
633 if ((randint0(100 + ep_ptr->rlev / 2) < player_ptr->skill_sav) && !check_multishadow(player_ptr)) {
634 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
636 if (!check_multishadow(player_ptr)) {
637 msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!"));
638 curse_equipment(player_ptr, 40, 20);
641 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->m_name);
643 if (player_ptr->chp < 1)
648 void effect_player_void(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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);
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);
661 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);
664 void effect_player_abyss(PlayerType *player_ptr, EffectPlayerType *ep_ptr)
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)) {
675 if (!player_ptr->levitation) {
676 (void)bss.mod_slowness(randint0(4) + 4, false);
679 if (player_ptr->blind) {
683 msg_print(_("深淵から何かがあなたを覗き込んでいる!", "Something gazes at you from the abyss!"));
684 if (!has_resist_chaos(player_ptr)) {
685 (void)bss.mod_hallucination(randint1(10));
688 if (!has_resist_conf(player_ptr)) {
689 (void)bss.mod_confusion(randint1(10));
692 if (!has_resist_fear(player_ptr)) {
693 (void)bss.mod_afraidness(randint1(10));
695 ep_ptr->get_damage = take_hit(player_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer);