OSDN Git Service

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