1 #include "artifact/random-art-misc.h"
2 #include "artifact/random-art-bias-types.h"
3 #include "object-enchant/tr-types.h"
4 #include "object-hook/hook-armor.h"
5 #include "system/object-type-definition.h"
6 #include "util/bit-flags-calculator.h"
8 static bool invest_misc_ranger(object_type *o_ptr)
10 if (has_flag(o_ptr->art_flags, TR_SUST_CON))
13 add_flag(o_ptr->art_flags, TR_SUST_CON);
17 static bool invest_misc_strength(object_type *o_ptr)
19 if (has_flag(o_ptr->art_flags, TR_SUST_STR))
22 add_flag(o_ptr->art_flags, TR_SUST_STR);
26 static bool invest_misc_wisdom(object_type *o_ptr)
28 if (has_flag(o_ptr->art_flags, TR_SUST_WIS))
31 add_flag(o_ptr->art_flags, TR_SUST_WIS);
35 static bool invest_misc_intelligence(object_type *o_ptr)
37 if (has_flag(o_ptr->art_flags, TR_SUST_INT))
40 add_flag(o_ptr->art_flags, TR_SUST_INT);
44 static bool invest_misc_dexterity(object_type *o_ptr)
46 if (has_flag(o_ptr->art_flags, TR_SUST_DEX))
49 add_flag(o_ptr->art_flags, TR_SUST_DEX);
53 static bool invest_misc_constitution(object_type *o_ptr)
55 if (has_flag(o_ptr->art_flags, TR_SUST_CON))
58 add_flag(o_ptr->art_flags, TR_SUST_CON);
62 static bool invest_misc_charisma(object_type *o_ptr)
64 if (has_flag(o_ptr->art_flags, TR_SUST_CHR))
67 add_flag(o_ptr->art_flags, TR_SUST_CHR);
71 static bool invest_misc_chaos(object_type *o_ptr)
73 if (has_flag(o_ptr->art_flags, TR_TELEPORT))
76 add_flag(o_ptr->art_flags, TR_TELEPORT);
81 * @brief アーティファクトのバイアス値に基づいて特性を付与する
82 * @param o_ptr 対象のオブジェクト構造体への参照ポインタ
83 * @return 処理続行ならFALSE、打ち切るならTRUE
85 static bool switch_misc_bias(object_type *o_ptr)
87 switch (o_ptr->artifact_bias) {
89 return invest_misc_ranger(o_ptr);
91 return invest_misc_strength(o_ptr);
93 return invest_misc_intelligence(o_ptr);
95 return invest_misc_wisdom(o_ptr);
97 return invest_misc_dexterity(o_ptr);
99 return invest_misc_constitution(o_ptr);
101 return invest_misc_charisma(o_ptr);
103 return invest_misc_chaos(o_ptr);
105 if (!(has_flag(o_ptr->art_flags, TR_LITE_1)))
106 add_flag(o_ptr->art_flags, TR_LITE_1);
114 static void invest_misc_hit_dice(object_type *o_ptr)
116 add_flag(o_ptr->art_flags, TR_SHOW_MODS);
117 HIT_PROB bonus_h = 4 + (HIT_PROB)randint1(11);
118 HIT_POINT bonus_d = 4 + (HIT_POINT)randint1(11);
119 if ((o_ptr->tval != TV_SWORD) && (o_ptr->tval != TV_POLEARM) && (o_ptr->tval != TV_HAFTED) && (o_ptr->tval != TV_DIGGING) && (o_ptr->tval != TV_GLOVES)
120 && (o_ptr->tval != TV_RING)) {
125 o_ptr->to_h += bonus_h;
126 o_ptr->to_d += bonus_d;
129 static void invest_misc_string_esp(object_type *o_ptr)
131 switch (randint1(3)) {
133 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
134 if (!o_ptr->artifact_bias && one_in_(3))
135 o_ptr->artifact_bias = BIAS_LAW;
139 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
140 if (!o_ptr->artifact_bias && one_in_(3))
141 o_ptr->artifact_bias = BIAS_MAGE;
145 add_flag(o_ptr->art_flags, TR_TELEPATHY);
146 if (!o_ptr->artifact_bias && one_in_(9))
147 o_ptr->artifact_bias = BIAS_MAGE;
153 static void switch_investment_weak_esps(object_type *o_ptr, const int *idx, const int n)
157 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
158 if (!o_ptr->artifact_bias && one_in_(4))
159 o_ptr->artifact_bias = BIAS_RANGER;
163 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
164 if (!o_ptr->artifact_bias && one_in_(3))
165 o_ptr->artifact_bias = BIAS_PRIESTLY;
166 else if (!o_ptr->artifact_bias && one_in_(6))
167 o_ptr->artifact_bias = BIAS_NECROMANTIC;
171 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
174 add_flag(o_ptr->art_flags, TR_ESP_ORC);
177 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
180 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
183 add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
186 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
187 if (!o_ptr->artifact_bias && one_in_(6))
188 o_ptr->artifact_bias = BIAS_ROGUE;
192 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
193 if (!o_ptr->artifact_bias && one_in_(3))
194 o_ptr->artifact_bias = BIAS_LAW;
198 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
199 if (!o_ptr->artifact_bias && one_in_(3))
200 o_ptr->artifact_bias = BIAS_LAW;
206 static void invest_misc_weak_esps(object_type *o_ptr)
209 idx[0] = randint1(10);
210 idx[1] = randint1(9);
211 if (idx[1] >= idx[0])
214 idx[2] = randint1(8);
215 if (idx[2] >= idx[0])
218 if (idx[2] >= idx[1])
223 switch_investment_weak_esps(o_ptr, idx, n);
227 * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
228 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
229 * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
230 * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
231 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
232 * @param o_ptr 対象のオブジェクト構造体ポインタ
235 void random_misc(player_type *player_ptr, object_type *o_ptr)
237 if (switch_misc_bias(o_ptr))
240 switch (randint1(33)) {
242 add_flag(o_ptr->art_flags, TR_SUST_STR);
243 if (!o_ptr->artifact_bias)
244 o_ptr->artifact_bias = BIAS_STR;
248 add_flag(o_ptr->art_flags, TR_SUST_INT);
249 if (!o_ptr->artifact_bias)
250 o_ptr->artifact_bias = BIAS_INT;
254 add_flag(o_ptr->art_flags, TR_SUST_WIS);
255 if (!o_ptr->artifact_bias)
256 o_ptr->artifact_bias = BIAS_WIS;
260 add_flag(o_ptr->art_flags, TR_SUST_DEX);
261 if (!o_ptr->artifact_bias)
262 o_ptr->artifact_bias = BIAS_DEX;
266 add_flag(o_ptr->art_flags, TR_SUST_CON);
267 if (!o_ptr->artifact_bias)
268 o_ptr->artifact_bias = BIAS_CON;
272 add_flag(o_ptr->art_flags, TR_SUST_CHR);
273 if (!o_ptr->artifact_bias)
274 o_ptr->artifact_bias = BIAS_CHR;
280 add_flag(o_ptr->art_flags, TR_FREE_ACT);
283 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
284 if (!o_ptr->artifact_bias && one_in_(5))
285 o_ptr->artifact_bias = BIAS_PRIESTLY;
286 else if (!o_ptr->artifact_bias && one_in_(6))
287 o_ptr->artifact_bias = BIAS_NECROMANTIC;
292 add_flag(o_ptr->art_flags, TR_LITE_1);
296 add_flag(o_ptr->art_flags, TR_LEVITATION);
301 add_flag(o_ptr->art_flags, TR_SEE_INVIS);
305 add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
309 add_flag(o_ptr->art_flags, TR_REGEN);
312 add_flag(o_ptr->art_flags, TR_TELEPORT);
317 if (object_is_armour(player_ptr, o_ptr))
318 random_misc(player_ptr, o_ptr);
320 o_ptr->to_a = 4 + randint1(11);
326 invest_misc_hit_dice(o_ptr);
329 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
332 add_flag(o_ptr->art_flags, TR_NO_TELE);
335 add_flag(o_ptr->art_flags, TR_WARNING);
338 invest_misc_string_esp(o_ptr);
341 invest_misc_weak_esps(o_ptr);