OSDN Git Service

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