OSDN Git Service

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