OSDN Git Service

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