OSDN Git Service

ef45a29478a11729be5e82899bf8f8fffe6606ac
[hengband/hengband.git] / src / effect / effect-player-switcher.c
1 #include "system/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 "effect/effect-player-spirit.h"
8 #include "mspell/monster-spell.h"
9 #include "object/object-broken.h"
10 #include "object-enchant/object-curse.h"
11 #include "player/player-damage.h"
12 #include "mind/racial-mirror-master.h"
13 #include "inventory/inventory-damage.h"
14 #include "player/player-effects.h"
15 #include "player/mimic-info-table.h"
16 #include "spell/spells-type.h"
17 #include "world/world.h"
18 #include "player/player-races-table.h"
19 #include "cmd-action/cmd-attack.h"
20
21 void effect_player_mana(player_type *target_ptr, effect_player_type *ep_ptr) {
22   if (target_ptr->blind)
23     msg_print(
24         _("\96\82\96@\82Ì\83I\81[\83\89\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by an aura of magic!"));
25
26   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
27                                 ep_ptr->killer, ep_ptr->monspell);
28 }
29
30 void effect_player_psy_spear(player_type *target_ptr,
31                              effect_player_type *ep_ptr) {
32   if (target_ptr->blind)
33     msg_print(_("\83G\83l\83\8b\83M\81[\82Ì\89ò\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by an energy!"));
34
35   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_FORCE, ep_ptr->dam,
36                                 ep_ptr->killer, ep_ptr->monspell);
37 }
38
39 void effect_player_meteor(player_type *target_ptr, effect_player_type *ep_ptr) {
40   if (target_ptr->blind)
41     msg_print(_("\89½\82©\82ª\8bó\82©\82ç\82 \82È\82½\82Ì\93ª\8fã\82É\97\8e\82¿\82Ä\82«\82½\81I",
42                 "Something falls from the sky on you!"));
43
44   ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
45                                 ep_ptr->killer, ep_ptr->monspell);
46   if (!target_ptr->resist_shard || one_in_(13)) {
47     if (!target_ptr->immune_fire)
48       inventory_damage(target_ptr, set_fire_destroy, 2);
49     inventory_damage(target_ptr, set_cold_destroy, 2);
50   }
51 }
52
53 void effect_player_icee(player_type *target_ptr, effect_player_type *ep_ptr) {
54   if (target_ptr->blind)
55     msg_print(_("\89½\82©\89s\82­\97â\82½\82¢\82à\82Ì\82Å\8dU\8c\82\82³\82ê\82½\81I",
56                 "You are hit by something sharp and cold!"));
57
58   ep_ptr->get_damage = cold_dam(target_ptr, ep_ptr->dam, ep_ptr->killer,
59                                 ep_ptr->monspell, FALSE);
60   if (check_multishadow(target_ptr))
61     return;
62
63   if (!target_ptr->resist_shard) {
64     (void)set_cut(target_ptr, target_ptr->cut + damroll(5, 8));
65   }
66
67   if (!target_ptr->resist_sound) {
68     (void)set_stun(target_ptr, target_ptr->stun + randint1(15));
69   }
70
71   if ((!(target_ptr->resist_cold || is_oppose_cold(target_ptr))) ||
72       one_in_(12)) {
73     if (!target_ptr->immune_cold)
74       inventory_damage(target_ptr, set_cold_destroy, 3);
75   }
76 }
77
78 void effect_player_death_ray(player_type *target_ptr,
79                              effect_player_type *ep_ptr) {
80   if (target_ptr->blind)
81     msg_print(_("\89½\82©\94ñ\8fí\82É\97â\82½\82¢\82à\82Ì\82Å\8dU\8c\82\82³\82ê\82½\81I",
82                 "You are hit by something extremely cold!"));
83
84   if (target_ptr->mimic_form) {
85     if (!(mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING))
86       ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
87                                     ep_ptr->killer, ep_ptr->monspell);
88
89     return;
90   }
91
92   switch (target_ptr->prace) {
93   case RACE_GOLEM:
94   case RACE_SKELETON:
95   case RACE_ZOMBIE:
96   case RACE_VAMPIRE:
97   case RACE_BALROG:
98   case RACE_SPECTRE: {
99     ep_ptr->dam = 0;
100     break;
101   }
102   default: {
103     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
104                                   ep_ptr->killer, ep_ptr->monspell);
105     break;
106   }
107   }
108 }
109
110 void effect_player_hand_doom(player_type *target_ptr,
111                              effect_player_type *ep_ptr) {
112   if ((randint0(100 + ep_ptr->rlev / 2) < target_ptr->skill_sav) &&
113       !check_multishadow(target_ptr)) {
114     msg_print(_("\82µ\82©\82µ\8cø\97Í\82ð\92µ\82Ë\95Ô\82µ\82½\81I", "You resist the effects!"));
115     learn_spell(target_ptr, ep_ptr->monspell);
116   } else {
117     if (!check_multishadow(target_ptr)) {
118       msg_print(_("\82 \82È\82½\82Í\96½\82ª\94\96\82Ü\82Á\82Ä\82¢\82­\82æ\82¤\82É\8a´\82\82½\81I",
119                   "You feel your life fade away!"));
120       curse_equipment(target_ptr, 40, 20);
121     }
122
123     ep_ptr->get_damage = take_hit(target_ptr, DAMAGE_ATTACK, ep_ptr->dam,
124                                   ep_ptr->m_name, ep_ptr->monspell);
125
126     if (target_ptr->chp < 1)
127       target_ptr->chp = 1;
128   }
129 }
130
131 /*!
132  * @brief
133  * \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é
134  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
135  * @param em_ptr \83v\83\8c\81[\83\84\81[\8cø\89Ê\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
136  * @return \82È\82µ
137  */
138 void switch_effects_player(player_type *target_ptr,
139                            effect_player_type *ep_ptr) {
140   switch (ep_ptr->effect_type) {
141   case GF_ACID:
142     effect_player_elements(target_ptr, ep_ptr,
143                            _("\8e_\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by acid!"),
144                            acid_dam);
145     return;
146   case GF_FIRE:
147     effect_player_elements(target_ptr, ep_ptr,
148                            _("\89Î\89\8a\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by fire!"),
149                            fire_dam);
150     return;
151   case GF_COLD:
152     effect_player_elements(target_ptr, ep_ptr,
153                            _("\97â\8bC\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by cold!"),
154                            cold_dam);
155     return;
156   case GF_ELEC:
157     effect_player_elements(target_ptr, ep_ptr,
158                            _("\93d\8c\82\82Å\8dU\8c\82\82³\82ê\82½\81I", "You are hit by lightning!"),
159                            elec_dam);
160     return;
161   case GF_POIS:
162     effect_player_poison(target_ptr, ep_ptr);
163     return;
164   case GF_NUKE:
165     effect_player_nuke(target_ptr, ep_ptr);
166     return;
167   case GF_MISSILE:
168     effect_player_missile(target_ptr, ep_ptr);
169     return;
170   case GF_HOLY_FIRE:
171     effect_player_holy_fire(target_ptr, ep_ptr);
172     return;
173   case GF_HELL_FIRE:
174     effect_player_hell_fire(target_ptr, ep_ptr);
175     return;
176   case GF_ARROW:
177     effect_player_arrow(target_ptr, ep_ptr);
178     return;
179   case GF_PLASMA:
180     effect_player_plasma(target_ptr, ep_ptr);
181     return;
182   case GF_NETHER:
183     effect_player_nether(target_ptr, ep_ptr);
184     return;
185   case GF_WATER:
186     effect_player_water(target_ptr, ep_ptr);
187     return;
188   case GF_CHAOS:
189     effect_player_chaos(target_ptr, ep_ptr);
190     return;
191   case GF_SHARDS:
192     effect_player_shards(target_ptr, ep_ptr);
193     return;
194   case GF_SOUND:
195     effect_player_sound(target_ptr, ep_ptr);
196     return;
197   case GF_CONFUSION:
198     effect_player_confusion(target_ptr, ep_ptr);
199     return;
200   case GF_DISENCHANT:
201     effect_player_disenchant(target_ptr, ep_ptr);
202     return;
203   case GF_NEXUS:
204     effect_player_nexus(target_ptr, ep_ptr);
205     return;
206   case GF_FORCE:
207     effect_player_force(target_ptr, ep_ptr);
208     return;
209   case GF_ROCKET:
210     effect_player_rocket(target_ptr, ep_ptr);
211     return;
212   case GF_INERTIAL:
213     effect_player_inertial(target_ptr, ep_ptr);
214     return;
215   case GF_LITE:
216     effect_player_lite(target_ptr, ep_ptr);
217     return;
218   case GF_DARK:
219     effect_player_dark(target_ptr, ep_ptr);
220     return;
221   case GF_TIME:
222     effect_player_time(target_ptr, ep_ptr);
223     return;
224   case GF_GRAVITY:
225     effect_player_gravity(target_ptr, ep_ptr);
226     return;
227   case GF_DISINTEGRATE:
228     effect_player_disintegration(target_ptr, ep_ptr);
229     return;
230   case GF_OLD_HEAL:
231     effect_player_old_heal(target_ptr, ep_ptr);
232     return;
233   case GF_OLD_SPEED:
234     effect_player_old_speed(target_ptr, ep_ptr);
235     return;
236   case GF_OLD_SLOW:
237     effect_player_old_slow(target_ptr);
238     return;
239   case GF_OLD_SLEEP:
240     effect_player_old_sleep(target_ptr, ep_ptr);
241     return;
242   case GF_MANA:
243   case GF_SEEKER:
244   case GF_SUPER_RAY:
245     effect_player_mana(target_ptr, ep_ptr);
246     return;
247   case GF_PSY_SPEAR:
248     effect_player_psy_spear(target_ptr, ep_ptr);
249     return;
250   case GF_METEOR:
251     effect_player_meteor(target_ptr, ep_ptr);
252     return;
253   case GF_ICE:
254     effect_player_icee(target_ptr, ep_ptr);
255     return;
256   case GF_DEATH_RAY:
257     effect_player_death_ray(target_ptr, ep_ptr);
258     return;
259   case GF_DRAIN_MANA:
260     effect_player_drain_mana(target_ptr, ep_ptr);
261     return;
262   case GF_MIND_BLAST:
263     effect_player_mind_blast(target_ptr, ep_ptr);
264     return;
265   case GF_BRAIN_SMASH:
266     effect_player_brain_smash(target_ptr, ep_ptr);
267     return;
268   case GF_CAUSE_1:
269     effect_player_curse_1(target_ptr, ep_ptr);
270     return;
271   case GF_CAUSE_2:
272     effect_player_curse_2(target_ptr, ep_ptr);
273     return;
274   case GF_CAUSE_3:
275     effect_player_curse_3(target_ptr, ep_ptr);
276     return;
277   case GF_CAUSE_4:
278     effect_player_curse_4(target_ptr, ep_ptr);
279     return;
280   case GF_HAND_DOOM:
281     effect_player_hand_doom(target_ptr, ep_ptr);
282     return;
283   default: {
284     ep_ptr->dam = 0;
285     return;
286   }
287   }
288 }