1 #include "artifact/random-art-slay.h"
2 #include "artifact/random-art-bias-types.h"
3 #include "object-enchant/tr-types.h"
4 #include "sv-definition/sv-weapon-types.h"
5 #include "system/object-type-definition.h"
6 #include "util/bit-flags-calculator.h"
8 static bool random_art_slay_bow(object_type *o_ptr)
10 if (o_ptr->tval != TV_BOW)
13 switch (randint1(6)) {
17 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
19 remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
21 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
22 o_ptr->artifact_bias = BIAS_RANGER;
26 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
28 remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
30 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
31 o_ptr->artifact_bias = BIAS_RANGER;
37 static bool random_art_slay_chaos(object_type *o_ptr)
39 if (has_flag(o_ptr->art_flags, TR_CHAOTIC))
42 add_flag(o_ptr->art_flags, TR_CHAOTIC);
46 static bool random_art_slay_vampiric(object_type *o_ptr)
48 if (has_flag(o_ptr->art_flags, TR_VAMPIRIC))
51 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
55 static bool random_art_slay_brand_acid(object_type *o_ptr)
57 if (has_flag(o_ptr->art_flags, TR_BRAND_ACID))
60 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
64 static bool random_art_slay_brand_elec(object_type *o_ptr)
66 if (has_flag(o_ptr->art_flags, TR_BRAND_ELEC))
69 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
73 static bool random_art_slay_brand_fire(object_type *o_ptr)
75 if (has_flag(o_ptr->art_flags, TR_BRAND_FIRE))
78 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
82 static bool random_art_slay_brand_cold(object_type *o_ptr)
84 if (has_flag(o_ptr->art_flags, TR_BRAND_COLD))
87 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
91 static bool random_art_slay_brand_pois(object_type *o_ptr)
93 if (has_flag(o_ptr->art_flags, TR_BRAND_POIS) || one_in_(2))
96 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
100 static bool random_art_slay_animal(object_type *o_ptr)
102 if (has_flag(o_ptr->art_flags, TR_SLAY_ANIMAL))
105 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
109 static bool random_art_slay_evil(object_type *o_ptr)
111 if (has_flag(o_ptr->art_flags, TR_SLAY_EVIL))
114 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
118 static bool random_art_slay_undead(object_type *o_ptr)
120 if (has_flag(o_ptr->art_flags, TR_SLAY_UNDEAD))
123 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
127 static bool random_art_slay_demon(object_type *o_ptr)
129 if (has_flag(o_ptr->art_flags, TR_SLAY_DEMON))
132 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
136 static bool switch_random_art_slay(object_type *o_ptr)
138 switch (o_ptr->artifact_bias) {
140 return random_art_slay_chaos(o_ptr);
142 if (((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)) && !has_flag(o_ptr->art_flags, TR_BLESSED))
143 add_flag(o_ptr->art_flags, TR_BLESSED);
146 case BIAS_NECROMANTIC:
147 return random_art_slay_vampiric(o_ptr) || random_art_slay_brand_pois(o_ptr);
149 return random_art_slay_animal(o_ptr);
151 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) || ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR)))
152 && !(has_flag(o_ptr->art_flags, TR_THROW))) {
153 add_flag(o_ptr->art_flags, TR_THROW);
156 return random_art_slay_brand_pois(o_ptr);
158 return random_art_slay_brand_pois(o_ptr);
160 return random_art_slay_brand_acid(o_ptr);
162 return random_art_slay_brand_elec(o_ptr);
164 return random_art_slay_brand_fire(o_ptr);
166 return random_art_slay_brand_cold(o_ptr);
168 return random_art_slay_evil(o_ptr) || random_art_slay_undead(o_ptr) || random_art_slay_demon(o_ptr);
175 * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
176 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
177 * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
178 * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
179 * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
180 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
181 * @param o_ptr 対象のオブジェクト構造体ポインタ
184 void random_slay(object_type *o_ptr)
186 if (random_art_slay_bow(o_ptr) || switch_random_art_slay(o_ptr))
189 switch (randint1(36)) {
193 add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
195 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
201 add_flag(o_ptr->art_flags, TR_KILL_EVIL);
203 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
205 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(2)) {
206 o_ptr->artifact_bias = BIAS_LAW;
210 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
211 o_ptr->artifact_bias = BIAS_PRIESTLY;
217 add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
219 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
221 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
222 o_ptr->artifact_bias = BIAS_PRIESTLY;
228 add_flag(o_ptr->art_flags, TR_KILL_DEMON);
230 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
232 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
233 o_ptr->artifact_bias = BIAS_PRIESTLY;
239 add_flag(o_ptr->art_flags, TR_KILL_ORC);
241 add_flag(o_ptr->art_flags, TR_SLAY_ORC);
247 add_flag(o_ptr->art_flags, TR_KILL_TROLL);
249 add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
255 add_flag(o_ptr->art_flags, TR_KILL_GIANT);
257 add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
262 add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
265 add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
269 if (o_ptr->tval != TV_SWORD) {
274 add_flag(o_ptr->art_flags, TR_VORPAL);
275 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
276 o_ptr->artifact_bias = BIAS_WARRIOR;
280 add_flag(o_ptr->art_flags, TR_IMPACT);
284 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
285 if (o_ptr->artifact_bias == BIAS_NONE)
286 o_ptr->artifact_bias = BIAS_FIRE;
291 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
292 if (o_ptr->artifact_bias == BIAS_NONE)
293 o_ptr->artifact_bias = BIAS_COLD;
298 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
299 if (o_ptr->artifact_bias == BIAS_NONE)
300 o_ptr->artifact_bias = BIAS_ELEC;
305 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
306 if (!o_ptr->artifact_bias)
307 o_ptr->artifact_bias = BIAS_ACID;
312 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
313 if ((o_ptr->artifact_bias == BIAS_NONE) && !one_in_(3)) {
314 o_ptr->artifact_bias = BIAS_POIS;
318 if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(6)) {
319 o_ptr->artifact_bias = BIAS_NECROMANTIC;
323 if (o_ptr->artifact_bias == BIAS_NONE)
324 o_ptr->artifact_bias = BIAS_ROGUE;
328 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
329 if (o_ptr->artifact_bias == BIAS_NONE)
330 o_ptr->artifact_bias = BIAS_NECROMANTIC;
334 add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
335 if (o_ptr->artifact_bias == BIAS_NONE)
336 o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
342 add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
344 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
348 add_flag(o_ptr->art_flags, TR_CHAOTIC);
349 if (o_ptr->artifact_bias == BIAS_NONE)
350 o_ptr->artifact_bias = BIAS_CHAOS;