OSDN Git Service

54b8369ed45a84dc9ebb37e875fb4c713656d287
[hengband/hengband.git] / src / effect / effect-player-resist-hurt.c
1 #include "effect/effect-player-resist-hurt.h"
2 #include "art-definition/art-sword-types.h"
3 #include "blue-magic/blue-magic-checker.h"
4 #include "core/hp-mp-processor.h"
5 #include "core/player-redraw-types.h"
6 #include "core/player-update-types.h"
7 #include "core/window-redrawer.h"
8 #include "inventory/inventory-damage.h"
9 #include "inventory/inventory-slot-types.h"
10 #include "mind/mind-mirror-master.h"
11 #include "monster-race/race-indice-types.h"
12 #include "mutation/mutation-investor-remover.h"
13 #include "object/object-broken.h"
14 #include "object-enchant/object-curse.h"
15 #include "player/player-damage.h"
16 #include "player/player-race-types.h"
17 #include "player/player-race.h"
18 #include "player/player-status-flags.h"
19 #include "player/player-status-resist.h"
20 #include "spell-kind/spells-equipment.h"
21 #include "spell-kind/spells-teleport.h"
22 #include "spell/spells-status.h"
23 #include "status/bad-status-setter.h"
24 #include "status/base-status.h"
25 #include "status/element-resistance.h"
26 #include "status/experience.h"
27 #include "status/shape-changer.h"
28 #include "system/object-type-definition.h"
29 #include "view/display-messages.h"
30 #include "world/world.h"
31
32 // 毒を除く4元素.
33 void effect_player_elements(
34     player_type *target_ptr, effect_player_type *ep_ptr, concptr attack_message, HIT_POINT (*damage_func)(player_type *, HIT_POINT, concptr, int, bool))
35 {
36     if (target_ptr->blind)
37         msg_print(attack_message);
38
39     ep_ptr->get_damage = (*damage_func)(target_ptr, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell, FALSE);
40 }
41
42 void effect_player_poison(player_type *target_ptr, effect_player_type *ep_ptr)
43 {
44     bool double_resist = is_oppose_pois(target_ptr);
45     if (target_ptr->blind)
46         msg_print(_("毒で攻撃された!", "You are hit by poison!"));
47
48     ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(target_ptr) / 100;
49
50     if ((!(double_resist || target_ptr->resist_pois)) && one_in_(HURT_CHANCE) && !check_multishadow(target_ptr)) {
51         do_dec_stat(target_ptr, A_CON);
52     }
53
54     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
55
56     if (!(double_resist || target_ptr->resist_pois) && !check_multishadow(target_ptr))
57         set_poisoned(target_ptr, target_ptr->poisoned + randint0(ep_ptr->dam) + 10);
58 }
59
60 void effect_player_nuke(player_type *target_ptr, effect_player_type *ep_ptr)
61 {
62     bool double_resist = is_oppose_pois(target_ptr);
63     if (target_ptr->blind)
64         msg_print(_("放射能で攻撃された!", "You are hit by radiation!"));
65
66     ep_ptr->dam = ep_ptr->dam * calc_pois_damage_rate(target_ptr) / 100;
67
68     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
69     if ((double_resist || target_ptr->resist_pois) || check_multishadow(target_ptr))
70         return;
71
72     set_poisoned(target_ptr, target_ptr->poisoned + randint0(ep_ptr->dam) + 10);
73     if (one_in_(5)) /* 6 */
74     {
75         msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!"));
76         if (one_in_(4)) /* 4 */
77             do_poly_self(target_ptr);
78         else
79             status_shuffle(target_ptr);
80     }
81
82     if (one_in_(6))
83         inventory_damage(target_ptr, set_acid_destroy, 2);
84 }
85
86 void effect_player_missile(player_type *target_ptr, effect_player_type *ep_ptr)
87 {
88     if (target_ptr->blind)
89         msg_print(_("何かで攻撃された!", "You are hit by something!"));
90
91     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
92 }
93
94 void effect_player_holy_fire(player_type *target_ptr, effect_player_type *ep_ptr)
95 {
96     if (target_ptr->blind)
97         msg_print(_("何かで攻撃された!", "You are hit by something!"));
98
99     ep_ptr->dam = ep_ptr->dam * calc_holy_fire_damage_rate(target_ptr, CALC_RAND) / 100;
100
101     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
102 }
103
104 void effect_player_hell_fire(player_type *target_ptr, effect_player_type *ep_ptr)
105 {
106     if (target_ptr->blind)
107         msg_print(_("何かで攻撃された!", "You are hit by something!"));
108
109     ep_ptr->dam = ep_ptr->dam * calc_hell_fire_damage_rate(target_ptr, CALC_RAND) / 100;
110
111     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
112 }
113
114 void effect_player_arrow(player_type *target_ptr, effect_player_type *ep_ptr)
115 {
116     if (target_ptr->blind) {
117         msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
118         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
119         return;
120     }
121
122     if (has_invuln_arrow(target_ptr)) {
123         msg_print(_("矢を斬り捨てた!", "You cut down the arrow!"));
124         return;
125     }
126
127     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
128 }
129
130 void effect_player_plasma(player_type *target_ptr, effect_player_type *ep_ptr)
131 {
132     if (target_ptr->blind)
133         msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!"));
134
135     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
136
137     if (!target_ptr->resist_sound && !check_multishadow(target_ptr)) {
138         int plus_stun = (randint1((ep_ptr->dam > 40) ? 35 : (ep_ptr->dam * 3 / 4 + 5)));
139         (void)set_stun(target_ptr, target_ptr->stun + plus_stun);
140     }
141
142     if (!(target_ptr->resist_fire || is_oppose_fire(target_ptr) || has_immune_fire(target_ptr)))
143         inventory_damage(target_ptr, set_acid_destroy, 3);
144 }
145
146 void effect_player_nether(player_type *target_ptr, effect_player_type *ep_ptr)
147 {
148     if (target_ptr->blind)
149         msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!"));
150
151     ep_ptr->dam = ep_ptr->dam * calc_nether_damage_rate(target_ptr, CALC_RAND) / 100;
152
153     if (!target_ptr->resist_neth && !check_multishadow(target_ptr))
154         drain_exp(target_ptr, 200 + (target_ptr->exp / 100), 200 + (target_ptr->exp / 1000), 75);
155
156     if (!is_specific_player_race(target_ptr, RACE_SPECTRE) || check_multishadow(target_ptr)) {
157         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
158         return;
159     }
160
161     msg_print(_("気分がよくなった。", "You feel invigorated!"));
162     hp_player(target_ptr, ep_ptr->dam / 4);
163     learn_spell(target_ptr, ep_ptr->monspell);
164 }
165
166 void effect_player_water(player_type *target_ptr, effect_player_type *ep_ptr)
167 {
168     if (target_ptr->blind)
169         msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!"));
170     if (check_multishadow(target_ptr)) {
171         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
172         return;
173     }
174
175     if (!target_ptr->resist_sound && !target_ptr->resist_water) {
176         set_stun(target_ptr, target_ptr->stun + randint1(40));
177     }
178     if (!target_ptr->resist_conf && !target_ptr->resist_water) {
179         set_confused(target_ptr, target_ptr->confused + randint1(5) + 5);
180     }
181
182     if (one_in_(5) && !target_ptr->resist_water) {
183         inventory_damage(target_ptr, set_cold_destroy, 3);
184     }
185
186     if (target_ptr->resist_water)
187         ep_ptr->get_damage /= 4;
188
189     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
190 }
191
192 void effect_player_chaos(player_type *target_ptr, effect_player_type *ep_ptr)
193 {
194     if (target_ptr->blind)
195         msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!"));
196
197     ep_ptr->dam = ep_ptr->dam * calc_chaos_damage_rate(target_ptr, CALC_RAND) / 100;
198
199     if (check_multishadow(target_ptr)) {
200         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
201         return;
202     }
203
204     if (!target_ptr->resist_conf) {
205         (void)set_confused(target_ptr, target_ptr->confused + randint0(20) + 10);
206     }
207     if (!target_ptr->resist_chaos) {
208         (void)set_image(target_ptr, target_ptr->image + randint1(10));
209         if (one_in_(3)) {
210             msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!"));
211             (void)gain_mutation(target_ptr, 0);
212         }
213     }
214     if (!target_ptr->resist_neth && !target_ptr->resist_chaos) {
215         drain_exp(target_ptr, 5000 + (target_ptr->exp / 100), 500 + (target_ptr->exp / 1000), 75);
216     }
217
218     if (!target_ptr->resist_chaos || one_in_(9)) {
219         inventory_damage(target_ptr, set_elec_destroy, 2);
220         inventory_damage(target_ptr, set_fire_destroy, 2);
221     }
222
223     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
224 }
225
226 void effect_player_shards(player_type *target_ptr, effect_player_type *ep_ptr)
227 {
228     if (target_ptr->blind)
229         msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!"));
230
231     ep_ptr->dam = ep_ptr->dam * calc_shards_damage_rate(target_ptr, CALC_RAND) / 100;
232
233     if (!target_ptr->resist_shard && !check_multishadow(target_ptr)) {
234         (void)set_cut(target_ptr, target_ptr->cut + ep_ptr->dam);
235     }
236
237     if (!target_ptr->resist_shard || one_in_(13))
238         inventory_damage(target_ptr, set_cold_destroy, 2);
239
240     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
241 }
242
243 void effect_player_sound(player_type *target_ptr, effect_player_type *ep_ptr)
244 {
245     if (target_ptr->blind)
246         msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!"));
247
248     ep_ptr->dam = ep_ptr->dam * calc_sound_damage_rate(target_ptr, CALC_RAND) / 100;
249
250     if (!target_ptr->resist_sound && !check_multishadow(target_ptr)) {
251         int plus_stun = (randint1((ep_ptr->dam > 90) ? 35 : (ep_ptr->dam / 3 + 5)));
252         (void)set_stun(target_ptr, target_ptr->stun + plus_stun);
253     }
254
255     if (!target_ptr->resist_sound || one_in_(13))
256         inventory_damage(target_ptr, set_cold_destroy, 2);
257
258     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
259 }
260
261 void effect_player_confusion(player_type *target_ptr, effect_player_type *ep_ptr)
262 {
263     if (target_ptr->blind)
264         msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!"));
265
266     ep_ptr->dam = ep_ptr->dam * calc_conf_damage_rate(target_ptr, CALC_RAND) / 100;
267
268     if (!target_ptr->resist_conf && !check_multishadow(target_ptr)) {
269         (void)set_confused(target_ptr, target_ptr->confused + randint1(20) + 10);
270     }
271
272     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
273 }
274
275 void effect_player_disenchant(player_type *target_ptr, effect_player_type *ep_ptr)
276 {
277     if (target_ptr->blind)
278         msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!"));
279
280     ep_ptr->dam = ep_ptr->dam * calc_disenchant_damage_rate(target_ptr, CALC_RAND) / 100;
281
282     if (!target_ptr->resist_disen && !check_multishadow(target_ptr)) {
283         (void)apply_disenchant(target_ptr, 0);
284     }
285
286     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
287 }
288
289 void effect_player_nexus(player_type *target_ptr, effect_player_type *ep_ptr)
290 {
291     if (target_ptr->blind)
292         msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!"));
293
294     ep_ptr->dam = ep_ptr->dam * calc_nexus_damage_rate(target_ptr, CALC_RAND) / 100;
295
296     if (!target_ptr->resist_nexus && !check_multishadow(target_ptr)) {
297         apply_nexus(ep_ptr->m_ptr, target_ptr);
298     }
299
300     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
301 }
302
303 void effect_player_force(player_type *target_ptr, effect_player_type *ep_ptr)
304 {
305     if (target_ptr->blind)
306         msg_print(_("運動エネルギーで攻撃された!", "You are hit by kinetic force!"));
307     if (!target_ptr->resist_sound && !check_multishadow(target_ptr)) {
308         (void)set_stun(target_ptr, target_ptr->stun + randint1(20));
309     }
310
311     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
312 }
313
314 void effect_player_rocket(player_type *target_ptr, effect_player_type *ep_ptr)
315 {
316     if (target_ptr->blind)
317         msg_print(_("爆発があった!", "There is an explosion!"));
318     if (!target_ptr->resist_sound && !check_multishadow(target_ptr)) {
319         (void)set_stun(target_ptr, target_ptr->stun + randint1(20));
320     }
321
322     ep_ptr->dam = ep_ptr->dam * calc_rocket_damage_rate(target_ptr, CALC_RAND) / 100;
323
324     if (!target_ptr->resist_shard && !check_multishadow(target_ptr)) {
325         (void)set_cut(target_ptr, target_ptr->cut + (ep_ptr->dam / 2));
326     }
327
328     if (!target_ptr->resist_shard || one_in_(12)) {
329         inventory_damage(target_ptr, set_cold_destroy, 3);
330     }
331
332     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
333 }
334
335 void effect_player_inertial(player_type *target_ptr, effect_player_type *ep_ptr)
336 {
337     if (target_ptr->blind)
338         msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!"));
339     if (!check_multishadow(target_ptr))
340         (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE);
341
342     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
343 }
344
345 void effect_player_lite(player_type *target_ptr, effect_player_type *ep_ptr)
346 {
347     if (target_ptr->blind)
348         msg_print(_("何かで攻撃された!", "You are hit by something!"));
349     if (!target_ptr->blind && !target_ptr->resist_lite && !target_ptr->resist_blind && !check_multishadow(target_ptr)) {
350         (void)set_blind(target_ptr, target_ptr->blind + randint1(5) + 2);
351     }
352
353     ep_ptr->dam = ep_ptr->dam * calc_lite_damage_rate(target_ptr, CALC_RAND) / 100;
354
355     if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE)) {
356         if (!check_multishadow(target_ptr))
357             msg_print(_("光で肉体が焦がされた!", "The light scorches your flesh!"));
358     }
359
360     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
361
362     if (!target_ptr->wraith_form || check_multishadow(target_ptr))
363         return;
364
365     target_ptr->wraith_form = 0;
366     msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form."));
367
368     target_ptr->redraw |= (PR_MAP | PR_STATUS);
369     target_ptr->update |= (PU_MONSTERS);
370     target_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
371 }
372
373 void effect_player_dark(player_type *target_ptr, effect_player_type *ep_ptr)
374 {
375     if (target_ptr->blind)
376         msg_print(_("何かで攻撃された!", "You are hit by something!"));
377
378     ep_ptr->dam = ep_ptr->dam * calc_dark_damage_rate(target_ptr, CALC_RAND) / 100;
379
380     if (!target_ptr->blind && !target_ptr->resist_dark && !target_ptr->resist_blind && !check_multishadow(target_ptr)) {
381         (void)set_blind(target_ptr, target_ptr->blind + randint1(5) + 2);
382     }
383
384     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
385 }
386
387 static void effect_player_time_one_disability(player_type *target_ptr)
388 {
389     int k = 0;
390     concptr act = NULL;
391     switch (randint1(6)) {
392     case 1:
393         k = A_STR;
394         act = _("強く", "strong");
395         break;
396     case 2:
397         k = A_INT;
398         act = _("聡明で", "bright");
399         break;
400     case 3:
401         k = A_WIS;
402         act = _("賢明で", "wise");
403         break;
404     case 4:
405         k = A_DEX;
406         act = _("器用で", "agile");
407         break;
408     case 5:
409         k = A_CON;
410         act = _("健康で", "hale");
411         break;
412     case 6:
413         k = A_CHR;
414         act = _("美しく", "beautiful");
415         break;
416     }
417
418     msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
419     target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 3) / 4;
420     if (target_ptr->stat_cur[k] < 3)
421         target_ptr->stat_cur[k] = 3;
422
423     target_ptr->update |= (PU_BONUS);
424 }
425
426 static void effect_player_time_all_disabilities(player_type *target_ptr)
427 {
428     msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
429     for (int k = 0; k < A_MAX; k++) {
430         target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
431         if (target_ptr->stat_cur[k] < 3)
432             target_ptr->stat_cur[k] = 3;
433     }
434
435     target_ptr->update |= (PU_BONUS);
436 }
437
438 static void effect_player_time_addition(player_type *target_ptr)
439 {
440     switch (randint1(10)) {
441     case 1:
442     case 2:
443     case 3:
444     case 4:
445     case 5: {
446         if (target_ptr->prace == RACE_ANDROID)
447             break;
448
449         msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
450         lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
451         break;
452     }
453     case 6:
454     case 7:
455     case 8:
456     case 9:
457         effect_player_time_one_disability(target_ptr);
458         break;
459     case 10:
460         effect_player_time_all_disabilities(target_ptr);
461         break;
462     }
463 }
464
465 void effect_player_time(player_type *target_ptr, effect_player_type *ep_ptr)
466 {
467     if (target_ptr->blind)
468         msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!"));
469
470     ep_ptr->dam = ep_ptr->dam * calc_time_damage_rate(target_ptr, CALC_RAND) / 100;
471     if (!check_multishadow(target_ptr)) {
472         if (target_ptr->resist_time) {
473             msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by."));
474         }
475         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
476         if (!target_ptr->resist_time) {
477             effect_player_time_addition(target_ptr);
478         }
479     }
480 }
481
482 void effect_player_gravity(player_type *target_ptr, effect_player_type *ep_ptr)
483 {
484     if (target_ptr->blind)
485         msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!"));
486     msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you."));
487
488     if (!check_multishadow(target_ptr)) {
489         teleport_player(target_ptr, 5, TELEPORT_PASSIVE);
490         if (!target_ptr->levitation)
491             (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE);
492         if (!(target_ptr->resist_sound || target_ptr->levitation)) {
493             int plus_stun = (randint1((ep_ptr->dam > 90) ? 35 : (ep_ptr->dam / 3 + 5)));
494             (void)set_stun(target_ptr, target_ptr->stun + plus_stun);
495         }
496     }
497
498     ep_ptr->dam = ep_ptr->dam * calc_gravity_damage_rate(target_ptr, CALC_RAND) / 100;
499
500     if (!target_ptr->levitation || one_in_(13)) {
501         inventory_damage(target_ptr, set_cold_destroy, 2);
502     }
503
504     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
505 }
506
507 void effect_player_disintegration(player_type *target_ptr, effect_player_type *ep_ptr)
508 {
509     if (target_ptr->blind)
510         msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!"));
511
512     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
513 }
514
515 void effect_player_death_ray(player_type *target_ptr, effect_player_type *ep_ptr)
516 {
517     if (target_ptr->blind)
518         msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!"));
519
520     ep_ptr->dam = ep_ptr->dam * calc_deathray_damage_rate(target_ptr, CALC_RAND) / 100;
521     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
522 }
523
524 void effect_player_mana(player_type *target_ptr, effect_player_type *ep_ptr)
525 {
526     if (target_ptr->blind)
527         msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!"));
528
529     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
530 }
531
532 void effect_player_psy_spear(player_type *target_ptr, effect_player_type *ep_ptr)
533 {
534     if (target_ptr->blind)
535         msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!"));
536
537     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_FORCE, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
538 }
539
540 void effect_player_meteor(player_type *target_ptr, effect_player_type *ep_ptr)
541 {
542     if (target_ptr->blind)
543         msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!"));
544
545     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell);
546     if (!target_ptr->resist_shard || one_in_(13)) {
547         if (!has_immune_fire(target_ptr))
548             inventory_damage(target_ptr, set_fire_destroy, 2);
549         inventory_damage(target_ptr, set_cold_destroy, 2);
550     }
551 }
552
553 void effect_player_icee(player_type *target_ptr, effect_player_type *ep_ptr)
554 {
555     if (target_ptr->blind)
556         msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!"));
557
558     ep_ptr->get_damage = cold_dam(target_ptr, ep_ptr->dam, ep_ptr->killer, ep_ptr->monspell, FALSE);
559     if (check_multishadow(target_ptr))
560         return;
561
562     if (!target_ptr->resist_shard) {
563         (void)set_cut(target_ptr, target_ptr->cut + damroll(5, 8));
564     }
565
566     if (!target_ptr->resist_sound) {
567         (void)set_stun(target_ptr, target_ptr->stun + randint1(15));
568     }
569
570     if ((!(target_ptr->resist_cold || is_oppose_cold(target_ptr))) || one_in_(12)) {
571         if (!has_immune_cold(target_ptr))
572             inventory_damage(target_ptr, set_cold_destroy, 3);
573     }
574 }
575
576 void effect_player_hand_doom(player_type *target_ptr, effect_player_type *ep_ptr)
577 {
578     if ((randint0(100 + ep_ptr->rlev / 2) < target_ptr->skill_sav) && !check_multishadow(target_ptr)) {
579         msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
580         learn_spell(target_ptr, ep_ptr->monspell);
581     } else {
582         if (!check_multishadow(target_ptr)) {
583             msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!"));
584             curse_equipment(target_ptr, 40, 20);
585         }
586
587         ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam, ep_ptr->m_name, ep_ptr->monspell);
588
589         if (target_ptr->chp < 1)
590             target_ptr->chp = 1;
591     }
592 }