OSDN Git Service

[Fix] #40514 calc_nuke_damage_rate() のリファクタリングミス修正. / Fixed refactoring mistake in...
[hengband/hengband.git] / src / player / player-status-resist.c
1 #include "player/player-status-resist.h"
2 #include "player/mimic-info-table.h"
3 #include "art-definition/art-sword-types.h"
4 #include "grid/grid.h"
5 #include "inventory/inventory-slot-types.h"
6 #include "monster-race/monster-race.h"
7 #include "monster-race/race-flags2.h"
8 #include "monster-race/race-flags7.h"
9 #include "mutation/mutation-flag-types.h"
10 #include "object-enchant/object-ego.h"
11 #include "object-enchant/tr-types.h"
12 #include "object-enchant/trc-types.h"
13 #include "object-hook/hook-checker.h"
14 #include "object-hook/hook-weapon.h"
15 #include "object/object-flags.h"
16 #include "player/player-class.h"
17 #include "player/player-race-types.h"
18 #include "player/player-race.h"
19 #include "player/player-skill.h"
20 #include "player/player-status-flags.h"
21 #include "player/player-status.h"
22 #include "player/special-defense-types.h"
23 #include "realm/realm-hex-numbers.h"
24 #include "realm/realm-song-numbers.h"
25 #include "realm/realm-types.h"
26 #include "spell-realm/spells-hex.h"
27 #include "status/element-resistance.h"
28 #include "sv-definition/sv-weapon-types.h"
29 #include "system/floor-type-definition.h"
30 #include "system/monster-type-definition.h"
31 #include "system/object-type-definition.h"
32 #include "util/bit-flags-calculator.h"
33 #include "util/quarks.h"
34 #include "util/string-processor.h"
35
36 PERCENTAGE randrate(int dice, int fix, rate_calc_type_mode mode)
37 {
38     switch (mode) {
39     case CALC_RAND:
40         return randint1(dice) * 100 + fix * 100;
41         break;
42     case CALC_AVERAGE:
43         return (dice + 1) * 50 + fix * 100;
44         break;
45     case CALC_MIN:
46         return (fix + 1) * 100;
47         break;
48     case CALC_MAX:
49         return (dice + fix) * 100;
50         break;
51     default:
52         return (fix + 1) * 100;
53         break;
54     }
55 }
56
57 PERCENTAGE calc_acid_damage_rate(player_type *creature_ptr)
58 {
59     PERCENTAGE per = 100;
60     int i;
61
62     if (is_immune_acid(creature_ptr)) {
63         return 0;
64     }
65
66     BIT_FLAGS flgs = is_vuln_acid(creature_ptr);
67     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
68         if (flgs & (0x01 << i)) {
69             if (i == FLAG_CAUSE_MUTATION) {
70                 per *= 2;
71             } else {
72                 per += per / 3;
73             }
74         }
75     }
76
77     if (creature_ptr->resist_acid)
78         per = (per + 2) / 3;
79     if (is_oppose_acid(creature_ptr))
80         per = (per + 2) / 3;
81
82     return per;
83 }
84
85 PERCENTAGE calc_elec_damage_rate(player_type *creature_ptr)
86 {
87     PERCENTAGE per = 100;
88     int i;
89
90     if (is_immune_elec(creature_ptr)) {
91         return 0;
92     }
93
94     BIT_FLAGS flgs = is_vuln_elec(creature_ptr);
95     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
96         if (flgs & (0x01 << i)) {
97             if (i == FLAG_CAUSE_MUTATION) {
98                 per *= 2;
99             } else {
100                 per += per / 3;
101             }
102         }
103     }
104
105     if (creature_ptr->resist_elec)
106         per = (per + 2) / 3;
107     if (is_oppose_elec(creature_ptr))
108         per = (per + 2) / 3;
109
110     return per;
111 }
112
113 PERCENTAGE calc_fire_damage_rate(player_type *creature_ptr)
114 {
115     PERCENTAGE per = 100;
116     int i;
117     BIT_FLAGS flgs = is_vuln_fire(creature_ptr);
118     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
119         if (flgs & (0x01 << i)) {
120             if (i == FLAG_CAUSE_MUTATION) {
121                 per *= 2;
122             } else {
123                 per += per / 3;
124             }
125         }
126     }
127
128     /* Resist the damage */
129     if (creature_ptr->resist_fire)
130         per = (per + 2) / 3;
131     if (is_oppose_fire(creature_ptr))
132         per = (per + 2) / 3;
133
134     return per;
135 }
136
137 PERCENTAGE calc_cold_damage_rate(player_type *creature_ptr)
138 {
139     PERCENTAGE per = 100;
140     int i;
141     BIT_FLAGS flgs = is_vuln_cold(creature_ptr);
142     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
143         if (flgs & (0x01 << i)) {
144             if (i == FLAG_CAUSE_MUTATION) {
145                 per *= 2;
146             } else {
147                 per += per / 3;
148             }
149         }
150     }
151
152     if (creature_ptr->resist_cold)
153         per = (per + 2) / 3;
154     if (is_oppose_cold(creature_ptr))
155         per = (per + 2) / 3;
156
157     return per;
158 }
159
160 PERCENTAGE calc_pois_damage_rate(player_type *creature_ptr)
161 {
162     PERCENTAGE per = 100;
163     if (creature_ptr->resist_pois)
164         per = (per + 2) / 3;
165     if (is_oppose_pois(creature_ptr))
166         per = (per + 2) / 3;
167
168     return per;
169 }
170
171 PERCENTAGE calc_nuke_damage_rate(player_type *creature_ptr)
172 {
173
174     PERCENTAGE per = 100;
175     if (creature_ptr->resist_pois)
176         per = (2 * per + 2) / 5;
177     if (is_oppose_pois(creature_ptr))
178         per = (2 * per + 2) / 5;
179
180     return per;
181 }
182
183 PERCENTAGE calc_deathray_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
184 {
185     (mode); // unused
186     if (creature_ptr->mimic_form) {
187         if (mimic_info[creature_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) {
188             return 0;
189         }
190     }
191
192     switch (creature_ptr->prace) {
193     case RACE_GOLEM:
194     case RACE_SKELETON:
195     case RACE_ZOMBIE:
196     case RACE_VAMPIRE:
197     case RACE_BALROG:
198     case RACE_SPECTRE:
199         return 0;
200         break;
201     }
202
203     return 100;
204 }
205
206 PERCENTAGE calc_lite_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
207 {
208     PERCENTAGE per = 100;
209     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
210         per *= 2;
211     } else if (is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
212         per = per * 4 / 3;
213     }
214
215     if (creature_ptr->resist_lite) {
216         per *= 400;
217         per /= randrate(4, 7, mode);
218     }
219
220     if (creature_ptr->wraith_form)
221         per *= 2;
222
223     return per;
224 }
225
226 PERCENTAGE calc_dark_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
227 {
228     PERCENTAGE per = 100;
229
230     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE) || creature_ptr->wraith_form) {
231         return 0;
232     }
233
234     if (creature_ptr->resist_dark) {
235         per *= 400;
236         per /= randrate(4, 7, mode);
237     }
238
239     return per;
240 }
241
242 PERCENTAGE calc_shards_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
243 {
244     PERCENTAGE per = 100;
245
246     if (creature_ptr->resist_shard) {
247         per *= 600;
248         per /= randrate(4, 7, mode);
249     }
250
251     return per;
252 }
253
254 PERCENTAGE calc_sound_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
255 {
256     PERCENTAGE per = 100;
257
258     if (creature_ptr->resist_sound) {
259         per *= 500;
260         per /= randrate(4, 7, mode);
261     }
262
263     return per;
264 }
265
266 PERCENTAGE calc_conf_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
267 {
268     PERCENTAGE per = 100;
269
270     if (creature_ptr->resist_conf) {
271         per *= 500;
272         per /= randrate(4, 7, mode);
273     }
274
275     return per;
276 }
277
278 PERCENTAGE calc_chaos_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
279 {
280     PERCENTAGE per = 100;
281
282     if (creature_ptr->resist_chaos) {
283         per *= 600;
284         per /= randrate(4, 7, mode);
285     }
286
287     return per;
288 }
289
290 PERCENTAGE calc_disenchant_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
291 {
292     PERCENTAGE per = 100;
293
294     if (creature_ptr->resist_disen) {
295         per *= 600;
296         per /= randrate(4, 7, mode);
297     }
298
299     return per;
300 }
301
302 PERCENTAGE calc_nexus_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
303 {
304     PERCENTAGE per = 100;
305
306     if (creature_ptr->resist_disen) {
307         per *= 600;
308         per /= randrate(4, 7, mode);
309     }
310
311     return per;
312 }
313
314 PERCENTAGE calc_rocket_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
315 {
316     (mode); // unused
317     PERCENTAGE per = 100;
318
319     if (creature_ptr->resist_shard) {
320         per /= 2;
321     }
322
323     return per;
324 }
325
326 PERCENTAGE calc_nether_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
327 {
328     PERCENTAGE per = 100;
329
330     if (creature_ptr->resist_neth) {
331         if (!is_specific_player_race(creature_ptr, RACE_SPECTRE))
332             per *= 6;
333         per *= 100;
334         per /= randrate(4, 7, mode);
335     }
336
337     return per;
338 }
339
340 PERCENTAGE calc_time_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
341 {
342     (mode); // unused
343     PERCENTAGE per = 100;
344
345     if (creature_ptr->resist_time) {
346         per *= 400;
347         per /= randrate(4, 7, mode);
348     }
349
350     return per;
351 }
352
353 PERCENTAGE calc_holy_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
354 {
355     (mode); // unused
356     PERCENTAGE per = 100;
357     if (creature_ptr->align > 10)
358         per /= 2;
359     else if (creature_ptr->align < -10)
360         per *= 2;
361     return per;
362 }
363
364 PERCENTAGE calc_hell_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
365 {
366     (mode); // unused
367     PERCENTAGE per = 100;
368     if (creature_ptr->align > 10)
369         per *= 2;
370     return per;
371 }
372
373 PERCENTAGE calc_gravity_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
374 {
375     (mode); // unused
376     PERCENTAGE per = 100;
377     if (creature_ptr->levitation) {
378         per = (per * 2) / 3;
379     }
380     return per;
381 }