OSDN Git Service

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