OSDN Git Service

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