OSDN Git Service

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