OSDN Git Service

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