OSDN Git Service

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