OSDN Git Service

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