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"
18 #include "object-hook.h"
21 static bool has_extreme_damage_rate(object_type *o_ptr);
22 static bool weakening_artifact(object_type *o_ptr);
26 * @brief ランダムアーティファクトのバイアス名称テーブル
28 const concptr artifact_bias_name[MAX_BIAS] =
52 const concptr artifact_bias_name[MAX_BIAS] =
78 * @brief 対象のオブジェクトにランダムな上位耐性を一つ付加する。/ Choose one random high resistance
79 * @details 重複の抑止はない。候補は毒、閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、劣化、恐怖のいずれか。
80 * @param o_ptr 対象のオブジェクト構造体ポインタ
83 void one_high_resistance(object_type *o_ptr)
87 case 0: add_flag(o_ptr->art_flags, TR_RES_POIS); break;
88 case 1: add_flag(o_ptr->art_flags, TR_RES_LITE); break;
89 case 2: add_flag(o_ptr->art_flags, TR_RES_DARK); break;
90 case 3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
91 case 4: add_flag(o_ptr->art_flags, TR_RES_BLIND); break;
92 case 5: add_flag(o_ptr->art_flags, TR_RES_CONF); break;
93 case 6: add_flag(o_ptr->art_flags, TR_RES_SOUND); break;
94 case 7: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
95 case 8: add_flag(o_ptr->art_flags, TR_RES_NEXUS); break;
96 case 9: add_flag(o_ptr->art_flags, TR_RES_CHAOS); break;
97 case 10: add_flag(o_ptr->art_flags, TR_RES_DISEN); break;
98 case 11: add_flag(o_ptr->art_flags, TR_RES_FEAR); break;
103 * @brief 対象のオブジェクトに王者の指輪向けの上位耐性を一つ付加する。/ Choose one random high resistance
104 * @details 候補は閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、恐怖であり
105 * 王者の指輪にあらかじめついている耐性をone_high_resistance()から除外したものである。
106 * ランダム付加そのものに重複の抑止はない。
107 * @param o_ptr 対象のオブジェクト構造体ポインタ
110 void one_lordly_high_resistance(object_type *o_ptr)
112 switch (randint0(10))
114 case 0: add_flag(o_ptr->art_flags, TR_RES_LITE); break;
115 case 1: add_flag(o_ptr->art_flags, TR_RES_DARK); break;
116 case 2: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
117 case 3: add_flag(o_ptr->art_flags, TR_RES_BLIND); break;
118 case 4: add_flag(o_ptr->art_flags, TR_RES_CONF); break;
119 case 5: add_flag(o_ptr->art_flags, TR_RES_SOUND); break;
120 case 6: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
121 case 7: add_flag(o_ptr->art_flags, TR_RES_NEXUS); break;
122 case 8: add_flag(o_ptr->art_flags, TR_RES_CHAOS); break;
123 case 9: add_flag(o_ptr->art_flags, TR_RES_FEAR); break;
128 * @brief 対象のオブジェクトに元素耐性を一つ付加する。/ Choose one random element resistance
129 * @details 候補は火炎、冷気、電撃、酸のいずれかであり、重複の抑止はない。
130 * @param o_ptr 対象のオブジェクト構造体ポインタ
133 void one_ele_resistance(object_type *o_ptr)
137 case 0: add_flag(o_ptr->art_flags, TR_RES_ACID); break;
138 case 1: add_flag(o_ptr->art_flags, TR_RES_ELEC); break;
139 case 2: add_flag(o_ptr->art_flags, TR_RES_COLD); break;
140 case 3: add_flag(o_ptr->art_flags, TR_RES_FIRE); break;
145 * @brief 対象のオブジェクトにドラゴン装備向け元素耐性を一つ付加する。/ Choose one random element or poison resistance
146 * @details 候補は1/7の確率で毒、6/7の確率で火炎、冷気、電撃、酸のいずれか(one_ele_resistance()のコール)であり、重複の抑止はない。
147 * @param o_ptr 対象のオブジェクト構造体ポインタ
150 void one_dragon_ele_resistance(object_type *o_ptr)
154 add_flag(o_ptr->art_flags, TR_RES_POIS);
158 one_ele_resistance(o_ptr);
163 * @brief 対象のオブジェクトに弱いESPを一つ付加する。/ Choose one lower rank esp
164 * @details 候補は動物、アンデッド、悪魔、オーク、トロル、巨人、
165 * ドラゴン、人間、善良、ユニークESPのいずれかであり、重複の抑止はない。
166 * @param o_ptr 対象のオブジェクト構造体ポインタ
169 void one_low_esp(object_type *o_ptr)
171 switch (randint1(10))
173 case 1: add_flag(o_ptr->art_flags, TR_ESP_ANIMAL); break;
174 case 2: add_flag(o_ptr->art_flags, TR_ESP_UNDEAD); break;
175 case 3: add_flag(o_ptr->art_flags, TR_ESP_DEMON); break;
176 case 4: add_flag(o_ptr->art_flags, TR_ESP_ORC); break;
177 case 5: add_flag(o_ptr->art_flags, TR_ESP_TROLL); break;
178 case 6: add_flag(o_ptr->art_flags, TR_ESP_GIANT); break;
179 case 7: add_flag(o_ptr->art_flags, TR_ESP_DRAGON); break;
180 case 8: add_flag(o_ptr->art_flags, TR_ESP_HUMAN); break;
181 case 9: add_flag(o_ptr->art_flags, TR_ESP_GOOD); break;
182 case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE); break;
188 * @brief 対象のオブジェクトに耐性を一つ付加する。/ Choose one random resistance
189 * @details 1/3で元素耐性(one_ele_resistance())、2/3で上位耐性(one_high_resistance)
191 * @param o_ptr 対象のオブジェクト構造体ポインタ
194 void one_resistance(object_type *o_ptr)
198 one_ele_resistance(o_ptr);
202 one_high_resistance(o_ptr);
208 * @brief 対象のオブジェクトに能力を一つ付加する。/ Choose one random ability
209 * @details 候補は浮遊、永久光源+1、透明視、警告、遅消化、急回復、麻痺知らず、経験値維持のいずれか。
211 * @param o_ptr 対象のオブジェクト構造体ポインタ
214 void one_ability(object_type *o_ptr)
216 switch (randint0(10))
218 case 0: add_flag(o_ptr->art_flags, TR_LEVITATION); break;
219 case 1: add_flag(o_ptr->art_flags, TR_LITE_1); break;
220 case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS); break;
221 case 3: add_flag(o_ptr->art_flags, TR_WARNING); break;
222 case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
223 case 5: add_flag(o_ptr->art_flags, TR_REGEN); break;
224 case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT); break;
225 case 7: add_flag(o_ptr->art_flags, TR_HOLD_EXP); break;
234 * @brief 対象のオブジェクトに発動を一つ付加する。/ Choose one random activation
235 * @details 候補多数。ランダムアーティファクトのバイアスには一切依存せず、
236 * whileループによる構造で能力的に強力なものほど確率を落としている。
237 * @param o_ptr 対象のオブジェクト構造体ポインタ
240 void one_activation(object_type *o_ptr)
245 while (randint1(100) >= chance)
247 type = randint1(255);
262 case ACT_CURE_POISON:
273 case ACT_HYPODYNAMIA_1:
288 case ACT_HYPODYNAMIA_2:
300 case ACT_CHARM_ANIMAL:
303 case ACT_SUMMON_ANIMAL:
309 case ACT_BANISH_EVIL:
312 case ACT_CHARM_UNDEAD:
313 case ACT_CHARM_OTHER:
314 case ACT_SUMMON_PHANTOM:
321 case ACT_CHARM_ANIMALS:
322 case ACT_CHARM_OTHERS:
323 case ACT_SUMMON_ELEMENTAL:
332 case ACT_DETECT_XTRA:
336 case ACT_SUMMON_UNDEAD:
337 case ACT_SUMMON_DEMON:
348 /* A type was chosen... */
349 o_ptr->xtra2 = (byte_hack)type;
350 add_flag(o_ptr->art_flags, TR_ACTIVATE);
355 * @brief ランダムアーティファクト生成中、対象のオブジェクトを呪いのアーティファクトにする経過処理。/ generation process of cursed artifact.
356 * @details pval、AC、命中、ダメージが正の場合、符号反転の上1d4だけ悪化させ、重い呪い、呪いフラグを必ず付加。
357 * 祝福を無効。確率に応じて、永遠の呪い、太古の怨念、経験値吸収、弱い呪いの継続的付加、強い呪いの継続的付加、HP吸収の呪い、
358 * MP吸収の呪い、乱テレポート、反テレポート、反魔法をつける。
359 * @attention プレイヤーの職業依存処理あり。
360 * @param o_ptr 対象のオブジェクト構造体ポインタ
363 static void curse_artifact(object_type * o_ptr)
365 if (o_ptr->pval > 0) o_ptr->pval = 0 - (o_ptr->pval + randint1(4));
366 if (o_ptr->to_a > 0) o_ptr->to_a = 0 - (o_ptr->to_a + randint1(4));
367 if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
368 if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
370 o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
371 remove_flag(o_ptr->art_flags, TR_BLESSED);
373 if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
374 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
375 if (one_in_(2)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
376 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
377 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
378 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
379 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
380 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
381 if (one_in_(2)) add_flag(o_ptr->art_flags, TR_TELEPORT);
382 else if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
384 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))
385 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
389 * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
390 * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
391 * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
392 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
393 * @param o_ptr 対象のオブジェクト構造体ポインタ
396 static void random_plus(object_type * o_ptr)
398 int this_type = (object_is_weapon_ammo(o_ptr) ? 23 : 19);
400 switch (o_ptr->artifact_bias)
403 if (!(have_flag(o_ptr->art_flags, TR_STR)))
405 add_flag(o_ptr->art_flags, TR_STR);
406 if (one_in_(2)) return;
409 if (!(have_flag(o_ptr->art_flags, TR_CON)))
411 add_flag(o_ptr->art_flags, TR_CON);
412 if (one_in_(2)) return;
415 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
417 add_flag(o_ptr->art_flags, TR_DEX);
418 if (one_in_(2)) return;
423 if (!(have_flag(o_ptr->art_flags, TR_INT)))
425 add_flag(o_ptr->art_flags, TR_INT);
426 if (one_in_(2)) return;
428 if ((o_ptr->tval == TV_GLOVES) && !(have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)))
430 add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
431 if (one_in_(2)) return;
436 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
438 add_flag(o_ptr->art_flags, TR_WIS);
439 if (one_in_(2)) return;
444 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
446 add_flag(o_ptr->art_flags, TR_DEX);
447 if (one_in_(2)) return;
450 if (!(have_flag(o_ptr->art_flags, TR_CON)))
452 add_flag(o_ptr->art_flags, TR_CON);
453 if (one_in_(2)) return;
456 if (!(have_flag(o_ptr->art_flags, TR_STR)))
458 add_flag(o_ptr->art_flags, TR_STR);
459 if (one_in_(2)) return;
464 if (!(have_flag(o_ptr->art_flags, TR_STEALTH)))
466 add_flag(o_ptr->art_flags, TR_STEALTH);
467 if (one_in_(2)) return;
469 if (!(have_flag(o_ptr->art_flags, TR_SEARCH)))
471 add_flag(o_ptr->art_flags, TR_SEARCH);
472 if (one_in_(2)) return;
477 if (!(have_flag(o_ptr->art_flags, TR_STR)))
479 add_flag(o_ptr->art_flags, TR_STR);
480 if (one_in_(2)) return;
485 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
487 add_flag(o_ptr->art_flags, TR_WIS);
488 if (one_in_(2)) return;
493 if (!(have_flag(o_ptr->art_flags, TR_INT)))
495 add_flag(o_ptr->art_flags, TR_INT);
496 if (one_in_(2)) return;
501 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
503 add_flag(o_ptr->art_flags, TR_DEX);
504 if (one_in_(2)) return;
509 if (!(have_flag(o_ptr->art_flags, TR_CON)))
511 add_flag(o_ptr->art_flags, TR_CON);
512 if (one_in_(2)) return;
517 if (!(have_flag(o_ptr->art_flags, TR_CHR)))
519 add_flag(o_ptr->art_flags, TR_CHR);
520 if (one_in_(2)) return;
525 if ((o_ptr->artifact_bias == BIAS_MAGE || o_ptr->artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE))
527 if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3))
529 add_flag(o_ptr->art_flags, TR_DEC_MANA);
530 if (one_in_(2)) return;
534 switch (randint1(this_type))
537 add_flag(o_ptr->art_flags, TR_STR);
538 if (!o_ptr->artifact_bias && !one_in_(13))
539 o_ptr->artifact_bias = BIAS_STR;
540 else if (!o_ptr->artifact_bias && one_in_(7))
541 o_ptr->artifact_bias = BIAS_WARRIOR;
544 add_flag(o_ptr->art_flags, TR_INT);
545 if (!o_ptr->artifact_bias && !one_in_(13))
546 o_ptr->artifact_bias = BIAS_INT;
547 else if (!o_ptr->artifact_bias && one_in_(7))
548 o_ptr->artifact_bias = BIAS_MAGE;
551 add_flag(o_ptr->art_flags, TR_WIS);
552 if (!o_ptr->artifact_bias && !one_in_(13))
553 o_ptr->artifact_bias = BIAS_WIS;
554 else if (!o_ptr->artifact_bias && one_in_(7))
555 o_ptr->artifact_bias = BIAS_PRIESTLY;
558 add_flag(o_ptr->art_flags, TR_DEX);
559 if (!o_ptr->artifact_bias && !one_in_(13))
560 o_ptr->artifact_bias = BIAS_DEX;
561 else if (!o_ptr->artifact_bias && one_in_(7))
562 o_ptr->artifact_bias = BIAS_ROGUE;
565 add_flag(o_ptr->art_flags, TR_CON);
566 if (!o_ptr->artifact_bias && !one_in_(13))
567 o_ptr->artifact_bias = BIAS_CON;
568 else if (!o_ptr->artifact_bias && one_in_(9))
569 o_ptr->artifact_bias = BIAS_RANGER;
572 add_flag(o_ptr->art_flags, TR_CHR);
573 if (!o_ptr->artifact_bias && !one_in_(13))
574 o_ptr->artifact_bias = BIAS_CHR;
577 add_flag(o_ptr->art_flags, TR_STEALTH);
578 if (!o_ptr->artifact_bias && one_in_(3))
579 o_ptr->artifact_bias = BIAS_ROGUE;
582 add_flag(o_ptr->art_flags, TR_SEARCH);
583 if (!o_ptr->artifact_bias && one_in_(9))
584 o_ptr->artifact_bias = BIAS_RANGER;
587 add_flag(o_ptr->art_flags, TR_INFRA);
590 add_flag(o_ptr->art_flags, TR_SPEED);
591 if (!o_ptr->artifact_bias && one_in_(11))
592 o_ptr->artifact_bias = BIAS_ROGUE;
595 add_flag(o_ptr->art_flags, TR_TUNNEL);
598 if (o_ptr->tval == TV_BOW) random_plus(o_ptr);
601 add_flag(o_ptr->art_flags, TR_BLOWS);
602 if (!o_ptr->artifact_bias && one_in_(11))
603 o_ptr->artifact_bias = BIAS_WARRIOR;
610 * @brief ランダムアーティファクト生成中、対象のオブジェクトに耐性を付加する。/ Add one resistance on generation of randam artifact.
611 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
612 * 原則的候補は火炎、冷気、電撃、酸(以上免疫の可能性もあり)、
613 * 毒、閃光、暗黒、破片、轟音、盲目、混乱、地獄、カオス、劣化、恐怖、火オーラ、冷気オーラ、電撃オーラ、反射。
615 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
616 * @param o_ptr 対象のオブジェクト構造体ポインタ
619 static void random_resistance(object_type * o_ptr)
621 switch (o_ptr->artifact_bias)
624 if (!(have_flag(o_ptr->art_flags, TR_RES_ACID)))
626 add_flag(o_ptr->art_flags, TR_RES_ACID);
627 if (one_in_(2)) return;
629 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ACID)))
631 add_flag(o_ptr->art_flags, TR_IM_ACID);
632 if (!one_in_(IM_LUCK))
634 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
635 remove_flag(o_ptr->art_flags, TR_IM_COLD);
636 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
638 if (one_in_(2)) return;
643 if (!(have_flag(o_ptr->art_flags, TR_RES_ELEC)))
645 add_flag(o_ptr->art_flags, TR_RES_ELEC);
646 if (one_in_(2)) return;
648 if ((o_ptr->tval >= TV_CLOAK) && (o_ptr->tval <= TV_HARD_ARMOR) &&
649 !(have_flag(o_ptr->art_flags, TR_SH_ELEC)))
651 add_flag(o_ptr->art_flags, TR_SH_ELEC);
652 if (one_in_(2)) return;
654 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ELEC)))
656 add_flag(o_ptr->art_flags, TR_IM_ELEC);
657 if (!one_in_(IM_LUCK))
659 remove_flag(o_ptr->art_flags, TR_IM_ACID);
660 remove_flag(o_ptr->art_flags, TR_IM_COLD);
661 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
664 if (one_in_(2)) return;
669 if (!(have_flag(o_ptr->art_flags, TR_RES_FIRE)))
671 add_flag(o_ptr->art_flags, TR_RES_FIRE);
672 if (one_in_(2)) return;
674 if ((o_ptr->tval >= TV_CLOAK) &&
675 (o_ptr->tval <= TV_HARD_ARMOR) &&
676 !(have_flag(o_ptr->art_flags, TR_SH_FIRE)))
678 add_flag(o_ptr->art_flags, TR_SH_FIRE);
679 if (one_in_(2)) return;
681 if (one_in_(BIAS_LUCK) &&
682 !(have_flag(o_ptr->art_flags, TR_IM_FIRE)))
684 add_flag(o_ptr->art_flags, TR_IM_FIRE);
685 if (!one_in_(IM_LUCK))
687 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
688 remove_flag(o_ptr->art_flags, TR_IM_COLD);
689 remove_flag(o_ptr->art_flags, TR_IM_ACID);
691 if (one_in_(2)) return;
696 if (!(have_flag(o_ptr->art_flags, TR_RES_COLD)))
698 add_flag(o_ptr->art_flags, TR_RES_COLD);
699 if (one_in_(2)) return;
701 if ((o_ptr->tval >= TV_CLOAK) &&
702 (o_ptr->tval <= TV_HARD_ARMOR) &&
703 !(have_flag(o_ptr->art_flags, TR_SH_COLD)))
705 add_flag(o_ptr->art_flags, TR_SH_COLD);
706 if (one_in_(2)) return;
708 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_COLD)))
710 add_flag(o_ptr->art_flags, TR_IM_COLD);
711 if (!one_in_(IM_LUCK))
713 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
714 remove_flag(o_ptr->art_flags, TR_IM_ACID);
715 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
717 if (one_in_(2)) return;
722 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
724 add_flag(o_ptr->art_flags, TR_RES_POIS);
725 if (one_in_(2)) return;
730 if (!one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_RES_FEAR))))
732 add_flag(o_ptr->art_flags, TR_RES_FEAR);
733 if (one_in_(2)) return;
735 if (one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_NO_MAGIC))))
737 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
738 if (one_in_(2)) return;
742 case BIAS_NECROMANTIC:
743 if (!(have_flag(o_ptr->art_flags, TR_RES_NETHER)))
745 add_flag(o_ptr->art_flags, TR_RES_NETHER);
746 if (one_in_(2)) return;
748 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
750 add_flag(o_ptr->art_flags, TR_RES_POIS);
751 if (one_in_(2)) return;
753 if (!(have_flag(o_ptr->art_flags, TR_RES_DARK)))
755 add_flag(o_ptr->art_flags, TR_RES_DARK);
756 if (one_in_(2)) return;
761 if (!(have_flag(o_ptr->art_flags, TR_RES_CHAOS)))
763 add_flag(o_ptr->art_flags, TR_RES_CHAOS);
764 if (one_in_(2)) return;
766 if (!(have_flag(o_ptr->art_flags, TR_RES_CONF)))
768 add_flag(o_ptr->art_flags, TR_RES_CONF);
769 if (one_in_(2)) return;
771 if (!(have_flag(o_ptr->art_flags, TR_RES_DISEN)))
773 add_flag(o_ptr->art_flags, TR_RES_DISEN);
774 if (one_in_(2)) return;
779 switch (randint1(42))
782 if (!one_in_(WEIRD_LUCK))
783 random_resistance(o_ptr);
786 add_flag(o_ptr->art_flags, TR_IM_ACID);
787 if (!o_ptr->artifact_bias)
788 o_ptr->artifact_bias = BIAS_ACID;
792 if (!one_in_(WEIRD_LUCK))
793 random_resistance(o_ptr);
796 add_flag(o_ptr->art_flags, TR_IM_ELEC);
797 if (!o_ptr->artifact_bias)
798 o_ptr->artifact_bias = BIAS_ELEC;
802 if (!one_in_(WEIRD_LUCK))
803 random_resistance(o_ptr);
806 add_flag(o_ptr->art_flags, TR_IM_COLD);
807 if (!o_ptr->artifact_bias)
808 o_ptr->artifact_bias = BIAS_COLD;
812 if (!one_in_(WEIRD_LUCK))
813 random_resistance(o_ptr);
816 add_flag(o_ptr->art_flags, TR_IM_FIRE);
817 if (!o_ptr->artifact_bias)
818 o_ptr->artifact_bias = BIAS_FIRE;
824 add_flag(o_ptr->art_flags, TR_RES_ACID);
825 if (!o_ptr->artifact_bias)
826 o_ptr->artifact_bias = BIAS_ACID;
831 add_flag(o_ptr->art_flags, TR_RES_ELEC);
832 if (!o_ptr->artifact_bias)
833 o_ptr->artifact_bias = BIAS_ELEC;
838 add_flag(o_ptr->art_flags, TR_RES_FIRE);
839 if (!o_ptr->artifact_bias)
840 o_ptr->artifact_bias = BIAS_FIRE;
845 add_flag(o_ptr->art_flags, TR_RES_COLD);
846 if (!o_ptr->artifact_bias)
847 o_ptr->artifact_bias = BIAS_COLD;
851 add_flag(o_ptr->art_flags, TR_RES_POIS);
852 if (!o_ptr->artifact_bias && !one_in_(4))
853 o_ptr->artifact_bias = BIAS_POIS;
854 else if (!o_ptr->artifact_bias && one_in_(2))
855 o_ptr->artifact_bias = BIAS_NECROMANTIC;
856 else if (!o_ptr->artifact_bias && one_in_(2))
857 o_ptr->artifact_bias = BIAS_ROGUE;
861 add_flag(o_ptr->art_flags, TR_RES_FEAR);
862 if (!o_ptr->artifact_bias && one_in_(3))
863 o_ptr->artifact_bias = BIAS_WARRIOR;
866 add_flag(o_ptr->art_flags, TR_RES_LITE);
869 add_flag(o_ptr->art_flags, TR_RES_DARK);
873 add_flag(o_ptr->art_flags, TR_RES_BLIND);
877 add_flag(o_ptr->art_flags, TR_RES_CONF);
878 if (!o_ptr->artifact_bias && one_in_(6))
879 o_ptr->artifact_bias = BIAS_CHAOS;
883 add_flag(o_ptr->art_flags, TR_RES_SOUND);
887 add_flag(o_ptr->art_flags, TR_RES_SHARDS);
891 add_flag(o_ptr->art_flags, TR_RES_NETHER);
892 if (!o_ptr->artifact_bias && one_in_(3))
893 o_ptr->artifact_bias = BIAS_NECROMANTIC;
897 add_flag(o_ptr->art_flags, TR_RES_NEXUS);
901 add_flag(o_ptr->art_flags, TR_RES_CHAOS);
902 if (!o_ptr->artifact_bias && one_in_(2))
903 o_ptr->artifact_bias = BIAS_CHAOS;
907 add_flag(o_ptr->art_flags, TR_RES_DISEN);
910 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
911 add_flag(o_ptr->art_flags, TR_SH_ELEC);
913 random_resistance(o_ptr);
914 if (!o_ptr->artifact_bias)
915 o_ptr->artifact_bias = BIAS_ELEC;
918 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
919 add_flag(o_ptr->art_flags, TR_SH_FIRE);
921 random_resistance(o_ptr);
922 if (!o_ptr->artifact_bias)
923 o_ptr->artifact_bias = BIAS_FIRE;
926 if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
927 o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
928 add_flag(o_ptr->art_flags, TR_REFLECT);
930 random_resistance(o_ptr);
933 if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
934 add_flag(o_ptr->art_flags, TR_SH_COLD);
936 random_resistance(o_ptr);
937 if (!o_ptr->artifact_bias)
938 o_ptr->artifact_bias = BIAS_COLD;
945 * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
946 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
947 * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
948 * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
949 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
950 * @param o_ptr 対象のオブジェクト構造体ポインタ
953 static void random_misc(object_type * o_ptr)
955 switch (o_ptr->artifact_bias)
958 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
960 add_flag(o_ptr->art_flags, TR_SUST_CON);
961 if (one_in_(2)) return;
966 if (!(have_flag(o_ptr->art_flags, TR_SUST_STR)))
968 add_flag(o_ptr->art_flags, TR_SUST_STR);
969 if (one_in_(2)) return;
974 if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS)))
976 add_flag(o_ptr->art_flags, TR_SUST_WIS);
977 if (one_in_(2)) return;
982 if (!(have_flag(o_ptr->art_flags, TR_SUST_INT)))
984 add_flag(o_ptr->art_flags, TR_SUST_INT);
985 if (one_in_(2)) return;
990 if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX)))
992 add_flag(o_ptr->art_flags, TR_SUST_DEX);
993 if (one_in_(2)) return;
998 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
1000 add_flag(o_ptr->art_flags, TR_SUST_CON);
1001 if (one_in_(2)) return;
1006 if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR)))
1008 add_flag(o_ptr->art_flags, TR_SUST_CHR);
1009 if (one_in_(2)) return;
1014 if (!(have_flag(o_ptr->art_flags, TR_TELEPORT)))
1016 add_flag(o_ptr->art_flags, TR_TELEPORT);
1017 if (one_in_(2)) return;
1022 if (!(have_flag(o_ptr->art_flags, TR_LITE_1)))
1024 add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
1029 switch (randint1(33))
1032 add_flag(o_ptr->art_flags, TR_SUST_STR);
1033 if (!o_ptr->artifact_bias)
1034 o_ptr->artifact_bias = BIAS_STR;
1037 add_flag(o_ptr->art_flags, TR_SUST_INT);
1038 if (!o_ptr->artifact_bias)
1039 o_ptr->artifact_bias = BIAS_INT;
1042 add_flag(o_ptr->art_flags, TR_SUST_WIS);
1043 if (!o_ptr->artifact_bias)
1044 o_ptr->artifact_bias = BIAS_WIS;
1047 add_flag(o_ptr->art_flags, TR_SUST_DEX);
1048 if (!o_ptr->artifact_bias)
1049 o_ptr->artifact_bias = BIAS_DEX;
1052 add_flag(o_ptr->art_flags, TR_SUST_CON);
1053 if (!o_ptr->artifact_bias)
1054 o_ptr->artifact_bias = BIAS_CON;
1057 add_flag(o_ptr->art_flags, TR_SUST_CHR);
1058 if (!o_ptr->artifact_bias)
1059 o_ptr->artifact_bias = BIAS_CHR;
1064 add_flag(o_ptr->art_flags, TR_FREE_ACT);
1067 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1068 if (!o_ptr->artifact_bias && one_in_(5))
1069 o_ptr->artifact_bias = BIAS_PRIESTLY;
1070 else if (!o_ptr->artifact_bias && one_in_(6))
1071 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1075 add_flag(o_ptr->art_flags, TR_LITE_1);
1079 add_flag(o_ptr->art_flags, TR_LEVITATION);
1084 add_flag(o_ptr->art_flags, TR_SEE_INVIS);
1088 add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
1092 add_flag(o_ptr->art_flags, TR_REGEN);
1095 add_flag(o_ptr->art_flags, TR_TELEPORT);
1100 if (object_is_armour(o_ptr))
1104 o_ptr->to_a = 4 + randint1(11);
1113 add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1114 bonus_h = 4 + (HIT_PROB)(randint1(11));
1115 bonus_d = 4 + (HIT_POINT)(randint1(11));
1116 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))
1121 o_ptr->to_h += bonus_h;
1122 o_ptr->to_d += bonus_d;
1126 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1129 add_flag(o_ptr->art_flags, TR_NO_TELE);
1132 add_flag(o_ptr->art_flags, TR_WARNING);
1136 switch (randint1(3))
1139 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
1140 if (!o_ptr->artifact_bias && one_in_(3))
1141 o_ptr->artifact_bias = BIAS_LAW;
1144 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
1145 if (!o_ptr->artifact_bias && one_in_(3))
1146 o_ptr->artifact_bias = BIAS_MAGE;
1149 add_flag(o_ptr->art_flags, TR_TELEPATHY);
1150 if (!o_ptr->artifact_bias && one_in_(9))
1151 o_ptr->artifact_bias = BIAS_MAGE;
1159 int n = randint1(3);
1161 idx[0] = randint1(10);
1163 idx[1] = randint1(9);
1164 if (idx[1] >= idx[0]) idx[1]++;
1166 idx[2] = randint1(8);
1167 if (idx[2] >= idx[0]) idx[2]++;
1168 if (idx[2] >= idx[1]) idx[2]++;
1170 while (n--) switch (idx[n])
1173 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
1174 if (!o_ptr->artifact_bias && one_in_(4))
1175 o_ptr->artifact_bias = BIAS_RANGER;
1178 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
1179 if (!o_ptr->artifact_bias && one_in_(3))
1180 o_ptr->artifact_bias = BIAS_PRIESTLY;
1181 else if (!o_ptr->artifact_bias && one_in_(6))
1182 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1185 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
1188 add_flag(o_ptr->art_flags, TR_ESP_ORC);
1191 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
1194 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
1197 add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
1200 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
1201 if (!o_ptr->artifact_bias && one_in_(6))
1202 o_ptr->artifact_bias = BIAS_ROGUE;
1205 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
1206 if (!o_ptr->artifact_bias && one_in_(3))
1207 o_ptr->artifact_bias = BIAS_LAW;
1210 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
1211 if (!o_ptr->artifact_bias && one_in_(3))
1212 o_ptr->artifact_bias = BIAS_LAW;
1221 * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
1222 * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
1223 * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
1224 * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
1225 * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
1226 * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
1227 * @param o_ptr 対象のオブジェクト構造体ポインタ
1230 static void random_slay(object_type *o_ptr)
1232 if (o_ptr->tval == TV_BOW)
1234 switch (randint1(6))
1239 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1240 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1241 if (!o_ptr->artifact_bias && one_in_(9))
1242 o_ptr->artifact_bias = BIAS_RANGER;
1245 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1246 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1247 if (!o_ptr->artifact_bias && one_in_(9))
1248 o_ptr->artifact_bias = BIAS_RANGER;
1255 switch (o_ptr->artifact_bias)
1258 if (!(have_flag(o_ptr->art_flags, TR_CHAOTIC)))
1260 add_flag(o_ptr->art_flags, TR_CHAOTIC);
1261 if (one_in_(2)) return;
1266 if((o_ptr->tval == TV_SWORD || o_ptr->tval == TV_POLEARM) &&
1267 !(have_flag(o_ptr->art_flags, TR_BLESSED)))
1269 /* A free power for "priestly" random artifacts */
1270 add_flag(o_ptr->art_flags, TR_BLESSED);
1274 case BIAS_NECROMANTIC:
1275 if (!(have_flag(o_ptr->art_flags, TR_VAMPIRIC)))
1277 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1278 if (one_in_(2)) return;
1280 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)) && one_in_(2))
1282 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1283 if (one_in_(2)) return;
1288 if (!(have_flag(o_ptr->art_flags, TR_SLAY_ANIMAL)))
1290 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1291 if (one_in_(2)) return;
1296 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) ||
1297 ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR))) &&
1298 !(have_flag(o_ptr->art_flags, TR_THROW)))
1300 /* Free power for rogues... */
1301 add_flag(o_ptr->art_flags, TR_THROW);
1303 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1305 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1306 if (one_in_(2)) return;
1311 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1313 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1314 if (one_in_(2)) return;
1319 if (!(have_flag(o_ptr->art_flags, TR_BRAND_FIRE)))
1321 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1322 if (one_in_(2)) return;
1327 if (!(have_flag(o_ptr->art_flags, TR_BRAND_COLD)))
1329 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1330 if (one_in_(2)) return;
1335 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ELEC)))
1337 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1338 if (one_in_(2)) return;
1343 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ACID)))
1345 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1346 if (one_in_(2)) return;
1351 if (!(have_flag(o_ptr->art_flags, TR_SLAY_EVIL)))
1353 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1354 if (one_in_(2)) return;
1356 if (!(have_flag(o_ptr->art_flags, TR_SLAY_UNDEAD)))
1358 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1359 if (one_in_(2)) return;
1361 if (!(have_flag(o_ptr->art_flags, TR_SLAY_DEMON)))
1363 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1364 if (one_in_(2)) return;
1369 switch (randint1(36))
1375 add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
1379 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1386 add_flag(o_ptr->art_flags, TR_KILL_EVIL);
1390 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1392 if (!o_ptr->artifact_bias && one_in_(2))
1393 o_ptr->artifact_bias = BIAS_LAW;
1394 else if (!o_ptr->artifact_bias && one_in_(9))
1395 o_ptr->artifact_bias = BIAS_PRIESTLY;
1401 add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
1405 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1407 if (!o_ptr->artifact_bias && one_in_(9))
1408 o_ptr->artifact_bias = BIAS_PRIESTLY;
1414 add_flag(o_ptr->art_flags, TR_KILL_DEMON);
1418 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1420 if (!o_ptr->artifact_bias && one_in_(9))
1421 o_ptr->artifact_bias = BIAS_PRIESTLY;
1427 add_flag(o_ptr->art_flags, TR_KILL_ORC);
1431 add_flag(o_ptr->art_flags, TR_SLAY_ORC);
1438 add_flag(o_ptr->art_flags, TR_KILL_TROLL);
1442 add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1449 add_flag(o_ptr->art_flags, TR_KILL_GIANT);
1453 add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1458 add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1461 add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1465 if (o_ptr->tval == TV_SWORD)
1467 add_flag(o_ptr->art_flags, TR_VORPAL);
1468 if (!o_ptr->artifact_bias && one_in_(9))
1469 o_ptr->artifact_bias = BIAS_WARRIOR;
1475 add_flag(o_ptr->art_flags, TR_IMPACT);
1479 add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1480 if (!o_ptr->artifact_bias)
1481 o_ptr->artifact_bias = BIAS_FIRE;
1485 add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1486 if (!o_ptr->artifact_bias)
1487 o_ptr->artifact_bias = BIAS_COLD;
1491 add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1492 if (!o_ptr->artifact_bias)
1493 o_ptr->artifact_bias = BIAS_ELEC;
1497 add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1498 if (!o_ptr->artifact_bias)
1499 o_ptr->artifact_bias = BIAS_ACID;
1503 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1504 if (!o_ptr->artifact_bias && !one_in_(3))
1505 o_ptr->artifact_bias = BIAS_POIS;
1506 else if (!o_ptr->artifact_bias && one_in_(6))
1507 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1508 else if (!o_ptr->artifact_bias)
1509 o_ptr->artifact_bias = BIAS_ROGUE;
1512 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1513 if (!o_ptr->artifact_bias)
1514 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1517 add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1518 if (!o_ptr->artifact_bias)
1519 o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
1525 add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
1529 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1533 add_flag(o_ptr->art_flags, TR_CHAOTIC);
1534 if (!o_ptr->artifact_bias)
1535 o_ptr->artifact_bias = BIAS_CHAOS;
1541 * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
1542 * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
1543 * @param o_ptr 対象のオブジェクト構造体ポインタ
1546 static void give_activation_power(object_type *o_ptr)
1548 int type = 0, chance = 0;
1550 switch (o_ptr->artifact_bias)
1555 type = ACT_BO_ELEC_1;
1557 else if (!one_in_(5))
1559 type = ACT_BA_ELEC_2;
1563 type = ACT_BA_ELEC_3;
1569 type = ACT_BA_POIS_1;
1576 type = ACT_BO_FIRE_1;
1578 else if (!one_in_(5))
1580 type = ACT_BA_FIRE_1;
1584 type = ACT_BA_FIRE_2;
1592 type = ACT_BO_COLD_1;
1593 else if (!one_in_(3))
1594 type = ACT_BA_COLD_1;
1595 else if (!one_in_(3))
1596 type = ACT_BA_COLD_2;
1598 type = ACT_BA_COLD_3;
1604 type = ACT_SUMMON_DEMON;
1606 type = ACT_CALL_CHAOS;
1613 type = ACT_CHARM_UNDEAD;
1614 else if (one_in_(12))
1615 type = ACT_BANISH_EVIL;
1616 else if (one_in_(11))
1617 type = ACT_DISP_EVIL;
1618 else if (one_in_(10))
1619 type = ACT_PROT_EVIL;
1620 else if (one_in_(9))
1621 type = ACT_CURE_1000;
1622 else if (one_in_(8))
1623 type = ACT_CURE_700;
1624 else if (one_in_(7))
1625 type = ACT_REST_ALL;
1626 else if (one_in_(6))
1627 type = ACT_REST_EXP;
1632 case BIAS_NECROMANTIC:
1636 else if (one_in_(13))
1637 type = ACT_DISP_GOOD;
1638 else if (one_in_(9))
1639 type = ACT_MASS_GENO;
1640 else if (one_in_(8))
1641 type = ACT_GENOCIDE;
1642 else if (one_in_(13))
1643 type = ACT_SUMMON_UNDEAD;
1644 else if (one_in_(9))
1646 else if (one_in_(6))
1647 type = ACT_CHARM_UNDEAD;
1655 type = ACT_BANISH_EVIL;
1656 else if (one_in_(4))
1657 type = ACT_DISP_EVIL;
1659 type = ACT_PROT_EVIL;
1666 else if (one_in_(4))
1668 else if (one_in_(3))
1669 type = ACT_DETECT_ALL;
1670 else if (one_in_(8))
1673 type = ACT_ID_PLAIN;
1679 type = ACT_SUMMON_ELEMENTAL;
1680 else if (one_in_(10))
1681 type = ACT_SUMMON_PHANTOM;
1682 else if (one_in_(5))
1683 type = ACT_RUNE_EXPLO;
1699 type = ACT_CHARM_ANIMALS;
1700 else if (one_in_(7))
1701 type = ACT_SUMMON_ANIMAL;
1702 else if (one_in_(6))
1703 type = ACT_CHARM_ANIMAL;
1704 else if (one_in_(4))
1705 type = ACT_RESIST_ALL;
1706 else if (one_in_(3))
1709 type = ACT_CURE_POISON;
1713 if (!type || (randint1(100) >= chance))
1715 one_activation(o_ptr);
1719 /* A type was chosen... */
1720 o_ptr->xtra2 = (byte_hack)type;
1721 add_flag(o_ptr->art_flags, TR_ACTIVATE);
1726 * @brief ランダムアーティファクト生成中、対象のオブジェクトに名前を与える。/ Set name of randomartifact.
1727 * @details 確率によって、シンダリン銘、漢字銘、固定名のいずれか一つが与えられる。
1728 * @param o_ptr 処理中のアイテム参照ポインタ
1729 * @param return_name 名前を返すための文字列参照ポインタ
1730 * @param armour 対象のオブジェクトが防具が否か
1731 * @param power 銘の基準となるオブジェクトの価値レベル(0=呪い、1=低位、2=中位、3以上=高位)
1734 static void get_random_name(object_type *o_ptr, char *return_name, bool armour, int power)
1736 PERCENTAGE prob = randint1(100);
1738 if (prob <= SINDARIN_NAME)
1740 get_table_sindarin(return_name);
1742 else if (prob <= TABLE_NAME)
1744 get_table_name(return_name);
1756 filename = _("a_cursed_j.txt", "a_cursed.txt");
1759 filename = _("a_low_j.txt", "a_low.txt");
1762 filename = _("a_med_j.txt", "a_med.txt");
1765 filename = _("a_high_j.txt", "a_high.txt");
1772 filename = _("w_cursed_j.txt", "w_cursed.txt");
1775 filename = _("w_low_j.txt", "w_low.txt");
1778 filename = _("w_med_j.txt", "w_med.txt");
1781 filename = _("w_high_j.txt", "w_high.txt");
1785 (void)get_rnd_line(filename, o_ptr->artifact_bias, return_name);
1787 if (return_name[0] == 0) get_table_name(return_name);
1793 * @brief ランダムアーティファクト生成のメインルーチン
1794 * @details 既に生成が済んでいるオブジェクトの構造体を、アーティファクトとして強化する。
1795 * @param o_ptr 対象のオブジェクト構造体ポインタ
1796 * @param a_scroll アーティファクト生成の巻物上の処理。呪いのアーティファクトが生成対象外となる。
1797 * @return 常にTRUE(1)を返す
1799 bool create_artifact(object_type *o_ptr, bool a_scroll)
1801 GAME_TEXT new_name[1024];
1802 PARAMETER_VALUE has_pval = 0;
1803 int powers = randint1(5) + 1;
1805 int max_type = (object_is_weapon_ammo(o_ptr) ? 7 : 5);
1808 bool a_cursed = FALSE;
1809 int warrior_artifact_bias = 0;
1812 /* Reset artifact bias */
1813 o_ptr->artifact_bias = 0;
1815 /* Nuke enchantments */
1819 for (i = 0; i < TR_FLAG_SIZE; i++)
1820 o_ptr->art_flags[i] |= k_info[o_ptr->k_idx].flags[i];
1822 if (o_ptr->pval) has_pval = TRUE;
1824 if (a_scroll && one_in_(4))
1826 switch (p_ptr->pclass)
1829 case CLASS_BERSERKER:
1834 o_ptr->artifact_bias = BIAS_WARRIOR;
1837 case CLASS_HIGH_MAGE:
1838 case CLASS_SORCERER:
1839 case CLASS_MAGIC_EATER:
1840 case CLASS_BLUE_MAGE:
1841 o_ptr->artifact_bias = BIAS_MAGE;
1844 o_ptr->artifact_bias = BIAS_PRIESTLY;
1848 o_ptr->artifact_bias = BIAS_ROGUE;
1849 warrior_artifact_bias = 25;
1853 o_ptr->artifact_bias = BIAS_RANGER;
1854 warrior_artifact_bias = 30;
1857 o_ptr->artifact_bias = BIAS_PRIESTLY;
1858 warrior_artifact_bias = 40;
1860 case CLASS_WARRIOR_MAGE:
1861 case CLASS_RED_MAGE:
1862 o_ptr->artifact_bias = BIAS_MAGE;
1863 warrior_artifact_bias = 40;
1865 case CLASS_CHAOS_WARRIOR:
1866 o_ptr->artifact_bias = BIAS_CHAOS;
1867 warrior_artifact_bias = 40;
1870 case CLASS_FORCETRAINER:
1871 o_ptr->artifact_bias = BIAS_PRIESTLY;
1873 case CLASS_MINDCRAFTER:
1875 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_PRIESTLY;
1878 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_WARRIOR;
1880 case CLASS_IMITATOR:
1881 if (randint1(2) > 1) o_ptr->artifact_bias = BIAS_RANGER;
1883 case CLASS_BEASTMASTER:
1884 o_ptr->artifact_bias = BIAS_CHR;
1885 warrior_artifact_bias = 50;
1887 case CLASS_MIRROR_MASTER:
1888 if (randint1(4) > 1)
1890 o_ptr->artifact_bias = BIAS_MAGE;
1894 o_ptr->artifact_bias = BIAS_ROGUE;
1900 if (a_scroll && (randint1(100) <= warrior_artifact_bias))
1901 o_ptr->artifact_bias = BIAS_WARRIOR;
1903 strcpy(new_name, "");
1905 if (!a_scroll && one_in_(A_CURSED))
1907 if (((o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) && object_is_cursed(o_ptr))
1910 while (one_in_(powers) || one_in_(7) || one_in_(10))
1913 if (!a_cursed && one_in_(WEIRD_LUCK))
1916 if (a_cursed) powers /= 2;
1918 max_powers = powers;
1922 switch (randint1(max_type))
1929 if (one_in_(2) && object_is_weapon_ammo(o_ptr) && (o_ptr->tval != TV_BOW))
1931 if (a_cursed && !one_in_(13)) break;
1934 if (one_in_(o_ptr->ds+4)) o_ptr->ds++;
1938 if (one_in_(o_ptr->dd+1)) o_ptr->dd++;
1942 random_resistance(o_ptr);
1951 if (p_ptr->wizard) msg_print("Switch error in create_artifact!");
1958 if (have_flag(o_ptr->art_flags, TR_BLOWS))
1960 o_ptr->pval = randint1(2);
1961 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
1970 while (o_ptr->pval < randint1(5) || one_in_(o_ptr->pval));
1973 if ((o_ptr->pval > 4) && !one_in_(WEIRD_LUCK))
1978 /* give it some plusses... */
1979 if (object_is_armour(o_ptr))
1980 o_ptr->to_a += randint1(o_ptr->to_a > 19 ? 1 : 20 - o_ptr->to_a);
1981 else if (object_is_weapon_ammo(o_ptr))
1983 o_ptr->to_h += randint1(o_ptr->to_h > 19 ? 1 : 20 - o_ptr->to_h);
1984 o_ptr->to_d += randint1(o_ptr->to_d > 19 ? 1 : 20 - o_ptr->to_d);
1985 if ((have_flag(o_ptr->art_flags, TR_WIS)) && (o_ptr->pval > 0)) add_flag(o_ptr->art_flags, TR_BLESSED);
1988 /* Just to be sure */
1989 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1990 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1991 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1992 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1994 total_flags = flag_cost(o_ptr, o_ptr->pval);
1996 if (a_cursed) curse_artifact(o_ptr);
1999 one_in_(object_is_armour(o_ptr) ? ACTIVATION_CHANCE * 2 : ACTIVATION_CHANCE))
2002 give_activation_power(o_ptr);
2005 if (object_is_armour(o_ptr))
2007 while ((o_ptr->to_d+o_ptr->to_h) > 20)
2009 if (one_in_(o_ptr->to_d) && one_in_(o_ptr->to_h)) break;
2010 o_ptr->to_d -= (HIT_POINT)randint0(3);
2011 o_ptr->to_h -= (HIT_PROB)randint0(3);
2013 while ((o_ptr->to_d+o_ptr->to_h) > 10)
2015 if (one_in_(o_ptr->to_d) || one_in_(o_ptr->to_h)) break;
2016 o_ptr->to_d -= (HIT_POINT)randint0(3);
2017 o_ptr->to_h -= (HIT_PROB)randint0(3);
2021 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);
2023 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
2027 remove_flag(o_ptr->art_flags, TR_BLOWS);
2028 remove_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
2029 remove_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
2030 remove_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2031 remove_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
2032 remove_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2033 remove_flag(o_ptr->art_flags, TR_SLAY_ORC);
2034 remove_flag(o_ptr->art_flags, TR_SLAY_TROLL);
2035 remove_flag(o_ptr->art_flags, TR_SLAY_GIANT);
2036 remove_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
2037 remove_flag(o_ptr->art_flags, TR_KILL_DRAGON);
2038 remove_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2039 remove_flag(o_ptr->art_flags, TR_VORPAL);
2040 remove_flag(o_ptr->art_flags, TR_BRAND_POIS);
2041 remove_flag(o_ptr->art_flags, TR_BRAND_ACID);
2042 remove_flag(o_ptr->art_flags, TR_BRAND_ELEC);
2043 remove_flag(o_ptr->art_flags, TR_BRAND_FIRE);
2044 remove_flag(o_ptr->art_flags, TR_BRAND_COLD);
2047 if (!object_is_weapon_ammo(o_ptr))
2050 if (a_cursed) power_level = 0;
2051 else if (total_flags < 15000) power_level = 1;
2052 else if (total_flags < 35000) power_level = 2;
2053 else power_level = 3;
2059 if (a_cursed) power_level = 0;
2060 else if (total_flags < 20000) power_level = 1;
2061 else if (total_flags < 45000) power_level = 2;
2062 else power_level = 3;
2066 while (has_extreme_damage_rate(o_ptr) && !one_in_(SWORDFISH_LUCK))
2068 weakening_artifact(o_ptr);
2073 GAME_TEXT dummy_name[MAX_NLEN] = "";
2074 concptr ask_msg = _("このアーティファクトを何と名付けますか?", "What do you want to call the artifact? ");
2076 object_aware(o_ptr);
2077 object_known(o_ptr);
2079 /* Mark the item as fully known */
2080 o_ptr->ident |= (IDENT_MENTAL);
2082 /* For being treated as random artifact in screen_object() */
2083 o_ptr->art_name = quark_add("");
2085 (void)screen_object(o_ptr, 0L);
2087 if (!get_string(ask_msg, dummy_name, sizeof dummy_name)
2093 get_table_sindarin_aux(dummy_name);
2097 get_table_name_aux(dummy_name);
2100 sprintf(new_name, _("《%s》", "'%s'"), dummy_name);
2101 chg_virtue(V_INDIVIDUALISM, 2);
2102 chg_virtue(V_ENCHANT, 5);
2106 get_random_name(o_ptr, new_name, object_is_armour(o_ptr), power_level);
2109 /* Save the inscription */
2110 o_ptr->art_name = quark_add(new_name);
2112 msg_format_wizard(CHEAT_OBJECT, _("パワー %d で 価値%ld のランダムアーティファクト生成 バイアスは「%s」",
2113 "Random artifact generated - Power:%d Value:%d Bias:%s."), max_powers, total_flags, artifact_bias_name[o_ptr->artifact_bias]);
2115 p_ptr->window |= (PW_INVEN | PW_EQUIP);
2121 * @brief オブジェクトから能力発動IDを取得する。
2122 * @details いくつかのケースで定義されている発動効果から、
2123 * 鍛冶師による付与>固定アーティファクト>エゴ>ランダムアーティファクト>ベースアイテムの優先順位で走査していく。
2124 * @param o_ptr 対象のオブジェクト構造体ポインタ
2125 * @return 発動効果のIDを返す
2127 int activation_index(object_type *o_ptr)
2129 /* Give priority to weaponsmith's essential activations */
2130 if (object_is_smith(o_ptr))
2132 switch (o_ptr->xtra3 - 1)
2134 case ESSENCE_TMP_RES_ACID: return ACT_RESIST_ACID;
2135 case ESSENCE_TMP_RES_ELEC: return ACT_RESIST_ELEC;
2136 case ESSENCE_TMP_RES_FIRE: return ACT_RESIST_FIRE;
2137 case ESSENCE_TMP_RES_COLD: return ACT_RESIST_COLD;
2138 case TR_IMPACT: return ACT_QUAKE;
2142 if (object_is_fixed_artifact(o_ptr))
2144 if (have_flag(a_info[o_ptr->name1].flags, TR_ACTIVATE))
2146 return a_info[o_ptr->name1].act_idx;
2149 if (object_is_ego(o_ptr))
2151 if (have_flag(e_info[o_ptr->name2].flags, TR_ACTIVATE))
2153 return e_info[o_ptr->name2].act_idx;
2156 if (!object_is_random_artifact(o_ptr))
2158 if (have_flag(k_info[o_ptr->k_idx].flags, TR_ACTIVATE))
2160 return k_info[o_ptr->k_idx].act_idx;
2164 return o_ptr->xtra2;
2168 * @brief オブジェクトから発動効果構造体のポインタを取得する。
2169 * @details activation_index() 関数の結果から参照する。
2170 * @param o_ptr 対象のオブジェクト構造体ポインタ
2171 * @return 発動効果構造体のポインタを返す
2173 const activation_type* find_activation_info(object_type *o_ptr)
2175 const int index = activation_index(o_ptr);
2176 const activation_type* p;
2178 for (p = activation_info; p->flag != NULL; ++ p) {
2179 if (p->index == index)
2189 * @brief 固定アーティファクト生成時の特別なハードコーディング処理を行う。.
2190 * @details random_artifact_resistance()とあるが実際は固定アーティファクトである。
2191 * 対象は恐怖の仮面、村正、ロビントンのハープ、龍争虎鬪、ブラッディムーン、羽衣、天女の羽衣、ミリム、
2193 * @attention プレイヤーの各種ステータスに依存した処理がある。
2194 * @todo 折を見て関数名を変更すること。
2195 * @param o_ptr 対象のオブジェクト構造体ポインタ
2196 * @param a_ptr 生成する固定アーティファクト構造体ポインタ
2199 void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
2201 bool give_resistance = FALSE, give_power = FALSE;
2203 if (o_ptr->name1 == ART_TERROR) /* Terror Mask is for warriors... */
2205 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_ARCHER || p_ptr->pclass == CLASS_CAVALRY || p_ptr->pclass == CLASS_BERSERKER)
2208 give_resistance = TRUE;
2212 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2213 add_flag(o_ptr->art_flags, TR_TY_CURSE);
2214 o_ptr->curse_flags |=
2215 (TRC_CURSED | TRC_HEAVY_CURSE);
2216 o_ptr->curse_flags |= get_curse(2, o_ptr);
2221 if (o_ptr->name1 == ART_MURAMASA)
2223 if (p_ptr->pclass != CLASS_SAMURAI)
2225 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2226 o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2230 if (o_ptr->name1 == ART_ROBINTON)
2232 if (p_ptr->pclass == CLASS_BARD)
2234 add_flag(o_ptr->art_flags, TR_DEC_MANA);
2238 if (o_ptr->name1 == ART_XIAOLONG)
2240 if (p_ptr->pclass == CLASS_MONK)
2241 add_flag(o_ptr->art_flags, TR_BLOWS);
2244 if (o_ptr->name1 == ART_BLOOD)
2246 get_bloody_moon_flags(o_ptr);
2249 if (o_ptr->name1 == ART_HEAVENLY_MAIDEN)
2251 if (p_ptr->psex != SEX_FEMALE)
2253 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2257 if (o_ptr->name1 == ART_MILIM)
2259 if (p_ptr->pseikaku == SEIKAKU_SEXY)
2262 add_flag(o_ptr->art_flags, TR_STR);
2263 add_flag(o_ptr->art_flags, TR_INT);
2264 add_flag(o_ptr->art_flags, TR_WIS);
2265 add_flag(o_ptr->art_flags, TR_DEX);
2266 add_flag(o_ptr->art_flags, TR_CON);
2267 add_flag(o_ptr->art_flags, TR_CHR);
2271 if (a_ptr->gen_flags & (TRG_XTRA_POWER)) give_power = TRUE;
2272 if (a_ptr->gen_flags & (TRG_XTRA_H_RES)) give_resistance = TRUE;
2273 if (a_ptr->gen_flags & (TRG_XTRA_RES_OR_POWER))
2275 /* Give a resistance OR a power */
2276 if (one_in_(2)) give_resistance = TRUE;
2277 else give_power = TRUE;
2285 if (give_resistance)
2287 one_high_resistance(o_ptr);
2293 * @brief フロアの指定された位置に固定アーティファクトを生成する。 / Create the artifact of the specified number
2294 * @details 固定アーティファクト構造体から基本ステータスをコピーした後、所定の座標でdrop_item()で落とす。
2295 * @param a_idx 生成する固定アーティファクト構造体のID
2296 * @param y アイテムを落とす地点のy座標
2297 * @param x アイテムを落とす地点のx座標
2298 * @return 生成が成功したか否か、失敗はIDの不全、ベースアイテムの不全、drop_item()の失敗時に起こる。
2299 * @attention この処理はdrop_near()内で普通の固定アーティファクトが重ならない性質に依存する.
2300 * 仮に2個以上存在可能かつ装備品以外の固定アーティファクトが作成されれば
2301 * drop_near()関数の返り値は信用できなくなる.
2303 bool create_named_art(ARTIFACT_IDX a_idx, POSITION y, POSITION x)
2309 artifact_type *a_ptr = &a_info[a_idx];
2312 /* Ignore "empty" artifacts */
2313 if (!a_ptr->name) return FALSE;
2315 /* Acquire the "kind" index */
2316 i = lookup_kind(a_ptr->tval, a_ptr->sval);
2318 if (!i) return FALSE;
2320 /* Create the artifact */
2321 object_prep(q_ptr, i);
2324 q_ptr->name1 = a_idx;
2326 /* Extract the fields */
2327 q_ptr->pval = a_ptr->pval;
2328 q_ptr->ac = a_ptr->ac;
2329 q_ptr->dd = a_ptr->dd;
2330 q_ptr->ds = a_ptr->ds;
2331 q_ptr->to_a = a_ptr->to_a;
2332 q_ptr->to_h = a_ptr->to_h;
2333 q_ptr->to_d = a_ptr->to_d;
2334 q_ptr->weight = a_ptr->weight;
2336 /* Hack -- extract the "cursed" flag */
2337 if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
2338 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2339 if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
2340 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
2341 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
2342 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
2344 random_artifact_resistance(q_ptr, a_ptr);
2346 /* Drop the artifact from heaven */
2347 return drop_near(q_ptr, -1, y, x) ? TRUE : FALSE;
2351 HIT_POINT calc_arm_avgdamage(object_type *o_ptr)
2353 BIT_FLAGS flgs[TR_FLAG_SIZE];
2354 object_flags(o_ptr, flgs);
2356 HIT_POINT dam, base, s_evil, forced, vorpal;
2357 s_evil = forced = vorpal = 0;
2358 dam = base = (o_ptr->dd * o_ptr->ds + o_ptr->dd) / 2;
2360 if(have_flag(flgs, TR_KILL_EVIL))
2362 dam = s_evil = dam * 7 / 2;
2364 else if(!have_flag(flgs, TR_KILL_EVIL) && have_flag(flgs, TR_SLAY_EVIL))
2366 dam = s_evil = dam * 2;
2370 if (have_flag(flgs, TR_FORCE_WEAPON))
2372 dam = forced = dam * 3 / 2 + (o_ptr->dd * o_ptr->ds + o_ptr->dd);
2376 if(have_flag(flgs, TR_VORPAL))
2378 dam = vorpal = dam * 11 / 9;
2382 dam = dam + o_ptr->to_d;
2384 msg_format_wizard(CHEAT_OBJECT,"素:%d> 対邪:%d> 理力:%d> 切:%d> 最終:%d", base, s_evil, forced, vorpal, dam);
2389 static bool has_extreme_damage_rate(object_type *o_ptr)
2391 BIT_FLAGS flgs[TR_FLAG_SIZE];
2392 object_flags(o_ptr, flgs);
2394 if (have_flag(flgs, TR_VAMPIRIC))
2396 if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 52))
2400 else if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 43))
2404 else if( have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 33))
2408 else if (calc_arm_avgdamage(o_ptr) > 63)
2415 if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 65))
2419 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 52))
2423 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 40))
2427 else if (calc_arm_avgdamage(o_ptr) > 75)
2435 static bool weakening_artifact(object_type *o_ptr)
2437 KIND_OBJECT_IDX k_idx = lookup_kind(o_ptr->tval, o_ptr->sval);
2438 object_kind *k_ptr = &k_info[k_idx];
2439 BIT_FLAGS flgs[TR_FLAG_SIZE];
2440 object_flags(o_ptr, flgs);
2442 if (have_flag(flgs, TR_KILL_EVIL))
2444 remove_flag(o_ptr->art_flags, TR_KILL_EVIL);
2445 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2448 else if (k_ptr->dd < o_ptr->dd)
2453 else if (k_ptr->ds < o_ptr->ds)
2458 else if (o_ptr->to_d > 10)
2460 o_ptr->to_d = o_ptr->to_d - damroll(1, 6);
2461 if (o_ptr->to_d < 10)