OSDN Git Service

Merge remote-tracking branch 'remotes/OSX/For2.2.2-Refactoring-implicit-prototypes...
[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 /*!
37  * @brief 耐性倍率計算の用途に応じた分岐処理
38  */
39 PERCENTAGE randrate(int dice, int fix, rate_calc_type_mode mode)
40 {
41     switch (mode) {
42     case CALC_RAND:
43         return randint1(dice) * 100 + fix * 100;
44         break;
45     case CALC_AVERAGE:
46         return (dice + 1) * 50 + fix * 100;
47         break;
48     case CALC_MIN:
49         return (fix + 1) * 100;
50         break;
51     case CALC_MAX:
52         return (dice + fix) * 100;
53         break;
54     default:
55         return (fix + 1) * 100;
56         break;
57     }
58 }
59
60 /*!
61  * @brief 酸属性攻撃に対するダメージ倍率計算
62  */
63 PERCENTAGE calc_acid_damage_rate(player_type *creature_ptr)
64 {
65     PERCENTAGE per = 100;
66     int i;
67
68     if (is_immune_acid(creature_ptr)) {
69         return 0;
70     }
71
72     BIT_FLAGS flgs = is_vuln_acid(creature_ptr);
73     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
74         if (flgs & (0x01 << i)) {
75             if (i == FLAG_CAUSE_MUTATION) {
76                 per *= 2;
77             } else {
78                 per += per / 3;
79             }
80         }
81     }
82
83     if (creature_ptr->resist_acid)
84         per = (per + 2) / 3;
85     if (is_oppose_acid(creature_ptr))
86         per = (per + 2) / 3;
87
88     return per;
89 }
90
91 /*!
92  * @brief 電撃属性攻撃に対するダメージ倍率計算
93  */
94 PERCENTAGE calc_elec_damage_rate(player_type *creature_ptr)
95 {
96     PERCENTAGE per = 100;
97     int i;
98
99     if (is_immune_elec(creature_ptr)) {
100         return 0;
101     }
102
103     BIT_FLAGS flgs = is_vuln_elec(creature_ptr);
104     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
105         if (flgs & (0x01 << i)) {
106             if (i == FLAG_CAUSE_MUTATION) {
107                 per *= 2;
108             } else {
109                 per += per / 3;
110             }
111         }
112     }
113
114     if (creature_ptr->resist_elec)
115         per = (per + 2) / 3;
116     if (is_oppose_elec(creature_ptr))
117         per = (per + 2) / 3;
118
119     return per;
120 }
121
122 /*!
123  * @brief 火炎属性攻撃に対するダメージ倍率計算
124  */
125 PERCENTAGE calc_fire_damage_rate(player_type *creature_ptr)
126 {
127     PERCENTAGE per = 100;
128     int i;
129     BIT_FLAGS flgs = is_vuln_fire(creature_ptr);
130     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
131         if (flgs & (0x01 << i)) {
132             if (i == FLAG_CAUSE_MUTATION) {
133                 per *= 2;
134             } else {
135                 per += per / 3;
136             }
137         }
138     }
139
140     /* Resist the damage */
141     if (creature_ptr->resist_fire)
142         per = (per + 2) / 3;
143     if (is_oppose_fire(creature_ptr))
144         per = (per + 2) / 3;
145
146     return per;
147 }
148
149 /*!
150  * @brief 冷気属性攻撃に対するダメージ倍率計算
151  */
152 PERCENTAGE calc_cold_damage_rate(player_type *creature_ptr)
153 {
154     PERCENTAGE per = 100;
155     int i;
156     BIT_FLAGS flgs = is_vuln_cold(creature_ptr);
157     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
158         if (flgs & (0x01 << i)) {
159             if (i == FLAG_CAUSE_MUTATION) {
160                 per *= 2;
161             } else {
162                 per += per / 3;
163             }
164         }
165     }
166
167     if (creature_ptr->resist_cold)
168         per = (per + 2) / 3;
169     if (is_oppose_cold(creature_ptr))
170         per = (per + 2) / 3;
171
172     return per;
173 }
174
175 /*!
176  * @brief 毒属性攻撃に対するダメージ倍率計算
177  */
178 PERCENTAGE calc_pois_damage_rate(player_type *creature_ptr)
179 {
180     PERCENTAGE per = 100;
181     if (creature_ptr->resist_pois)
182         per = (per + 2) / 3;
183     if (is_oppose_pois(creature_ptr))
184         per = (per + 2) / 3;
185
186     return per;
187 }
188
189 /*!
190  * @brief 放射性廃棄物攻撃に対するダメージ倍率計算
191  */
192 PERCENTAGE calc_nuke_damage_rate(player_type *creature_ptr)
193 {
194
195     PERCENTAGE per = 100;
196     if (creature_ptr->resist_pois)
197         per = (2 * per + 2) / 5;
198     if (is_oppose_pois(creature_ptr))
199         per = (2 * per + 2) / 5;
200
201     return per;
202 }
203
204 /*!
205  * @brief 死の光線に対するダメージ倍率計算
206  */
207 PERCENTAGE calc_deathray_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
208 {
209     (mode); // unused
210     if (creature_ptr->mimic_form) {
211         if (mimic_info[creature_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) {
212             return 0;
213         }
214     }
215
216     switch (creature_ptr->prace) {
217     case RACE_GOLEM:
218     case RACE_SKELETON:
219     case RACE_ZOMBIE:
220     case RACE_VAMPIRE:
221     case RACE_BALROG:
222     case RACE_SPECTRE:
223         return 0;
224         break;
225     }
226
227     return 100;
228 }
229
230 /*!
231  * @brief 閃光属性攻撃に対するダメージ倍率計算
232  */
233 PERCENTAGE calc_lite_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
234 {
235     PERCENTAGE per = 100;
236     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
237         per *= 2;
238     } else if (is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
239         per = per * 4 / 3;
240     }
241
242     if (creature_ptr->resist_lite) {
243         per *= 400;
244         per /= randrate(4, 7, mode);
245     }
246
247     if (creature_ptr->wraith_form)
248         per *= 2;
249
250     return per;
251 }
252
253 /*!
254  * @brief 暗黒属性攻撃に対するダメージ倍率計算
255  */
256 PERCENTAGE calc_dark_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
257 {
258     PERCENTAGE per = 100;
259
260     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE) || creature_ptr->wraith_form) {
261         return 0;
262     }
263
264     if (creature_ptr->resist_dark) {
265         per *= 400;
266         per /= randrate(4, 7, mode);
267     }
268
269     return per;
270 }
271
272 /*!
273  * @brief 破片属性攻撃に対するダメージ倍率計算
274  */
275 PERCENTAGE calc_shards_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
276 {
277     PERCENTAGE per = 100;
278
279     if (creature_ptr->resist_shard) {
280         per *= 600;
281         per /= randrate(4, 7, mode);
282     }
283
284     return per;
285 }
286
287 /*!
288  * @brief 轟音属性攻撃に対するダメージ倍率計算
289  */
290 PERCENTAGE calc_sound_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
291 {
292     PERCENTAGE per = 100;
293
294     if (creature_ptr->resist_sound) {
295         per *= 500;
296         per /= randrate(4, 7, mode);
297     }
298
299     return per;
300 }
301
302 /*!
303  * @brief 混乱属性攻撃に対するダメージ倍率計算
304  */
305 PERCENTAGE calc_conf_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
306 {
307     PERCENTAGE per = 100;
308
309     if (creature_ptr->resist_conf) {
310         per *= 500;
311         per /= randrate(4, 7, mode);
312     }
313
314     return per;
315 }
316
317 /*!
318  * @brief 混沌属性攻撃に対するダメージ倍率計算
319  */
320 PERCENTAGE calc_chaos_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
321 {
322     PERCENTAGE per = 100;
323
324     if (creature_ptr->resist_chaos) {
325         per *= 600;
326         per /= randrate(4, 7, mode);
327     }
328
329     return per;
330 }
331
332 /*!
333  * @brief 劣化属性攻撃に対するダメージ倍率計算
334  */
335 PERCENTAGE calc_disenchant_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
336 {
337     PERCENTAGE per = 100;
338
339     if (creature_ptr->resist_disen) {
340         per *= 600;
341         per /= randrate(4, 7, mode);
342     }
343
344     return per;
345 }
346
347 /*!
348  * @brief 因果混乱属性攻撃に対するダメージ倍率計算
349  */
350 PERCENTAGE calc_nexus_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
351 {
352     PERCENTAGE per = 100;
353
354     if (creature_ptr->resist_disen) {
355         per *= 600;
356         per /= randrate(4, 7, mode);
357     }
358
359     return per;
360 }
361
362 /*!
363  * @brief ロケット属性攻撃に対するダメージ倍率計算
364  */
365 PERCENTAGE calc_rocket_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
366 {
367     (mode); // unused
368     PERCENTAGE per = 100;
369
370     if (creature_ptr->resist_shard) {
371         per /= 2;
372     }
373
374     return per;
375 }
376
377 /*!
378  * @brief 地獄属性攻撃に対するダメージ倍率計算
379  */
380 PERCENTAGE calc_nether_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
381 {
382     PERCENTAGE per = 100;
383
384     if (creature_ptr->resist_neth) {
385         if (!is_specific_player_race(creature_ptr, RACE_SPECTRE))
386             per *= 6;
387         per *= 100;
388         per /= randrate(4, 7, mode);
389     }
390
391     return per;
392 }
393
394
395 /*!
396  * @brief 時間逆転攻撃に対するダメージ倍率計算
397  */
398 PERCENTAGE calc_time_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
399 {
400     (mode); // unused
401     PERCENTAGE per = 100;
402
403     if (creature_ptr->resist_time) {
404         per *= 400;
405         per /= randrate(4, 7, mode);
406     }
407
408     return per;
409 }
410
411 /*!
412  * @brief 聖なる火炎攻撃に対するダメージ倍率計算
413  */
414 PERCENTAGE calc_holy_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
415 {
416     (mode); // unused
417     PERCENTAGE per = 100;
418     if (creature_ptr->align > 10)
419         per /= 2;
420     else if (creature_ptr->align < -10)
421         per *= 2;
422     return per;
423 }
424
425 /*!
426  * @brief 地獄の火炎攻撃に対するダメージ倍率計算
427  */
428 PERCENTAGE calc_hell_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
429 {
430     (mode); // unused
431     PERCENTAGE per = 100;
432     if (creature_ptr->align > 10)
433         per *= 2;
434     return per;
435 }
436
437 /*!
438  * @brief 重力攻撃に対するダメージ倍率計算
439  */
440 PERCENTAGE calc_gravity_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
441 {
442     (mode); // unused
443     PERCENTAGE per = 100;
444     if (creature_ptr->levitation) {
445         per = (per * 2) / 3;
446     }
447     return per;
448 }