3 * @brief アーティファクトの生成と管理 / Artifact code
6 * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research, and\n
8 * not for profit purposes provided that this copyright and statement are\n
9 * included in all such copies.\n
10 * 2013 Deskull rearranged comment for Doxygen.
16 #include "cmd-activate.h"
17 #include "object-curse.h"
20 static bool has_extreme_damage_rate(object_type *o_ptr);
21 static bool weakening_artifact(object_type *o_ptr);
25 * @brief ランダムアーティファクトのバイアス名称テーブル
27 const concptr artifact_bias_name[MAX_BIAS] =
51 const concptr artifact_bias_name[MAX_BIAS] =
77 * @brief 対象のオブジェクトにランダムな上位耐性を一つ付加する。/ Choose one random high resistance
78 * @details 重複の抑止はない。候補は毒、閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、劣化、恐怖のいずれか。
79 * @param o_ptr 対象のオブジェクト構造体ポインタ
82 void one_high_resistance(object_type *o_ptr)
86 case 0: add_flag(o_ptr->art_flags, TR_RES_POIS); break;
87 case 1: add_flag(o_ptr->art_flags, TR_RES_LITE); break;
88 case 2: add_flag(o_ptr->art_flags, TR_RES_DARK); break;
89 case 3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
90 case 4: add_flag(o_ptr->art_flags, TR_RES_BLIND); break;
91 case 5: add_flag(o_ptr->art_flags, TR_RES_CONF); break;
92 case 6: add_flag(o_ptr->art_flags, TR_RES_SOUND); break;
93 case 7: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
94 case 8: add_flag(o_ptr->art_flags, TR_RES_NEXUS); break;
95 case 9: add_flag(o_ptr->art_flags, TR_RES_CHAOS); break;
96 case 10: add_flag(o_ptr->art_flags, TR_RES_DISEN); break;
97 case 11: add_flag(o_ptr->art_flags, TR_RES_FEAR); break;
102 * @brief 対象のオブジェクトに王者の指輪向けの上位耐性を一つ付加する。/ Choose one random high resistance
103 * @details 候補は閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、恐怖であり
104 * 王者の指輪にあらかじめついている耐性をone_high_resistance()から除外したものである。
105 * ランダム付加そのものに重複の抑止はない。
106 * @param o_ptr 対象のオブジェクト構造体ポインタ
109 void one_lordly_high_resistance(object_type *o_ptr)
111 switch (randint0(10))
113 case 0: add_flag(o_ptr->art_flags, TR_RES_LITE); break;
114 case 1: add_flag(o_ptr->art_flags, TR_RES_DARK); break;
115 case 2: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
116 case 3: add_flag(o_ptr->art_flags, TR_RES_BLIND); break;
117 case 4: add_flag(o_ptr->art_flags, TR_RES_CONF); break;
118 case 5: add_flag(o_ptr->art_flags, TR_RES_SOUND); break;
119 case 6: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
120 case 7: add_flag(o_ptr->art_flags, TR_RES_NEXUS); break;
121 case 8: add_flag(o_ptr->art_flags, TR_RES_CHAOS); break;
122 case 9: add_flag(o_ptr->art_flags, TR_RES_FEAR); break;
127 * @brief 対象のオブジェクトに元素耐性を一つ付加する。/ Choose one random element resistance
128 * @details 候補は火炎、冷気、電撃、酸のいずれかであり、重複の抑止はない。
129 * @param o_ptr 対象のオブジェクト構造体ポインタ
132 void one_ele_resistance(object_type *o_ptr)
136 case 0: add_flag(o_ptr->art_flags, TR_RES_ACID); break;
137 case 1: add_flag(o_ptr->art_flags, TR_RES_ELEC); break;
138 case 2: add_flag(o_ptr->art_flags, TR_RES_COLD); break;
139 case 3: add_flag(o_ptr->art_flags, TR_RES_FIRE); break;
144 * @brief 対象のオブジェクトにドラゴン装備向け元素耐性を一つ付加する。/ Choose one random element or poison resistance
145 * @details 候補は1/7の確率で毒、6/7の確率で火炎、冷気、電撃、酸のいずれか(one_ele_resistance()のコール)であり、重複の抑止はない。
146 * @param o_ptr 対象のオブジェクト構造体ポインタ
149 void one_dragon_ele_resistance(object_type *o_ptr)
153 add_flag(o_ptr->art_flags, TR_RES_POIS);
157 one_ele_resistance(o_ptr);
162 * @brief 対象のオブジェクトに弱いESPを一つ付加する。/ Choose one lower rank esp
163 * @details 候補は動物、アンデッド、悪魔、オーク、トロル、巨人、
164 * ドラゴン、人間、善良、ユニークESPのいずれかであり、重複の抑止はない。
165 * @param o_ptr 対象のオブジェクト構造体ポインタ
168 void one_low_esp(object_type *o_ptr)
170 switch (randint1(10))
172 case 1: add_flag(o_ptr->art_flags, TR_ESP_ANIMAL); break;
173 case 2: add_flag(o_ptr->art_flags, TR_ESP_UNDEAD); break;
174 case 3: add_flag(o_ptr->art_flags, TR_ESP_DEMON); break;
175 case 4: add_flag(o_ptr->art_flags, TR_ESP_ORC); break;
176 case 5: add_flag(o_ptr->art_flags, TR_ESP_TROLL); break;
177 case 6: add_flag(o_ptr->art_flags, TR_ESP_GIANT); break;
178 case 7: add_flag(o_ptr->art_flags, TR_ESP_DRAGON); break;
179 case 8: add_flag(o_ptr->art_flags, TR_ESP_HUMAN); break;
180 case 9: add_flag(o_ptr->art_flags, TR_ESP_GOOD); break;
181 case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE); break;
187 * @brief 対象のオブジェクトに耐性を一つ付加する。/ Choose one random resistance
188 * @details 1/3で元素耐性(one_ele_resistance())、2/3で上位耐性(one_high_resistance)
190 * @param o_ptr 対象のオブジェクト構造体ポインタ
193 void one_resistance(object_type *o_ptr)
197 one_ele_resistance(o_ptr);
201 one_high_resistance(o_ptr);
207 * @brief 対象のオブジェクトに能力を一つ付加する。/ Choose one random ability
208 * @details 候補は浮遊、永久光源+1、透明視、警告、遅消化、急回復、麻痺知らず、経験値維持のいずれか。
210 * @param o_ptr 対象のオブジェクト構造体ポインタ
213 void one_ability(object_type *o_ptr)
215 switch (randint0(10))
217 case 0: add_flag(o_ptr->art_flags, TR_LEVITATION); break;
218 case 1: add_flag(o_ptr->art_flags, TR_LITE_1); break;
219 case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS); break;
220 case 3: add_flag(o_ptr->art_flags, TR_WARNING); break;
221 case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
222 case 5: add_flag(o_ptr->art_flags, TR_REGEN); break;
223 case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT); break;
224 case 7: add_flag(o_ptr->art_flags, TR_HOLD_EXP); break;
233 * @brief 対象のオブジェクトに発動を一つ付加する。/ Choose one random activation
234 * @details 候補多数。ランダムアーティファクトのバイアスには一切依存せず、
235 * whileループによる構造で能力的に強力なものほど確率を落としている。
236 * @param o_ptr 対象のオブジェクト構造体ポインタ
239 void one_activation(object_type *o_ptr)
244 while (randint1(100) >= chance)
246 type = randint1(255);
261 case ACT_CURE_POISON:
272 case ACT_HYPODYNAMIA_1:
287 case ACT_HYPODYNAMIA_2:
299 case ACT_CHARM_ANIMAL:
302 case ACT_SUMMON_ANIMAL:
308 case ACT_BANISH_EVIL:
311 case ACT_CHARM_UNDEAD:
312 case ACT_CHARM_OTHER:
313 case ACT_SUMMON_PHANTOM:
320 case ACT_CHARM_ANIMALS:
321 case ACT_CHARM_OTHERS:
322 case ACT_SUMMON_ELEMENTAL:
331 case ACT_DETECT_XTRA:
335 case ACT_SUMMON_UNDEAD:
336 case ACT_SUMMON_DEMON:
347 /* A type was chosen... */
348 o_ptr->xtra2 = (byte_hack)type;
349 add_flag(o_ptr->art_flags, TR_ACTIVATE);
354 * @brief ランダムアーティファクト生成中、対象のオブジェクトを呪いのアーティファクトにする経過処理。/ generation process of cursed artifact.
355 * @details pval、AC、命中、ダメージが正の場合、符号反転の上1d4だけ悪化させ、重い呪い、呪いフラグを必ず付加。
356 * 祝福を無効。確率に応じて、永遠の呪い、太古の怨念、経験値吸収、弱い呪いの継続的付加、強い呪いの継続的付加、HP吸収の呪い、
357 * MP吸収の呪い、乱テレポート、反テレポート、反魔法をつける。
358 * @attention プレイヤーの職業依存処理あり。
359 * @param o_ptr 対象のオブジェクト構造体ポインタ
362 static void curse_artifact(object_type * o_ptr)
364 if (o_ptr->pval > 0) o_ptr->pval = 0 - (o_ptr->pval + randint1(4));
365 if (o_ptr->to_a > 0) o_ptr->to_a = 0 - (o_ptr->to_a + randint1(4));
366 if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
367 if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
369 o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
370 remove_flag(o_ptr->art_flags, TR_BLESSED);
372 if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
373 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
374 if (one_in_(2)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
375 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
376 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
377 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
378 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
379 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
380 if (one_in_(2)) add_flag(o_ptr->art_flags, TR_TELEPORT);
381 else if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
383 if ((p_ptr->pclass != CLASS_WARRIOR) && (p_ptr->pclass != CLASS_ARCHER) && (p_ptr->pclass != CLASS_CAVALRY) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH) && one_in_(3))
384 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
388 * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
389 * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
390 * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
391 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
392 * @param o_ptr 対象のオブジェクト構造体ポインタ
395 static void random_plus(object_type * o_ptr)
397 int this_type = (object_is_weapon_ammo(o_ptr) ? 23 : 19);
399 switch (o_ptr->artifact_bias)
402 if (!(have_flag(o_ptr->art_flags, TR_STR)))
404 add_flag(o_ptr->art_flags, TR_STR);
405 if (one_in_(2)) return;
408 if (!(have_flag(o_ptr->art_flags, TR_CON)))
410 add_flag(o_ptr->art_flags, TR_CON);
411 if (one_in_(2)) return;
414 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
416 add_flag(o_ptr->art_flags, TR_DEX);
417 if (one_in_(2)) return;
422 if (!(have_flag(o_ptr->art_flags, TR_INT)))
424 add_flag(o_ptr->art_flags, TR_INT);
425 if (one_in_(2)) return;
427 if ((o_ptr->tval == TV_GLOVES) && !(have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)))
429 add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
430 if (one_in_(2)) return;
435 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
437 add_flag(o_ptr->art_flags, TR_WIS);
438 if (one_in_(2)) return;
443 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
445 add_flag(o_ptr->art_flags, TR_DEX);
446 if (one_in_(2)) return;
449 if (!(have_flag(o_ptr->art_flags, TR_CON)))
451 add_flag(o_ptr->art_flags, TR_CON);
452 if (one_in_(2)) return;
455 if (!(have_flag(o_ptr->art_flags, TR_STR)))
457 add_flag(o_ptr->art_flags, TR_STR);
458 if (one_in_(2)) return;
463 if (!(have_flag(o_ptr->art_flags, TR_STEALTH)))
465 add_flag(o_ptr->art_flags, TR_STEALTH);
466 if (one_in_(2)) return;
468 if (!(have_flag(o_ptr->art_flags, TR_SEARCH)))
470 add_flag(o_ptr->art_flags, TR_SEARCH);
471 if (one_in_(2)) return;
476 if (!(have_flag(o_ptr->art_flags, TR_STR)))
478 add_flag(o_ptr->art_flags, TR_STR);
479 if (one_in_(2)) return;
484 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
486 add_flag(o_ptr->art_flags, TR_WIS);
487 if (one_in_(2)) return;
492 if (!(have_flag(o_ptr->art_flags, TR_INT)))
494 add_flag(o_ptr->art_flags, TR_INT);
495 if (one_in_(2)) return;
500 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
502 add_flag(o_ptr->art_flags, TR_DEX);
503 if (one_in_(2)) return;
508 if (!(have_flag(o_ptr->art_flags, TR_CON)))
510 add_flag(o_ptr->art_flags, TR_CON);
511 if (one_in_(2)) return;
516 if (!(have_flag(o_ptr->art_flags, TR_CHR)))
518 add_flag(o_ptr->art_flags, TR_CHR);
519 if (one_in_(2)) return;
524 if ((o_ptr->artifact_bias == BIAS_MAGE || o_ptr->artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE))
526 if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3))
528 add_flag(o_ptr->art_flags, TR_DEC_MANA);
529 if (one_in_(2)) return;
533 switch (randint1(this_type))
536 add_flag(o_ptr->art_flags, TR_STR);
537 if (!o_ptr->artifact_bias && !one_in_(13))
538 o_ptr->artifact_bias = BIAS_STR;
539 else if (!o_ptr->artifact_bias && one_in_(7))
540 o_ptr->artifact_bias = BIAS_WARRIOR;
543 add_flag(o_ptr->art_flags, TR_INT);
544 if (!o_ptr->artifact_bias && !one_in_(13))
545 o_ptr->artifact_bias = BIAS_INT;
546 else if (!o_ptr->artifact_bias && one_in_(7))
547 o_ptr->artifact_bias = BIAS_MAGE;
550 add_flag(o_ptr->art_flags, TR_WIS);
551 if (!o_ptr->artifact_bias && !one_in_(13))
552 o_ptr->artifact_bias = BIAS_WIS;
553 else if (!o_ptr->artifact_bias && one_in_(7))
554 o_ptr->artifact_bias = BIAS_PRIESTLY;
557 add_flag(o_ptr->art_flags, TR_DEX);
558 if (!o_ptr->artifact_bias && !one_in_(13))
559 o_ptr->artifact_bias = BIAS_DEX;
560 else if (!o_ptr->artifact_bias && one_in_(7))
561 o_ptr->artifact_bias = BIAS_ROGUE;
564 add_flag(o_ptr->art_flags, TR_CON);
565 if (!o_ptr->artifact_bias && !one_in_(13))
566 o_ptr->artifact_bias = BIAS_CON;
567 else if (!o_ptr->artifact_bias && one_in_(9))
568 o_ptr->artifact_bias = BIAS_RANGER;
571 add_flag(o_ptr->art_flags, TR_CHR);
572 if (!o_ptr->artifact_bias && !one_in_(13))
573 o_ptr->artifact_bias = BIAS_CHR;
576 add_flag(o_ptr->art_flags, TR_STEALTH);
577 if (!o_ptr->artifact_bias && one_in_(3))
578 o_ptr->artifact_bias = BIAS_ROGUE;
581 add_flag(o_ptr->art_flags, TR_SEARCH);
582 if (!o_ptr->artifact_bias && one_in_(9))
583 o_ptr->artifact_bias = BIAS_RANGER;
586 add_flag(o_ptr->art_flags, TR_INFRA);
589 add_flag(o_ptr->art_flags, TR_SPEED);
590 if (!o_ptr->artifact_bias && one_in_(11))
591 o_ptr->artifact_bias = BIAS_ROGUE;
594 add_flag(o_ptr->art_flags, TR_TUNNEL);
597 if (o_ptr->tval == TV_BOW) random_plus(o_ptr);
600 add_flag(o_ptr->art_flags, TR_BLOWS);
601 if (!o_ptr->artifact_bias && one_in_(11))
602 o_ptr->artifact_bias = BIAS_WARRIOR;
609 * @brief ランダムアーティファクト生成中、対象のオブジェクトに耐性を付加する。/ Add one resistance on generation of randam artifact.
610 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
611 * 原則的候補は火炎、冷気、電撃、酸(以上免疫の可能性もあり)、
612 * 毒、閃光、暗黒、破片、轟音、盲目、混乱、地獄、カオス、劣化、恐怖、火オーラ、冷気オーラ、電撃オーラ、反射。
614 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
615 * @param o_ptr 対象のオブジェクト構造体ポインタ
618 static void random_resistance(object_type * o_ptr)
620 switch (o_ptr->artifact_bias)
623 if (!(have_flag(o_ptr->art_flags, TR_RES_ACID)))
625 add_flag(o_ptr->art_flags, TR_RES_ACID);
626 if (one_in_(2)) return;
628 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ACID)))
630 add_flag(o_ptr->art_flags, TR_IM_ACID);
631 if (!one_in_(IM_LUCK))
633 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
634 remove_flag(o_ptr->art_flags, TR_IM_COLD);
635 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
637 if (one_in_(2)) return;
642 if (!(have_flag(o_ptr->art_flags, TR_RES_ELEC)))
644 add_flag(o_ptr->art_flags, TR_RES_ELEC);
645 if (one_in_(2)) return;
647 if ((o_ptr->tval >= TV_CLOAK) && (o_ptr->tval <= TV_HARD_ARMOR) &&
648 !(have_flag(o_ptr->art_flags, TR_SH_ELEC)))
650 add_flag(o_ptr->art_flags, TR_SH_ELEC);
651 if (one_in_(2)) return;
653 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ELEC)))
655 add_flag(o_ptr->art_flags, TR_IM_ELEC);
656 if (!one_in_(IM_LUCK))
658 remove_flag(o_ptr->art_flags, TR_IM_ACID);
659 remove_flag(o_ptr->art_flags, TR_IM_COLD);
660 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
663 if (one_in_(2)) return;
668 if (!(have_flag(o_ptr->art_flags, TR_RES_FIRE)))
670 add_flag(o_ptr->art_flags, TR_RES_FIRE);
671 if (one_in_(2)) return;
673 if ((o_ptr->tval >= TV_CLOAK) &&
674 (o_ptr->tval <= TV_HARD_ARMOR) &&
675 !(have_flag(o_ptr->art_flags, TR_SH_FIRE)))
677 add_flag(o_ptr->art_flags, TR_SH_FIRE);
678 if (one_in_(2)) return;
680 if (one_in_(BIAS_LUCK) &&
681 !(have_flag(o_ptr->art_flags, TR_IM_FIRE)))
683 add_flag(o_ptr->art_flags, TR_IM_FIRE);
684 if (!one_in_(IM_LUCK))
686 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
687 remove_flag(o_ptr->art_flags, TR_IM_COLD);
688 remove_flag(o_ptr->art_flags, TR_IM_ACID);
690 if (one_in_(2)) return;
695 if (!(have_flag(o_ptr->art_flags, TR_RES_COLD)))
697 add_flag(o_ptr->art_flags, TR_RES_COLD);
698 if (one_in_(2)) return;
700 if ((o_ptr->tval >= TV_CLOAK) &&
701 (o_ptr->tval <= TV_HARD_ARMOR) &&
702 !(have_flag(o_ptr->art_flags, TR_SH_COLD)))
704 add_flag(o_ptr->art_flags, TR_SH_COLD);
705 if (one_in_(2)) return;
707 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_COLD)))
709 add_flag(o_ptr->art_flags, TR_IM_COLD);
710 if (!one_in_(IM_LUCK))
712 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
713 remove_flag(o_ptr->art_flags, TR_IM_ACID);
714 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
716 if (one_in_(2)) return;
721 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
723 add_flag(o_ptr->art_flags, TR_RES_POIS);
724 if (one_in_(2)) return;
729 if (!one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_RES_FEAR))))
731 add_flag(o_ptr->art_flags, TR_RES_FEAR);
732 if (one_in_(2)) return;
734 if (one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_NO_MAGIC))))
736 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
737 if (one_in_(2)) return;
741 case BIAS_NECROMANTIC:
742 if (!(have_flag(o_ptr->art_flags, TR_RES_NETHER)))
744 add_flag(o_ptr->art_flags, TR_RES_NETHER);
745 if (one_in_(2)) return;
747 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
749 add_flag(o_ptr->art_flags, TR_RES_POIS);
750 if (one_in_(2)) return;
752 if (!(have_flag(o_ptr->art_flags, TR_RES_DARK)))
754 add_flag(o_ptr->art_flags, TR_RES_DARK);
755 if (one_in_(2)) return;
760 if (!(have_flag(o_ptr->art_flags, TR_RES_CHAOS)))
762 add_flag(o_ptr->art_flags, TR_RES_CHAOS);
763 if (one_in_(2)) return;
765 if (!(have_flag(o_ptr->art_flags, TR_RES_CONF)))
767 add_flag(o_ptr->art_flags, TR_RES_CONF);
768 if (one_in_(2)) return;
770 if (!(have_flag(o_ptr->art_flags, TR_RES_DISEN)))
772 add_flag(o_ptr->art_flags, TR_RES_DISEN);
773 if (one_in_(2)) return;
778 switch (randint1(42))
781 if (!one_in_(WEIRD_LUCK))
782 random_resistance(o_ptr);
785 add_flag(o_ptr->art_flags, TR_IM_ACID);
786 if (!o_ptr->artifact_bias)
787 o_ptr->artifact_bias = BIAS_ACID;
791 if (!one_in_(WEIRD_LUCK))
792 random_resistance(o_ptr);
795 add_flag(o_ptr->art_flags, TR_IM_ELEC);
796 if (!o_ptr->artifact_bias)
797 o_ptr->artifact_bias = BIAS_ELEC;
801 if (!one_in_(WEIRD_LUCK))
802 random_resistance(o_ptr);
805 add_flag(o_ptr->art_flags, TR_IM_COLD);
806 if (!o_ptr->artifact_bias)
807 o_ptr->artifact_bias = BIAS_COLD;
811 if (!one_in_(WEIRD_LUCK))
812 random_resistance(o_ptr);
815 add_flag(o_ptr->art_flags, TR_IM_FIRE);
816 if (!o_ptr->artifact_bias)
817 o_ptr->artifact_bias = BIAS_FIRE;
823 add_flag(o_ptr->art_flags, TR_RES_ACID);
824 if (!o_ptr->artifact_bias)
825 o_ptr->artifact_bias = BIAS_ACID;
830 add_flag(o_ptr->art_flags, TR_RES_ELEC);
831 if (!o_ptr->artifact_bias)
832 o_ptr->artifact_bias = BIAS_ELEC;
837 add_flag(o_ptr->art_flags, TR_RES_FIRE);
838 if (!o_ptr->artifact_bias)
839 o_ptr->artifact_bias = BIAS_FIRE;
844 add_flag(o_ptr->art_flags, TR_RES_COLD);
845 if (!o_ptr->artifact_bias)
846 o_ptr->artifact_bias = BIAS_COLD;
850 add_flag(o_ptr->art_flags, TR_RES_POIS);
851 if (!o_ptr->artifact_bias && !one_in_(4))
852 o_ptr->artifact_bias = BIAS_POIS;
853 else if (!o_ptr->artifact_bias && one_in_(2))
854 o_ptr->artifact_bias = BIAS_NECROMANTIC;
855 else if (!o_ptr->artifact_bias && one_in_(2))
856 o_ptr->artifact_bias = BIAS_ROGUE;
860 add_flag(o_ptr->art_flags, TR_RES_FEAR);
861 if (!o_ptr->artifact_bias && one_in_(3))
862 o_ptr->artifact_bias = BIAS_WARRIOR;
865 add_flag(o_ptr->art_flags, TR_RES_LITE);
868 add_flag(o_ptr->art_flags, TR_RES_DARK);
872 add_flag(o_ptr->art_flags, TR_RES_BLIND);
876 add_flag(o_ptr->art_flags, TR_RES_CONF);
877 if (!o_ptr->artifact_bias && one_in_(6))
878 o_ptr->artifact_bias = BIAS_CHAOS;
882 add_flag(o_ptr->art_flags, TR_RES_SOUND);
886 add_flag(o_ptr->art_flags, TR_RES_SHARDS);
890 add_flag(o_ptr->art_flags, TR_RES_NETHER);
891 if (!o_ptr->artifact_bias && one_in_(3))
892 o_ptr->artifact_bias = BIAS_NECROMANTIC;
896 add_flag(o_ptr->art_flags, TR_RES_NEXUS);
900 add_flag(o_ptr->art_flags, TR_RES_CHAOS);
901 if (!o_ptr->artifact_bias && one_in_(2))
902 o_ptr->artifact_bias = BIAS_CHAOS;
906 add_flag(o_ptr->art_flags, TR_RES_DISEN);
909 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
910 add_flag(o_ptr->art_flags, TR_SH_ELEC);
912 random_resistance(o_ptr);
913 if (!o_ptr->artifact_bias)
914 o_ptr->artifact_bias = BIAS_ELEC;
917 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
918 add_flag(o_ptr->art_flags, TR_SH_FIRE);
920 random_resistance(o_ptr);
921 if (!o_ptr->artifact_bias)
922 o_ptr->artifact_bias = BIAS_FIRE;
925 if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
926 o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
927 add_flag(o_ptr->art_flags, TR_REFLECT);
929 random_resistance(o_ptr);
932 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
933 add_flag(o_ptr->art_flags, TR_SH_COLD);
935 random_resistance(o_ptr);
936 if (!o_ptr->artifact_bias)
937 o_ptr->artifact_bias = BIAS_COLD;
944 * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
945 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
946 * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
947 * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
948 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
949 * @param o_ptr 対象のオブジェクト構造体ポインタ
952 static void random_misc(object_type * o_ptr)
954 switch (o_ptr->artifact_bias)
957 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
959 add_flag(o_ptr->art_flags, TR_SUST_CON);
960 if (one_in_(2)) return;
965 if (!(have_flag(o_ptr->art_flags, TR_SUST_STR)))
967 add_flag(o_ptr->art_flags, TR_SUST_STR);
968 if (one_in_(2)) return;
973 if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS)))
975 add_flag(o_ptr->art_flags, TR_SUST_WIS);
976 if (one_in_(2)) return;
981 if (!(have_flag(o_ptr->art_flags, TR_SUST_INT)))
983 add_flag(o_ptr->art_flags, TR_SUST_INT);
984 if (one_in_(2)) return;
989 if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX)))
991 add_flag(o_ptr->art_flags, TR_SUST_DEX);
992 if (one_in_(2)) return;
997 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
999 add_flag(o_ptr->art_flags, TR_SUST_CON);
1000 if (one_in_(2)) return;
1005 if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR)))
1007 add_flag(o_ptr->art_flags, TR_SUST_CHR);
1008 if (one_in_(2)) return;
1013 if (!(have_flag(o_ptr->art_flags, TR_TELEPORT)))
1015 add_flag(o_ptr->art_flags, TR_TELEPORT);
1016 if (one_in_(2)) return;
1021 if (!(have_flag(o_ptr->art_flags, TR_LITE_1)))
1023 add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
1028 switch (randint1(33))
1031 add_flag(o_ptr->art_flags, TR_SUST_STR);
1032 if (!o_ptr->artifact_bias)
1033 o_ptr->artifact_bias = BIAS_STR;
1036 add_flag(o_ptr->art_flags, TR_SUST_INT);
1037 if (!o_ptr->artifact_bias)
1038 o_ptr->artifact_bias = BIAS_INT;
1041 add_flag(o_ptr->art_flags, TR_SUST_WIS);
1042 if (!o_ptr->artifact_bias)
1043 o_ptr->artifact_bias = BIAS_WIS;
1046 add_flag(o_ptr->art_flags, TR_SUST_DEX);
1047 if (!o_ptr->artifact_bias)
1048 o_ptr->artifact_bias = BIAS_DEX;
1051 add_flag(o_ptr->art_flags, TR_SUST_CON);
1052 if (!o_ptr->artifact_bias)
1053 o_ptr->artifact_bias = BIAS_CON;
1056 add_flag(o_ptr->art_flags, TR_SUST_CHR);
1057 if (!o_ptr->artifact_bias)
1058 o_ptr->artifact_bias = BIAS_CHR;
1063 add_flag(o_ptr->art_flags, TR_FREE_ACT);
1066 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1067 if (!o_ptr->artifact_bias && one_in_(5))
1068 o_ptr->artifact_bias = BIAS_PRIESTLY;
1069 else if (!o_ptr->artifact_bias && one_in_(6))
1070 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1074 add_flag(o_ptr->art_flags, TR_LITE_1);
1078 add_flag(o_ptr->art_flags, TR_LEVITATION);
1083 add_flag(o_ptr->art_flags, TR_SEE_INVIS);
1087 add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
1091 add_flag(o_ptr->art_flags, TR_REGEN);
1094 add_flag(o_ptr->art_flags, TR_TELEPORT);
1099 if (object_is_armour(o_ptr))
1103 o_ptr->to_a = 4 + randint1(11);
1112 add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1113 bonus_h = 4 + (HIT_PROB)(randint1(11));
1114 bonus_d = 4 + (HIT_POINT)(randint1(11));
1115 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) && (o_ptr->tval != TV_RING))
1120 o_ptr->to_h += bonus_h;
1121 o_ptr->to_d += bonus_d;
1125 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1128 add_flag(o_ptr->art_flags, TR_NO_TELE);
1131 add_flag(o_ptr->art_flags, TR_WARNING);
1135 switch (randint1(3))
1138 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
1139 if (!o_ptr->artifact_bias && one_in_(3))
1140 o_ptr->artifact_bias = BIAS_LAW;
1143 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
1144 if (!o_ptr->artifact_bias && one_in_(3))
1145 o_ptr->artifact_bias = BIAS_MAGE;
1148 add_flag(o_ptr->art_flags, TR_TELEPATHY);
1149 if (!o_ptr->artifact_bias && one_in_(9))
1150 o_ptr->artifact_bias = BIAS_MAGE;
1158 int n = randint1(3);
1160 idx[0] = randint1(10);
1162 idx[1] = randint1(9);
1163 if (idx[1] >= idx[0]) idx[1]++;
1165 idx[2] = randint1(8);
1166 if (idx[2] >= idx[0]) idx[2]++;
1167 if (idx[2] >= idx[1]) idx[2]++;
1169 while (n--) switch (idx[n])
1172 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
1173 if (!o_ptr->artifact_bias && one_in_(4))
1174 o_ptr->artifact_bias = BIAS_RANGER;
1177 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
1178 if (!o_ptr->artifact_bias && one_in_(3))
1179 o_ptr->artifact_bias = BIAS_PRIESTLY;
1180 else if (!o_ptr->artifact_bias && one_in_(6))
1181 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1184 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
1187 add_flag(o_ptr->art_flags, TR_ESP_ORC);
1190 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
1193 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
1196 add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
1199 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
1200 if (!o_ptr->artifact_bias && one_in_(6))
1201 o_ptr->artifact_bias = BIAS_ROGUE;
1204 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
1205 if (!o_ptr->artifact_bias && one_in_(3))
1206 o_ptr->artifact_bias = BIAS_LAW;
1209 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
1210 if (!o_ptr->artifact_bias && one_in_(3))
1211 o_ptr->artifact_bias = BIAS_LAW;
1220 * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
1221 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
1222 * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
1223 * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
1224 * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
1225 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
1226 * @param o_ptr 対象のオブジェクト構造体ポインタ
1229 static void random_slay(object_type *o_ptr)
1231 if (o_ptr->tval == TV_BOW)
1233 switch (randint1(6))
1238 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1239 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1240 if (!o_ptr->artifact_bias && one_in_(9))
1241 o_ptr->artifact_bias = BIAS_RANGER;
1244 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1245 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1246 if (!o_ptr->artifact_bias && one_in_(9))
1247 o_ptr->artifact_bias = BIAS_RANGER;
1254 switch (o_ptr->artifact_bias)
1257 if (!(have_flag(o_ptr->art_flags, TR_CHAOTIC)))
1259 add_flag(o_ptr->art_flags, TR_CHAOTIC);
1260 if (one_in_(2)) return;
1265 if((o_ptr->tval == TV_SWORD || o_ptr->tval == TV_POLEARM) &&
1266 !(have_flag(o_ptr->art_flags, TR_BLESSED)))
1268 /* A free power for "priestly" random artifacts */
1269 add_flag(o_ptr->art_flags, TR_BLESSED);
1273 case BIAS_NECROMANTIC:
1274 if (!(have_flag(o_ptr->art_flags, TR_VAMPIRIC)))
1276 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1277 if (one_in_(2)) return;
1279 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)) && one_in_(2))
1281 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1282 if (one_in_(2)) return;
1287 if (!(have_flag(o_ptr->art_flags, TR_SLAY_ANIMAL)))
1289 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1290 if (one_in_(2)) return;
1295 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) ||
1296 ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR))) &&
1297 !(have_flag(o_ptr->art_flags, TR_THROW)))
1299 /* Free power for rogues... */
1300 add_flag(o_ptr->art_flags, TR_THROW);
1302 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1304 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1305 if (one_in_(2)) return;
1310 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1312 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1313 if (one_in_(2)) return;
1318 if (!(have_flag(o_ptr->art_flags, TR_BRAND_FIRE)))
1320 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1321 if (one_in_(2)) return;
1326 if (!(have_flag(o_ptr->art_flags, TR_BRAND_COLD)))
1328 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1329 if (one_in_(2)) return;
1334 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ELEC)))
1336 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1337 if (one_in_(2)) return;
1342 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ACID)))
1344 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1345 if (one_in_(2)) return;
1350 if (!(have_flag(o_ptr->art_flags, TR_SLAY_EVIL)))
1352 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1353 if (one_in_(2)) return;
1355 if (!(have_flag(o_ptr->art_flags, TR_SLAY_UNDEAD)))
1357 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1358 if (one_in_(2)) return;
1360 if (!(have_flag(o_ptr->art_flags, TR_SLAY_DEMON)))
1362 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1363 if (one_in_(2)) return;
1368 switch (randint1(36))
1374 add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
1378 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1385 add_flag(o_ptr->art_flags, TR_KILL_EVIL);
1389 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1391 if (!o_ptr->artifact_bias && one_in_(2))
1392 o_ptr->artifact_bias = BIAS_LAW;
1393 else if (!o_ptr->artifact_bias && one_in_(9))
1394 o_ptr->artifact_bias = BIAS_PRIESTLY;
1400 add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
1404 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1406 if (!o_ptr->artifact_bias && one_in_(9))
1407 o_ptr->artifact_bias = BIAS_PRIESTLY;
1413 add_flag(o_ptr->art_flags, TR_KILL_DEMON);
1417 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1419 if (!o_ptr->artifact_bias && one_in_(9))
1420 o_ptr->artifact_bias = BIAS_PRIESTLY;
1426 add_flag(o_ptr->art_flags, TR_KILL_ORC);
1430 add_flag(o_ptr->art_flags, TR_SLAY_ORC);
1437 add_flag(o_ptr->art_flags, TR_KILL_TROLL);
1441 add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1448 add_flag(o_ptr->art_flags, TR_KILL_GIANT);
1452 add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1457 add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1460 add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1464 if (o_ptr->tval == TV_SWORD)
1466 add_flag(o_ptr->art_flags, TR_VORPAL);
1467 if (!o_ptr->artifact_bias && one_in_(9))
1468 o_ptr->artifact_bias = BIAS_WARRIOR;
1474 add_flag(o_ptr->art_flags, TR_IMPACT);
1478 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1479 if (!o_ptr->artifact_bias)
1480 o_ptr->artifact_bias = BIAS_FIRE;
1484 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1485 if (!o_ptr->artifact_bias)
1486 o_ptr->artifact_bias = BIAS_COLD;
1490 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1491 if (!o_ptr->artifact_bias)
1492 o_ptr->artifact_bias = BIAS_ELEC;
1496 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1497 if (!o_ptr->artifact_bias)
1498 o_ptr->artifact_bias = BIAS_ACID;
1502 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1503 if (!o_ptr->artifact_bias && !one_in_(3))
1504 o_ptr->artifact_bias = BIAS_POIS;
1505 else if (!o_ptr->artifact_bias && one_in_(6))
1506 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1507 else if (!o_ptr->artifact_bias)
1508 o_ptr->artifact_bias = BIAS_ROGUE;
1511 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1512 if (!o_ptr->artifact_bias)
1513 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1516 add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1517 if (!o_ptr->artifact_bias)
1518 o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
1524 add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
1528 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1532 add_flag(o_ptr->art_flags, TR_CHAOTIC);
1533 if (!o_ptr->artifact_bias)
1534 o_ptr->artifact_bias = BIAS_CHAOS;
1540 * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
1541 * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
1542 * @param o_ptr 対象のオブジェクト構造体ポインタ
1545 static void give_activation_power(object_type *o_ptr)
1547 int type = 0, chance = 0;
1549 switch (o_ptr->artifact_bias)
1554 type = ACT_BO_ELEC_1;
1556 else if (!one_in_(5))
1558 type = ACT_BA_ELEC_2;
1562 type = ACT_BA_ELEC_3;
1568 type = ACT_BA_POIS_1;
1575 type = ACT_BO_FIRE_1;
1577 else if (!one_in_(5))
1579 type = ACT_BA_FIRE_1;
1583 type = ACT_BA_FIRE_2;
1591 type = ACT_BO_COLD_1;
1592 else if (!one_in_(3))
1593 type = ACT_BA_COLD_1;
1594 else if (!one_in_(3))
1595 type = ACT_BA_COLD_2;
1597 type = ACT_BA_COLD_3;
1603 type = ACT_SUMMON_DEMON;
1605 type = ACT_CALL_CHAOS;
1612 type = ACT_CHARM_UNDEAD;
1613 else if (one_in_(12))
1614 type = ACT_BANISH_EVIL;
1615 else if (one_in_(11))
1616 type = ACT_DISP_EVIL;
1617 else if (one_in_(10))
1618 type = ACT_PROT_EVIL;
1619 else if (one_in_(9))
1620 type = ACT_CURE_1000;
1621 else if (one_in_(8))
1622 type = ACT_CURE_700;
1623 else if (one_in_(7))
1624 type = ACT_REST_ALL;
1625 else if (one_in_(6))
1626 type = ACT_REST_EXP;
1631 case BIAS_NECROMANTIC:
1635 else if (one_in_(13))
1636 type = ACT_DISP_GOOD;
1637 else if (one_in_(9))
1638 type = ACT_MASS_GENO;
1639 else if (one_in_(8))
1640 type = ACT_GENOCIDE;
1641 else if (one_in_(13))
1642 type = ACT_SUMMON_UNDEAD;
1643 else if (one_in_(9))
1645 else if (one_in_(6))
1646 type = ACT_CHARM_UNDEAD;
1654 type = ACT_BANISH_EVIL;
1655 else if (one_in_(4))
1656 type = ACT_DISP_EVIL;
1658 type = ACT_PROT_EVIL;
1665 else if (one_in_(4))
1667 else if (one_in_(3))
1668 type = ACT_DETECT_ALL;
1669 else if (one_in_(8))
1672 type = ACT_ID_PLAIN;
1678 type = ACT_SUMMON_ELEMENTAL;
1679 else if (one_in_(10))
1680 type = ACT_SUMMON_PHANTOM;
1681 else if (one_in_(5))
1682 type = ACT_RUNE_EXPLO;
1698 type = ACT_CHARM_ANIMALS;
1699 else if (one_in_(7))
1700 type = ACT_SUMMON_ANIMAL;
1701 else if (one_in_(6))
1702 type = ACT_CHARM_ANIMAL;
1703 else if (one_in_(4))
1704 type = ACT_RESIST_ALL;
1705 else if (one_in_(3))
1708 type = ACT_CURE_POISON;
1712 if (!type || (randint1(100) >= chance))
1714 one_activation(o_ptr);
1718 /* A type was chosen... */
1719 o_ptr->xtra2 = (byte_hack)type;
1720 add_flag(o_ptr->art_flags, TR_ACTIVATE);
1725 * @brief ランダムアーティファクト生成中、対象のオブジェクトに名前を与える。/ Set name of randomartifact.
1726 * @details 確率によって、シンダリン銘、漢字銘、固定名のいずれか一つが与えられる。
1727 * @param o_ptr 処理中のアイテム参照ポインタ
1728 * @param return_name 名前を返すための文字列参照ポインタ
1729 * @param armour 対象のオブジェクトが防具が否か
1730 * @param power 銘の基準となるオブジェクトの価値レベル(0=呪い、1=低位、2=中位、3以上=高位)
1733 static void get_random_name(object_type *o_ptr, char *return_name, bool armour, int power)
1735 PERCENTAGE prob = randint1(100);
1737 if (prob <= SINDARIN_NAME)
1739 get_table_sindarin(return_name);
1741 else if (prob <= TABLE_NAME)
1743 get_table_name(return_name);
1755 filename = _("a_cursed_j.txt", "a_cursed.txt");
1758 filename = _("a_low_j.txt", "a_low.txt");
1761 filename = _("a_med_j.txt", "a_med.txt");
1764 filename = _("a_high_j.txt", "a_high.txt");
1771 filename = _("w_cursed_j.txt", "w_cursed.txt");
1774 filename = _("w_low_j.txt", "w_low.txt");
1777 filename = _("w_med_j.txt", "w_med.txt");
1780 filename = _("w_high_j.txt", "w_high.txt");
1784 (void)get_rnd_line(filename, o_ptr->artifact_bias, return_name);
1786 if (return_name[0] == 0) get_table_name(return_name);
1792 * @brief ランダムアーティファクト生成のメインルーチン
1793 * @details 既に生成が済んでいるオブジェクトの構造体を、アーティファクトとして強化する。
1794 * @param o_ptr 対象のオブジェクト構造体ポインタ
1795 * @param a_scroll アーティファクト生成の巻物上の処理。呪いのアーティファクトが生成対象外となる。
1796 * @return 常にTRUE(1)を返す
1798 bool create_artifact(object_type *o_ptr, bool a_scroll)
1800 GAME_TEXT new_name[1024];
1801 PARAMETER_VALUE has_pval = 0;
1802 int powers = randint1(5) + 1;
1804 int max_type = (object_is_weapon_ammo(o_ptr) ? 7 : 5);
1807 bool a_cursed = FALSE;
1808 int warrior_artifact_bias = 0;
1811 /* Reset artifact bias */
1812 o_ptr->artifact_bias = 0;
1814 /* Nuke enchantments */
1818 for (i = 0; i < TR_FLAG_SIZE; i++)
1819 o_ptr->art_flags[i] |= k_info[o_ptr->k_idx].flags[i];
1821 if (o_ptr->pval) has_pval = TRUE;
1823 if (a_scroll && one_in_(4))
1825 switch (p_ptr->pclass)
1828 case CLASS_BERSERKER:
1833 o_ptr->artifact_bias = BIAS_WARRIOR;
1836 case CLASS_HIGH_MAGE:
1837 case CLASS_SORCERER:
1838 case CLASS_MAGIC_EATER:
1839 case CLASS_BLUE_MAGE:
1840 o_ptr->artifact_bias = BIAS_MAGE;
1843 o_ptr->artifact_bias = BIAS_PRIESTLY;
1847 o_ptr->artifact_bias = BIAS_ROGUE;
1848 warrior_artifact_bias = 25;
1852 o_ptr->artifact_bias = BIAS_RANGER;
1853 warrior_artifact_bias = 30;
1856 o_ptr->artifact_bias = BIAS_PRIESTLY;
1857 warrior_artifact_bias = 40;
1859 case CLASS_WARRIOR_MAGE:
1860 case CLASS_RED_MAGE:
1861 o_ptr->artifact_bias = BIAS_MAGE;
1862 warrior_artifact_bias = 40;
1864 case CLASS_CHAOS_WARRIOR:
1865 o_ptr->artifact_bias = BIAS_CHAOS;
1866 warrior_artifact_bias = 40;
1869 case CLASS_FORCETRAINER:
1870 o_ptr->artifact_bias = BIAS_PRIESTLY;
1872 case CLASS_MINDCRAFTER:
1874 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_PRIESTLY;
1877 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_WARRIOR;
1879 case CLASS_IMITATOR:
1880 if (randint1(2) > 1) o_ptr->artifact_bias = BIAS_RANGER;
1882 case CLASS_BEASTMASTER:
1883 o_ptr->artifact_bias = BIAS_CHR;
1884 warrior_artifact_bias = 50;
1886 case CLASS_MIRROR_MASTER:
1887 if (randint1(4) > 1)
1889 o_ptr->artifact_bias = BIAS_MAGE;
1893 o_ptr->artifact_bias = BIAS_ROGUE;
1899 if (a_scroll && (randint1(100) <= warrior_artifact_bias))
1900 o_ptr->artifact_bias = BIAS_WARRIOR;
1902 strcpy(new_name, "");
1904 if (!a_scroll && one_in_(A_CURSED))
1906 if (((o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) && object_is_cursed(o_ptr))
1909 while (one_in_(powers) || one_in_(7) || one_in_(10))
1912 if (!a_cursed && one_in_(WEIRD_LUCK))
1915 if (a_cursed) powers /= 2;
1917 max_powers = powers;
1921 switch (randint1(max_type))
1928 if (one_in_(2) && object_is_weapon_ammo(o_ptr) && (o_ptr->tval != TV_BOW))
1930 if (a_cursed && !one_in_(13)) break;
1933 if (one_in_(o_ptr->ds+4)) o_ptr->ds++;
1937 if (one_in_(o_ptr->dd+1)) o_ptr->dd++;
1941 random_resistance(o_ptr);
1950 if (p_ptr->wizard) msg_print("Switch error in create_artifact!");
1957 if (have_flag(o_ptr->art_flags, TR_BLOWS))
1959 o_ptr->pval = randint1(2);
1960 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
1969 while (o_ptr->pval < randint1(5) || one_in_(o_ptr->pval));
1972 if ((o_ptr->pval > 4) && !one_in_(WEIRD_LUCK))
1977 /* give it some plusses... */
1978 if (object_is_armour(o_ptr))
1979 o_ptr->to_a += randint1(o_ptr->to_a > 19 ? 1 : 20 - o_ptr->to_a);
1980 else if (object_is_weapon_ammo(o_ptr))
1982 o_ptr->to_h += randint1(o_ptr->to_h > 19 ? 1 : 20 - o_ptr->to_h);
1983 o_ptr->to_d += randint1(o_ptr->to_d > 19 ? 1 : 20 - o_ptr->to_d);
1984 if ((have_flag(o_ptr->art_flags, TR_WIS)) && (o_ptr->pval > 0)) add_flag(o_ptr->art_flags, TR_BLESSED);
1987 /* Just to be sure */
1988 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1989 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1990 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1991 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1993 total_flags = flag_cost(o_ptr, o_ptr->pval);
1995 if (a_cursed) curse_artifact(o_ptr);
1998 one_in_(object_is_armour(o_ptr) ? ACTIVATION_CHANCE * 2 : ACTIVATION_CHANCE))
2001 give_activation_power(o_ptr);
2004 if (object_is_armour(o_ptr))
2006 while ((o_ptr->to_d+o_ptr->to_h) > 20)
2008 if (one_in_(o_ptr->to_d) && one_in_(o_ptr->to_h)) break;
2009 o_ptr->to_d -= (HIT_POINT)randint0(3);
2010 o_ptr->to_h -= (HIT_PROB)randint0(3);
2012 while ((o_ptr->to_d+o_ptr->to_h) > 10)
2014 if (one_in_(o_ptr->to_d) || one_in_(o_ptr->to_h)) break;
2015 o_ptr->to_d -= (HIT_POINT)randint0(3);
2016 o_ptr->to_h -= (HIT_PROB)randint0(3);
2020 if (((o_ptr->artifact_bias == BIAS_MAGE) || (o_ptr->artifact_bias == BIAS_INT)) && (o_ptr->tval == TV_GLOVES)) add_flag(o_ptr->art_flags, TR_FREE_ACT);
2022 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
2026 remove_flag(o_ptr->art_flags, TR_BLOWS);
2027 remove_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
2028 remove_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
2029 remove_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2030 remove_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
2031 remove_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2032 remove_flag(o_ptr->art_flags, TR_SLAY_ORC);
2033 remove_flag(o_ptr->art_flags, TR_SLAY_TROLL);
2034 remove_flag(o_ptr->art_flags, TR_SLAY_GIANT);
2035 remove_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
2036 remove_flag(o_ptr->art_flags, TR_KILL_DRAGON);
2037 remove_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2038 remove_flag(o_ptr->art_flags, TR_VORPAL);
2039 remove_flag(o_ptr->art_flags, TR_BRAND_POIS);
2040 remove_flag(o_ptr->art_flags, TR_BRAND_ACID);
2041 remove_flag(o_ptr->art_flags, TR_BRAND_ELEC);
2042 remove_flag(o_ptr->art_flags, TR_BRAND_FIRE);
2043 remove_flag(o_ptr->art_flags, TR_BRAND_COLD);
2046 if (!object_is_weapon_ammo(o_ptr))
2049 if (a_cursed) power_level = 0;
2050 else if (total_flags < 15000) power_level = 1;
2051 else if (total_flags < 35000) power_level = 2;
2052 else power_level = 3;
2058 if (a_cursed) power_level = 0;
2059 else if (total_flags < 20000) power_level = 1;
2060 else if (total_flags < 45000) power_level = 2;
2061 else power_level = 3;
2065 while (has_extreme_damage_rate(o_ptr) && !one_in_(SWORDFISH_LUCK))
2067 weakening_artifact(o_ptr);
2072 GAME_TEXT dummy_name[MAX_NLEN] = "";
2073 concptr ask_msg = _("このアーティファクトを何と名付けますか?", "What do you want to call the artifact? ");
2075 object_aware(o_ptr);
2076 object_known(o_ptr);
2078 /* Mark the item as fully known */
2079 o_ptr->ident |= (IDENT_MENTAL);
2081 /* For being treated as random artifact in screen_object() */
2082 o_ptr->art_name = quark_add("");
2084 (void)screen_object(o_ptr, 0L);
2086 if (!get_string(ask_msg, dummy_name, sizeof dummy_name)
2092 get_table_sindarin_aux(dummy_name);
2096 get_table_name_aux(dummy_name);
2099 sprintf(new_name, _("《%s》", "'%s'"), dummy_name);
2100 chg_virtue(V_INDIVIDUALISM, 2);
2101 chg_virtue(V_ENCHANT, 5);
2105 get_random_name(o_ptr, new_name, object_is_armour(o_ptr), power_level);
2108 /* Save the inscription */
2109 o_ptr->art_name = quark_add(new_name);
2111 msg_format_wizard(CHEAT_OBJECT, _("パワー %d で 価値%ld のランダムアーティファクト生成 バイアスは「%s」",
2112 "Random artifact generated - Power:%d Value:%d Bias:%s."), max_powers, total_flags, artifact_bias_name[o_ptr->artifact_bias]);
2114 p_ptr->window |= (PW_INVEN | PW_EQUIP);
2120 * @brief オブジェクトから能力発動IDを取得する。
2121 * @details いくつかのケースで定義されている発動効果から、
2122 * 鍛冶師による付与>固定アーティファクト>エゴ>ランダムアーティファクト>ベースアイテムの優先順位で走査していく。
2123 * @param o_ptr 対象のオブジェクト構造体ポインタ
2124 * @return 発動効果のIDを返す
2126 int activation_index(object_type *o_ptr)
2128 /* Give priority to weaponsmith's essential activations */
2129 if (object_is_smith(o_ptr))
2131 switch (o_ptr->xtra3 - 1)
2133 case ESSENCE_TMP_RES_ACID: return ACT_RESIST_ACID;
2134 case ESSENCE_TMP_RES_ELEC: return ACT_RESIST_ELEC;
2135 case ESSENCE_TMP_RES_FIRE: return ACT_RESIST_FIRE;
2136 case ESSENCE_TMP_RES_COLD: return ACT_RESIST_COLD;
2137 case TR_IMPACT: return ACT_QUAKE;
2141 if (object_is_fixed_artifact(o_ptr))
2143 if (have_flag(a_info[o_ptr->name1].flags, TR_ACTIVATE))
2145 return a_info[o_ptr->name1].act_idx;
2148 if (object_is_ego(o_ptr))
2150 if (have_flag(e_info[o_ptr->name2].flags, TR_ACTIVATE))
2152 return e_info[o_ptr->name2].act_idx;
2155 if (!object_is_random_artifact(o_ptr))
2157 if (have_flag(k_info[o_ptr->k_idx].flags, TR_ACTIVATE))
2159 return k_info[o_ptr->k_idx].act_idx;
2163 return o_ptr->xtra2;
2167 * @brief オブジェクトから発動効果構造体のポインタを取得する。
2168 * @details activation_index() 関数の結果から参照する。
2169 * @param o_ptr 対象のオブジェクト構造体ポインタ
2170 * @return 発動効果構造体のポインタを返す
2172 const activation_type* find_activation_info(object_type *o_ptr)
2174 const int index = activation_index(o_ptr);
2175 const activation_type* p;
2177 for (p = activation_info; p->flag != NULL; ++ p) {
2178 if (p->index == index)
2188 * @brief 固定アーティファクト生成時の特別なハードコーディング処理を行う。.
2189 * @details random_artifact_resistance()とあるが実際は固定アーティファクトである。
2190 * 対象は恐怖の仮面、村正、ロビントンのハープ、龍争虎鬪、ブラッディムーン、羽衣、天女の羽衣、ミリム、
2192 * @attention プレイヤーの各種ステータスに依存した処理がある。
2193 * @todo 折を見て関数名を変更すること。
2194 * @param o_ptr 対象のオブジェクト構造体ポインタ
2195 * @param a_ptr 生成する固定アーティファクト構造体ポインタ
2198 void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
2200 bool give_resistance = FALSE, give_power = FALSE;
2202 if (o_ptr->name1 == ART_TERROR) /* Terror Mask is for warriors... */
2204 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_ARCHER || p_ptr->pclass == CLASS_CAVALRY || p_ptr->pclass == CLASS_BERSERKER)
2207 give_resistance = TRUE;
2211 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2212 add_flag(o_ptr->art_flags, TR_TY_CURSE);
2213 o_ptr->curse_flags |=
2214 (TRC_CURSED | TRC_HEAVY_CURSE);
2215 o_ptr->curse_flags |= get_curse(2, o_ptr);
2220 if (o_ptr->name1 == ART_MURAMASA)
2222 if (p_ptr->pclass != CLASS_SAMURAI)
2224 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2225 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2229 if (o_ptr->name1 == ART_ROBINTON)
2231 if (p_ptr->pclass == CLASS_BARD)
2233 add_flag(o_ptr->art_flags, TR_DEC_MANA);
2237 if (o_ptr->name1 == ART_XIAOLONG)
2239 if (p_ptr->pclass == CLASS_MONK)
2240 add_flag(o_ptr->art_flags, TR_BLOWS);
2243 if (o_ptr->name1 == ART_BLOOD)
2245 get_bloody_moon_flags(o_ptr);
2248 if (o_ptr->name1 == ART_HEAVENLY_MAIDEN)
2250 if (p_ptr->psex != SEX_FEMALE)
2252 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2256 if (o_ptr->name1 == ART_MILIM)
2258 if (p_ptr->pseikaku == SEIKAKU_SEXY)
2261 add_flag(o_ptr->art_flags, TR_STR);
2262 add_flag(o_ptr->art_flags, TR_INT);
2263 add_flag(o_ptr->art_flags, TR_WIS);
2264 add_flag(o_ptr->art_flags, TR_DEX);
2265 add_flag(o_ptr->art_flags, TR_CON);
2266 add_flag(o_ptr->art_flags, TR_CHR);
2270 if (a_ptr->gen_flags & (TRG_XTRA_POWER)) give_power = TRUE;
2271 if (a_ptr->gen_flags & (TRG_XTRA_H_RES)) give_resistance = TRUE;
2272 if (a_ptr->gen_flags & (TRG_XTRA_RES_OR_POWER))
2274 /* Give a resistance OR a power */
2275 if (one_in_(2)) give_resistance = TRUE;
2276 else give_power = TRUE;
2284 if (give_resistance)
2286 one_high_resistance(o_ptr);
2292 * @brief フロアの指定された位置に固定アーティファクトを生成する。 / Create the artifact of the specified number
2293 * @details 固定アーティファクト構造体から基本ステータスをコピーした後、所定の座標でdrop_item()で落とす。
2294 * @param a_idx 生成する固定アーティファクト構造体のID
2295 * @param y アイテムを落とす地点のy座標
2296 * @param x アイテムを落とす地点のx座標
2297 * @return 生成が成功したか否か、失敗はIDの不全、ベースアイテムの不全、drop_item()の失敗時に起こる。
2298 * @attention この処理はdrop_near()内で普通の固定アーティファクトが重ならない性質に依存する.
2299 * 仮に2個以上存在可能かつ装備品以外の固定アーティファクトが作成されれば
2300 * drop_near()関数の返り値は信用できなくなる.
2302 bool create_named_art(ARTIFACT_IDX a_idx, POSITION y, POSITION x)
2308 artifact_type *a_ptr = &a_info[a_idx];
2311 /* Ignore "empty" artifacts */
2312 if (!a_ptr->name) return FALSE;
2314 /* Acquire the "kind" index */
2315 i = lookup_kind(a_ptr->tval, a_ptr->sval);
2317 if (!i) return FALSE;
2319 /* Create the artifact */
2320 object_prep(q_ptr, i);
2323 q_ptr->name1 = a_idx;
2325 /* Extract the fields */
2326 q_ptr->pval = a_ptr->pval;
2327 q_ptr->ac = a_ptr->ac;
2328 q_ptr->dd = a_ptr->dd;
2329 q_ptr->ds = a_ptr->ds;
2330 q_ptr->to_a = a_ptr->to_a;
2331 q_ptr->to_h = a_ptr->to_h;
2332 q_ptr->to_d = a_ptr->to_d;
2333 q_ptr->weight = a_ptr->weight;
2335 /* Hack -- extract the "cursed" flag */
2336 if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
2337 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2338 if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
2339 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
2340 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
2341 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
2343 random_artifact_resistance(q_ptr, a_ptr);
2345 /* Drop the artifact from heaven */
2346 return drop_near(q_ptr, -1, y, x) ? TRUE : FALSE;
2350 HIT_POINT calc_arm_avgdamage(object_type *o_ptr)
2352 BIT_FLAGS flgs[TR_FLAG_SIZE];
2353 object_flags(o_ptr, flgs);
2355 HIT_POINT dam, base, s_evil, forced, vorpal;
2356 s_evil = forced = vorpal = 0;
2357 dam = base = (o_ptr->dd * o_ptr->ds + o_ptr->dd) / 2;
2359 if(have_flag(flgs, TR_KILL_EVIL))
2361 dam = s_evil = dam * 7 / 2;
2363 else if(!have_flag(flgs, TR_KILL_EVIL) && have_flag(flgs, TR_SLAY_EVIL))
2365 dam = s_evil = dam * 2;
2369 if (have_flag(flgs, TR_FORCE_WEAPON))
2371 dam = forced = dam * 3 / 2 + (o_ptr->dd * o_ptr->ds + o_ptr->dd);
2375 if(have_flag(flgs, TR_VORPAL))
2377 dam = vorpal = dam * 11 / 9;
2381 dam = dam + o_ptr->to_d;
2383 msg_format_wizard(CHEAT_OBJECT,"素:%d> 対邪:%d> 理力:%d> 切:%d> 最終:%d", base, s_evil, forced, vorpal, dam);
2388 static bool has_extreme_damage_rate(object_type *o_ptr)
2390 BIT_FLAGS flgs[TR_FLAG_SIZE];
2391 object_flags(o_ptr, flgs);
2393 if (have_flag(flgs, TR_VAMPIRIC))
2395 if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 52))
2399 else if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 43))
2403 else if( have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 33))
2407 else if (calc_arm_avgdamage(o_ptr) > 63)
2414 if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 65))
2418 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 52))
2422 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 40))
2426 else if (calc_arm_avgdamage(o_ptr) > 75)
2434 static bool weakening_artifact(object_type *o_ptr)
2436 KIND_OBJECT_IDX k_idx = lookup_kind(o_ptr->tval, o_ptr->sval);
2437 object_kind *k_ptr = &k_info[k_idx];
2438 BIT_FLAGS flgs[TR_FLAG_SIZE];
2439 object_flags(o_ptr, flgs);
2441 if (have_flag(flgs, TR_KILL_EVIL))
2443 remove_flag(o_ptr->art_flags, TR_KILL_EVIL);
2444 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2447 else if (k_ptr->dd < o_ptr->dd)
2452 else if (k_ptr->ds < o_ptr->ds)
2457 else if (o_ptr->to_d > 10)
2459 o_ptr->to_d = o_ptr->to_d - damroll(1, 6);
2460 if (o_ptr->to_d < 10)