OSDN Git Service

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