OSDN Git Service

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