OSDN Git Service

[Refactor] #39963 Separated effect-player-curse.c/h from effect-player-switcher.c
[hengband/hengband.git] / src / effect / effect-player-switcher.c
1 #include "angband.h"
2 #include "effect-player-util.h"
3 #include "effect/effect-player-curse.h"
4 #include "effect/effect-player-switcher.h"
5 #include "effect/effect-player-oldies.h"
6 #include "effect/effect-player-resist-hurt.h"
7 #include "monster-spell.h"
8 #include "object-broken.h"
9 #include "object-curse.h"
10 #include "player-damage.h"
11 #include "player-effects.h"
12 #include "player/mimic-info-table.h"
13 #include "spell/spells-type.h"
14 #include "world.h"
15
16 void effect_player_mana(player_type *target_ptr, effect_player_type *ep_ptr) {
17   if (target_ptr->blind)
18     msg_print(
19         _("\96\82\96@\82Ì\83I\81[\83\89\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by an aura of magic!"));
20
21   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
22                                 ep_ptr->killer, ep_ptr->monspell);
23 }
24
25 void effect_player_psy_spear(player_type *target_ptr,
26                              effect_player_type *ep_ptr) {
27   if (target_ptr->blind)
28     msg_print(_("\83G\83l\83\8b\83M\81[\82Ì\89ò\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by an energy!"));
29
30   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_FORCE, ep_ptr->dam,
31                                 ep_ptr->killer, ep_ptr->monspell);
32 }
33
34 void effect_player_meteor(player_type *target_ptr, effect_player_type *ep_ptr) {
35   if (target_ptr->blind)
36     msg_print(_("\89½\82©\82ª\8bó\82©\82ç\82 \82È\82½\82Ì\93ª\8fã\82É\97\8e\82¿\82Ä\82«\82½\81I",
37                 "Something falls from the sky on you!"));
38
39   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
40                                 ep_ptr->killer, ep_ptr->monspell);
41   if (!target_ptr->resist_shard || one_in_(13)) {
42     if (!target_ptr->immune_fire)
43       inventory_damage(target_ptr, set_fire_destroy, 2);
44     inventory_damage(target_ptr, set_cold_destroy, 2);
45   }
46 }
47
48 void effect_player_icee(player_type *target_ptr, effect_player_type *ep_ptr) {
49   if (target_ptr->blind)
50     msg_print(_("\89½\82©\89s\82­\97â\82½\82¢\82à\82Ì\82Å\8dU\8c\82\82³\82ê\82½\81I",
51                 "You are hit by something sharp and cold!"));
52
53   ep_ptr->get_damage = cold_dam(target_ptr, ep_ptr->dam, ep_ptr->killer,
54                                 ep_ptr->monspell, FALSE);
55   if (CHECK_MULTISHADOW(target_ptr))
56     return;
57
58   if (!target_ptr->resist_shard) {
59     (void)set_cut(target_ptr, target_ptr->cut + damroll(5, 8));
60   }
61
62   if (!target_ptr->resist_sound) {
63     (void)set_stun(target_ptr, target_ptr->stun + randint1(15));
64   }
65
66   if ((!(target_ptr->resist_cold || is_oppose_cold(target_ptr))) ||
67       one_in_(12)) {
68     if (!target_ptr->immune_cold)
69       inventory_damage(target_ptr, set_cold_destroy, 3);
70   }
71 }
72
73 void effect_player_death_ray(player_type *target_ptr,
74                              effect_player_type *ep_ptr) {
75   if (target_ptr->blind)
76     msg_print(_("\89½\82©\94ñ\8fí\82É\97â\82½\82¢\82à\82Ì\82Å\8dU\8c\82\82³\82ê\82½\81I",
77                 "You are hit by something extremely cold!"));
78
79   if (target_ptr->mimic_form) {
80     if (!(mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING))
81       ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
82                                     ep_ptr->killer, ep_ptr->monspell);
83
84     return;
85   }
86
87   switch (target_ptr->prace) {
88   case RACE_GOLEM:
89   case RACE_SKELETON:
90   case RACE_ZOMBIE:
91   case RACE_VAMPIRE:
92   case RACE_DEMON:
93   case RACE_SPECTRE: {
94     ep_ptr->dam = 0;
95     break;
96   }
97   default: {
98     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
99                                   ep_ptr->killer, ep_ptr->monspell);
100     break;
101   }
102   }
103 }
104
105 void effect_player_drain_mana(player_type *target_ptr,
106                               effect_player_type *ep_ptr) {
107   if (CHECK_MULTISHADOW(target_ptr)) {
108     msg_print(_("\8dU\8c\82\82Í\8c\89e\82É\96½\92\86\82µ\81A\82 \82È\82½\82É\82Í\93Í\82©\82È\82©\82Á\82½\81B",
109                 "The attack hits Shadow, but you are unharmed!"));
110     ep_ptr->dam = 0;
111     return;
112   }
113
114   if (target_ptr->csp == 0) {
115     ep_ptr->dam = 0;
116     return;
117   }
118
119   if (ep_ptr->who > 0)
120     msg_format(_("%^s\82É\90¸\90_\83G\83l\83\8b\83M\81[\82ð\8bz\82¢\8eæ\82ç\82ê\82Ä\82µ\82Ü\82Á\82½\81I",
121                  "%^s draws psychic energy from you!"),
122                ep_ptr->m_name);
123   else
124     msg_print(_("\90¸\90_\83G\83l\83\8b\83M\81[\82ð\8bz\82¢\8eæ\82ç\82ê\82Ä\82µ\82Ü\82Á\82½\81I",
125                 "Your psychic energy is drawn!"));
126
127   if (ep_ptr->dam >= target_ptr->csp) {
128     ep_ptr->dam = target_ptr->csp;
129     target_ptr->csp = 0;
130     target_ptr->csp_frac = 0;
131   } else {
132     target_ptr->csp -= ep_ptr->dam;
133   }
134
135   learn_spell(target_ptr, ep_ptr->monspell);
136   target_ptr->redraw |= (PR_MANA);
137   target_ptr->window |= (PW_PLAYER | PW_SPELL);
138
139   if ((ep_ptr->who <= 0) || (ep_ptr->m_ptr->hp >= ep_ptr->m_ptr->maxhp)) {
140     ep_ptr->dam = 0;
141     return;
142   }
143
144   ep_ptr->m_ptr->hp += ep_ptr->dam;
145   if (ep_ptr->m_ptr->hp > ep_ptr->m_ptr->maxhp)
146     ep_ptr->m_ptr->hp = ep_ptr->m_ptr->maxhp;
147
148   if (target_ptr->health_who == ep_ptr->who)
149     target_ptr->redraw |= (PR_HEALTH);
150   if (target_ptr->riding == ep_ptr->who)
151     target_ptr->redraw |= (PR_UHEALTH);
152
153   if (ep_ptr->m_ptr->ml) {
154     msg_format(_("%^s\82Í\8bC\95ª\82ª\97Ç\82³\82»\82¤\82¾\81B", "%^s appears healthier."),
155                ep_ptr->m_name);
156   }
157
158   ep_ptr->dam = 0;
159 }
160
161 void effect_player_mind_blast(player_type *target_ptr,
162                               effect_player_type *ep_ptr) {
163   if ((randint0(100 + ep_ptr->rlev / 2) < MAX(5, target_ptr->skill_sav)) &&
164       !CHECK_MULTISHADOW(target_ptr)) {
165     msg_print(_("\82µ\82©\82µ\8cø\97Í\82ð\92µ\82Ë\95Ô\82µ\82½\81I", "You resist the effects!"));
166     learn_spell(target_ptr, ep_ptr->monspell);
167     return;
168   }
169
170   if (CHECK_MULTISHADOW(target_ptr)) {
171     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
172                                   ep_ptr->killer, ep_ptr->monspell);
173     return;
174   }
175
176   msg_print(_("\97ì\93I\83G\83l\83\8b\83M\81[\82Å\90¸\90_\82ª\8dU\8c\82\82³\82ê\82½\81B",
177               "Your mind is blasted by psionic energy."));
178   if (!target_ptr->resist_conf) {
179     (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4);
180   }
181
182   if (!target_ptr->resist_chaos && one_in_(3)) {
183     (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150);
184   }
185
186   target_ptr->csp -= 50;
187   if (target_ptr->csp < 0) {
188     target_ptr->csp = 0;
189     target_ptr->csp_frac = 0;
190   }
191
192   target_ptr->redraw |= PR_MANA;
193   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
194                                 ep_ptr->killer, ep_ptr->monspell);
195 }
196
197 void effect_player_brain_smash(player_type *target_ptr,
198                                effect_player_type *ep_ptr) {
199   if ((randint0(100 + ep_ptr->rlev / 2) < MAX(5, target_ptr->skill_sav)) &&
200       !CHECK_MULTISHADOW(target_ptr)) {
201     msg_print(_("\82µ\82©\82µ\8cø\97Í\82ð\92µ\82Ë\95Ô\82µ\82½\81I", "You resist the effects!"));
202     learn_spell(target_ptr, ep_ptr->monspell);
203     return;
204   }
205
206   if (!CHECK_MULTISHADOW(target_ptr)) {
207     msg_print(_("\97ì\93I\83G\83l\83\8b\83M\81[\82Å\90¸\90_\82ª\8dU\8c\82\82³\82ê\82½\81B",
208                 "Your mind is blasted by psionic energy."));
209
210     target_ptr->csp -= 100;
211     if (target_ptr->csp < 0) {
212       target_ptr->csp = 0;
213       target_ptr->csp_frac = 0;
214     }
215     target_ptr->redraw |= PR_MANA;
216   }
217
218   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
219                                 ep_ptr->killer, ep_ptr->monspell);
220   if (CHECK_MULTISHADOW(target_ptr))
221     return;
222
223   if (!target_ptr->resist_blind) {
224     (void)set_blind(target_ptr, target_ptr->blind + 8 + randint0(8));
225   }
226
227   if (!target_ptr->resist_conf) {
228     (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4);
229   }
230
231   if (!target_ptr->free_act) {
232     (void)set_paralyzed(target_ptr, target_ptr->paralyzed + randint0(4) + 4);
233   }
234
235   (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE);
236
237   while (randint0(100 + ep_ptr->rlev / 2) > (MAX(5, target_ptr->skill_sav)))
238     (void)do_dec_stat(target_ptr, A_INT);
239   while (randint0(100 + ep_ptr->rlev / 2) > (MAX(5, target_ptr->skill_sav)))
240     (void)do_dec_stat(target_ptr, A_WIS);
241
242   if (!target_ptr->resist_chaos) {
243     (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150);
244   }
245 }
246
247 void effect_player_hand_doom(player_type *target_ptr,
248                              effect_player_type *ep_ptr) {
249   if ((randint0(100 + ep_ptr->rlev / 2) < target_ptr->skill_sav) &&
250       !CHECK_MULTISHADOW(target_ptr)) {
251     msg_print(_("\82µ\82©\82µ\8cø\97Í\82ð\92µ\82Ë\95Ô\82µ\82½\81I", "You resist the effects!"));
252     learn_spell(target_ptr, ep_ptr->monspell);
253   } else {
254     if (!CHECK_MULTISHADOW(target_ptr)) {
255       msg_print(_("\82 \82È\82½\82Í\96½\82ª\94\96\82Ü\82Á\82Ä\82¢\82­\82æ\82¤\82É\8a´\82\82½\81I",
256                   "You feel your life fade away!"));
257       curse_equipment(target_ptr, 40, 20);
258     }
259
260     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
261                                   ep_ptr->m_name, ep_ptr->monspell);
262
263     if (target_ptr->chp < 1)
264       target_ptr->chp = 1;
265   }
266 }
267
268 /*!
269  * @brief
270  * \96\82\96@\82Ì\8cø\89Ê\82É\82æ\82Á\82Ä\97l\81X\82È\83\81\83b\83Z\81[\82ð\8fo\97Í\82µ\82½\82è\97^\82¦\82é\83_\83\81\81[\83W\82Ì\91\9d\8c¸\82ð\8ds\82Á\82½\82è\82·\82é
271  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
272  * @param em_ptr \83v\83\8c\81[\83\84\81[\8cø\89Ê\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
273  * @return \82È\82µ
274  */
275 void switch_effects_player(player_type *target_ptr,
276                            effect_player_type *ep_ptr) {
277   switch (ep_ptr->effect_type) {
278   case GF_ACID:
279     effect_player_elements(target_ptr, ep_ptr,
280                            _("\8e_\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by acid!"),
281                            acid_dam);
282     return;
283   case GF_FIRE:
284     effect_player_elements(target_ptr, ep_ptr,
285                            _("\89Î\89\8a\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by fire!"),
286                            fire_dam);
287     return;
288   case GF_COLD:
289     effect_player_elements(target_ptr, ep_ptr,
290                            _("\97â\8bC\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by cold!"),
291                            cold_dam);
292     return;
293   case GF_ELEC:
294     effect_player_elements(target_ptr, ep_ptr,
295                            _("\93d\8c\82\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by lightning!"),
296                            elec_dam);
297     return;
298   case GF_POIS:
299     effect_player_poison(target_ptr, ep_ptr);
300     return;
301   case GF_NUKE:
302     effect_player_nuke(target_ptr, ep_ptr);
303     return;
304   case GF_MISSILE:
305     effect_player_missile(target_ptr, ep_ptr);
306     return;
307   case GF_HOLY_FIRE:
308     effect_player_holy_fire(target_ptr, ep_ptr);
309     return;
310   case GF_HELL_FIRE:
311     effect_player_hell_fire(target_ptr, ep_ptr);
312     return;
313   case GF_ARROW:
314     effect_player_arrow(target_ptr, ep_ptr);
315     return;
316   case GF_PLASMA:
317     effect_player_plasma(target_ptr, ep_ptr);
318     return;
319   case GF_NETHER:
320     effect_player_nether(target_ptr, ep_ptr);
321     return;
322   case GF_WATER:
323     effect_player_water(target_ptr, ep_ptr);
324     return;
325   case GF_CHAOS:
326     effect_player_chaos(target_ptr, ep_ptr);
327     return;
328   case GF_SHARDS:
329     effect_player_shards(target_ptr, ep_ptr);
330     return;
331   case GF_SOUND:
332     effect_player_sound(target_ptr, ep_ptr);
333     return;
334   case GF_CONFUSION:
335     effect_player_confusion(target_ptr, ep_ptr);
336     return;
337   case GF_DISENCHANT:
338     effect_player_disenchant(target_ptr, ep_ptr);
339     return;
340   case GF_NEXUS:
341     effect_player_nexus(target_ptr, ep_ptr);
342     return;
343   case GF_FORCE:
344     effect_player_force(target_ptr, ep_ptr);
345     return;
346   case GF_ROCKET:
347     effect_player_rocket(target_ptr, ep_ptr);
348     return;
349   case GF_INERTIAL:
350     effect_player_inertial(target_ptr, ep_ptr);
351     return;
352   case GF_LITE:
353     effect_player_lite(target_ptr, ep_ptr);
354     return;
355   case GF_DARK:
356     effect_player_dark(target_ptr, ep_ptr);
357     return;
358   case GF_TIME:
359     effect_player_time(target_ptr, ep_ptr);
360     return;
361   case GF_GRAVITY:
362     effect_player_gravity(target_ptr, ep_ptr);
363     return;
364   case GF_DISINTEGRATE:
365     effect_player_disintegration(target_ptr, ep_ptr);
366     return;
367   case GF_OLD_HEAL:
368     effect_player_old_heal(target_ptr, ep_ptr);
369     return;
370   case GF_OLD_SPEED:
371     effect_player_old_speed(target_ptr, ep_ptr);
372     return;
373   case GF_OLD_SLOW:
374     effect_player_old_slow(target_ptr);
375     return;
376   case GF_OLD_SLEEP:
377     effect_player_old_sleep(target_ptr, ep_ptr);
378     return;
379   case GF_MANA:
380   case GF_SEEKER:
381   case GF_SUPER_RAY:
382     effect_player_mana(target_ptr, ep_ptr);
383     return;
384   case GF_PSY_SPEAR:
385     effect_player_psy_spear(target_ptr, ep_ptr);
386     return;
387   case GF_METEOR:
388     effect_player_meteor(target_ptr, ep_ptr);
389     return;
390   case GF_ICE:
391     effect_player_icee(target_ptr, ep_ptr);
392     return;
393   case GF_DEATH_RAY:
394     effect_player_death_ray(target_ptr, ep_ptr);
395     return;
396   case GF_DRAIN_MANA:
397     effect_player_drain_mana(target_ptr, ep_ptr);
398     return;
399   case GF_MIND_BLAST:
400     effect_player_mind_blast(target_ptr, ep_ptr);
401     return;
402   case GF_BRAIN_SMASH:
403     effect_player_brain_smash(target_ptr, ep_ptr);
404     return;
405   case GF_CAUSE_1:
406     effect_player_curse_1(target_ptr, ep_ptr);
407     return;
408   case GF_CAUSE_2:
409     effect_player_curse_2(target_ptr, ep_ptr);
410     return;
411   case GF_CAUSE_3:
412     effect_player_curse_3(target_ptr, ep_ptr);
413     return;
414   case GF_CAUSE_4:
415     effect_player_curse_4(target_ptr, ep_ptr);
416     return;
417   case GF_HAND_DOOM:
418     effect_player_hand_doom(target_ptr, ep_ptr);
419     return;
420   default: {
421     ep_ptr->dam = 0;
422     return;
423   }
424   }
425 }