OSDN Git Service

Revert "Revert "Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband""
[hengband/hengband.git] / src / effect / effect-monster-evil.c
1 #include "effect/effect-monster-evil.h"
2 #include "effect/effect-monster-util.h"
3 #include "monster-race/monster-race-hook.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags-resistance.h"
6 #include "monster-race/race-flags1.h"
7 #include "monster-race/race-flags3.h"
8 #include "monster/monster-info.h"
9
10 static bool effect_monster_away_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
11 {
12         if ((em_ptr->r_ptr->flagsr & RFR_RES_TELE) == 0) return FALSE;
13
14         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
15         {
16                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
17                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
18                 return TRUE;
19         }
20
21         if (em_ptr->r_ptr->level > randint1(100))
22         {
23                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
24                 em_ptr->note = _("には耐性がある!", " resists!");
25                 return TRUE;
26         }
27
28         return FALSE;
29 }
30
31
32 process_result effect_monster_away_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
33 {
34         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
35         {
36                 em_ptr->skipped = TRUE;
37                 em_ptr->dam = 0;
38                 return PROCESS_CONTINUE;
39         }
40
41         bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
42         if (!resists_tele)
43         {
44                 if (em_ptr->seen) em_ptr->obvious = TRUE;
45                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
46                         em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
47
48                 em_ptr->do_dist = em_ptr->dam;
49         }
50
51         em_ptr->dam = 0;
52         return PROCESS_CONTINUE;
53 }
54
55
56 process_result effect_monster_away_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
57 {
58         if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
59         {
60                 em_ptr->skipped = TRUE;
61                 em_ptr->dam = 0;
62                 return PROCESS_CONTINUE;
63         }
64
65         bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
66         if (!resists_tele)
67         {
68                 if (em_ptr->seen) em_ptr->obvious = TRUE;
69                 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
70                         em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
71
72                 em_ptr->do_dist = em_ptr->dam;
73         }
74
75         em_ptr->dam = 0;
76         return PROCESS_CONTINUE;
77 }
78
79
80 process_result effect_monster_away_all(player_type *caster_ptr, effect_monster_type *em_ptr)
81 {
82         bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
83         if (!resists_tele)
84         {
85                 if (em_ptr->seen) em_ptr->obvious = TRUE;
86
87                 em_ptr->do_dist = em_ptr->dam;
88         }
89
90         em_ptr->dam = 0;
91         return PROCESS_CONTINUE;
92 }
93
94
95 process_result effect_monster_turn_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
96 {
97         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
98         {
99                 em_ptr->skipped = TRUE;
100                 em_ptr->dam = 0;
101                 return PROCESS_CONTINUE;
102         }
103
104         if (em_ptr->seen) em_ptr->obvious = TRUE;
105
106         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
107
108         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
109         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
110         {
111                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
112                 em_ptr->obvious = FALSE;
113                 em_ptr->do_fear = 0;
114         }
115
116         em_ptr->dam = 0;
117         return PROCESS_CONTINUE;
118 }
119
120
121 process_result effect_monster_turn_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
122 {
123         if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
124         {
125                 em_ptr->skipped = TRUE;
126                 em_ptr->dam = 0;
127                 return PROCESS_CONTINUE;
128         }
129
130         if (em_ptr->seen) em_ptr->obvious = TRUE;
131
132         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
133
134         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
135         if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
136         {
137                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
138                 em_ptr->obvious = FALSE;
139                 em_ptr->do_fear = 0;
140         }
141
142         em_ptr->dam = 0;
143         return PROCESS_CONTINUE;
144 }
145
146
147 process_result effect_monster_turn_all(effect_monster_type *em_ptr)
148 {
149         if (em_ptr->seen) em_ptr->obvious = TRUE;
150
151         em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
152         if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
153                 (em_ptr->r_ptr->flags3 & (RF3_NO_FEAR)) ||
154                 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
155         {
156                 em_ptr->note = _("には効果がなかった。", " is unaffected.");
157                 em_ptr->obvious = FALSE;
158                 em_ptr->do_fear = 0;
159         }
160
161         em_ptr->dam = 0;
162         return PROCESS_CONTINUE;
163 }
164
165
166 process_result effect_monster_disp_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
167 {
168         if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
169         {
170                 em_ptr->skipped = TRUE;
171                 em_ptr->dam = 0;
172                 return PROCESS_CONTINUE;
173         }
174
175         if (em_ptr->seen) em_ptr->obvious = TRUE;
176
177         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
178                 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
179
180         em_ptr->note = _("は身震いした。", " shudders.");
181         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
182         return PROCESS_CONTINUE;
183 }
184
185
186 process_result effect_monster_disp_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
187 {
188         if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
189         {
190                 em_ptr->skipped = TRUE;
191                 em_ptr->dam = 0;
192                 return PROCESS_CONTINUE;
193         }
194
195         if (em_ptr->seen) em_ptr->obvious = TRUE;
196
197         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
198
199         em_ptr->note = _("は身震いした。", " shudders.");
200         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
201         return PROCESS_CONTINUE;
202 }
203
204
205 process_result effect_monster_disp_good(player_type *caster_ptr, effect_monster_type *em_ptr)
206 {
207         if ((em_ptr->r_ptr->flags3 & (RF3_GOOD)) == 0)
208         {
209                 em_ptr->skipped = TRUE;
210                 em_ptr->dam = 0;
211                 return PROCESS_CONTINUE;
212         }
213
214         if (em_ptr->seen) em_ptr->obvious = TRUE;
215
216         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
217
218         em_ptr->note = _("は身震いした。", " shudders.");
219         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
220         return PROCESS_CONTINUE;
221 }
222
223
224 process_result effect_monster_disp_living(effect_monster_type *em_ptr)
225 {
226         if (!monster_living(em_ptr->m_ptr->r_idx))
227         {
228                 em_ptr->skipped = TRUE;
229                 em_ptr->dam = 0;
230                 return PROCESS_CONTINUE;
231         }
232
233         if (em_ptr->seen) em_ptr->obvious = TRUE;
234
235         em_ptr->note = _("は身震いした。", " shudders.");
236         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
237         return PROCESS_CONTINUE;
238 }
239
240
241 process_result effect_monster_disp_demon(player_type *caster_ptr, effect_monster_type *em_ptr)
242 {
243         if ((em_ptr->r_ptr->flags3 & (RF3_DEMON)) == 0)
244         {
245                 em_ptr->skipped = TRUE;
246                 em_ptr->dam = 0;
247                 return PROCESS_CONTINUE;
248         }
249
250         if (em_ptr->seen) em_ptr->obvious = TRUE;
251
252         if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
253
254         em_ptr->note = _("は身震いした。", " shudders.");
255         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
256         return PROCESS_CONTINUE;
257 }
258
259
260 process_result effect_monster_disp_all(effect_monster_type *em_ptr)
261 {
262         if (em_ptr->seen) em_ptr->obvious = TRUE;
263
264         em_ptr->note = _("は身震いした。", " shudders.");
265         em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
266         return PROCESS_CONTINUE;
267 }