OSDN Git Service

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