2 * @file random-art-activation.cpp
3 * @brief ランダムアーティファクトの発動実装定義
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"
15 static int invest_activation_elec(void)
26 static int invest_activation_fire(void)
37 static int invest_activation_cold(void)
51 static int invest_activation_chaos(void) { return one_in_(6) ? ACT_SUMMON_DEMON : ACT_CALL_CHAOS; }
53 static int invest_activation_priest(void)
56 return ACT_CHARM_UNDEAD;
59 return ACT_BANISH_EVIL;
82 static int invest_activation_necromancy(void)
97 return ACT_SUMMON_UNDEAD;
103 return ACT_CHARM_UNDEAD;
108 static int invest_activation_law(void)
111 return ACT_BANISH_EVIL;
114 return ACT_DISP_EVIL;
116 return ACT_PROT_EVIL;
119 static int invest_activation_rogue(void)
128 return ACT_DETECT_ALL;
136 static int invest_activation_mage(void)
139 return ACT_SUMMON_ELEMENTAL;
142 return ACT_SUMMON_PHANTOM;
145 return ACT_RUNE_EXPLO;
150 static int invest_activation_warrior(void) { return one_in_(100) ? ACT_INVULN : ACT_BERSERK; }
152 static int invest_activation_ranger(void)
155 return ACT_CHARM_ANIMALS;
158 return ACT_SUMMON_ANIMAL;
161 return ACT_CHARM_ANIMAL;
164 return ACT_RESIST_ALL;
169 return ACT_CURE_POISON;
173 * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
174 * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
175 * @param o_ptr 対象のオブジェクト構造体ポインタ
177 void give_activation_power(object_type *o_ptr)
181 switch (o_ptr->artifact_bias) {
183 type = invest_activation_elec();
187 type = ACT_BA_POIS_1;
191 type = invest_activation_fire();
195 type = invest_activation_cold();
199 type = invest_activation_chaos();
203 type = invest_activation_priest();
206 case BIAS_NECROMANTIC:
207 type = invest_activation_necromancy();
211 type = invest_activation_law();
215 type = invest_activation_rogue();
219 type = invest_activation_mage();
223 type = invest_activation_warrior();
227 type = invest_activation_ranger();
232 if (!type || (randint1(100) >= chance)) {
233 one_activation(o_ptr);
237 o_ptr->xtra2 = (byte)type;
238 add_flag(o_ptr->art_flags, TR_ACTIVATE);