OSDN Git Service

[Refactor] #40514 randrate() と rate_calc_type_mode 列挙体実装. / Implement randrate()...
[hengband/hengband.git] / src / player / player-status-resist.c
1 #include "player/player-status-resist.h"
2 #include "art-definition/art-sword-types.h"
3 #include "grid/grid.h"
4 #include "inventory/inventory-slot-types.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags2.h"
7 #include "monster-race/race-flags7.h"
8 #include "mutation/mutation-flag-types.h"
9 #include "object-enchant/object-ego.h"
10 #include "object-enchant/tr-types.h"
11 #include "object-enchant/trc-types.h"
12 #include "object-hook/hook-checker.h"
13 #include "object-hook/hook-weapon.h"
14 #include "object/object-flags.h"
15 #include "player/player-class.h"
16 #include "player/player-race-types.h"
17 #include "player/player-race.h"
18 #include "player/player-skill.h"
19 #include "player/player-status-flags.h"
20 #include "player/player-status.h"
21 #include "player/special-defense-types.h"
22 #include "realm/realm-hex-numbers.h"
23 #include "realm/realm-song-numbers.h"
24 #include "realm/realm-types.h"
25 #include "spell-realm/spells-hex.h"
26 #include "status/element-resistance.h"
27 #include "sv-definition/sv-weapon-types.h"
28 #include "system/floor-type-definition.h"
29 #include "system/monster-type-definition.h"
30 #include "system/object-type-definition.h"
31 #include "util/bit-flags-calculator.h"
32 #include "util/quarks.h"
33 #include "util/string-processor.h"
34
35 PERCENTAGE randrate(int dice, int fix, rate_calc_type_mode mode)
36 {
37     switch (mode) {    
38         case CALC_RAND:
39             return randint1(dice) * 100 + fix * 100;
40             break;
41         case CALC_AVERAGE:    
42             return (dice + 1) * 50 + fix * 100;
43             break;
44         case CALC_MIN:    
45             return (fix + 1) * 100;
46             break;
47         case CALC_MAX:
48             return (dice + fix) * 100;
49             break;
50         default:
51             return (fix + 1) * 100;
52             break;
53     }
54 }
55
56 PERCENTAGE calc_acid_damage_rate(player_type *creature_ptr)
57 {
58     PERCENTAGE per = 100;
59     int i;
60
61     BIT_FLAGS flgs = is_vuln_acid(creature_ptr);
62     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
63         if (flgs & (0x01 << i)) {
64             if (i == FLAG_CAUSE_MUTATION) {
65                 per *= 2;
66             } else {
67                 per += per / 3;
68             }
69         }
70     }
71
72     if (creature_ptr->resist_acid)
73         per = (per + 2) / 3;
74     if (is_oppose_acid(creature_ptr))
75         per = (per + 2) / 3;
76
77     return per;
78 }
79
80 PERCENTAGE calc_elec_damage_rate(player_type *creature_ptr)
81 {
82     PERCENTAGE per = 100;
83     int i;
84     BIT_FLAGS flgs = is_vuln_elec(creature_ptr);
85     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
86         if (flgs & (0x01 << i)) {
87             if (i == FLAG_CAUSE_MUTATION) {
88                 per *= 2;
89             } else {
90                 per += per / 3;
91             }
92         }
93     }
94
95     if (creature_ptr->resist_elec)
96         per = (per + 2) / 3;
97     if (is_oppose_elec(creature_ptr))
98         per = (per + 2) / 3;
99
100     return per;
101 }
102
103 PERCENTAGE calc_fire_damage_rate(player_type *creature_ptr)
104 {
105     PERCENTAGE per = 100;
106     int i;
107     BIT_FLAGS flgs = is_vuln_fire(creature_ptr);
108     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
109         if (flgs & (0x01 << i)) {
110             if (i == FLAG_CAUSE_MUTATION) {
111                 per *= 2;
112             } else {
113                 per += per / 3;
114             }
115         }
116     }
117
118     /* Resist the damage */
119     if (creature_ptr->resist_fire)
120         per = (per + 2) / 3;
121     if (is_oppose_fire(creature_ptr))
122         per = (per + 2) / 3;
123
124     return per;
125 }
126
127 PERCENTAGE calc_cold_damage_rate(player_type *creature_ptr)
128 {
129     PERCENTAGE per = 100;
130     int i;
131     BIT_FLAGS flgs = is_vuln_cold(creature_ptr);
132     for (i = 0; i < FLAG_CAUSE_MAX; i++) {
133         if (flgs & (0x01 << i)) {
134             if (i == FLAG_CAUSE_MUTATION) {
135                 per *= 2;
136             } else {
137                 per += per / 3;
138             }
139         }
140     }
141
142     if (creature_ptr->resist_cold)
143         per = (per + 2) / 3;
144     if (is_oppose_cold(creature_ptr))
145         per = (per + 2) / 3;
146
147     return per;
148 }
149
150 PERCENTAGE calc_vuln_lite_rate(player_type *creature_ptr)
151 {
152     PERCENTAGE per = 100;
153     if (is_specific_player_race(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE)) {
154         per *= 2;
155     } else if (is_specific_player_race(creature_ptr, RACE_S_FAIRY)) {
156         per = per * 4 / 3;
157     }
158
159     if (creature_ptr->wraith_form)
160         per *= 2;
161
162     return per;
163 }