OSDN Git Service

[Refactor] #37353 is_open() を cave.c へ移動。 / Move is_open() to cave.c.
[hengband/hengband.git] / src / artifact.c
1 /*!
2  * @file artifact.c
3  * @brief アーティファクトの生成と管理 / Artifact code
4  * @date 2013/12/11
5  * @author
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.
11  */
12
13 #include "angband.h"
14
15 #include "avatar.h"
16 #include "cmd-activate.h"
17 #include "object-curse.h"
18 #include "artifact.h"
19
20 static bool has_extreme_damage_rate(object_type *o_ptr);
21 static bool weakening_artifact(object_type *o_ptr);
22
23
24 /*!
25  * @brief 対象のオブジェクトにランダムな上位耐性を一つ付加する。/ Choose one random high resistance
26  * @details 重複の抑止はない。候補は毒、閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、劣化、恐怖のいずれか。
27  * @param o_ptr 対象のオブジェクト構造体ポインタ
28  * @return なし
29  */
30 void one_high_resistance(object_type *o_ptr)
31 {
32         switch (randint0(12))
33         {
34                 case  0: add_flag(o_ptr->art_flags, TR_RES_POIS);   break;
35                 case  1: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
36                 case  2: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
37                 case  3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
38                 case  4: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
39                 case  5: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
40                 case  6: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
41                 case  7: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
42                 case  8: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
43                 case  9: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
44                 case 10: add_flag(o_ptr->art_flags, TR_RES_DISEN);  break;
45                 case 11: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
46         }
47 }
48
49 /*!
50  * @brief 対象のオブジェクトに王者の指輪向けの上位耐性を一つ付加する。/ Choose one random high resistance
51  * @details 候補は閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、恐怖であり
52  * 王者の指輪にあらかじめついている耐性をone_high_resistance()から除外したものである。
53  * ランダム付加そのものに重複の抑止はない。
54  * @param o_ptr 対象のオブジェクト構造体ポインタ
55  * @return なし
56  */
57 void one_lordly_high_resistance(object_type *o_ptr)
58 {
59         switch (randint0(10))
60         {
61                 case 0: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
62                 case 1: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
63                 case 2: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
64                 case 3: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
65                 case 4: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
66                 case 5: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
67                 case 6: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
68                 case 7: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
69                 case 8: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
70                 case 9: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
71         }
72 }
73
74 /*!
75  * @brief 対象のオブジェクトに元素耐性を一つ付加する。/ Choose one random element resistance
76  * @details 候補は火炎、冷気、電撃、酸のいずれかであり、重複の抑止はない。
77  * @param o_ptr 対象のオブジェクト構造体ポインタ
78  * @return なし
79  */
80 void one_ele_resistance(object_type *o_ptr)
81 {
82         switch (randint0(4))
83         {
84                 case  0: add_flag(o_ptr->art_flags, TR_RES_ACID); break;
85                 case  1: add_flag(o_ptr->art_flags, TR_RES_ELEC); break;
86                 case  2: add_flag(o_ptr->art_flags, TR_RES_COLD); break;
87                 case  3: add_flag(o_ptr->art_flags, TR_RES_FIRE); break;
88         }
89 }
90
91 /*!
92  * @brief 対象のオブジェクトにドラゴン装備向け元素耐性を一つ付加する。/ Choose one random element or poison resistance
93  * @details 候補は1/7の確率で毒、6/7の確率で火炎、冷気、電撃、酸のいずれか(one_ele_resistance()のコール)であり、重複の抑止はない。
94  * @param o_ptr 対象のオブジェクト構造体ポインタ
95  * @return なし
96  */
97 void one_dragon_ele_resistance(object_type *o_ptr)
98 {
99         if (one_in_(7))
100         {
101                 add_flag(o_ptr->art_flags, TR_RES_POIS);
102         }
103         else
104         {
105                 one_ele_resistance(o_ptr);
106         }
107 }
108
109 /*!
110  * @brief 対象のオブジェクトに弱いESPを一つ付加する。/ Choose one lower rank esp
111  * @details 候補は動物、アンデッド、悪魔、オーク、トロル、巨人、
112  * ドラゴン、人間、善良、ユニークESPのいずれかであり、重複の抑止はない。
113  * @param o_ptr 対象のオブジェクト構造体ポインタ
114  * @return なし
115  */
116 void one_low_esp(object_type *o_ptr)
117 {
118         switch (randint1(10))
119         {
120                 case 1:  add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);   break;
121                 case 2:  add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);   break;
122                 case 3:  add_flag(o_ptr->art_flags, TR_ESP_DEMON);   break;
123                 case 4:  add_flag(o_ptr->art_flags, TR_ESP_ORC);   break;
124                 case 5:  add_flag(o_ptr->art_flags, TR_ESP_TROLL);   break;
125                 case 6:  add_flag(o_ptr->art_flags, TR_ESP_GIANT);   break;
126                 case 7:  add_flag(o_ptr->art_flags, TR_ESP_DRAGON);   break;
127                 case 8:  add_flag(o_ptr->art_flags, TR_ESP_HUMAN);   break;
128                 case 9:  add_flag(o_ptr->art_flags, TR_ESP_GOOD);   break;
129                 case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);   break;
130         }
131 }
132
133
134 /*!
135  * @brief 対象のオブジェクトに耐性を一つ付加する。/ Choose one random resistance
136  * @details 1/3で元素耐性(one_ele_resistance())、2/3で上位耐性(one_high_resistance)
137  * をコールする。重複の抑止はない。
138  * @param o_ptr 対象のオブジェクト構造体ポインタ
139  * @return なし
140  */
141 void one_resistance(object_type *o_ptr)
142 {
143         if (one_in_(3))
144         {
145                 one_ele_resistance(o_ptr);
146         }
147         else
148         {
149                 one_high_resistance(o_ptr);
150         }
151 }
152
153
154 /*!
155  * @brief 対象のオブジェクトに能力を一つ付加する。/ Choose one random ability
156  * @details 候補は浮遊、永久光源+1、透明視、警告、遅消化、急回復、麻痺知らず、経験値維持のいずれか。
157  * 重複の抑止はない。
158  * @param o_ptr 対象のオブジェクト構造体ポインタ
159  * @return なし
160  */
161 void one_ability(object_type *o_ptr)
162 {
163         switch (randint0(10))
164         {
165         case 0: add_flag(o_ptr->art_flags, TR_LEVITATION);  break;
166         case 1: add_flag(o_ptr->art_flags, TR_LITE_1);      break;
167         case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS);   break;
168         case 3: add_flag(o_ptr->art_flags, TR_WARNING);     break;
169         case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
170         case 5: add_flag(o_ptr->art_flags, TR_REGEN);       break;
171         case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT);    break;
172         case 7: add_flag(o_ptr->art_flags, TR_HOLD_EXP);   break;
173         case 8:
174         case 9:
175                 one_low_esp(o_ptr);
176                 break;
177         }
178 }
179
180 /*!
181  * @brief 対象のオブジェクトに発動を一つ付加する。/ Choose one random activation
182  * @details 候補多数。ランダムアーティファクトのバイアスには一切依存せず、
183  * whileループによる構造で能力的に強力なものほど確率を落としている。
184  * @param o_ptr 対象のオブジェクト構造体ポインタ
185  * @return なし
186  */
187 void one_activation(object_type *o_ptr)
188 {
189         int type = 0;
190         int chance = 0;
191
192         while (randint1(100) >= chance)
193         {
194                 type = randint1(255);
195                 switch (type)
196                 {
197                         case ACT_SUNLIGHT:
198                         case ACT_BO_MISS_1:
199                         case ACT_BA_POIS_1:
200                         case ACT_BO_ELEC_1:
201                         case ACT_BO_ACID_1:
202                         case ACT_BO_COLD_1:
203                         case ACT_BO_FIRE_1:
204                         case ACT_CONFUSE:
205                         case ACT_SLEEP:
206                         case ACT_QUAKE:
207                         case ACT_CURE_LW:
208                         case ACT_CURE_MW:
209                         case ACT_CURE_POISON:
210                         case ACT_BERSERK:
211                         case ACT_LIGHT:
212                         case ACT_MAP_LIGHT:
213                         case ACT_DEST_DOOR:
214                         case ACT_STONE_MUD:
215                         case ACT_TELEPORT:
216                                 chance = 101;
217                                 break;
218                         case ACT_BA_COLD_1:
219                         case ACT_BA_FIRE_1:
220                         case ACT_HYPODYNAMIA_1:
221                         case ACT_TELE_AWAY:
222                         case ACT_ESP:
223                         case ACT_RESIST_ALL:
224                         case ACT_DETECT_ALL:
225                         case ACT_RECALL:
226                         case ACT_SATIATE:
227                         case ACT_RECHARGE:
228                                 chance = 85;
229                                 break;
230                         case ACT_TERROR:
231                         case ACT_PROT_EVIL:
232                         case ACT_ID_PLAIN:
233                                 chance = 75;
234                                 break;
235                         case ACT_HYPODYNAMIA_2:
236                         case ACT_DRAIN_1:
237                         case ACT_BO_MISS_2:
238                         case ACT_BA_FIRE_2:
239                         case ACT_REST_EXP:
240                                 chance = 66;
241                                 break;
242                         case ACT_BA_FIRE_3:
243                         case ACT_BA_COLD_3:
244                         case ACT_BA_ELEC_3:
245                         case ACT_WHIRLWIND:
246                         case ACT_DRAIN_2:
247                         case ACT_CHARM_ANIMAL:
248                                 chance = 50;
249                                 break;
250                         case ACT_SUMMON_ANIMAL:
251                                 chance = 40;
252                                 break;
253                         case ACT_DISP_EVIL:
254                         case ACT_BA_MISS_3:
255                         case ACT_DISP_GOOD:
256                         case ACT_BANISH_EVIL:
257                         case ACT_GENOCIDE:
258                         case ACT_MASS_GENO:
259                         case ACT_CHARM_UNDEAD:
260                         case ACT_CHARM_OTHER:
261                         case ACT_SUMMON_PHANTOM:
262                         case ACT_REST_ALL:
263                         case ACT_RUNE_EXPLO:
264                                 chance = 33;
265                                 break;
266                         case ACT_CALL_CHAOS:
267                         case ACT_ROCKET:
268                         case ACT_CHARM_ANIMALS:
269                         case ACT_CHARM_OTHERS:
270                         case ACT_SUMMON_ELEMENTAL:
271                         case ACT_CURE_700:
272                         case ACT_SPEED:
273                         case ACT_ID_FULL:
274                         case ACT_RUNE_PROT:
275                                 chance = 25;
276                                 break;
277                         case ACT_CURE_1000:
278                         case ACT_XTRA_SPEED:
279                         case ACT_DETECT_XTRA:
280                         case ACT_DIM_DOOR:
281                                 chance = 10;
282                                 break;
283                         case ACT_SUMMON_UNDEAD:
284                         case ACT_SUMMON_DEMON:
285                         case ACT_WRAITH:
286                         case ACT_INVULN:
287                         case ACT_ALCHEMY:
288                                 chance = 5;
289                                 break;
290                         default:
291                                 chance = 0;
292                 }
293         }
294
295         /* A type was chosen... */
296         o_ptr->xtra2 = (byte_hack)type;
297         add_flag(o_ptr->art_flags, TR_ACTIVATE);
298         o_ptr->timeout = 0;
299 }
300
301 /*!
302  * @brief ランダムアーティファクト生成中、対象のオブジェクトを呪いのアーティファクトにする経過処理。/ generation process of cursed artifact.
303  * @details pval、AC、命中、ダメージが正の場合、符号反転の上1d4だけ悪化させ、重い呪い、呪いフラグを必ず付加。
304  * 祝福を無効。確率に応じて、永遠の呪い、太古の怨念、経験値吸収、弱い呪いの継続的付加、強い呪いの継続的付加、HP吸収の呪い、
305  * MP吸収の呪い、乱テレポート、反テレポート、反魔法をつける。
306  * @attention プレイヤーの職業依存処理あり。
307  * @param o_ptr 対象のオブジェクト構造体ポインタ
308  * @return なし
309  */
310 static void curse_artifact(object_type * o_ptr)
311 {
312         if (o_ptr->pval > 0) o_ptr->pval = 0 - (o_ptr->pval + randint1(4));
313         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - (o_ptr->to_a + randint1(4));
314         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
315         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
316
317         o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
318         remove_flag(o_ptr->art_flags, TR_BLESSED);
319
320         if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
321         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
322         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
323         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
324         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
325         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
326         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
327         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
328         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_TELEPORT);
329         else if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
330
331         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))
332                 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
333 }
334
335 /*!
336  * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
337  * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
338  * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
339  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
340  * @param o_ptr 対象のオブジェクト構造体ポインタ
341  * @return なし
342  */
343 static void random_plus(object_type * o_ptr)
344 {
345         int this_type = (object_is_weapon_ammo(o_ptr) ? 23 : 19);
346
347         switch (o_ptr->artifact_bias)
348         {
349         case BIAS_WARRIOR:
350                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
351                 {
352                         add_flag(o_ptr->art_flags, TR_STR);
353                         if (one_in_(2)) return;
354                 }
355
356                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
357                 {
358                         add_flag(o_ptr->art_flags, TR_CON);
359                         if (one_in_(2)) return;
360                 }
361
362                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
363                 {
364                         add_flag(o_ptr->art_flags, TR_DEX);
365                         if (one_in_(2)) return;
366                 }
367                 break;
368
369         case BIAS_MAGE:
370                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
371                 {
372                         add_flag(o_ptr->art_flags, TR_INT);
373                         if (one_in_(2)) return;
374                 }
375                 if ((o_ptr->tval == TV_GLOVES) && !(have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)))
376                 {
377                         add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
378                         if (one_in_(2)) return;
379                 }
380                 break;
381
382         case BIAS_PRIESTLY:
383                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
384                 {
385                         add_flag(o_ptr->art_flags, TR_WIS);
386                         if (one_in_(2)) return;
387                 }
388                 break;
389
390         case BIAS_RANGER:
391                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
392                 {
393                         add_flag(o_ptr->art_flags, TR_DEX);
394                         if (one_in_(2)) return;
395                 }
396
397                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
398                 {
399                         add_flag(o_ptr->art_flags, TR_CON);
400                         if (one_in_(2)) return;
401                 }
402
403                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
404                 {
405                         add_flag(o_ptr->art_flags, TR_STR);
406                         if (one_in_(2)) return;
407                 }
408                 break;
409
410         case BIAS_ROGUE:
411                 if (!(have_flag(o_ptr->art_flags, TR_STEALTH)))
412                 {
413                         add_flag(o_ptr->art_flags, TR_STEALTH);
414                         if (one_in_(2)) return;
415                 }
416                 if (!(have_flag(o_ptr->art_flags, TR_SEARCH)))
417                 {
418                         add_flag(o_ptr->art_flags, TR_SEARCH);
419                         if (one_in_(2)) return;
420                 }
421                 break;
422
423         case BIAS_STR:
424                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
425                 {
426                         add_flag(o_ptr->art_flags, TR_STR);
427                         if (one_in_(2)) return;
428                 }
429                 break;
430
431         case BIAS_WIS:
432                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
433                 {
434                         add_flag(o_ptr->art_flags, TR_WIS);
435                         if (one_in_(2)) return;
436                 }
437                 break;
438
439         case BIAS_INT:
440                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
441                 {
442                         add_flag(o_ptr->art_flags, TR_INT);
443                         if (one_in_(2)) return;
444                 }
445                 break;
446
447         case BIAS_DEX:
448                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
449                 {
450                         add_flag(o_ptr->art_flags, TR_DEX);
451                         if (one_in_(2)) return;
452                 }
453                 break;
454
455         case BIAS_CON:
456                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
457                 {
458                         add_flag(o_ptr->art_flags, TR_CON);
459                         if (one_in_(2)) return;
460                 }
461                 break;
462
463         case BIAS_CHR:
464                 if (!(have_flag(o_ptr->art_flags, TR_CHR)))
465                 {
466                         add_flag(o_ptr->art_flags, TR_CHR);
467                         if (one_in_(2)) return;
468                 }
469                 break;
470         }
471
472         if ((o_ptr->artifact_bias == BIAS_MAGE || o_ptr->artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE))
473         {
474                 if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3))
475                 {
476                         add_flag(o_ptr->art_flags, TR_DEC_MANA);
477                         if (one_in_(2)) return;
478                 }
479         }
480
481         switch (randint1(this_type))
482         {
483         case 1: case 2:
484                 add_flag(o_ptr->art_flags, TR_STR);
485                 if (!o_ptr->artifact_bias && !one_in_(13))
486                         o_ptr->artifact_bias = BIAS_STR;
487                 else if (!o_ptr->artifact_bias && one_in_(7))
488                         o_ptr->artifact_bias = BIAS_WARRIOR;
489                 break;
490         case 3: case 4:
491                 add_flag(o_ptr->art_flags, TR_INT);
492                 if (!o_ptr->artifact_bias && !one_in_(13))
493                         o_ptr->artifact_bias = BIAS_INT;
494                 else if (!o_ptr->artifact_bias && one_in_(7))
495                         o_ptr->artifact_bias = BIAS_MAGE;
496                 break;
497         case 5: case 6:
498                 add_flag(o_ptr->art_flags, TR_WIS);
499                 if (!o_ptr->artifact_bias && !one_in_(13))
500                         o_ptr->artifact_bias = BIAS_WIS;
501                 else if (!o_ptr->artifact_bias && one_in_(7))
502                         o_ptr->artifact_bias = BIAS_PRIESTLY;
503                 break;
504         case 7: case 8:
505                 add_flag(o_ptr->art_flags, TR_DEX);
506                 if (!o_ptr->artifact_bias && !one_in_(13))
507                         o_ptr->artifact_bias = BIAS_DEX;
508                 else if (!o_ptr->artifact_bias && one_in_(7))
509                         o_ptr->artifact_bias = BIAS_ROGUE;
510                 break;
511         case 9: case 10:
512                 add_flag(o_ptr->art_flags, TR_CON);
513                 if (!o_ptr->artifact_bias && !one_in_(13))
514                         o_ptr->artifact_bias = BIAS_CON;
515                 else if (!o_ptr->artifact_bias && one_in_(9))
516                         o_ptr->artifact_bias = BIAS_RANGER;
517                 break;
518         case 11: case 12:
519                 add_flag(o_ptr->art_flags, TR_CHR);
520                 if (!o_ptr->artifact_bias && !one_in_(13))
521                         o_ptr->artifact_bias = BIAS_CHR;
522                 break;
523         case 13: case 14:
524                 add_flag(o_ptr->art_flags, TR_STEALTH);
525                 if (!o_ptr->artifact_bias && one_in_(3))
526                         o_ptr->artifact_bias = BIAS_ROGUE;
527                 break;
528         case 15: case 16:
529                 add_flag(o_ptr->art_flags, TR_SEARCH);
530                 if (!o_ptr->artifact_bias && one_in_(9))
531                         o_ptr->artifact_bias = BIAS_RANGER;
532                 break;
533         case 17: case 18:
534                 add_flag(o_ptr->art_flags, TR_INFRA);
535                 break;
536         case 19:
537                 add_flag(o_ptr->art_flags, TR_SPEED);
538                 if (!o_ptr->artifact_bias && one_in_(11))
539                         o_ptr->artifact_bias = BIAS_ROGUE;
540                 break;
541         case 20: case 21:
542                 add_flag(o_ptr->art_flags, TR_TUNNEL);
543                 break;
544         case 22: case 23:
545                 if (o_ptr->tval == TV_BOW) random_plus(o_ptr);
546                 else
547                 {
548                         add_flag(o_ptr->art_flags, TR_BLOWS);
549                         if (!o_ptr->artifact_bias && one_in_(11))
550                                 o_ptr->artifact_bias = BIAS_WARRIOR;
551                 }
552                 break;
553         }
554 }
555
556 /*!
557  * @brief ランダムアーティファクト生成中、対象のオブジェクトに耐性を付加する。/ Add one resistance on generation of randam artifact.
558  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
559  * 原則的候補は火炎、冷気、電撃、酸(以上免疫の可能性もあり)、
560  * 毒、閃光、暗黒、破片、轟音、盲目、混乱、地獄、カオス、劣化、恐怖、火オーラ、冷気オーラ、電撃オーラ、反射。
561  * 戦士系バイアスのみ反魔もつく。
562  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
563  * @param o_ptr 対象のオブジェクト構造体ポインタ
564  * @return なし
565  */
566 static void random_resistance(object_type * o_ptr)
567 {
568         switch (o_ptr->artifact_bias)
569         {
570         case BIAS_ACID:
571                 if (!(have_flag(o_ptr->art_flags, TR_RES_ACID)))
572                 {
573                         add_flag(o_ptr->art_flags, TR_RES_ACID);
574                         if (one_in_(2)) return;
575                 }
576                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ACID)))
577                 {
578                         add_flag(o_ptr->art_flags, TR_IM_ACID);
579                         if (!one_in_(IM_LUCK))
580                         {
581                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
582                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
583                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
584                         }
585                         if (one_in_(2)) return;
586                 }
587                 break;
588
589         case BIAS_ELEC:
590                 if (!(have_flag(o_ptr->art_flags, TR_RES_ELEC)))
591                 {
592                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
593                         if (one_in_(2)) return;
594                 }
595                 if ((o_ptr->tval >= TV_CLOAK) && (o_ptr->tval <= TV_HARD_ARMOR) &&
596                     !(have_flag(o_ptr->art_flags, TR_SH_ELEC)))
597                 {
598                         add_flag(o_ptr->art_flags, TR_SH_ELEC);
599                         if (one_in_(2)) return;
600                 }
601                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ELEC)))
602                 {
603                         add_flag(o_ptr->art_flags, TR_IM_ELEC);
604                         if (!one_in_(IM_LUCK))
605                         {
606                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
607                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
608                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
609                         }
610
611                         if (one_in_(2)) return;
612                 }
613                 break;
614
615         case BIAS_FIRE:
616                 if (!(have_flag(o_ptr->art_flags, TR_RES_FIRE)))
617                 {
618                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
619                         if (one_in_(2)) return;
620                 }
621                 if ((o_ptr->tval >= TV_CLOAK) &&
622                     (o_ptr->tval <= TV_HARD_ARMOR) &&
623                     !(have_flag(o_ptr->art_flags, TR_SH_FIRE)))
624                 {
625                         add_flag(o_ptr->art_flags, TR_SH_FIRE);
626                         if (one_in_(2)) return;
627                 }
628                 if (one_in_(BIAS_LUCK) &&
629                     !(have_flag(o_ptr->art_flags, TR_IM_FIRE)))
630                 {
631                         add_flag(o_ptr->art_flags, TR_IM_FIRE);
632                         if (!one_in_(IM_LUCK))
633                         {
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_ACID);
637                         }
638                         if (one_in_(2)) return;
639                 }
640                 break;
641
642         case BIAS_COLD:
643                 if (!(have_flag(o_ptr->art_flags, TR_RES_COLD)))
644                 {
645                         add_flag(o_ptr->art_flags, TR_RES_COLD);
646                         if (one_in_(2)) return;
647                 }
648                 if ((o_ptr->tval >= TV_CLOAK) &&
649                     (o_ptr->tval <= TV_HARD_ARMOR) &&
650                     !(have_flag(o_ptr->art_flags, TR_SH_COLD)))
651                 {
652                         add_flag(o_ptr->art_flags, TR_SH_COLD);
653                         if (one_in_(2)) return;
654                 }
655                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_COLD)))
656                 {
657                         add_flag(o_ptr->art_flags, TR_IM_COLD);
658                         if (!one_in_(IM_LUCK))
659                         {
660                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
661                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
662                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
663                         }
664                         if (one_in_(2)) return;
665                 }
666                 break;
667
668         case BIAS_POIS:
669                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
670                 {
671                         add_flag(o_ptr->art_flags, TR_RES_POIS);
672                         if (one_in_(2)) return;
673                 }
674                 break;
675
676         case BIAS_WARRIOR:
677                 if (!one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_RES_FEAR))))
678                 {
679                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
680                         if (one_in_(2)) return;
681                 }
682                 if (one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_NO_MAGIC))))
683                 {
684                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
685                         if (one_in_(2)) return;
686                 }
687                 break;
688
689         case BIAS_NECROMANTIC:
690                 if (!(have_flag(o_ptr->art_flags, TR_RES_NETHER)))
691                 {
692                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
693                         if (one_in_(2)) return;
694                 }
695                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
696                 {
697                         add_flag(o_ptr->art_flags, TR_RES_POIS);
698                         if (one_in_(2)) return;
699                 }
700                 if (!(have_flag(o_ptr->art_flags, TR_RES_DARK)))
701                 {
702                         add_flag(o_ptr->art_flags, TR_RES_DARK);
703                         if (one_in_(2)) return;
704                 }
705                 break;
706
707         case BIAS_CHAOS:
708                 if (!(have_flag(o_ptr->art_flags, TR_RES_CHAOS)))
709                 {
710                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
711                         if (one_in_(2)) return;
712                 }
713                 if (!(have_flag(o_ptr->art_flags, TR_RES_CONF)))
714                 {
715                         add_flag(o_ptr->art_flags, TR_RES_CONF);
716                         if (one_in_(2)) return;
717                 }
718                 if (!(have_flag(o_ptr->art_flags, TR_RES_DISEN)))
719                 {
720                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
721                         if (one_in_(2)) return;
722                 }
723                 break;
724         }
725
726         switch (randint1(42))
727         {
728                 case 1:
729                         if (!one_in_(WEIRD_LUCK))
730                                 random_resistance(o_ptr);
731                         else
732                         {
733                                 add_flag(o_ptr->art_flags, TR_IM_ACID);
734                                 if (!o_ptr->artifact_bias)
735                                         o_ptr->artifact_bias = BIAS_ACID;
736                         }
737                         break;
738                 case 2:
739                         if (!one_in_(WEIRD_LUCK))
740                                 random_resistance(o_ptr);
741                         else
742                         {
743                                 add_flag(o_ptr->art_flags, TR_IM_ELEC);
744                                 if (!o_ptr->artifact_bias)
745                                         o_ptr->artifact_bias = BIAS_ELEC;
746                         }
747                         break;
748                 case 3:
749                         if (!one_in_(WEIRD_LUCK))
750                                 random_resistance(o_ptr);
751                         else
752                         {
753                                 add_flag(o_ptr->art_flags, TR_IM_COLD);
754                                 if (!o_ptr->artifact_bias)
755                                         o_ptr->artifact_bias = BIAS_COLD;
756                         }
757                         break;
758                 case 4:
759                         if (!one_in_(WEIRD_LUCK))
760                                 random_resistance(o_ptr);
761                         else
762                         {
763                                 add_flag(o_ptr->art_flags, TR_IM_FIRE);
764                                 if (!o_ptr->artifact_bias)
765                                         o_ptr->artifact_bias = BIAS_FIRE;
766                         }
767                         break;
768                 case 5:
769                 case 6:
770                 case 13:
771                         add_flag(o_ptr->art_flags, TR_RES_ACID);
772                         if (!o_ptr->artifact_bias)
773                                 o_ptr->artifact_bias = BIAS_ACID;
774                         break;
775                 case 7:
776                 case 8:
777                 case 14:
778                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
779                         if (!o_ptr->artifact_bias)
780                                 o_ptr->artifact_bias = BIAS_ELEC;
781                         break;
782                 case 9:
783                 case 10:
784                 case 15:
785                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
786                         if (!o_ptr->artifact_bias)
787                                 o_ptr->artifact_bias = BIAS_FIRE;
788                         break;
789                 case 11:
790                 case 12:
791                 case 16:
792                         add_flag(o_ptr->art_flags, TR_RES_COLD);
793                         if (!o_ptr->artifact_bias)
794                                 o_ptr->artifact_bias = BIAS_COLD;
795                         break;
796                 case 17:
797                 case 18:
798                         add_flag(o_ptr->art_flags, TR_RES_POIS);
799                         if (!o_ptr->artifact_bias && !one_in_(4))
800                                 o_ptr->artifact_bias = BIAS_POIS;
801                         else if (!o_ptr->artifact_bias && one_in_(2))
802                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
803                         else if (!o_ptr->artifact_bias && one_in_(2))
804                                 o_ptr->artifact_bias = BIAS_ROGUE;
805                         break;
806                 case 19:
807                 case 20:
808                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
809                         if (!o_ptr->artifact_bias && one_in_(3))
810                                 o_ptr->artifact_bias = BIAS_WARRIOR;
811                         break;
812                 case 21:
813                         add_flag(o_ptr->art_flags, TR_RES_LITE);
814                         break;
815                 case 22:
816                         add_flag(o_ptr->art_flags, TR_RES_DARK);
817                         break;
818                 case 23:
819                 case 24:
820                         add_flag(o_ptr->art_flags, TR_RES_BLIND);
821                         break;
822                 case 25:
823                 case 26:
824                         add_flag(o_ptr->art_flags, TR_RES_CONF);
825                         if (!o_ptr->artifact_bias && one_in_(6))
826                                 o_ptr->artifact_bias = BIAS_CHAOS;
827                         break;
828                 case 27:
829                 case 28:
830                         add_flag(o_ptr->art_flags, TR_RES_SOUND);
831                         break;
832                 case 29:
833                 case 30:
834                         add_flag(o_ptr->art_flags, TR_RES_SHARDS);
835                         break;
836                 case 31:
837                 case 32:
838                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
839                         if (!o_ptr->artifact_bias && one_in_(3))
840                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
841                         break;
842                 case 33:
843                 case 34:
844                         add_flag(o_ptr->art_flags, TR_RES_NEXUS);
845                         break;
846                 case 35:
847                 case 36:
848                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
849                         if (!o_ptr->artifact_bias && one_in_(2))
850                                 o_ptr->artifact_bias = BIAS_CHAOS;
851                         break;
852                 case 37:
853                 case 38:
854                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
855                         break;
856                 case 39:
857                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
858                                 add_flag(o_ptr->art_flags, TR_SH_ELEC);
859                         else
860                                 random_resistance(o_ptr);
861                         if (!o_ptr->artifact_bias)
862                                 o_ptr->artifact_bias = BIAS_ELEC;
863                         break;
864                 case 40:
865                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
866                                 add_flag(o_ptr->art_flags, TR_SH_FIRE);
867                         else
868                                 random_resistance(o_ptr);
869                         if (!o_ptr->artifact_bias)
870                                 o_ptr->artifact_bias = BIAS_FIRE;
871                         break;
872                 case 41:
873                         if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
874                             o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
875                                 add_flag(o_ptr->art_flags, TR_REFLECT);
876                         else
877                                 random_resistance(o_ptr);
878                         break;
879                 case 42:
880                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
881                                 add_flag(o_ptr->art_flags, TR_SH_COLD);
882                         else
883                                 random_resistance(o_ptr);
884                         if (!o_ptr->artifact_bias)
885                                 o_ptr->artifact_bias = BIAS_COLD;
886                         break;
887         }
888 }
889
890
891 /*!
892  * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
893  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
894  * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
895  * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
896  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
897  * @param o_ptr 対象のオブジェクト構造体ポインタ
898  * @return なし
899  */
900 static void random_misc(object_type * o_ptr)
901 {
902         switch (o_ptr->artifact_bias)
903         {
904         case BIAS_RANGER:
905                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
906                 {
907                         add_flag(o_ptr->art_flags, TR_SUST_CON);
908                         if (one_in_(2)) return;
909                 }
910                 break;
911
912         case BIAS_STR:
913                 if (!(have_flag(o_ptr->art_flags, TR_SUST_STR)))
914                 {
915                         add_flag(o_ptr->art_flags, TR_SUST_STR);
916                         if (one_in_(2)) return;
917                 }
918                 break;
919
920         case BIAS_WIS:
921                 if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS)))
922                 {
923                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
924                         if (one_in_(2)) return;
925                 }
926                 break;
927
928         case BIAS_INT:
929                 if (!(have_flag(o_ptr->art_flags, TR_SUST_INT)))
930                 {
931                         add_flag(o_ptr->art_flags, TR_SUST_INT);
932                         if (one_in_(2)) return;
933                 }
934                 break;
935
936         case BIAS_DEX:
937                 if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX)))
938                 {
939                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
940                         if (one_in_(2)) return;
941                 }
942                 break;
943
944         case BIAS_CON:
945                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
946                 {
947                         add_flag(o_ptr->art_flags, TR_SUST_CON);
948                         if (one_in_(2)) return;
949                 }
950                 break;
951
952         case BIAS_CHR:
953                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR)))
954                 {
955                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
956                         if (one_in_(2)) return;
957                 }
958                 break;
959
960         case BIAS_CHAOS:
961                 if (!(have_flag(o_ptr->art_flags, TR_TELEPORT)))
962                 {
963                         add_flag(o_ptr->art_flags, TR_TELEPORT);
964                         if (one_in_(2)) return;
965                 }
966                 break;
967
968         case BIAS_FIRE:
969                 if (!(have_flag(o_ptr->art_flags, TR_LITE_1)))
970                 {
971                         add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
972                 }
973                 break;
974         }
975
976         switch (randint1(33))
977         {
978                 case 1:
979                         add_flag(o_ptr->art_flags, TR_SUST_STR);
980                         if (!o_ptr->artifact_bias)
981                                 o_ptr->artifact_bias = BIAS_STR;
982                         break;
983                 case 2:
984                         add_flag(o_ptr->art_flags, TR_SUST_INT);
985                         if (!o_ptr->artifact_bias)
986                                 o_ptr->artifact_bias = BIAS_INT;
987                         break;
988                 case 3:
989                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
990                         if (!o_ptr->artifact_bias)
991                                 o_ptr->artifact_bias = BIAS_WIS;
992                         break;
993                 case 4:
994                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
995                         if (!o_ptr->artifact_bias)
996                                 o_ptr->artifact_bias = BIAS_DEX;
997                         break;
998                 case 5:
999                         add_flag(o_ptr->art_flags, TR_SUST_CON);
1000                         if (!o_ptr->artifact_bias)
1001                                 o_ptr->artifact_bias = BIAS_CON;
1002                         break;
1003                 case 6:
1004                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
1005                         if (!o_ptr->artifact_bias)
1006                                 o_ptr->artifact_bias = BIAS_CHR;
1007                         break;
1008                 case 7:
1009                 case 8:
1010                 case 14:
1011                         add_flag(o_ptr->art_flags, TR_FREE_ACT);
1012                         break;
1013                 case 9:
1014                         add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1015                         if (!o_ptr->artifact_bias && one_in_(5))
1016                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1017                         else if (!o_ptr->artifact_bias && one_in_(6))
1018                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1019                         break;
1020                 case 10:
1021                 case 11:
1022                         add_flag(o_ptr->art_flags, TR_LITE_1);
1023                         break;
1024                 case 12:
1025                 case 13:
1026                         add_flag(o_ptr->art_flags, TR_LEVITATION);
1027                         break;
1028                 case 15:
1029                 case 16:
1030                 case 17:
1031                         add_flag(o_ptr->art_flags, TR_SEE_INVIS);
1032                         break;
1033                 case 19:
1034                 case 20:
1035                         add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
1036                         break;
1037                 case 21:
1038                 case 22:
1039                         add_flag(o_ptr->art_flags, TR_REGEN);
1040                         break;
1041                 case 23:
1042                         add_flag(o_ptr->art_flags, TR_TELEPORT);
1043                         break;
1044                 case 24:
1045                 case 25:
1046                 case 26:
1047                         if (object_is_armour(o_ptr))
1048                                 random_misc(o_ptr);
1049                         else
1050                         {
1051                                 o_ptr->to_a = 4 + randint1(11);
1052                         }
1053                         break;
1054                 case 27:
1055                 case 28:
1056                 case 29:
1057                 {
1058                         HIT_PROB bonus_h;
1059                         HIT_POINT bonus_d;
1060                         add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1061                         bonus_h = 4 + (HIT_PROB)(randint1(11));
1062                         bonus_d = 4 + (HIT_POINT)(randint1(11));
1063                         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))
1064                         {
1065                                 bonus_h /= 2;
1066                                 bonus_d /= 2;
1067                         }
1068                         o_ptr->to_h += bonus_h;
1069                         o_ptr->to_d += bonus_d;
1070                         break;
1071                 }
1072                 case 30:
1073                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1074                         break;
1075                 case 31:
1076                         add_flag(o_ptr->art_flags, TR_NO_TELE);
1077                         break;
1078                 case 32:
1079                         add_flag(o_ptr->art_flags, TR_WARNING);
1080                         break;
1081
1082                 case 18:
1083                         switch (randint1(3))
1084                         {
1085                         case 1:
1086                                 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
1087                                 if (!o_ptr->artifact_bias && one_in_(3))
1088                                         o_ptr->artifact_bias = BIAS_LAW;
1089                                 break;
1090                         case 2:
1091                                 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
1092                                 if (!o_ptr->artifact_bias && one_in_(3))
1093                                         o_ptr->artifact_bias = BIAS_MAGE;
1094                                 break;
1095                         case 3:
1096                                 add_flag(o_ptr->art_flags, TR_TELEPATHY);
1097                                 if (!o_ptr->artifact_bias && one_in_(9))
1098                                         o_ptr->artifact_bias = BIAS_MAGE;
1099                                 break;
1100                         }
1101                         break;
1102
1103                 case 33:
1104                 {
1105                         int idx[3];
1106                         int n = randint1(3);
1107
1108                         idx[0] = randint1(10);
1109
1110                         idx[1] = randint1(9);
1111                         if (idx[1] >= idx[0]) idx[1]++;
1112
1113                         idx[2] = randint1(8);
1114                         if (idx[2] >= idx[0]) idx[2]++;
1115                         if (idx[2] >= idx[1]) idx[2]++;
1116
1117                         while (n--) switch (idx[n])
1118                         {
1119                         case 1:
1120                                 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
1121                                 if (!o_ptr->artifact_bias && one_in_(4))
1122                                         o_ptr->artifact_bias = BIAS_RANGER;
1123                                 break;
1124                         case 2:
1125                                 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
1126                                 if (!o_ptr->artifact_bias && one_in_(3))
1127                                         o_ptr->artifact_bias = BIAS_PRIESTLY;
1128                                 else if (!o_ptr->artifact_bias && one_in_(6))
1129                                         o_ptr->artifact_bias = BIAS_NECROMANTIC;
1130                                 break;
1131                         case 3:
1132                                 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
1133                                 break;
1134                         case 4:
1135                                 add_flag(o_ptr->art_flags, TR_ESP_ORC);
1136                                 break;
1137                         case 5:
1138                                 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
1139                                 break;
1140                         case 6:
1141                                 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
1142                                 break;
1143                         case 7:
1144                                 add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
1145                                 break;
1146                         case 8:
1147                                 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
1148                                 if (!o_ptr->artifact_bias && one_in_(6))
1149                                         o_ptr->artifact_bias = BIAS_ROGUE;
1150                                 break;
1151                         case 9:
1152                                 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
1153                                 if (!o_ptr->artifact_bias && one_in_(3))
1154                                         o_ptr->artifact_bias = BIAS_LAW;
1155                                 break;
1156                         case 10:
1157                                 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
1158                                 if (!o_ptr->artifact_bias && one_in_(3))
1159                                         o_ptr->artifact_bias = BIAS_LAW;
1160                                 break;
1161                         }
1162                         break;
1163                 }
1164         }
1165 }
1166
1167 /*!
1168  * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
1169  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
1170  * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
1171  * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
1172  * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
1173  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
1174  * @param o_ptr 対象のオブジェクト構造体ポインタ
1175  * @return なし
1176  */
1177 static void random_slay(object_type *o_ptr)
1178 {
1179         if (o_ptr->tval == TV_BOW)
1180         {
1181                 switch (randint1(6))
1182                 {
1183                         case 1:
1184                         case 2:
1185                         case 3:
1186                                 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1187                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1188                                 if (!o_ptr->artifact_bias && one_in_(9))
1189                                         o_ptr->artifact_bias = BIAS_RANGER;
1190                                 break;
1191                         default:
1192                                 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1193                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1194                                 if (!o_ptr->artifact_bias && one_in_(9))
1195                                         o_ptr->artifact_bias = BIAS_RANGER;
1196                         break;
1197                 }
1198
1199                 return;
1200         }
1201
1202         switch (o_ptr->artifact_bias)
1203         {
1204         case BIAS_CHAOS:
1205                 if (!(have_flag(o_ptr->art_flags, TR_CHAOTIC)))
1206                 {
1207                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1208                         if (one_in_(2)) return;
1209                 }
1210                 break;
1211
1212         case BIAS_PRIESTLY:
1213                 if((o_ptr->tval == TV_SWORD || o_ptr->tval == TV_POLEARM) &&
1214                    !(have_flag(o_ptr->art_flags, TR_BLESSED)))
1215                 {
1216                         /* A free power for "priestly" random artifacts */
1217                         add_flag(o_ptr->art_flags, TR_BLESSED);
1218                 }
1219                 break;
1220
1221         case BIAS_NECROMANTIC:
1222                 if (!(have_flag(o_ptr->art_flags, TR_VAMPIRIC)))
1223                 {
1224                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1225                         if (one_in_(2)) return;
1226                 }
1227                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)) && one_in_(2))
1228                 {
1229                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1230                         if (one_in_(2)) return;
1231                 }
1232                 break;
1233
1234         case BIAS_RANGER:
1235                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_ANIMAL)))
1236                 {
1237                         add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1238                         if (one_in_(2)) return;
1239                 }
1240                 break;
1241
1242         case BIAS_ROGUE:
1243                 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) ||
1244                      ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR))) &&
1245                          !(have_flag(o_ptr->art_flags, TR_THROW)))
1246                 {
1247                         /* Free power for rogues... */
1248                         add_flag(o_ptr->art_flags, TR_THROW);
1249                 }
1250                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1251                 {
1252                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1253                         if (one_in_(2)) return;
1254                 }
1255                 break;
1256
1257         case BIAS_POIS:
1258                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1259                 {
1260                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1261                         if (one_in_(2)) return;
1262                 }
1263                 break;
1264
1265         case BIAS_FIRE:
1266                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_FIRE)))
1267                 {
1268                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1269                         if (one_in_(2)) return;
1270                 }
1271                 break;
1272
1273         case BIAS_COLD:
1274                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_COLD)))
1275                 {
1276                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1277                         if (one_in_(2)) return;
1278                 }
1279                 break;
1280
1281         case BIAS_ELEC:
1282                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ELEC)))
1283                 {
1284                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1285                         if (one_in_(2)) return;
1286                 }
1287                 break;
1288
1289         case BIAS_ACID:
1290                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ACID)))
1291                 {
1292                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1293                         if (one_in_(2)) return;
1294                 }
1295                 break;
1296
1297         case BIAS_LAW:
1298                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_EVIL)))
1299                 {
1300                         add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1301                         if (one_in_(2)) return;
1302                 }
1303                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_UNDEAD)))
1304                 {
1305                         add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1306                         if (one_in_(2)) return;
1307                 }
1308                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_DEMON)))
1309                 {
1310                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1311                         if (one_in_(2)) return;
1312                 }
1313                 break;
1314         }
1315
1316         switch (randint1(36))
1317         {
1318                 case 1:
1319                 case 2:
1320                         if (one_in_(4))
1321                         {
1322                                 add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
1323                         }
1324                         else
1325                         {
1326                                 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1327                         }
1328                         break;
1329                 case 3:
1330                 case 4:
1331                         if (one_in_(8))
1332                         {
1333                                 add_flag(o_ptr->art_flags, TR_KILL_EVIL);
1334                         }
1335                         else
1336                         {
1337                                 add_flag(o_ptr->art_flags, TR_SLAY_EVIL); 
1338                         }
1339                         if (!o_ptr->artifact_bias && one_in_(2))
1340                                 o_ptr->artifact_bias = BIAS_LAW;
1341                         else if (!o_ptr->artifact_bias && one_in_(9))
1342                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1343                         break;
1344                 case 5:
1345                 case 6:
1346                         if (one_in_(4))
1347                         {
1348                                 add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
1349                         }
1350                         else
1351                         {
1352                                 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1353                         }
1354                         if (!o_ptr->artifact_bias && one_in_(9))
1355                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1356                         break;
1357                 case 7:
1358                 case 8:
1359                         if (one_in_(4))
1360                         {
1361                                 add_flag(o_ptr->art_flags, TR_KILL_DEMON);
1362                         }
1363                         else
1364                         {
1365                                 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1366                         }
1367                         if (!o_ptr->artifact_bias && one_in_(9))
1368                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1369                         break;
1370                 case 9:
1371                 case 10:
1372                         if (one_in_(4))
1373                         {
1374                                 add_flag(o_ptr->art_flags, TR_KILL_ORC);
1375                         }
1376                         else
1377                         {
1378                                 add_flag(o_ptr->art_flags, TR_SLAY_ORC);
1379                         }
1380                         break;
1381                 case 11:
1382                 case 12:
1383                         if (one_in_(4))
1384                         {
1385                                 add_flag(o_ptr->art_flags, TR_KILL_TROLL);
1386                         }
1387                         else
1388                         {
1389                                 add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1390                         }
1391                         break;
1392                 case 13:
1393                 case 14:
1394                         if (one_in_(4))
1395                         {
1396                                 add_flag(o_ptr->art_flags, TR_KILL_GIANT);
1397                         }
1398                         else
1399                         {
1400                                 add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1401                         }
1402                         break;
1403                 case 15:
1404                 case 16:
1405                         add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1406                         break;
1407                 case 17:
1408                         add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1409                         break;
1410                 case 18:
1411                 case 19:
1412                         if (o_ptr->tval == TV_SWORD)
1413                         {
1414                                 add_flag(o_ptr->art_flags, TR_VORPAL);
1415                                 if (!o_ptr->artifact_bias && one_in_(9))
1416                                         o_ptr->artifact_bias = BIAS_WARRIOR;
1417                         }
1418                         else
1419                                 random_slay(o_ptr);
1420                         break;
1421                 case 20:
1422                         add_flag(o_ptr->art_flags, TR_IMPACT);
1423                         break;
1424                 case 21:
1425                 case 22:
1426                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1427                         if (!o_ptr->artifact_bias)
1428                                 o_ptr->artifact_bias = BIAS_FIRE;
1429                         break;
1430                 case 23:
1431                 case 24:
1432                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1433                         if (!o_ptr->artifact_bias)
1434                                 o_ptr->artifact_bias = BIAS_COLD;
1435                         break;
1436                 case 25:
1437                 case 26:
1438                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1439                         if (!o_ptr->artifact_bias)
1440                                 o_ptr->artifact_bias = BIAS_ELEC;
1441                         break;
1442                 case 27:
1443                 case 28:
1444                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1445                         if (!o_ptr->artifact_bias)
1446                                 o_ptr->artifact_bias = BIAS_ACID;
1447                         break;
1448                 case 29:
1449                 case 30:
1450                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1451                         if (!o_ptr->artifact_bias && !one_in_(3))
1452                                 o_ptr->artifact_bias = BIAS_POIS;
1453                         else if (!o_ptr->artifact_bias && one_in_(6))
1454                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1455                         else if (!o_ptr->artifact_bias)
1456                                 o_ptr->artifact_bias = BIAS_ROGUE;
1457                         break;
1458                 case 31:
1459                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1460                         if (!o_ptr->artifact_bias)
1461                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1462                         break;
1463                 case 32:
1464                         add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1465                         if (!o_ptr->artifact_bias)
1466                                 o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
1467                         break;
1468                 case 33:
1469                 case 34:
1470                         if (one_in_(4))
1471                         {
1472                                 add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
1473                         }
1474                         else
1475                         {
1476                                 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1477                         }
1478                         break;
1479                 default:
1480                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1481                         if (!o_ptr->artifact_bias)
1482                                 o_ptr->artifact_bias = BIAS_CHAOS;
1483                         break;
1484         }
1485 }
1486
1487 /*!
1488  * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
1489  * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
1490  * @param o_ptr 対象のオブジェクト構造体ポインタ
1491  * @return なし
1492  */
1493 static void give_activation_power(object_type *o_ptr)
1494 {
1495         int type = 0, chance = 0;
1496
1497         switch (o_ptr->artifact_bias)
1498         {
1499                 case BIAS_ELEC:
1500                         if (!one_in_(3))
1501                         {
1502                                 type = ACT_BO_ELEC_1;
1503                         }
1504                         else if (!one_in_(5))
1505                         {
1506                                 type = ACT_BA_ELEC_2;
1507                         }
1508                         else
1509                         {
1510                                 type = ACT_BA_ELEC_3;
1511                         }
1512                         chance = 101;
1513                         break;
1514
1515                 case BIAS_POIS:
1516                         type = ACT_BA_POIS_1;
1517                         chance = 101;
1518                         break;
1519
1520                 case BIAS_FIRE:
1521                         if (!one_in_(3))
1522                         {
1523                                 type = ACT_BO_FIRE_1;
1524                         }
1525                         else if (!one_in_(5))
1526                         {
1527                                 type = ACT_BA_FIRE_1;
1528                         }
1529                         else
1530                         {
1531                                 type = ACT_BA_FIRE_2;
1532                         }
1533                         chance = 101;
1534                         break;
1535
1536                 case BIAS_COLD:
1537                         chance = 101;
1538                         if (!one_in_(3))
1539                                 type = ACT_BO_COLD_1;
1540                         else if (!one_in_(3))
1541                                 type = ACT_BA_COLD_1;
1542                         else if (!one_in_(3))
1543                                 type = ACT_BA_COLD_2;
1544                         else
1545                                 type = ACT_BA_COLD_3;
1546                         break;
1547
1548                 case BIAS_CHAOS:
1549                         chance = 50;
1550                         if (one_in_(6))
1551                                 type = ACT_SUMMON_DEMON;
1552                         else
1553                                 type = ACT_CALL_CHAOS;
1554                         break;
1555
1556                 case BIAS_PRIESTLY:
1557                         chance = 101;
1558
1559                         if (one_in_(13))
1560                                 type = ACT_CHARM_UNDEAD;
1561                         else if (one_in_(12))
1562                                 type = ACT_BANISH_EVIL;
1563                         else if (one_in_(11))
1564                                 type = ACT_DISP_EVIL;
1565                         else if (one_in_(10))
1566                                 type = ACT_PROT_EVIL;
1567                         else if (one_in_(9))
1568                                 type = ACT_CURE_1000;
1569                         else if (one_in_(8))
1570                                 type = ACT_CURE_700;
1571                         else if (one_in_(7))
1572                                 type = ACT_REST_ALL;
1573                         else if (one_in_(6))
1574                                 type = ACT_REST_EXP;
1575                         else
1576                                 type = ACT_CURE_MW;
1577                         break;
1578
1579                 case BIAS_NECROMANTIC:
1580                         chance = 101;
1581                         if (one_in_(66))
1582                                 type = ACT_WRAITH;
1583                         else if (one_in_(13))
1584                                 type = ACT_DISP_GOOD;
1585                         else if (one_in_(9))
1586                                 type = ACT_MASS_GENO;
1587                         else if (one_in_(8))
1588                                 type = ACT_GENOCIDE;
1589                         else if (one_in_(13))
1590                                 type = ACT_SUMMON_UNDEAD;
1591                         else if (one_in_(9))
1592                                 type = ACT_DRAIN_2;
1593                         else if (one_in_(6))
1594                                 type = ACT_CHARM_UNDEAD;
1595                         else
1596                                 type = ACT_DRAIN_1;
1597                         break;
1598
1599                 case BIAS_LAW:
1600                         chance = 101;
1601                         if (one_in_(8))
1602                                 type = ACT_BANISH_EVIL;
1603                         else if (one_in_(4))
1604                                 type = ACT_DISP_EVIL;
1605                         else
1606                                 type = ACT_PROT_EVIL;
1607                         break;
1608
1609                 case BIAS_ROGUE:
1610                         chance = 101;
1611                         if (one_in_(50))
1612                                 type = ACT_SPEED;
1613                         else if (one_in_(4))
1614                                 type = ACT_SLEEP;
1615                         else if (one_in_(3))
1616                                 type = ACT_DETECT_ALL;
1617                         else if (one_in_(8))
1618                                 type = ACT_ID_FULL;
1619                         else
1620                                 type = ACT_ID_PLAIN;
1621                         break;
1622
1623                 case BIAS_MAGE:
1624                         chance = 66;
1625                         if (one_in_(20))
1626                                 type = ACT_SUMMON_ELEMENTAL;
1627                         else if (one_in_(10))
1628                                 type = ACT_SUMMON_PHANTOM;
1629                         else if (one_in_(5))
1630                                 type = ACT_RUNE_EXPLO;
1631                         else
1632                                 type = ACT_ESP;
1633                         break;
1634
1635                 case BIAS_WARRIOR:
1636                         chance = 80;
1637                         if (one_in_(100))
1638                                 type = ACT_INVULN;
1639                         else
1640                                 type = ACT_BERSERK;
1641                         break;
1642
1643                 case BIAS_RANGER:
1644                         chance = 101;
1645                         if (one_in_(20))
1646                                 type = ACT_CHARM_ANIMALS;
1647                         else if (one_in_(7))
1648                                 type = ACT_SUMMON_ANIMAL;
1649                         else if (one_in_(6))
1650                                 type = ACT_CHARM_ANIMAL;
1651                         else if (one_in_(4))
1652                                 type = ACT_RESIST_ALL;
1653                         else if (one_in_(3))
1654                                 type = ACT_SATIATE;
1655                         else
1656                                 type = ACT_CURE_POISON;
1657                         break;
1658         }
1659
1660         if (!type || (randint1(100) >= chance))
1661         {
1662                 one_activation(o_ptr);
1663                 return;
1664         }
1665
1666         /* A type was chosen... */
1667         o_ptr->xtra2 = (byte_hack)type;
1668         add_flag(o_ptr->art_flags, TR_ACTIVATE);
1669         o_ptr->timeout = 0;
1670 }
1671
1672 /*!
1673  * @brief ランダムアーティファクト生成中、対象のオブジェクトに名前を与える。/ Set name of randomartifact.
1674  * @details 確率によって、シンダリン銘、漢字銘、固定名のいずれか一つが与えられる。
1675  * @param o_ptr 処理中のアイテム参照ポインタ
1676  * @param return_name 名前を返すための文字列参照ポインタ
1677  * @param armour 対象のオブジェクトが防具が否か
1678  * @param power 銘の基準となるオブジェクトの価値レベル(0=呪い、1=低位、2=中位、3以上=高位)
1679  * @return なし
1680  */
1681 static void get_random_name(object_type *o_ptr, char *return_name, bool armour, int power)
1682 {
1683         PERCENTAGE prob = randint1(100);
1684
1685         if (prob <= SINDARIN_NAME)
1686         {
1687                 get_table_sindarin(return_name);
1688         }
1689         else if (prob <= TABLE_NAME)
1690         {
1691                 get_table_name(return_name);
1692         }
1693         else
1694         {
1695                 concptr filename;
1696
1697                 switch (armour)
1698                 {
1699                         case 1:
1700                                 switch (power)
1701                                 {
1702                                         case 0:
1703                                                 filename = _("a_cursed_j.txt", "a_cursed.txt");
1704                                                 break;
1705                                         case 1:
1706                                                 filename = _("a_low_j.txt", "a_low.txt");
1707                                                 break;
1708                                         case 2:
1709                                                 filename = _("a_med_j.txt", "a_med.txt");
1710                                                 break;
1711                                         default:
1712                                                 filename = _("a_high_j.txt", "a_high.txt");
1713                                 }
1714                                 break;
1715                         default:
1716                                 switch (power)
1717                                 {
1718                                         case 0:
1719                                                 filename = _("w_cursed_j.txt", "w_cursed.txt");
1720                                                 break;
1721                                         case 1:
1722                                                 filename = _("w_low_j.txt", "w_low.txt");
1723                                                 break;
1724                                         case 2:
1725                                                 filename = _("w_med_j.txt", "w_med.txt");
1726                                                 break;
1727                                         default:
1728                                                 filename = _("w_high_j.txt", "w_high.txt");
1729                                 }
1730                 }
1731
1732                 (void)get_rnd_line(filename, o_ptr->artifact_bias, return_name);
1733 #ifdef JP
1734                  if (return_name[0] == 0) get_table_name(return_name);
1735 #endif
1736         }
1737 }
1738
1739 /*!
1740  * @brief ランダムアーティファクト生成のメインルーチン
1741  * @details 既に生成が済んでいるオブジェクトの構造体を、アーティファクトとして強化する。
1742  * @param o_ptr 対象のオブジェクト構造体ポインタ
1743  * @param a_scroll アーティファクト生成の巻物上の処理。呪いのアーティファクトが生成対象外となる。
1744  * @return 常にTRUE(1)を返す
1745  */
1746 bool create_artifact(object_type *o_ptr, bool a_scroll)
1747 {
1748         GAME_TEXT new_name[1024];
1749         PARAMETER_VALUE has_pval = 0;
1750         int     powers = randint1(5) + 1;
1751         int     max_powers;
1752         int     max_type = (object_is_weapon_ammo(o_ptr) ? 7 : 5);
1753         int     power_level;
1754         s32b    total_flags;
1755         bool    a_cursed = FALSE;
1756         int     warrior_artifact_bias = 0;
1757         int i;
1758
1759         /* Reset artifact bias */
1760         o_ptr->artifact_bias = 0;
1761
1762         /* Nuke enchantments */
1763         o_ptr->name1 = 0;
1764         o_ptr->name2 = 0;
1765
1766         for (i = 0; i < TR_FLAG_SIZE; i++)
1767                 o_ptr->art_flags[i] |= k_info[o_ptr->k_idx].flags[i];
1768
1769         if (o_ptr->pval) has_pval = TRUE;
1770
1771         if (a_scroll && one_in_(4))
1772         {
1773                 switch (p_ptr->pclass)
1774                 {
1775                         case CLASS_WARRIOR:
1776                         case CLASS_BERSERKER:
1777                         case CLASS_ARCHER:
1778                         case CLASS_SAMURAI:
1779                         case CLASS_CAVALRY:
1780                         case CLASS_SMITH:
1781                                 o_ptr->artifact_bias = BIAS_WARRIOR;
1782                                 break;
1783                         case CLASS_MAGE:
1784                         case CLASS_HIGH_MAGE:
1785                         case CLASS_SORCERER:
1786                         case CLASS_MAGIC_EATER:
1787                         case CLASS_BLUE_MAGE:
1788                                 o_ptr->artifact_bias = BIAS_MAGE;
1789                                 break;
1790                         case CLASS_PRIEST:
1791                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1792                                 break;
1793                         case CLASS_ROGUE:
1794                         case CLASS_NINJA:
1795                                 o_ptr->artifact_bias = BIAS_ROGUE;
1796                                 warrior_artifact_bias = 25;
1797                                 break;
1798                         case CLASS_RANGER:
1799                         case CLASS_SNIPER:
1800                                 o_ptr->artifact_bias = BIAS_RANGER;
1801                                 warrior_artifact_bias = 30;
1802                                 break;
1803                         case CLASS_PALADIN:
1804                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1805                                 warrior_artifact_bias = 40;
1806                                 break;
1807                         case CLASS_WARRIOR_MAGE:
1808                         case CLASS_RED_MAGE:
1809                                 o_ptr->artifact_bias = BIAS_MAGE;
1810                                 warrior_artifact_bias = 40;
1811                                 break;
1812                         case CLASS_CHAOS_WARRIOR:
1813                                 o_ptr->artifact_bias = BIAS_CHAOS;
1814                                 warrior_artifact_bias = 40;
1815                                 break;
1816                         case CLASS_MONK:
1817                         case CLASS_FORCETRAINER:
1818                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1819                                 break;
1820                         case CLASS_MINDCRAFTER:
1821                         case CLASS_BARD:
1822                                 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_PRIESTLY;
1823                                 break;
1824                         case CLASS_TOURIST:
1825                                 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_WARRIOR;
1826                                 break;
1827                         case CLASS_IMITATOR:
1828                                 if (randint1(2) > 1) o_ptr->artifact_bias = BIAS_RANGER;
1829                                 break;
1830                         case CLASS_BEASTMASTER:
1831                                 o_ptr->artifact_bias = BIAS_CHR;
1832                                 warrior_artifact_bias = 50;
1833                                 break;
1834                         case CLASS_MIRROR_MASTER:
1835                                 if (randint1(4) > 1) 
1836                                 {
1837                                     o_ptr->artifact_bias = BIAS_MAGE;
1838                                 }
1839                                 else
1840                                 {
1841                                     o_ptr->artifact_bias = BIAS_ROGUE;
1842                                 }
1843                                 break;
1844                 }
1845         }
1846
1847         if (a_scroll && (randint1(100) <= warrior_artifact_bias))
1848                 o_ptr->artifact_bias = BIAS_WARRIOR;
1849
1850         strcpy(new_name, "");
1851
1852         if (!a_scroll && one_in_(A_CURSED))
1853                 a_cursed = TRUE;
1854         if (((o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) && object_is_cursed(o_ptr))
1855                 a_cursed = TRUE;
1856
1857         while (one_in_(powers) || one_in_(7) || one_in_(10))
1858                 powers++;
1859
1860         if (!a_cursed && one_in_(WEIRD_LUCK))
1861                 powers *= 2;
1862
1863         if (a_cursed) powers /= 2;
1864
1865         max_powers = powers;
1866         /* Main loop */
1867         while (powers--)
1868         {
1869                 switch (randint1(max_type))
1870                 {
1871                         case 1: case 2:
1872                                 random_plus(o_ptr);
1873                                 has_pval = TRUE;
1874                                 break;
1875                         case 3: case 4:
1876                                 if (one_in_(2) && object_is_weapon_ammo(o_ptr) && (o_ptr->tval != TV_BOW))
1877                                 {
1878                                         if (a_cursed && !one_in_(13)) break;
1879                                         if (one_in_(13))
1880                                         {
1881                                                 if (one_in_(o_ptr->ds+4)) o_ptr->ds++;
1882                                         }
1883                                         else
1884                                         {
1885                                                 if (one_in_(o_ptr->dd+1)) o_ptr->dd++;
1886                                         }
1887                                 }
1888                                 else
1889                                         random_resistance(o_ptr);
1890                                 break;
1891                         case 5:
1892                                 random_misc(o_ptr);
1893                                 break;
1894                         case 6: case 7:
1895                                 random_slay(o_ptr);
1896                                 break;
1897                         default:
1898                                 if (p_ptr->wizard) msg_print("Switch error in create_artifact!");
1899                                 powers++;
1900                 }
1901         };
1902
1903         if (has_pval)
1904         {
1905                 if (have_flag(o_ptr->art_flags, TR_BLOWS))
1906                 {
1907                         o_ptr->pval = randint1(2);
1908                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
1909                                 o_ptr->pval++;
1910                 }
1911                 else
1912                 {
1913                         do
1914                         {
1915                                 o_ptr->pval++;
1916                         }
1917                         while (o_ptr->pval < randint1(5) || one_in_(o_ptr->pval));
1918                 }
1919
1920                 if ((o_ptr->pval > 4) && !one_in_(WEIRD_LUCK))
1921                         o_ptr->pval = 4;
1922         }
1923
1924
1925         /* give it some plusses... */
1926         if (object_is_armour(o_ptr))
1927                 o_ptr->to_a += randint1(o_ptr->to_a > 19 ? 1 : 20 - o_ptr->to_a);
1928         else if (object_is_weapon_ammo(o_ptr))
1929         {
1930                 o_ptr->to_h += randint1(o_ptr->to_h > 19 ? 1 : 20 - o_ptr->to_h);
1931                 o_ptr->to_d += randint1(o_ptr->to_d > 19 ? 1 : 20 - o_ptr->to_d);
1932                 if ((have_flag(o_ptr->art_flags, TR_WIS)) && (o_ptr->pval > 0)) add_flag(o_ptr->art_flags, TR_BLESSED);
1933         }
1934
1935         /* Just to be sure */
1936         add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1937         add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1938         add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1939         add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1940
1941         total_flags = flag_cost(o_ptr, o_ptr->pval);
1942
1943         if (a_cursed) curse_artifact(o_ptr);
1944
1945         if (!a_cursed &&
1946             one_in_(object_is_armour(o_ptr) ? ACTIVATION_CHANCE * 2 : ACTIVATION_CHANCE))
1947         {
1948                 o_ptr->xtra2 = 0;
1949                 give_activation_power(o_ptr);
1950         }
1951
1952         if (object_is_armour(o_ptr))
1953         {
1954                 while ((o_ptr->to_d+o_ptr->to_h) > 20)
1955                 {
1956                         if (one_in_(o_ptr->to_d) && one_in_(o_ptr->to_h)) break;
1957                         o_ptr->to_d -= (HIT_POINT)randint0(3);
1958                         o_ptr->to_h -= (HIT_PROB)randint0(3);
1959                 }
1960                 while ((o_ptr->to_d+o_ptr->to_h) > 10)
1961                 {
1962                         if (one_in_(o_ptr->to_d) || one_in_(o_ptr->to_h)) break;
1963                         o_ptr->to_d -= (HIT_POINT)randint0(3);
1964                         o_ptr->to_h -= (HIT_PROB)randint0(3);
1965                 }
1966         }
1967
1968         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);
1969
1970         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
1971         {
1972                 o_ptr->to_h = 0;
1973                 o_ptr->to_d = 0;
1974                 remove_flag(o_ptr->art_flags, TR_BLOWS);
1975                 remove_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1976                 remove_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1977                 remove_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1978                 remove_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1979                 remove_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1980                 remove_flag(o_ptr->art_flags, TR_SLAY_ORC);
1981                 remove_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1982                 remove_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1983                 remove_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1984                 remove_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1985                 remove_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1986                 remove_flag(o_ptr->art_flags, TR_VORPAL);
1987                 remove_flag(o_ptr->art_flags, TR_BRAND_POIS);
1988                 remove_flag(o_ptr->art_flags, TR_BRAND_ACID);
1989                 remove_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1990                 remove_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1991                 remove_flag(o_ptr->art_flags, TR_BRAND_COLD);
1992         }
1993
1994         if (!object_is_weapon_ammo(o_ptr))
1995         {
1996                 /* For armors */
1997                 if (a_cursed) power_level = 0;
1998                 else if (total_flags < 15000) power_level = 1;
1999                 else if (total_flags < 35000) power_level = 2;
2000                 else power_level = 3;
2001         }
2002
2003         else
2004         {
2005                 /* For weapons */
2006                 if (a_cursed) power_level = 0;
2007                 else if (total_flags < 20000) power_level = 1;
2008                 else if (total_flags < 45000) power_level = 2;
2009                 else power_level = 3;
2010         }
2011
2012         /* ダメージ抑制処理を行う */
2013         while (has_extreme_damage_rate(o_ptr) && !one_in_(SWORDFISH_LUCK))
2014         {
2015                 weakening_artifact(o_ptr);
2016         }
2017
2018         if (a_scroll)
2019         {
2020                 GAME_TEXT dummy_name[MAX_NLEN] = "";
2021                 concptr ask_msg = _("このアーティファクトを何と名付けますか?", "What do you want to call the artifact? ");
2022
2023                 object_aware(o_ptr);
2024                 object_known(o_ptr);
2025
2026                 /* Mark the item as fully known */
2027                 o_ptr->ident |= (IDENT_MENTAL);
2028
2029                 /* For being treated as random artifact in screen_object() */
2030                 o_ptr->art_name = quark_add("");
2031
2032                 (void)screen_object(o_ptr, 0L);
2033
2034                 if (!get_string(ask_msg, dummy_name, sizeof dummy_name)
2035                     || !dummy_name[0])
2036                 {
2037                         /* Cancelled */
2038                         if (one_in_(2))
2039                         {
2040                                 get_table_sindarin_aux(dummy_name);
2041                         }
2042                         else
2043                         {
2044                                 get_table_name_aux(dummy_name);
2045                         }
2046                 }
2047                 sprintf(new_name, _("《%s》", "'%s'"), dummy_name);
2048                 chg_virtue(V_INDIVIDUALISM, 2);
2049                 chg_virtue(V_ENCHANT, 5);
2050         }
2051         else
2052         {
2053                 get_random_name(o_ptr, new_name, object_is_armour(o_ptr), power_level);
2054         }
2055
2056         /* Save the inscription */
2057         o_ptr->art_name = quark_add(new_name);
2058
2059         msg_format_wizard(CHEAT_OBJECT, _("パワー %d で 価値%ld のランダムアーティファクト生成 バイアスは「%s」",
2060                 "Random artifact generated - Power:%d Value:%d Bias:%s."), max_powers, total_flags, artifact_bias_name[o_ptr->artifact_bias]);
2061
2062         p_ptr->window |= (PW_INVEN | PW_EQUIP);
2063
2064         return TRUE;
2065 }
2066
2067 /*!
2068  * @brief オブジェクトから能力発動IDを取得する。
2069  * @details いくつかのケースで定義されている発動効果から、
2070  * 鍛冶師による付与>固定アーティファクト>エゴ>ランダムアーティファクト>ベースアイテムの優先順位で走査していく。
2071  * @param o_ptr 対象のオブジェクト構造体ポインタ
2072  * @return 発動効果のIDを返す
2073  */
2074 int activation_index(object_type *o_ptr)
2075 {
2076         /* Give priority to weaponsmith's essential activations */
2077         if (object_is_smith(o_ptr))
2078         {
2079                 switch (o_ptr->xtra3 - 1)
2080                 {
2081                 case ESSENCE_TMP_RES_ACID: return ACT_RESIST_ACID;
2082                 case ESSENCE_TMP_RES_ELEC: return ACT_RESIST_ELEC;
2083                 case ESSENCE_TMP_RES_FIRE: return ACT_RESIST_FIRE;
2084                 case ESSENCE_TMP_RES_COLD: return ACT_RESIST_COLD;
2085                 case TR_IMPACT: return ACT_QUAKE;
2086                 }
2087         }
2088
2089         if (object_is_fixed_artifact(o_ptr))
2090         {
2091                 if (have_flag(a_info[o_ptr->name1].flags, TR_ACTIVATE))
2092                 {
2093                         return a_info[o_ptr->name1].act_idx;
2094                 }
2095         }
2096         if (object_is_ego(o_ptr))
2097         {
2098                 if (have_flag(e_info[o_ptr->name2].flags, TR_ACTIVATE))
2099                 {
2100                         return e_info[o_ptr->name2].act_idx;
2101                 }
2102         }
2103         if (!object_is_random_artifact(o_ptr))
2104         {
2105                 if (have_flag(k_info[o_ptr->k_idx].flags, TR_ACTIVATE))
2106                 {
2107                         return k_info[o_ptr->k_idx].act_idx;
2108                 }
2109         }
2110
2111         return o_ptr->xtra2;
2112 }
2113
2114 /*!
2115  * @brief オブジェクトから発動効果構造体のポインタを取得する。
2116  * @details activation_index() 関数の結果から参照する。
2117  * @param o_ptr 対象のオブジェクト構造体ポインタ
2118  * @return 発動効果構造体のポインタを返す
2119  */
2120 const activation_type* find_activation_info(object_type *o_ptr)
2121 {
2122         const int index = activation_index(o_ptr);
2123         const activation_type* p;
2124
2125         for (p = activation_info; p->flag != NULL; ++ p) {
2126                 if (p->index == index)
2127                 {
2128                         return p;
2129                 }
2130         }
2131
2132         return NULL;
2133 }
2134
2135 /*!
2136  * @brief 固定アーティファクト生成時の特別なハードコーディング処理を行う。.
2137  * @details random_artifact_resistance()とあるが実際は固定アーティファクトである。
2138  * 対象は恐怖の仮面、村正、ロビントンのハープ、龍争虎鬪、ブラッディムーン、羽衣、天女の羽衣、ミリム、
2139  * その他追加耐性、特性追加処理。
2140  * @attention プレイヤーの各種ステータスに依存した処理がある。
2141  * @todo 折を見て関数名を変更すること。
2142  * @param o_ptr 対象のオブジェクト構造体ポインタ
2143  * @param a_ptr 生成する固定アーティファクト構造体ポインタ
2144  * @return なし
2145  */
2146 void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
2147 {
2148         bool give_resistance = FALSE, give_power = FALSE;
2149
2150         if (o_ptr->name1 == ART_TERROR) /* Terror Mask is for warriors... */
2151         {
2152                 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_ARCHER || p_ptr->pclass == CLASS_CAVALRY || p_ptr->pclass == CLASS_BERSERKER)
2153                 {
2154                         give_power = TRUE;
2155                         give_resistance = TRUE;
2156                 }
2157                 else
2158                 {
2159                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2160                         add_flag(o_ptr->art_flags, TR_TY_CURSE);
2161                         o_ptr->curse_flags |=
2162                             (TRC_CURSED | TRC_HEAVY_CURSE);
2163                         o_ptr->curse_flags |= get_curse(2, o_ptr);
2164                         return;
2165                 }
2166         }
2167
2168         if (o_ptr->name1 == ART_MURAMASA)
2169         {
2170                 if (p_ptr->pclass != CLASS_SAMURAI)
2171                 {
2172                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2173                         o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2174                 }
2175         }
2176
2177         if (o_ptr->name1 == ART_ROBINTON)
2178         {
2179                 if (p_ptr->pclass == CLASS_BARD)
2180                 {
2181                         add_flag(o_ptr->art_flags, TR_DEC_MANA);
2182                 }
2183         }
2184
2185         if (o_ptr->name1 == ART_XIAOLONG)
2186         {
2187                 if (p_ptr->pclass == CLASS_MONK)
2188                         add_flag(o_ptr->art_flags, TR_BLOWS);
2189         }
2190
2191         if (o_ptr->name1 == ART_BLOOD)
2192         {
2193                 get_bloody_moon_flags(o_ptr);
2194         }
2195
2196         if (o_ptr->name1 == ART_HEAVENLY_MAIDEN)
2197         {
2198                 if (p_ptr->psex != SEX_FEMALE)
2199                 {
2200                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2201                 }
2202         }
2203
2204         if (o_ptr->name1 == ART_MILIM)
2205         {
2206                 if (p_ptr->pseikaku == SEIKAKU_SEXY)
2207                 {
2208                         o_ptr->pval = 3;
2209                         add_flag(o_ptr->art_flags, TR_STR);
2210                         add_flag(o_ptr->art_flags, TR_INT);
2211                         add_flag(o_ptr->art_flags, TR_WIS);
2212                         add_flag(o_ptr->art_flags, TR_DEX);
2213                         add_flag(o_ptr->art_flags, TR_CON);
2214                         add_flag(o_ptr->art_flags, TR_CHR);
2215                 }
2216         }
2217
2218         if (a_ptr->gen_flags & (TRG_XTRA_POWER)) give_power = TRUE;
2219         if (a_ptr->gen_flags & (TRG_XTRA_H_RES)) give_resistance = TRUE;
2220         if (a_ptr->gen_flags & (TRG_XTRA_RES_OR_POWER))
2221         {
2222                 /* Give a resistance OR a power */
2223                 if (one_in_(2)) give_resistance = TRUE;
2224                 else give_power = TRUE;
2225         }
2226
2227         if (give_power)
2228         {
2229                 one_ability(o_ptr);
2230         }
2231
2232         if (give_resistance)
2233         {
2234                 one_high_resistance(o_ptr);
2235         }
2236 }
2237
2238
2239 /*!
2240  * @brief フロアの指定された位置に固定アーティファクトを生成する。 / Create the artifact of the specified number
2241  * @details 固定アーティファクト構造体から基本ステータスをコピーした後、所定の座標でdrop_item()で落とす。
2242  * @param a_idx 生成する固定アーティファクト構造体のID
2243  * @param y アイテムを落とす地点のy座標
2244  * @param x アイテムを落とす地点のx座標
2245  * @return 生成が成功したか否か、失敗はIDの不全、ベースアイテムの不全、drop_item()の失敗時に起こる。
2246  * @attention この処理はdrop_near()内で普通の固定アーティファクトが重ならない性質に依存する.
2247  * 仮に2個以上存在可能かつ装備品以外の固定アーティファクトが作成されれば
2248  * drop_near()関数の返り値は信用できなくなる.
2249  */
2250 bool create_named_art(ARTIFACT_IDX a_idx, POSITION y, POSITION x)
2251 {
2252         object_type forge;
2253         object_type *q_ptr;
2254         KIND_OBJECT_IDX i;
2255
2256         artifact_type *a_ptr = &a_info[a_idx];
2257         q_ptr = &forge;
2258
2259         /* Ignore "empty" artifacts */
2260         if (!a_ptr->name) return FALSE;
2261
2262         /* Acquire the "kind" index */
2263         i = lookup_kind(a_ptr->tval, a_ptr->sval);
2264
2265         if (!i) return FALSE;
2266
2267         /* Create the artifact */
2268         object_prep(q_ptr, i);
2269
2270         /* Save the name */
2271         q_ptr->name1 = a_idx;
2272
2273         /* Extract the fields */
2274         q_ptr->pval = a_ptr->pval;
2275         q_ptr->ac = a_ptr->ac;
2276         q_ptr->dd = a_ptr->dd;
2277         q_ptr->ds = a_ptr->ds;
2278         q_ptr->to_a = a_ptr->to_a;
2279         q_ptr->to_h = a_ptr->to_h;
2280         q_ptr->to_d = a_ptr->to_d;
2281         q_ptr->weight = a_ptr->weight;
2282
2283         /* Hack -- extract the "cursed" flag */
2284         if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
2285         if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2286         if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
2287         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
2288         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
2289         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
2290
2291         random_artifact_resistance(q_ptr, a_ptr);
2292
2293         /* Drop the artifact from heaven */
2294         return drop_near(q_ptr, -1, y, x) ? TRUE : FALSE;
2295 }
2296
2297 /*対邪平均ダメージの計算処理*/
2298 HIT_POINT calc_arm_avgdamage(object_type *o_ptr)
2299 {
2300         BIT_FLAGS flgs[TR_FLAG_SIZE];
2301         object_flags(o_ptr, flgs);
2302
2303         HIT_POINT dam, base, s_evil, forced, vorpal;
2304         s_evil = forced = vorpal = 0;
2305         dam = base = (o_ptr->dd * o_ptr->ds + o_ptr->dd) / 2;
2306
2307         if(have_flag(flgs, TR_KILL_EVIL))
2308         {
2309                 dam = s_evil = dam * 7 / 2;
2310         }
2311         else if(!have_flag(flgs, TR_KILL_EVIL) && have_flag(flgs, TR_SLAY_EVIL))
2312         {       
2313                 dam = s_evil = dam * 2;
2314         }
2315         else s_evil = dam;
2316
2317         if (have_flag(flgs, TR_FORCE_WEAPON))
2318         {
2319                 dam = forced = dam * 3 / 2 + (o_ptr->dd * o_ptr->ds + o_ptr->dd);
2320         }
2321         else forced = dam;
2322
2323         if(have_flag(flgs, TR_VORPAL))
2324         {
2325                 dam = vorpal = dam * 11 / 9;
2326         }
2327         else vorpal = dam;
2328
2329         dam = dam + o_ptr->to_d;
2330
2331         msg_format_wizard(CHEAT_OBJECT,"素:%d> 対邪:%d> 理力:%d> 切:%d> 最終:%d", base, s_evil, forced, vorpal, dam);
2332
2333         return dam;
2334 }
2335
2336 static bool has_extreme_damage_rate(object_type *o_ptr)
2337 {
2338         BIT_FLAGS flgs[TR_FLAG_SIZE];
2339         object_flags(o_ptr, flgs);
2340
2341         if (have_flag(flgs, TR_VAMPIRIC))
2342         {
2343                 if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 52))
2344                 {
2345                         return TRUE;
2346                 }
2347                 else if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 43))
2348                 {
2349                         return TRUE;
2350                 }
2351                 else if( have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 33))
2352                 {
2353                         return TRUE;
2354                 }
2355                 else if (calc_arm_avgdamage(o_ptr) > 63)
2356                 {
2357                         return TRUE;
2358                 }
2359         }
2360         else
2361         {
2362                 if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 65))
2363                 {
2364                         return TRUE;
2365                 }
2366                 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 52))
2367                 {
2368                         return TRUE;
2369                 }
2370                 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 40))
2371                 {
2372                         return TRUE;
2373                 }
2374                 else if (calc_arm_avgdamage(o_ptr) > 75)
2375                 {
2376                         return TRUE;
2377                 }
2378         }
2379         return FALSE;
2380 }
2381
2382 static bool weakening_artifact(object_type *o_ptr)
2383 {
2384         KIND_OBJECT_IDX k_idx = lookup_kind(o_ptr->tval, o_ptr->sval);
2385         object_kind *k_ptr = &k_info[k_idx];
2386         BIT_FLAGS flgs[TR_FLAG_SIZE];
2387         object_flags(o_ptr, flgs);
2388
2389         if (have_flag(flgs, TR_KILL_EVIL))
2390         {
2391                 remove_flag(o_ptr->art_flags, TR_KILL_EVIL);
2392                 add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2393                 return TRUE;
2394         }
2395         else if (k_ptr->dd < o_ptr->dd)
2396         {
2397                 o_ptr->dd--;
2398                 return TRUE;
2399         }
2400         else if (k_ptr->ds < o_ptr->ds)
2401         {
2402                 o_ptr->ds--;
2403                 return TRUE;
2404         }
2405         else if (o_ptr->to_d > 10)
2406         {
2407                 o_ptr->to_d = o_ptr->to_d - damroll(1, 6);
2408                 if (o_ptr->to_d < 10)
2409                 {
2410                         o_ptr->to_d = 10;
2411                 }
2412                 return TRUE;
2413         }
2414         return FALSE;
2415 }