OSDN Git Service

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