OSDN Git Service

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