OSDN Git Service

[Refactor] #41053 Moved art-definition/*.h to artifact/
[hengband/hengband.git] / src / artifact / random-art-activation.c
1 #include "artifact/random-art-activation.h"
2 #include "artifact/random-art-effects.h"
3 #include "artifact/random-art-bias-types.h"
4 #include "object-enchant/object-boost.h"
5 #include "object-enchant/tr-types.h"
6 #include "system/object-type-definition.h"
7 #include "util/bit-flags-calculator.h"
8
9 static int invest_activation_elec(void)
10 {
11     if (!one_in_(3))
12         return ACT_BO_ELEC_1;
13
14     if (!one_in_(5))
15         return ACT_BA_ELEC_2;
16
17     return ACT_BA_ELEC_3;
18 }
19
20 static int invest_activation_fire(void)
21 {
22     if (!one_in_(3))
23         return ACT_BO_FIRE_1;
24
25     if (!one_in_(5))
26         return ACT_BA_FIRE_1;
27
28     return ACT_BA_FIRE_2;
29 }
30
31 static int invest_activation_cold(void)
32 {
33     if (!one_in_(3))
34         return ACT_BO_COLD_1;
35
36     if (!one_in_(3))
37         return ACT_BA_COLD_1;
38
39     if (!one_in_(3))
40         return ACT_BA_COLD_2;
41
42     return ACT_BA_COLD_3;
43 }
44
45 static int invest_activation_chaos(void) { return one_in_(6) ? ACT_SUMMON_DEMON : ACT_CALL_CHAOS; }
46
47 static int invest_activation_priest(void)
48 {
49     if (one_in_(13))
50         return ACT_CHARM_UNDEAD;
51
52     if (one_in_(12))
53         return ACT_BANISH_EVIL;
54
55     if (one_in_(11))
56         return ACT_DISP_EVIL;
57
58     if (one_in_(10))
59         return ACT_PROT_EVIL;
60
61     if (one_in_(9))
62         return ACT_CURE_1000;
63
64     if (one_in_(8))
65         return ACT_CURE_700;
66
67     if (one_in_(7))
68         return ACT_REST_ALL;
69
70     if (one_in_(6))
71         return ACT_REST_EXP;
72
73     return ACT_CURE_MW;
74 }
75
76 static int invest_activation_necromancy(void)
77 {
78     if (one_in_(66))
79         return ACT_WRAITH;
80
81     if (one_in_(13))
82         return ACT_DISP_GOOD;
83
84     if (one_in_(9))
85         return ACT_MASS_GENO;
86
87     if (one_in_(8))
88         return ACT_GENOCIDE;
89
90     if (one_in_(13))
91         return ACT_SUMMON_UNDEAD;
92
93     if (one_in_(9))
94         return ACT_DRAIN_2;
95
96     if (one_in_(6))
97         return ACT_CHARM_UNDEAD;
98
99     return ACT_DRAIN_1;
100 }
101
102 static int invest_activation_law(void)
103 {
104     if (one_in_(8))
105         return ACT_BANISH_EVIL;
106
107     if (one_in_(4))
108         return ACT_DISP_EVIL;
109
110     return ACT_PROT_EVIL;
111 }
112
113 static int invest_activation_rogue(void)
114 {
115     if (one_in_(50))
116         return ACT_SPEED;
117
118     if (one_in_(4))
119         return ACT_SLEEP;
120
121     if (one_in_(3))
122         return ACT_DETECT_ALL;
123
124     if (one_in_(8))
125         return ACT_ID_FULL;
126
127     return ACT_ID_PLAIN;
128 }
129
130 static int invest_activation_mage(void)
131 {
132     if (one_in_(20))
133         return ACT_SUMMON_ELEMENTAL;
134
135     if (one_in_(10))
136         return ACT_SUMMON_PHANTOM;
137
138     if (one_in_(5))
139         return ACT_RUNE_EXPLO;
140
141     return ACT_ESP;
142 }
143
144 static int invest_activation_warrior(void) { return one_in_(100) ? ACT_INVULN : ACT_BERSERK; }
145
146 static int invest_activation_ranger(void)
147 {
148     if (one_in_(20))
149         return ACT_CHARM_ANIMALS;
150
151     if (one_in_(7))
152         return ACT_SUMMON_ANIMAL;
153
154     if (one_in_(6))
155         return ACT_CHARM_ANIMAL;
156
157     if (one_in_(4))
158         return ACT_RESIST_ALL;
159
160     if (one_in_(3))
161         return ACT_SATIATE;
162
163     return ACT_CURE_POISON;
164 }
165
166 /*!
167  * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
168  * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
169  * @param o_ptr 対象のオブジェクト構造体ポインタ
170  * @return なし
171  */
172 void give_activation_power(object_type *o_ptr)
173 {
174     int type = 0;
175     int chance = 0;
176     switch (o_ptr->artifact_bias) {
177     case BIAS_ELEC:
178         type = invest_activation_elec();
179         chance = 101;
180         break;
181     case BIAS_POIS:
182         type = ACT_BA_POIS_1;
183         chance = 101;
184         break;
185     case BIAS_FIRE:
186         type = invest_activation_fire();
187         chance = 101;
188         break;
189     case BIAS_COLD:
190         type = invest_activation_cold();
191         chance = 101;
192         break;
193     case BIAS_CHAOS:
194         type = invest_activation_chaos();
195         chance = 50;
196         break;
197     case BIAS_PRIESTLY:
198         type = invest_activation_priest();
199         chance = 101;
200         break;
201     case BIAS_NECROMANTIC:
202         type = invest_activation_necromancy();
203         chance = 101;
204         break;
205     case BIAS_LAW:
206         type = invest_activation_law();
207         chance = 101;
208         break;
209     case BIAS_ROGUE:
210         type = invest_activation_rogue();
211         chance = 101;
212         break;
213     case BIAS_MAGE:
214         type = invest_activation_mage();
215         chance = 66;
216         break;
217     case BIAS_WARRIOR:
218         type = invest_activation_warrior();
219         chance = 80;
220         break;
221     case BIAS_RANGER:
222         type = invest_activation_ranger();
223         chance = 101;
224         break;
225     }
226
227     if (!type || (randint1(100) >= chance)) {
228         one_activation(o_ptr);
229         return;
230     }
231
232     o_ptr->xtra2 = (byte)type;
233     add_flag(o_ptr->art_flags, TR_ACTIVATE);
234     o_ptr->timeout = 0;
235 }