OSDN Git Service

4adf2062a9b8962e156d354fc453057ad9e43842
[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 static int suppression_evil_dam(object_type *o_ptr);
16 static int weakening_artifact(object_type *o_ptr);
17
18
19 /* Chance of using syllables to form the name instead of the "template" files */
20 #define SINDARIN_NAME   10 /*!< ランダムアーティファクトにシンダリン銘をつける確率 */
21 #define TABLE_NAME      20 /*!< ランダムアーティファクトに漢字銘をつける確率(正確には TABLE_NAME - SINDARIN_NAME %)となる */
22 #define A_CURSED        13 /*!< 1/nの確率で生成の巻物以外のランダムアーティファクトが呪いつきになる。 */
23 #define WEIRD_LUCK      12 /*!< 1/nの確率でrandom_resistance()の処理中バイアス外の耐性がつき、create_artifactで4を超えるpvalが許可される。*/
24 #define BIAS_LUCK       20 /*!< 1/nの確率でrandom_resistance()で付加する元素耐性が免疫になる */
25 #define IM_LUCK         7 /*!< 1/nの確率でrandom_resistance()で複数免疫の除去処理が免除される */
26
27 /*! @note
28  * Bias luck needs to be higher than weird luck,
29  * since it is usually tested several times...
30  */
31
32 #define ACTIVATION_CHANCE 3 /*!< 1/nの確率でランダムアーティファクトに発動が付加される。ただし防具はさらに1/2 */
33
34
35 /*!
36  * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
37  * @details 重複の抑止はない。
38  * @param o_ptr 対象のオブジェクト構造体ポインタ
39  * @return なし
40  */
41 void one_sustain(object_type *o_ptr)
42 {
43         switch (randint0(6))
44         {
45                 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
46                 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
47                 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
48                 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
49                 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
50                 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
51         }
52 }
53
54
55 /*!
56  * @brief 対象のオブジェクトにランダムな上位耐性を一つ付加する。/ Choose one random high resistance
57  * @details 重複の抑止はない。候補は毒、閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、劣化、恐怖のいずれか。
58  * @param o_ptr 対象のオブジェクト構造体ポインタ
59  * @return なし
60  */
61 void one_high_resistance(object_type *o_ptr)
62 {
63         switch (randint0(12))
64         {
65                 case  0: add_flag(o_ptr->art_flags, TR_RES_POIS);   break;
66                 case  1: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
67                 case  2: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
68                 case  3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
69                 case  4: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
70                 case  5: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
71                 case  6: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
72                 case  7: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
73                 case  8: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
74                 case  9: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
75                 case 10: add_flag(o_ptr->art_flags, TR_RES_DISEN);  break;
76                 case 11: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
77         }
78 }
79
80 /*!
81  * @brief 対象のオブジェクトに王者の指輪向けの上位耐性を一つ付加する。/ Choose one random high resistance
82  * @details 候補は閃光、暗黒、破片、盲目、混乱、地獄、因果混乱、カオス、恐怖であり
83  * 王者の指輪にあらかじめついている耐性をone_high_resistance()から除外したものである。
84  * ランダム付加そのものに重複の抑止はない。
85  * @param o_ptr 対象のオブジェクト構造体ポインタ
86  * @return なし
87  */
88 void one_lordly_high_resistance(object_type *o_ptr)
89 {
90         switch (randint0(10))
91         {
92                 case 0: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
93                 case 1: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
94                 case 2: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
95                 case 3: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
96                 case 4: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
97                 case 5: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
98                 case 6: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
99                 case 7: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
100                 case 8: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
101                 case 9: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
102         }
103 }
104
105 /*!
106  * @brief 対象のオブジェクトに元素耐性を一つ付加する。/ Choose one random element resistance
107  * @details 候補は火炎、冷気、電撃、酸のいずれかであり、重複の抑止はない。
108  * @param o_ptr 対象のオブジェクト構造体ポインタ
109  * @return なし
110  */
111 void one_ele_resistance(object_type *o_ptr)
112 {
113         switch (randint0(4))
114         {
115                 case  0: add_flag(o_ptr->art_flags, TR_RES_ACID); break;
116                 case  1: add_flag(o_ptr->art_flags, TR_RES_ELEC); break;
117                 case  2: add_flag(o_ptr->art_flags, TR_RES_COLD); break;
118                 case  3: add_flag(o_ptr->art_flags, TR_RES_FIRE); break;
119         }
120 }
121
122 /*!
123  * @brief 対象のオブジェクトにドラゴン装備向け元素耐性を一つ付加する。/ Choose one random element or poison resistance
124  * @details 候補は1/7の確率で毒、6/7の確率で火炎、冷気、電撃、酸のいずれか(one_ele_resistance()のコール)であり、重複の抑止はない。
125  * @param o_ptr 対象のオブジェクト構造体ポインタ
126  * @return なし
127  */
128 void one_dragon_ele_resistance(object_type *o_ptr)
129 {
130         if (one_in_(7))
131         {
132                 add_flag(o_ptr->art_flags, TR_RES_POIS);
133         }
134         else
135         {
136                 one_ele_resistance(o_ptr);
137         }
138 }
139
140 /*!
141  * @brief 対象のオブジェクトに弱いESPを一つ付加する。/ Choose one lower rank esp
142  * @details 候補は動物、アンデッド、悪魔、オーク、トロル、巨人、
143  * ドラゴン、人間、善良、ユニークESPのいずれかであり、重複の抑止はない。
144  * @param o_ptr 対象のオブジェクト構造体ポインタ
145  * @return なし
146  */
147 void one_low_esp(object_type *o_ptr)
148 {
149         switch (randint1(10))
150         {
151                 case 1:  add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);   break;
152                 case 2:  add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);   break;
153                 case 3:  add_flag(o_ptr->art_flags, TR_ESP_DEMON);   break;
154                 case 4:  add_flag(o_ptr->art_flags, TR_ESP_ORC);   break;
155                 case 5:  add_flag(o_ptr->art_flags, TR_ESP_TROLL);   break;
156                 case 6:  add_flag(o_ptr->art_flags, TR_ESP_GIANT);   break;
157                 case 7:  add_flag(o_ptr->art_flags, TR_ESP_DRAGON);   break;
158                 case 8:  add_flag(o_ptr->art_flags, TR_ESP_HUMAN);   break;
159                 case 9:  add_flag(o_ptr->art_flags, TR_ESP_GOOD);   break;
160                 case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);   break;
161         }
162 }
163
164
165 /*!
166  * @brief 対象のオブジェクトに耐性を一つ付加する。/ Choose one random resistance
167  * @details 1/3で元素耐性(one_ele_resistance())、2/3で上位耐性(one_high_resistance)
168  * をコールする。重複の抑止はない。
169  * @param o_ptr 対象のオブジェクト構造体ポインタ
170  * @return なし
171  */
172 void one_resistance(object_type *o_ptr)
173 {
174         if (one_in_(3))
175         {
176                 one_ele_resistance(o_ptr);
177         }
178         else
179         {
180                 one_high_resistance(o_ptr);
181         }
182 }
183
184
185 /*!
186  * @brief 対象のオブジェクトに能力を一つ付加する。/ Choose one random ability
187  * @details 候補は浮遊、永久光源+1、透明視、警告、遅消化、急回復、麻痺知らず、経験値維持のいずれか。
188  * 重複の抑止はない。
189  * @param o_ptr 対象のオブジェクト構造体ポインタ
190  * @return なし
191  */
192 void one_ability(object_type *o_ptr)
193 {
194         switch (randint0(10))
195         {
196         case 0: add_flag(o_ptr->art_flags, TR_LEVITATION);  break;
197         case 1: add_flag(o_ptr->art_flags, TR_LITE_1);      break;
198         case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS);   break;
199         case 3: add_flag(o_ptr->art_flags, TR_WARNING);     break;
200         case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
201         case 5: add_flag(o_ptr->art_flags, TR_REGEN);       break;
202         case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT);    break;
203         case 7: add_flag(o_ptr->art_flags, TR_HOLD_EXP);   break;
204         case 8:
205         case 9:
206                 one_low_esp(o_ptr);
207                 break;
208         }
209 }
210
211 /*!
212  * @brief 対象のオブジェクトに発動を一つ付加する。/ Choose one random activation
213  * @details 候補多数。ランダムアーティファクトのバイアスには一切依存せず、
214  * whileループによる構造で能力的に強力なものほど確率を落としている。
215  * @param o_ptr 対象のオブジェクト構造体ポインタ
216  * @return なし
217  */
218 void one_activation(object_type *o_ptr)
219 {
220         int type = 0;
221         int chance = 0;
222
223         while (randint1(100) >= chance)
224         {
225                 type = randint1(255);
226                 switch (type)
227                 {
228                         case ACT_SUNLIGHT:
229                         case ACT_BO_MISS_1:
230                         case ACT_BA_POIS_1:
231                         case ACT_BO_ELEC_1:
232                         case ACT_BO_ACID_1:
233                         case ACT_BO_COLD_1:
234                         case ACT_BO_FIRE_1:
235                         case ACT_CONFUSE:
236                         case ACT_SLEEP:
237                         case ACT_QUAKE:
238                         case ACT_CURE_LW:
239                         case ACT_CURE_MW:
240                         case ACT_CURE_POISON:
241                         case ACT_BERSERK:
242                         case ACT_LIGHT:
243                         case ACT_MAP_LIGHT:
244                         case ACT_DEST_DOOR:
245                         case ACT_STONE_MUD:
246                         case ACT_TELEPORT:
247                                 chance = 101;
248                                 break;
249                         case ACT_BA_COLD_1:
250                         case ACT_BA_FIRE_1:
251                         case ACT_DRAIN_1:
252                         case ACT_TELE_AWAY:
253                         case ACT_ESP:
254                         case ACT_RESIST_ALL:
255                         case ACT_DETECT_ALL:
256                         case ACT_RECALL:
257                         case ACT_SATIATE:
258                         case ACT_RECHARGE:
259                                 chance = 85;
260                                 break;
261                         case ACT_TERROR:
262                         case ACT_PROT_EVIL:
263                         case ACT_ID_PLAIN:
264                                 chance = 75;
265                                 break;
266                         case ACT_DRAIN_2:
267                         case ACT_VAMPIRE_1:
268                         case ACT_BO_MISS_2:
269                         case ACT_BA_FIRE_2:
270                         case ACT_REST_EXP:
271                                 chance = 66;
272                                 break;
273                         case ACT_BA_FIRE_3:
274                         case ACT_BA_COLD_3:
275                         case ACT_BA_ELEC_3:
276                         case ACT_WHIRLWIND:
277                         case ACT_VAMPIRE_2:
278                         case ACT_CHARM_ANIMAL:
279                                 chance = 50;
280                                 break;
281                         case ACT_SUMMON_ANIMAL:
282                                 chance = 40;
283                                 break;
284                         case ACT_DISP_EVIL:
285                         case ACT_BA_MISS_3:
286                         case ACT_DISP_GOOD:
287                         case ACT_BANISH_EVIL:
288                         case ACT_GENOCIDE:
289                         case ACT_MASS_GENO:
290                         case ACT_CHARM_UNDEAD:
291                         case ACT_CHARM_OTHER:
292                         case ACT_SUMMON_PHANTOM:
293                         case ACT_REST_ALL:
294                         case ACT_RUNE_EXPLO:
295                                 chance = 33;
296                                 break;
297                         case ACT_CALL_CHAOS:
298                         case ACT_ROCKET:
299                         case ACT_CHARM_ANIMALS:
300                         case ACT_CHARM_OTHERS:
301                         case ACT_SUMMON_ELEMENTAL:
302                         case ACT_CURE_700:
303                         case ACT_SPEED:
304                         case ACT_ID_FULL:
305                         case ACT_RUNE_PROT:
306                                 chance = 25;
307                                 break;
308                         case ACT_CURE_1000:
309                         case ACT_XTRA_SPEED:
310                         case ACT_DETECT_XTRA:
311                         case ACT_DIM_DOOR:
312                                 chance = 10;
313                                 break;
314                         case ACT_SUMMON_UNDEAD:
315                         case ACT_SUMMON_DEMON:
316                         case ACT_WRAITH:
317                         case ACT_INVULN:
318                         case ACT_ALCHEMY:
319                                 chance = 5;
320                                 break;
321                         default:
322                                 chance = 0;
323                 }
324         }
325
326         /* A type was chosen... */
327         o_ptr->xtra2 = (byte_hack)type;
328         add_flag(o_ptr->art_flags, TR_ACTIVATE);
329         o_ptr->timeout = 0;
330 }
331
332 /*!
333  * @brief ランダムアーティファクト生成中、対象のオブジェクトを呪いのアーティファクトにする経過処理。/ generation process of cursed artifact.
334  * @details pval、AC、命中、ダメージが正の場合、符号反転の上1d4だけ悪化させ、重い呪い、呪いフラグを必ず付加。
335  * 祝福を無効。確率に応じて、永遠の呪い、太古の怨念、経験値吸収、弱い呪いの継続的付加、強い呪いの継続的付加、HP吸収の呪い、
336  * MP吸収の呪い、乱テレポート、反テレポート、反魔法をつける。
337  * @attention プレイヤーの職業依存処理あり。
338  * @param o_ptr 対象のオブジェクト構造体ポインタ
339  * @return なし
340  */
341 static void curse_artifact(object_type * o_ptr)
342 {
343         if (o_ptr->pval > 0) o_ptr->pval = 0 - (o_ptr->pval + randint1(4));
344         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - (o_ptr->to_a + randint1(4));
345         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
346         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
347
348         o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
349         remove_flag(o_ptr->art_flags, TR_BLESSED);
350
351         if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
352         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
353         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
354         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
355         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
356         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
357         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
358         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
359         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_TELEPORT);
360         else if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
361
362         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))
363                 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
364 }
365
366 /*!
367  * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
368  * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
369  * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
370  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
371  * @param o_ptr 対象のオブジェクト構造体ポインタ
372  * @return なし
373  */
374 static void random_plus(object_type * o_ptr)
375 {
376         int this_type = (object_is_weapon_ammo(o_ptr) ? 23 : 19);
377
378         switch (o_ptr->artifact_bias)
379         {
380         case BIAS_WARRIOR:
381                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
382                 {
383                         add_flag(o_ptr->art_flags, TR_STR);
384                         if (one_in_(2)) return;
385                 }
386
387                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
388                 {
389                         add_flag(o_ptr->art_flags, TR_CON);
390                         if (one_in_(2)) return;
391                 }
392
393                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
394                 {
395                         add_flag(o_ptr->art_flags, TR_DEX);
396                         if (one_in_(2)) return;
397                 }
398                 break;
399
400         case BIAS_MAGE:
401                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
402                 {
403                         add_flag(o_ptr->art_flags, TR_INT);
404                         if (one_in_(2)) return;
405                 }
406                 if ((o_ptr->tval == TV_GLOVES) && !(have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)))
407                 {
408                         add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
409                         if (one_in_(2)) return;
410                 }
411                 break;
412
413         case BIAS_PRIESTLY:
414                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
415                 {
416                         add_flag(o_ptr->art_flags, TR_WIS);
417                         if (one_in_(2)) return;
418                 }
419                 break;
420
421         case BIAS_RANGER:
422                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
423                 {
424                         add_flag(o_ptr->art_flags, TR_DEX);
425                         if (one_in_(2)) return;
426                 }
427
428                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
429                 {
430                         add_flag(o_ptr->art_flags, TR_CON);
431                         if (one_in_(2)) return;
432                 }
433
434                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
435                 {
436                         add_flag(o_ptr->art_flags, TR_STR);
437                         if (one_in_(2)) return;
438                 }
439                 break;
440
441         case BIAS_ROGUE:
442                 if (!(have_flag(o_ptr->art_flags, TR_STEALTH)))
443                 {
444                         add_flag(o_ptr->art_flags, TR_STEALTH);
445                         if (one_in_(2)) return;
446                 }
447                 if (!(have_flag(o_ptr->art_flags, TR_SEARCH)))
448                 {
449                         add_flag(o_ptr->art_flags, TR_SEARCH);
450                         if (one_in_(2)) return;
451                 }
452                 break;
453
454         case BIAS_STR:
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_WIS:
463                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
464                 {
465                         add_flag(o_ptr->art_flags, TR_WIS);
466                         if (one_in_(2)) return;
467                 }
468                 break;
469
470         case BIAS_INT:
471                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
472                 {
473                         add_flag(o_ptr->art_flags, TR_INT);
474                         if (one_in_(2)) return;
475                 }
476                 break;
477
478         case BIAS_DEX:
479                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
480                 {
481                         add_flag(o_ptr->art_flags, TR_DEX);
482                         if (one_in_(2)) return;
483                 }
484                 break;
485
486         case BIAS_CON:
487                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
488                 {
489                         add_flag(o_ptr->art_flags, TR_CON);
490                         if (one_in_(2)) return;
491                 }
492                 break;
493
494         case BIAS_CHR:
495                 if (!(have_flag(o_ptr->art_flags, TR_CHR)))
496                 {
497                         add_flag(o_ptr->art_flags, TR_CHR);
498                         if (one_in_(2)) return;
499                 }
500                 break;
501         }
502
503         if ((o_ptr->artifact_bias == BIAS_MAGE || o_ptr->artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE))
504         {
505                 if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3))
506                 {
507                         add_flag(o_ptr->art_flags, TR_DEC_MANA);
508                         if (one_in_(2)) return;
509                 }
510         }
511
512         switch (randint1(this_type))
513         {
514         case 1: case 2:
515                 add_flag(o_ptr->art_flags, TR_STR);
516                 if (!o_ptr->artifact_bias && !one_in_(13))
517                         o_ptr->artifact_bias = BIAS_STR;
518                 else if (!o_ptr->artifact_bias && one_in_(7))
519                         o_ptr->artifact_bias = BIAS_WARRIOR;
520                 break;
521         case 3: case 4:
522                 add_flag(o_ptr->art_flags, TR_INT);
523                 if (!o_ptr->artifact_bias && !one_in_(13))
524                         o_ptr->artifact_bias = BIAS_INT;
525                 else if (!o_ptr->artifact_bias && one_in_(7))
526                         o_ptr->artifact_bias = BIAS_MAGE;
527                 break;
528         case 5: case 6:
529                 add_flag(o_ptr->art_flags, TR_WIS);
530                 if (!o_ptr->artifact_bias && !one_in_(13))
531                         o_ptr->artifact_bias = BIAS_WIS;
532                 else if (!o_ptr->artifact_bias && one_in_(7))
533                         o_ptr->artifact_bias = BIAS_PRIESTLY;
534                 break;
535         case 7: case 8:
536                 add_flag(o_ptr->art_flags, TR_DEX);
537                 if (!o_ptr->artifact_bias && !one_in_(13))
538                         o_ptr->artifact_bias = BIAS_DEX;
539                 else if (!o_ptr->artifact_bias && one_in_(7))
540                         o_ptr->artifact_bias = BIAS_ROGUE;
541                 break;
542         case 9: case 10:
543                 add_flag(o_ptr->art_flags, TR_CON);
544                 if (!o_ptr->artifact_bias && !one_in_(13))
545                         o_ptr->artifact_bias = BIAS_CON;
546                 else if (!o_ptr->artifact_bias && one_in_(9))
547                         o_ptr->artifact_bias = BIAS_RANGER;
548                 break;
549         case 11: case 12:
550                 add_flag(o_ptr->art_flags, TR_CHR);
551                 if (!o_ptr->artifact_bias && !one_in_(13))
552                         o_ptr->artifact_bias = BIAS_CHR;
553                 break;
554         case 13: case 14:
555                 add_flag(o_ptr->art_flags, TR_STEALTH);
556                 if (!o_ptr->artifact_bias && one_in_(3))
557                         o_ptr->artifact_bias = BIAS_ROGUE;
558                 break;
559         case 15: case 16:
560                 add_flag(o_ptr->art_flags, TR_SEARCH);
561                 if (!o_ptr->artifact_bias && one_in_(9))
562                         o_ptr->artifact_bias = BIAS_RANGER;
563                 break;
564         case 17: case 18:
565                 add_flag(o_ptr->art_flags, TR_INFRA);
566                 break;
567         case 19:
568                 add_flag(o_ptr->art_flags, TR_SPEED);
569                 if (!o_ptr->artifact_bias && one_in_(11))
570                         o_ptr->artifact_bias = BIAS_ROGUE;
571                 break;
572         case 20: case 21:
573                 add_flag(o_ptr->art_flags, TR_TUNNEL);
574                 break;
575         case 22: case 23:
576                 if (o_ptr->tval == TV_BOW) random_plus(o_ptr);
577                 else
578                 {
579                         add_flag(o_ptr->art_flags, TR_BLOWS);
580                         if (!o_ptr->artifact_bias && one_in_(11))
581                                 o_ptr->artifact_bias = BIAS_WARRIOR;
582                 }
583                 break;
584         }
585 }
586
587 /*!
588  * @brief ランダムアーティファクト生成中、対象のオブジェクトに耐性を付加する。/ Add one resistance on generation of randam artifact.
589  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
590  * 原則的候補は火炎、冷気、電撃、酸(以上免疫の可能性もあり)、
591  * 毒、閃光、暗黒、破片、轟音、盲目、混乱、地獄、カオス、劣化、恐怖、火オーラ、冷気オーラ、電撃オーラ、反射。
592  * 戦士系バイアスのみ反魔もつく。
593  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
594  * @param o_ptr 対象のオブジェクト構造体ポインタ
595  * @return なし
596  */
597 static void random_resistance(object_type * o_ptr)
598 {
599         switch (o_ptr->artifact_bias)
600         {
601         case BIAS_ACID:
602                 if (!(have_flag(o_ptr->art_flags, TR_RES_ACID)))
603                 {
604                         add_flag(o_ptr->art_flags, TR_RES_ACID);
605                         if (one_in_(2)) return;
606                 }
607                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ACID)))
608                 {
609                         add_flag(o_ptr->art_flags, TR_IM_ACID);
610                         if (!one_in_(IM_LUCK))
611                         {
612                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
613                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
614                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
615                         }
616                         if (one_in_(2)) return;
617                 }
618                 break;
619
620         case BIAS_ELEC:
621                 if (!(have_flag(o_ptr->art_flags, TR_RES_ELEC)))
622                 {
623                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
624                         if (one_in_(2)) return;
625                 }
626                 if ((o_ptr->tval >= TV_CLOAK) && (o_ptr->tval <= TV_HARD_ARMOR) &&
627                     !(have_flag(o_ptr->art_flags, TR_SH_ELEC)))
628                 {
629                         add_flag(o_ptr->art_flags, TR_SH_ELEC);
630                         if (one_in_(2)) return;
631                 }
632                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ELEC)))
633                 {
634                         add_flag(o_ptr->art_flags, TR_IM_ELEC);
635                         if (!one_in_(IM_LUCK))
636                         {
637                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
638                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
639                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
640                         }
641
642                         if (one_in_(2)) return;
643                 }
644                 break;
645
646         case BIAS_FIRE:
647                 if (!(have_flag(o_ptr->art_flags, TR_RES_FIRE)))
648                 {
649                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
650                         if (one_in_(2)) return;
651                 }
652                 if ((o_ptr->tval >= TV_CLOAK) &&
653                     (o_ptr->tval <= TV_HARD_ARMOR) &&
654                     !(have_flag(o_ptr->art_flags, TR_SH_FIRE)))
655                 {
656                         add_flag(o_ptr->art_flags, TR_SH_FIRE);
657                         if (one_in_(2)) return;
658                 }
659                 if (one_in_(BIAS_LUCK) &&
660                     !(have_flag(o_ptr->art_flags, TR_IM_FIRE)))
661                 {
662                         add_flag(o_ptr->art_flags, TR_IM_FIRE);
663                         if (!one_in_(IM_LUCK))
664                         {
665                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
666                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
667                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
668                         }
669                         if (one_in_(2)) return;
670                 }
671                 break;
672
673         case BIAS_COLD:
674                 if (!(have_flag(o_ptr->art_flags, TR_RES_COLD)))
675                 {
676                         add_flag(o_ptr->art_flags, TR_RES_COLD);
677                         if (one_in_(2)) return;
678                 }
679                 if ((o_ptr->tval >= TV_CLOAK) &&
680                     (o_ptr->tval <= TV_HARD_ARMOR) &&
681                     !(have_flag(o_ptr->art_flags, TR_SH_COLD)))
682                 {
683                         add_flag(o_ptr->art_flags, TR_SH_COLD);
684                         if (one_in_(2)) return;
685                 }
686                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_COLD)))
687                 {
688                         add_flag(o_ptr->art_flags, TR_IM_COLD);
689                         if (!one_in_(IM_LUCK))
690                         {
691                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
692                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
693                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
694                         }
695                         if (one_in_(2)) return;
696                 }
697                 break;
698
699         case BIAS_POIS:
700                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
701                 {
702                         add_flag(o_ptr->art_flags, TR_RES_POIS);
703                         if (one_in_(2)) return;
704                 }
705                 break;
706
707         case BIAS_WARRIOR:
708                 if (!one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_RES_FEAR))))
709                 {
710                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
711                         if (one_in_(2)) return;
712                 }
713                 if (one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_NO_MAGIC))))
714                 {
715                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
716                         if (one_in_(2)) return;
717                 }
718                 break;
719
720         case BIAS_NECROMANTIC:
721                 if (!(have_flag(o_ptr->art_flags, TR_RES_NETHER)))
722                 {
723                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
724                         if (one_in_(2)) return;
725                 }
726                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
727                 {
728                         add_flag(o_ptr->art_flags, TR_RES_POIS);
729                         if (one_in_(2)) return;
730                 }
731                 if (!(have_flag(o_ptr->art_flags, TR_RES_DARK)))
732                 {
733                         add_flag(o_ptr->art_flags, TR_RES_DARK);
734                         if (one_in_(2)) return;
735                 }
736                 break;
737
738         case BIAS_CHAOS:
739                 if (!(have_flag(o_ptr->art_flags, TR_RES_CHAOS)))
740                 {
741                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
742                         if (one_in_(2)) return;
743                 }
744                 if (!(have_flag(o_ptr->art_flags, TR_RES_CONF)))
745                 {
746                         add_flag(o_ptr->art_flags, TR_RES_CONF);
747                         if (one_in_(2)) return;
748                 }
749                 if (!(have_flag(o_ptr->art_flags, TR_RES_DISEN)))
750                 {
751                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
752                         if (one_in_(2)) return;
753                 }
754                 break;
755         }
756
757         switch (randint1(42))
758         {
759                 case 1:
760                         if (!one_in_(WEIRD_LUCK))
761                                 random_resistance(o_ptr);
762                         else
763                         {
764                                 add_flag(o_ptr->art_flags, TR_IM_ACID);
765                                 if (!o_ptr->artifact_bias)
766                                         o_ptr->artifact_bias = BIAS_ACID;
767                         }
768                         break;
769                 case 2:
770                         if (!one_in_(WEIRD_LUCK))
771                                 random_resistance(o_ptr);
772                         else
773                         {
774                                 add_flag(o_ptr->art_flags, TR_IM_ELEC);
775                                 if (!o_ptr->artifact_bias)
776                                         o_ptr->artifact_bias = BIAS_ELEC;
777                         }
778                         break;
779                 case 3:
780                         if (!one_in_(WEIRD_LUCK))
781                                 random_resistance(o_ptr);
782                         else
783                         {
784                                 add_flag(o_ptr->art_flags, TR_IM_COLD);
785                                 if (!o_ptr->artifact_bias)
786                                         o_ptr->artifact_bias = BIAS_COLD;
787                         }
788                         break;
789                 case 4:
790                         if (!one_in_(WEIRD_LUCK))
791                                 random_resistance(o_ptr);
792                         else
793                         {
794                                 add_flag(o_ptr->art_flags, TR_IM_FIRE);
795                                 if (!o_ptr->artifact_bias)
796                                         o_ptr->artifact_bias = BIAS_FIRE;
797                         }
798                         break;
799                 case 5:
800                 case 6:
801                 case 13:
802                         add_flag(o_ptr->art_flags, TR_RES_ACID);
803                         if (!o_ptr->artifact_bias)
804                                 o_ptr->artifact_bias = BIAS_ACID;
805                         break;
806                 case 7:
807                 case 8:
808                 case 14:
809                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
810                         if (!o_ptr->artifact_bias)
811                                 o_ptr->artifact_bias = BIAS_ELEC;
812                         break;
813                 case 9:
814                 case 10:
815                 case 15:
816                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
817                         if (!o_ptr->artifact_bias)
818                                 o_ptr->artifact_bias = BIAS_FIRE;
819                         break;
820                 case 11:
821                 case 12:
822                 case 16:
823                         add_flag(o_ptr->art_flags, TR_RES_COLD);
824                         if (!o_ptr->artifact_bias)
825                                 o_ptr->artifact_bias = BIAS_COLD;
826                         break;
827                 case 17:
828                 case 18:
829                         add_flag(o_ptr->art_flags, TR_RES_POIS);
830                         if (!o_ptr->artifact_bias && !one_in_(4))
831                                 o_ptr->artifact_bias = BIAS_POIS;
832                         else if (!o_ptr->artifact_bias && one_in_(2))
833                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
834                         else if (!o_ptr->artifact_bias && one_in_(2))
835                                 o_ptr->artifact_bias = BIAS_ROGUE;
836                         break;
837                 case 19:
838                 case 20:
839                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
840                         if (!o_ptr->artifact_bias && one_in_(3))
841                                 o_ptr->artifact_bias = BIAS_WARRIOR;
842                         break;
843                 case 21:
844                         add_flag(o_ptr->art_flags, TR_RES_LITE);
845                         break;
846                 case 22:
847                         add_flag(o_ptr->art_flags, TR_RES_DARK);
848                         break;
849                 case 23:
850                 case 24:
851                         add_flag(o_ptr->art_flags, TR_RES_BLIND);
852                         break;
853                 case 25:
854                 case 26:
855                         add_flag(o_ptr->art_flags, TR_RES_CONF);
856                         if (!o_ptr->artifact_bias && one_in_(6))
857                                 o_ptr->artifact_bias = BIAS_CHAOS;
858                         break;
859                 case 27:
860                 case 28:
861                         add_flag(o_ptr->art_flags, TR_RES_SOUND);
862                         break;
863                 case 29:
864                 case 30:
865                         add_flag(o_ptr->art_flags, TR_RES_SHARDS);
866                         break;
867                 case 31:
868                 case 32:
869                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
870                         if (!o_ptr->artifact_bias && one_in_(3))
871                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
872                         break;
873                 case 33:
874                 case 34:
875                         add_flag(o_ptr->art_flags, TR_RES_NEXUS);
876                         break;
877                 case 35:
878                 case 36:
879                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
880                         if (!o_ptr->artifact_bias && one_in_(2))
881                                 o_ptr->artifact_bias = BIAS_CHAOS;
882                         break;
883                 case 37:
884                 case 38:
885                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
886                         break;
887                 case 39:
888                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
889                                 add_flag(o_ptr->art_flags, TR_SH_ELEC);
890                         else
891                                 random_resistance(o_ptr);
892                         if (!o_ptr->artifact_bias)
893                                 o_ptr->artifact_bias = BIAS_ELEC;
894                         break;
895                 case 40:
896                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
897                                 add_flag(o_ptr->art_flags, TR_SH_FIRE);
898                         else
899                                 random_resistance(o_ptr);
900                         if (!o_ptr->artifact_bias)
901                                 o_ptr->artifact_bias = BIAS_FIRE;
902                         break;
903                 case 41:
904                         if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
905                             o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
906                                 add_flag(o_ptr->art_flags, TR_REFLECT);
907                         else
908                                 random_resistance(o_ptr);
909                         break;
910                 case 42:
911                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
912                                 add_flag(o_ptr->art_flags, TR_SH_COLD);
913                         else
914                                 random_resistance(o_ptr);
915                         if (!o_ptr->artifact_bias)
916                                 o_ptr->artifact_bias = BIAS_COLD;
917                         break;
918         }
919 }
920
921
922 /*!
923  * @brief ランダムアーティファクト生成中、対象のオブジェクトにその他特性を付加する。/ Add one misc flag on generation of randam artifact.
924  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
925  * 原則的候補は各種能力維持、永久光源+1、麻痺知らず、経験値維持、浮遊、透明視、急回復、遅消化、
926  * 乱テレポート、反魔法、反テレポート、警告、テレパシー、各種ESP、一部装備に殺戮修正。
927  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
928  * @param o_ptr 対象のオブジェクト構造体ポインタ
929  * @return なし
930  */
931 static void random_misc(object_type * o_ptr)
932 {
933         switch (o_ptr->artifact_bias)
934         {
935         case BIAS_RANGER:
936                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
937                 {
938                         add_flag(o_ptr->art_flags, TR_SUST_CON);
939                         if (one_in_(2)) return;
940                 }
941                 break;
942
943         case BIAS_STR:
944                 if (!(have_flag(o_ptr->art_flags, TR_SUST_STR)))
945                 {
946                         add_flag(o_ptr->art_flags, TR_SUST_STR);
947                         if (one_in_(2)) return;
948                 }
949                 break;
950
951         case BIAS_WIS:
952                 if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS)))
953                 {
954                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
955                         if (one_in_(2)) return;
956                 }
957                 break;
958
959         case BIAS_INT:
960                 if (!(have_flag(o_ptr->art_flags, TR_SUST_INT)))
961                 {
962                         add_flag(o_ptr->art_flags, TR_SUST_INT);
963                         if (one_in_(2)) return;
964                 }
965                 break;
966
967         case BIAS_DEX:
968                 if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX)))
969                 {
970                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
971                         if (one_in_(2)) return;
972                 }
973                 break;
974
975         case BIAS_CON:
976                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
977                 {
978                         add_flag(o_ptr->art_flags, TR_SUST_CON);
979                         if (one_in_(2)) return;
980                 }
981                 break;
982
983         case BIAS_CHR:
984                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR)))
985                 {
986                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
987                         if (one_in_(2)) return;
988                 }
989                 break;
990
991         case BIAS_CHAOS:
992                 if (!(have_flag(o_ptr->art_flags, TR_TELEPORT)))
993                 {
994                         add_flag(o_ptr->art_flags, TR_TELEPORT);
995                         if (one_in_(2)) return;
996                 }
997                 break;
998
999         case BIAS_FIRE:
1000                 if (!(have_flag(o_ptr->art_flags, TR_LITE_1)))
1001                 {
1002                         add_flag(o_ptr->art_flags, TR_LITE_1); /* Freebie */
1003                 }
1004                 break;
1005         }
1006
1007         switch (randint1(33))
1008         {
1009                 case 1:
1010                         add_flag(o_ptr->art_flags, TR_SUST_STR);
1011                         if (!o_ptr->artifact_bias)
1012                                 o_ptr->artifact_bias = BIAS_STR;
1013                         break;
1014                 case 2:
1015                         add_flag(o_ptr->art_flags, TR_SUST_INT);
1016                         if (!o_ptr->artifact_bias)
1017                                 o_ptr->artifact_bias = BIAS_INT;
1018                         break;
1019                 case 3:
1020                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
1021                         if (!o_ptr->artifact_bias)
1022                                 o_ptr->artifact_bias = BIAS_WIS;
1023                         break;
1024                 case 4:
1025                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
1026                         if (!o_ptr->artifact_bias)
1027                                 o_ptr->artifact_bias = BIAS_DEX;
1028                         break;
1029                 case 5:
1030                         add_flag(o_ptr->art_flags, TR_SUST_CON);
1031                         if (!o_ptr->artifact_bias)
1032                                 o_ptr->artifact_bias = BIAS_CON;
1033                         break;
1034                 case 6:
1035                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
1036                         if (!o_ptr->artifact_bias)
1037                                 o_ptr->artifact_bias = BIAS_CHR;
1038                         break;
1039                 case 7:
1040                 case 8:
1041                 case 14:
1042                         add_flag(o_ptr->art_flags, TR_FREE_ACT);
1043                         break;
1044                 case 9:
1045                         add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1046                         if (!o_ptr->artifact_bias && one_in_(5))
1047                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1048                         else if (!o_ptr->artifact_bias && one_in_(6))
1049                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1050                         break;
1051                 case 10:
1052                 case 11:
1053                         add_flag(o_ptr->art_flags, TR_LITE_1);
1054                         break;
1055                 case 12:
1056                 case 13:
1057                         add_flag(o_ptr->art_flags, TR_LEVITATION);
1058                         break;
1059                 case 15:
1060                 case 16:
1061                 case 17:
1062                         add_flag(o_ptr->art_flags, TR_SEE_INVIS);
1063                         break;
1064                 case 19:
1065                 case 20:
1066                         add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
1067                         break;
1068                 case 21:
1069                 case 22:
1070                         add_flag(o_ptr->art_flags, TR_REGEN);
1071                         break;
1072                 case 23:
1073                         add_flag(o_ptr->art_flags, TR_TELEPORT);
1074                         break;
1075                 case 24:
1076                 case 25:
1077                 case 26:
1078                         if (object_is_armour(o_ptr))
1079                                 random_misc(o_ptr);
1080                         else
1081                         {
1082                                 o_ptr->to_a = 4 + randint1(11);
1083                         }
1084                         break;
1085                 case 27:
1086                 case 28:
1087                 case 29:
1088                 {
1089                         HIT_PROB bonus_h;
1090                         HIT_POINT bonus_d;
1091                         add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1092                         bonus_h = 4 + (HIT_PROB)(randint1(11));
1093                         bonus_d = 4 + (HIT_POINT)(randint1(11));
1094                         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))
1095                         {
1096                                 bonus_h /= 2;
1097                                 bonus_d /= 2;
1098                         }
1099                         o_ptr->to_h += bonus_h;
1100                         o_ptr->to_d += bonus_d;
1101                         break;
1102                 }
1103                 case 30:
1104                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1105                         break;
1106                 case 31:
1107                         add_flag(o_ptr->art_flags, TR_NO_TELE);
1108                         break;
1109                 case 32:
1110                         add_flag(o_ptr->art_flags, TR_WARNING);
1111                         break;
1112
1113                 case 18:
1114                         switch (randint1(3))
1115                         {
1116                         case 1:
1117                                 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
1118                                 if (!o_ptr->artifact_bias && one_in_(3))
1119                                         o_ptr->artifact_bias = BIAS_LAW;
1120                                 break;
1121                         case 2:
1122                                 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
1123                                 if (!o_ptr->artifact_bias && one_in_(3))
1124                                         o_ptr->artifact_bias = BIAS_MAGE;
1125                                 break;
1126                         case 3:
1127                                 add_flag(o_ptr->art_flags, TR_TELEPATHY);
1128                                 if (!o_ptr->artifact_bias && one_in_(9))
1129                                         o_ptr->artifact_bias = BIAS_MAGE;
1130                                 break;
1131                         }
1132                         break;
1133
1134                 case 33:
1135                 {
1136                         int idx[3];
1137                         int n = randint1(3);
1138
1139                         idx[0] = randint1(10);
1140
1141                         idx[1] = randint1(9);
1142                         if (idx[1] >= idx[0]) idx[1]++;
1143
1144                         idx[2] = randint1(8);
1145                         if (idx[2] >= idx[0]) idx[2]++;
1146                         if (idx[2] >= idx[1]) idx[2]++;
1147
1148                         while (n--) switch (idx[n])
1149                         {
1150                         case 1:
1151                                 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
1152                                 if (!o_ptr->artifact_bias && one_in_(4))
1153                                         o_ptr->artifact_bias = BIAS_RANGER;
1154                                 break;
1155                         case 2:
1156                                 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
1157                                 if (!o_ptr->artifact_bias && one_in_(3))
1158                                         o_ptr->artifact_bias = BIAS_PRIESTLY;
1159                                 else if (!o_ptr->artifact_bias && one_in_(6))
1160                                         o_ptr->artifact_bias = BIAS_NECROMANTIC;
1161                                 break;
1162                         case 3:
1163                                 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
1164                                 break;
1165                         case 4:
1166                                 add_flag(o_ptr->art_flags, TR_ESP_ORC);
1167                                 break;
1168                         case 5:
1169                                 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
1170                                 break;
1171                         case 6:
1172                                 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
1173                                 break;
1174                         case 7:
1175                                 add_flag(o_ptr->art_flags, TR_ESP_DRAGON);
1176                                 break;
1177                         case 8:
1178                                 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
1179                                 if (!o_ptr->artifact_bias && one_in_(6))
1180                                         o_ptr->artifact_bias = BIAS_ROGUE;
1181                                 break;
1182                         case 9:
1183                                 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
1184                                 if (!o_ptr->artifact_bias && one_in_(3))
1185                                         o_ptr->artifact_bias = BIAS_LAW;
1186                                 break;
1187                         case 10:
1188                                 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
1189                                 if (!o_ptr->artifact_bias && one_in_(3))
1190                                         o_ptr->artifact_bias = BIAS_LAW;
1191                                 break;
1192                         }
1193                         break;
1194                 }
1195         }
1196 }
1197
1198 /*!
1199  * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
1200  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
1201  * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
1202  * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
1203  * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
1204  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
1205  * @param o_ptr 対象のオブジェクト構造体ポインタ
1206  * @return なし
1207  */
1208 static void random_slay(object_type *o_ptr)
1209 {
1210         if (o_ptr->tval == TV_BOW)
1211         {
1212                 switch (randint1(6))
1213                 {
1214                         case 1:
1215                         case 2:
1216                         case 3:
1217                                 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1218                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1219                                 if (!o_ptr->artifact_bias && one_in_(9))
1220                                         o_ptr->artifact_bias = BIAS_RANGER;
1221                                 break;
1222                         default:
1223                                 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1224                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1225                                 if (!o_ptr->artifact_bias && one_in_(9))
1226                                         o_ptr->artifact_bias = BIAS_RANGER;
1227                         break;
1228                 }
1229
1230                 return;
1231         }
1232
1233         switch (o_ptr->artifact_bias)
1234         {
1235         case BIAS_CHAOS:
1236                 if (!(have_flag(o_ptr->art_flags, TR_CHAOTIC)))
1237                 {
1238                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1239                         if (one_in_(2)) return;
1240                 }
1241                 break;
1242
1243         case BIAS_PRIESTLY:
1244                 if((o_ptr->tval == TV_SWORD || o_ptr->tval == TV_POLEARM) &&
1245                    !(have_flag(o_ptr->art_flags, TR_BLESSED)))
1246                 {
1247                         /* A free power for "priestly" random artifacts */
1248                         add_flag(o_ptr->art_flags, TR_BLESSED);
1249                 }
1250                 break;
1251
1252         case BIAS_NECROMANTIC:
1253                 if (!(have_flag(o_ptr->art_flags, TR_VAMPIRIC)))
1254                 {
1255                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1256                         if (one_in_(2)) return;
1257                 }
1258                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)) && one_in_(2))
1259                 {
1260                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1261                         if (one_in_(2)) return;
1262                 }
1263                 break;
1264
1265         case BIAS_RANGER:
1266                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_ANIMAL)))
1267                 {
1268                         add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1269                         if (one_in_(2)) return;
1270                 }
1271                 break;
1272
1273         case BIAS_ROGUE:
1274                 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) ||
1275                      ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR))) &&
1276                          !(have_flag(o_ptr->art_flags, TR_THROW)))
1277                 {
1278                         /* Free power for rogues... */
1279                         add_flag(o_ptr->art_flags, TR_THROW);
1280                 }
1281                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1282                 {
1283                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1284                         if (one_in_(2)) return;
1285                 }
1286                 break;
1287
1288         case BIAS_POIS:
1289                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1290                 {
1291                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1292                         if (one_in_(2)) return;
1293                 }
1294                 break;
1295
1296         case BIAS_FIRE:
1297                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_FIRE)))
1298                 {
1299                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1300                         if (one_in_(2)) return;
1301                 }
1302                 break;
1303
1304         case BIAS_COLD:
1305                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_COLD)))
1306                 {
1307                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1308                         if (one_in_(2)) return;
1309                 }
1310                 break;
1311
1312         case BIAS_ELEC:
1313                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ELEC)))
1314                 {
1315                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1316                         if (one_in_(2)) return;
1317                 }
1318                 break;
1319
1320         case BIAS_ACID:
1321                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ACID)))
1322                 {
1323                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1324                         if (one_in_(2)) return;
1325                 }
1326                 break;
1327
1328         case BIAS_LAW:
1329                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_EVIL)))
1330                 {
1331                         add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1332                         if (one_in_(2)) return;
1333                 }
1334                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_UNDEAD)))
1335                 {
1336                         add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1337                         if (one_in_(2)) return;
1338                 }
1339                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_DEMON)))
1340                 {
1341                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1342                         if (one_in_(2)) return;
1343                 }
1344                 break;
1345         }
1346
1347         switch (randint1(36))
1348         {
1349                 case 1:
1350                 case 2:
1351                         if (one_in_(4))
1352                         {
1353                                 add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
1354                         }
1355                         else
1356                         {
1357                                 add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1358                         }
1359                         break;
1360                 case 3:
1361                 case 4:
1362                         if (one_in_(4))
1363                         {
1364                                 add_flag(o_ptr->art_flags, TR_KILL_EVIL);
1365                         }
1366                         else
1367                         {
1368                         add_flag(o_ptr->art_flags, TR_SLAY_EVIL); 
1369                         }
1370                         if (!o_ptr->artifact_bias && one_in_(2))
1371                                 o_ptr->artifact_bias = BIAS_LAW;
1372                         else if (!o_ptr->artifact_bias && one_in_(9))
1373                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1374                         break;
1375                 case 5:
1376                 case 6:
1377                         if (one_in_(4))
1378                         {
1379                                 add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
1380                         }
1381                         else
1382                         {
1383                                 add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1384                         }
1385                         if (!o_ptr->artifact_bias && one_in_(9))
1386                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1387                         break;
1388                 case 7:
1389                 case 8:
1390                         if (one_in_(4))
1391                         {
1392                                 add_flag(o_ptr->art_flags, TR_KILL_DEMON);
1393                         }
1394                         else
1395                         {
1396                                 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1397                         }
1398                         if (!o_ptr->artifact_bias && one_in_(9))
1399                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1400                         break;
1401                 case 9:
1402                 case 10:
1403                         if (one_in_(4))
1404                         {
1405                                 add_flag(o_ptr->art_flags, TR_KILL_ORC);
1406                         }
1407                         else
1408                         {
1409                                 add_flag(o_ptr->art_flags, TR_SLAY_ORC);
1410                         }
1411                         break;
1412                 case 11:
1413                 case 12:
1414                         if (one_in_(4))
1415                         {
1416                                 add_flag(o_ptr->art_flags, TR_KILL_TROLL);
1417                         }
1418                         else
1419                         {
1420                                 add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1421                         }
1422                         break;
1423                 case 13:
1424                 case 14:
1425                         if (one_in_(4))
1426                         {
1427                                 add_flag(o_ptr->art_flags, TR_KILL_GIANT);
1428                         }
1429                         else
1430                         {
1431                                 add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1432                         }
1433                         break;
1434                 case 15:
1435                 case 16:
1436                         add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1437                         break;
1438                 case 17:
1439                         add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1440                         break;
1441                 case 18:
1442                 case 19:
1443                         if (o_ptr->tval == TV_SWORD)
1444                         {
1445                                 add_flag(o_ptr->art_flags, TR_VORPAL);
1446                                 if (!o_ptr->artifact_bias && one_in_(9))
1447                                         o_ptr->artifact_bias = BIAS_WARRIOR;
1448                         }
1449                         else
1450                                 random_slay(o_ptr);
1451                         break;
1452                 case 20:
1453                         add_flag(o_ptr->art_flags, TR_IMPACT);
1454                         break;
1455                 case 21:
1456                 case 22:
1457                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1458                         if (!o_ptr->artifact_bias)
1459                                 o_ptr->artifact_bias = BIAS_FIRE;
1460                         break;
1461                 case 23:
1462                 case 24:
1463                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1464                         if (!o_ptr->artifact_bias)
1465                                 o_ptr->artifact_bias = BIAS_COLD;
1466                         break;
1467                 case 25:
1468                 case 26:
1469                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1470                         if (!o_ptr->artifact_bias)
1471                                 o_ptr->artifact_bias = BIAS_ELEC;
1472                         break;
1473                 case 27:
1474                 case 28:
1475                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1476                         if (!o_ptr->artifact_bias)
1477                                 o_ptr->artifact_bias = BIAS_ACID;
1478                         break;
1479                 case 29:
1480                 case 30:
1481                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1482                         if (!o_ptr->artifact_bias && !one_in_(3))
1483                                 o_ptr->artifact_bias = BIAS_POIS;
1484                         else if (!o_ptr->artifact_bias && one_in_(6))
1485                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1486                         else if (!o_ptr->artifact_bias)
1487                                 o_ptr->artifact_bias = BIAS_ROGUE;
1488                         break;
1489                 case 31:
1490                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1491                         if (!o_ptr->artifact_bias)
1492                                 o_ptr->artifact_bias = BIAS_NECROMANTIC;
1493                         break;
1494                 case 32:
1495                         add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1496                         if (!o_ptr->artifact_bias)
1497                                 o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
1498                         break;
1499                 case 33:
1500                 case 34:
1501                         if (one_in_(4))
1502                         {
1503                                 add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
1504                         }
1505                         else
1506                         {
1507                                 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1508                         }
1509                         break;
1510                 default:
1511                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1512                         if (!o_ptr->artifact_bias)
1513                                 o_ptr->artifact_bias = BIAS_CHAOS;
1514                         break;
1515         }
1516 }
1517
1518 /*!
1519  * @brief ランダムアーティファクト生成中、対象のオブジェクトにバイアスに依存した発動を与える。/ Add one activaton of randam artifact depend on bias.
1520  * @details バイアスが無い場合、一部のバイアスの確率によっては one_ability() に処理が移行する。
1521  * @param o_ptr 対象のオブジェクト構造体ポインタ
1522  * @return なし
1523  */
1524 static void give_activation_power(object_type *o_ptr)
1525 {
1526         int type = 0, chance = 0;
1527
1528         switch (o_ptr->artifact_bias)
1529         {
1530                 case BIAS_ELEC:
1531                         if (!one_in_(3))
1532                         {
1533                                 type = ACT_BO_ELEC_1;
1534                         }
1535                         else if (!one_in_(5))
1536                         {
1537                                 type = ACT_BA_ELEC_2;
1538                         }
1539                         else
1540                         {
1541                                 type = ACT_BA_ELEC_3;
1542                         }
1543                         chance = 101;
1544                         break;
1545
1546                 case BIAS_POIS:
1547                         type = ACT_BA_POIS_1;
1548                         chance = 101;
1549                         break;
1550
1551                 case BIAS_FIRE:
1552                         if (!one_in_(3))
1553                         {
1554                                 type = ACT_BO_FIRE_1;
1555                         }
1556                         else if (!one_in_(5))
1557                         {
1558                                 type = ACT_BA_FIRE_1;
1559                         }
1560                         else
1561                         {
1562                                 type = ACT_BA_FIRE_2;
1563                         }
1564                         chance = 101;
1565                         break;
1566
1567                 case BIAS_COLD:
1568                         chance = 101;
1569                         if (!one_in_(3))
1570                                 type = ACT_BO_COLD_1;
1571                         else if (!one_in_(3))
1572                                 type = ACT_BA_COLD_1;
1573                         else if (!one_in_(3))
1574                                 type = ACT_BA_COLD_2;
1575                         else
1576                                 type = ACT_BA_COLD_3;
1577                         break;
1578
1579                 case BIAS_CHAOS:
1580                         chance = 50;
1581                         if (one_in_(6))
1582                                 type = ACT_SUMMON_DEMON;
1583                         else
1584                                 type = ACT_CALL_CHAOS;
1585                         break;
1586
1587                 case BIAS_PRIESTLY:
1588                         chance = 101;
1589
1590                         if (one_in_(13))
1591                                 type = ACT_CHARM_UNDEAD;
1592                         else if (one_in_(12))
1593                                 type = ACT_BANISH_EVIL;
1594                         else if (one_in_(11))
1595                                 type = ACT_DISP_EVIL;
1596                         else if (one_in_(10))
1597                                 type = ACT_PROT_EVIL;
1598                         else if (one_in_(9))
1599                                 type = ACT_CURE_1000;
1600                         else if (one_in_(8))
1601                                 type = ACT_CURE_700;
1602                         else if (one_in_(7))
1603                                 type = ACT_REST_ALL;
1604                         else if (one_in_(6))
1605                                 type = ACT_REST_EXP;
1606                         else
1607                                 type = ACT_CURE_MW;
1608                         break;
1609
1610                 case BIAS_NECROMANTIC:
1611                         chance = 101;
1612                         if (one_in_(66))
1613                                 type = ACT_WRAITH;
1614                         else if (one_in_(13))
1615                                 type = ACT_DISP_GOOD;
1616                         else if (one_in_(9))
1617                                 type = ACT_MASS_GENO;
1618                         else if (one_in_(8))
1619                                 type = ACT_GENOCIDE;
1620                         else if (one_in_(13))
1621                                 type = ACT_SUMMON_UNDEAD;
1622                         else if (one_in_(9))
1623                                 type = ACT_VAMPIRE_2;
1624                         else if (one_in_(6))
1625                                 type = ACT_CHARM_UNDEAD;
1626                         else
1627                                 type = ACT_VAMPIRE_1;
1628                         break;
1629
1630                 case BIAS_LAW:
1631                         chance = 101;
1632                         if (one_in_(8))
1633                                 type = ACT_BANISH_EVIL;
1634                         else if (one_in_(4))
1635                                 type = ACT_DISP_EVIL;
1636                         else
1637                                 type = ACT_PROT_EVIL;
1638                         break;
1639
1640                 case BIAS_ROGUE:
1641                         chance = 101;
1642                         if (one_in_(50))
1643                                 type = ACT_SPEED;
1644                         else if (one_in_(4))
1645                                 type = ACT_SLEEP;
1646                         else if (one_in_(3))
1647                                 type = ACT_DETECT_ALL;
1648                         else if (one_in_(8))
1649                                 type = ACT_ID_FULL;
1650                         else
1651                                 type = ACT_ID_PLAIN;
1652                         break;
1653
1654                 case BIAS_MAGE:
1655                         chance = 66;
1656                         if (one_in_(20))
1657                                 type = ACT_SUMMON_ELEMENTAL;
1658                         else if (one_in_(10))
1659                                 type = ACT_SUMMON_PHANTOM;
1660                         else if (one_in_(5))
1661                                 type = ACT_RUNE_EXPLO;
1662                         else
1663                                 type = ACT_ESP;
1664                         break;
1665
1666                 case BIAS_WARRIOR:
1667                         chance = 80;
1668                         if (one_in_(100))
1669                                 type = ACT_INVULN;
1670                         else
1671                                 type = ACT_BERSERK;
1672                         break;
1673
1674                 case BIAS_RANGER:
1675                         chance = 101;
1676                         if (one_in_(20))
1677                                 type = ACT_CHARM_ANIMALS;
1678                         else if (one_in_(7))
1679                                 type = ACT_SUMMON_ANIMAL;
1680                         else if (one_in_(6))
1681                                 type = ACT_CHARM_ANIMAL;
1682                         else if (one_in_(4))
1683                                 type = ACT_RESIST_ALL;
1684                         else if (one_in_(3))
1685                                 type = ACT_SATIATE;
1686                         else
1687                                 type = ACT_CURE_POISON;
1688                         break;
1689         }
1690
1691         if (!type || (randint1(100) >= chance))
1692         {
1693                 one_activation(o_ptr);
1694                 return;
1695         }
1696
1697         /* A type was chosen... */
1698         o_ptr->xtra2 = (byte_hack)type;
1699         add_flag(o_ptr->art_flags, TR_ACTIVATE);
1700         o_ptr->timeout = 0;
1701 }
1702
1703 /*!
1704  * @brief ランダムアーティファクト生成中、対象のオブジェクトに名前を与える。/ Set name of randomartifact.
1705  * @details 確率によって、シンダリン銘、漢字銘、固定名のいずれか一つが与えられる。
1706  * @param o_ptr 処理中のアイテム参照ポインタ
1707  * @param return_name 名前を返すための文字列参照ポインタ
1708  * @param armour 対象のオブジェクトが防具が否か
1709  * @param power 銘の基準となるオブジェクトの価値レベル(0=呪い、1=低位、2=中位、3以上=高位)
1710  * @return なし
1711  */
1712 static void get_random_name(object_type *o_ptr, char *return_name, bool armour, int power)
1713 {
1714         int prob = randint1(100);
1715
1716         if (prob <= SINDARIN_NAME)
1717         {
1718                 get_table_sindarin(return_name);
1719         }
1720         else if (prob <= TABLE_NAME)
1721         {
1722                 get_table_name(return_name);
1723         }
1724         else
1725         {
1726                 cptr filename;
1727
1728                 switch (armour)
1729                 {
1730                         case 1:
1731                                 switch (power)
1732                                 {
1733                                         case 0:
1734                                                 filename = _("a_cursed_j.txt", "a_cursed.txt");
1735                                                 break;
1736                                         case 1:
1737                                                 filename = _("a_low_j.txt", "a_low.txt");
1738                                                 break;
1739                                         case 2:
1740                                                 filename = _("a_med_j.txt", "a_med.txt");
1741                                                 break;
1742                                         default:
1743                                                 filename = _("a_high_j.txt", "a_high.txt");
1744                                 }
1745                                 break;
1746                         default:
1747                                 switch (power)
1748                                 {
1749                                         case 0:
1750                                                 filename = _("w_cursed_j.txt", "w_cursed.txt");
1751                                                 break;
1752                                         case 1:
1753                                                 filename = _("w_low_j.txt", "w_low.txt");
1754                                                 break;
1755                                         case 2:
1756                                                 filename = _("w_med_j.txt", "w_med.txt");
1757                                                 break;
1758                                         default:
1759                                                 filename = _("w_high_j.txt", "w_high.txt");
1760                                 }
1761                 }
1762
1763                 (void)get_rnd_line(filename, o_ptr->artifact_bias, return_name);
1764 #ifdef JP
1765                  if (return_name[0] == 0) get_table_name(return_name);
1766 #endif
1767         }
1768 }
1769
1770 /*!
1771  * @brief ランダムアーティファクト生成のメインルーチン
1772  * @details 既に生成が済んでいるオブジェクトの構造体を、アーティファクトとして強化する。
1773  * @param o_ptr 対象のオブジェクト構造体ポインタ
1774  * @param a_scroll アーティファクト生成の巻物上の処理。呪いのアーティファクトが生成対象外となる。
1775  * @return 常にTRUE(1)を返す
1776  */
1777 bool create_artifact(object_type *o_ptr, bool a_scroll)
1778 {
1779         char    new_name[1024];
1780         int     has_pval = 0;
1781         int     powers = randint1(5) + 1;
1782         int     max_powers;
1783         int     max_type = (object_is_weapon_ammo(o_ptr) ? 7 : 5);
1784         int     power_level;
1785         s32b    total_flags;
1786         bool    a_cursed = FALSE;
1787         int     warrior_artifact_bias = 0;
1788         int i;
1789
1790         /* Reset artifact bias */
1791         o_ptr->artifact_bias = 0;
1792
1793         /* Nuke enchantments */
1794         o_ptr->name1 = 0;
1795         o_ptr->name2 = 0;
1796
1797         for (i = 0; i < TR_FLAG_SIZE; i++)
1798                 o_ptr->art_flags[i] |= k_info[o_ptr->k_idx].flags[i];
1799
1800         if (o_ptr->pval) has_pval = TRUE;
1801
1802         if (a_scroll && one_in_(4))
1803         {
1804                 switch (p_ptr->pclass)
1805                 {
1806                         case CLASS_WARRIOR:
1807                         case CLASS_BERSERKER:
1808                         case CLASS_ARCHER:
1809                         case CLASS_SAMURAI:
1810                         case CLASS_CAVALRY:
1811                         case CLASS_SMITH:
1812                                 o_ptr->artifact_bias = BIAS_WARRIOR;
1813                                 break;
1814                         case CLASS_MAGE:
1815                         case CLASS_HIGH_MAGE:
1816                         case CLASS_SORCERER:
1817                         case CLASS_MAGIC_EATER:
1818                         case CLASS_BLUE_MAGE:
1819                                 o_ptr->artifact_bias = BIAS_MAGE;
1820                                 break;
1821                         case CLASS_PRIEST:
1822                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1823                                 break;
1824                         case CLASS_ROGUE:
1825                         case CLASS_NINJA:
1826                                 o_ptr->artifact_bias = BIAS_ROGUE;
1827                                 warrior_artifact_bias = 25;
1828                                 break;
1829                         case CLASS_RANGER:
1830                         case CLASS_SNIPER:
1831                                 o_ptr->artifact_bias = BIAS_RANGER;
1832                                 warrior_artifact_bias = 30;
1833                                 break;
1834                         case CLASS_PALADIN:
1835                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1836                                 warrior_artifact_bias = 40;
1837                                 break;
1838                         case CLASS_WARRIOR_MAGE:
1839                         case CLASS_RED_MAGE:
1840                                 o_ptr->artifact_bias = BIAS_MAGE;
1841                                 warrior_artifact_bias = 40;
1842                                 break;
1843                         case CLASS_CHAOS_WARRIOR:
1844                                 o_ptr->artifact_bias = BIAS_CHAOS;
1845                                 warrior_artifact_bias = 40;
1846                                 break;
1847                         case CLASS_MONK:
1848                         case CLASS_FORCETRAINER:
1849                                 o_ptr->artifact_bias = BIAS_PRIESTLY;
1850                                 break;
1851                         case CLASS_MINDCRAFTER:
1852                         case CLASS_BARD:
1853                                 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_PRIESTLY;
1854                                 break;
1855                         case CLASS_TOURIST:
1856                                 if (randint1(5) > 2) o_ptr->artifact_bias = BIAS_WARRIOR;
1857                                 break;
1858                         case CLASS_IMITATOR:
1859                                 if (randint1(2) > 1) o_ptr->artifact_bias = BIAS_RANGER;
1860                                 break;
1861                         case CLASS_BEASTMASTER:
1862                                 o_ptr->artifact_bias = BIAS_CHR;
1863                                 warrior_artifact_bias = 50;
1864                                 break;
1865                         case CLASS_MIRROR_MASTER:
1866                                 if (randint1(4) > 1) 
1867                                 {
1868                                     o_ptr->artifact_bias = BIAS_MAGE;
1869                                 }
1870                                 else
1871                                 {
1872                                     o_ptr->artifact_bias = BIAS_ROGUE;
1873                                 }
1874                                 break;
1875                 }
1876         }
1877
1878         if (a_scroll && (randint1(100) <= warrior_artifact_bias))
1879                 o_ptr->artifact_bias = BIAS_WARRIOR;
1880
1881         strcpy(new_name, "");
1882
1883         if (!a_scroll && one_in_(A_CURSED))
1884                 a_cursed = TRUE;
1885         if (((o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) && object_is_cursed(o_ptr))
1886                 a_cursed = TRUE;
1887
1888         while (one_in_(powers) || one_in_(7) || one_in_(10))
1889                 powers++;
1890
1891         if (!a_cursed && one_in_(WEIRD_LUCK))
1892                 powers *= 2;
1893
1894         if (a_cursed) powers /= 2;
1895
1896         max_powers = powers;
1897         /* Main loop */
1898         while (powers--)
1899         {
1900                 switch (randint1(max_type))
1901                 {
1902                         case 1: case 2:
1903                                 random_plus(o_ptr);
1904                                 has_pval = TRUE;
1905                                 break;
1906                         case 3: case 4:
1907                                 if (one_in_(2) && object_is_weapon_ammo(o_ptr) && (o_ptr->tval != TV_BOW))
1908                                 {
1909                                         if (a_cursed && !one_in_(13)) break;
1910                                         if (one_in_(13))
1911                                         {
1912                                                 if (one_in_(o_ptr->ds+4)) o_ptr->ds++;
1913                                         }
1914                                         else
1915                                         {
1916                                                 if (one_in_(o_ptr->dd+1)) o_ptr->dd++;
1917                                         }
1918                                 }
1919                                 else
1920                                         random_resistance(o_ptr);
1921                                 break;
1922                         case 5:
1923                                 random_misc(o_ptr);
1924                                 break;
1925                         case 6: case 7:
1926                                 random_slay(o_ptr);
1927                                 break;
1928                         default:
1929                                 if (p_ptr->wizard) msg_print("Switch error in create_artifact!");
1930                                 powers++;
1931                 }
1932         };
1933
1934         if (has_pval)
1935         {
1936 #if 0
1937                 add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1938
1939                 /* This one commented out by gw's request... */
1940                 if (!a_scroll)
1941                         add_flag(o_ptr->art_flags, TR_HIDE_TYPE);
1942 #endif
1943
1944                 if (have_flag(o_ptr->art_flags, TR_BLOWS))
1945                 {
1946                         o_ptr->pval = randint1(2);
1947                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
1948                                 o_ptr->pval++;
1949                 }
1950                 else
1951                 {
1952                         do
1953                         {
1954                                 o_ptr->pval++;
1955                         }
1956                         while (o_ptr->pval < randint1(5) || one_in_(o_ptr->pval));
1957                 }
1958
1959                 if ((o_ptr->pval > 4) && !one_in_(WEIRD_LUCK))
1960                         o_ptr->pval = 4;
1961         }
1962
1963
1964         /* give it some plusses... */
1965         if (object_is_armour(o_ptr))
1966                 o_ptr->to_a += randint1(o_ptr->to_a > 19 ? 1 : 20 - o_ptr->to_a);
1967         else if (object_is_weapon_ammo(o_ptr))
1968         {
1969                 o_ptr->to_h += randint1(o_ptr->to_h > 19 ? 1 : 20 - o_ptr->to_h);
1970                 o_ptr->to_d += randint1(o_ptr->to_d > 19 ? 1 : 20 - o_ptr->to_d);
1971                 if ((have_flag(o_ptr->art_flags, TR_WIS)) && (o_ptr->pval > 0)) add_flag(o_ptr->art_flags, TR_BLESSED);
1972         }
1973
1974         /* Just to be sure */
1975         add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1976         add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1977         add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1978         add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1979
1980         total_flags = flag_cost(o_ptr, o_ptr->pval);
1981
1982         if (a_cursed) curse_artifact(o_ptr);
1983
1984         if (!a_cursed &&
1985             one_in_(object_is_armour(o_ptr) ? ACTIVATION_CHANCE * 2 : ACTIVATION_CHANCE))
1986         {
1987                 o_ptr->xtra2 = 0;
1988                 give_activation_power(o_ptr);
1989         }
1990
1991         if (object_is_armour(o_ptr))
1992         {
1993                 while ((o_ptr->to_d+o_ptr->to_h) > 20)
1994                 {
1995                         if (one_in_(o_ptr->to_d) && one_in_(o_ptr->to_h)) break;
1996                         o_ptr->to_d -= (s16b)randint0(3);
1997                         o_ptr->to_h -= (s16b)randint0(3);
1998                 }
1999                 while ((o_ptr->to_d+o_ptr->to_h) > 10)
2000                 {
2001                         if (one_in_(o_ptr->to_d) || one_in_(o_ptr->to_h)) break;
2002                         o_ptr->to_d -= (s16b)randint0(3);
2003                         o_ptr->to_h -= (s16b)randint0(3);
2004                 }
2005         }
2006
2007         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);
2008
2009         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
2010         {
2011                 o_ptr->to_h = 0;
2012                 o_ptr->to_d = 0;
2013                 remove_flag(o_ptr->art_flags, TR_BLOWS);
2014                 remove_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
2015                 remove_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
2016                 remove_flag(o_ptr->art_flags, TR_SLAY_EVIL);
2017                 remove_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
2018                 remove_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2019                 remove_flag(o_ptr->art_flags, TR_SLAY_ORC);
2020                 remove_flag(o_ptr->art_flags, TR_SLAY_TROLL);
2021                 remove_flag(o_ptr->art_flags, TR_SLAY_GIANT);
2022                 remove_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
2023                 remove_flag(o_ptr->art_flags, TR_KILL_DRAGON);
2024                 remove_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2025                 remove_flag(o_ptr->art_flags, TR_VORPAL);
2026                 remove_flag(o_ptr->art_flags, TR_BRAND_POIS);
2027                 remove_flag(o_ptr->art_flags, TR_BRAND_ACID);
2028                 remove_flag(o_ptr->art_flags, TR_BRAND_ELEC);
2029                 remove_flag(o_ptr->art_flags, TR_BRAND_FIRE);
2030                 remove_flag(o_ptr->art_flags, TR_BRAND_COLD);
2031         }
2032
2033         if (!object_is_weapon_ammo(o_ptr))
2034         {
2035                 /* For armors */
2036                 if (a_cursed) power_level = 0;
2037                 else if (total_flags < 15000) power_level = 1;
2038                 else if (total_flags < 35000) power_level = 2;
2039                 else power_level = 3;
2040         }
2041
2042         else
2043         {
2044                 /* For weapons */
2045                 if (a_cursed) power_level = 0;
2046                 else if (total_flags < 20000) power_level = 1;
2047                 else if (total_flags < 45000) power_level = 2;
2048                 else power_level = 3;
2049         }
2050
2051         /* 平均対邪ダメージが一定以上なら11/12(WEIRD_LUCK)でダメージ抑制処理を行う */
2052         if(suppression_evil_dam(o_ptr) && !one_in_(WEIRD_LUCK) && object_is_weapon(o_ptr))
2053         {
2054                 msg_format_wizard(CHEAT_OBJECT, "アーティファクトの抑制処理を行います。");
2055                 do
2056                 {
2057                         if (weakening_artifact(o_ptr) == 0) break;
2058                 } while (suppression_evil_dam(o_ptr));
2059         }
2060
2061         if (a_scroll)
2062         {
2063                 char dummy_name[80] = "";
2064                 cptr ask_msg = _("このアーティファクトを何と名付けますか?", "What do you want to call the artifact? ");
2065
2066                 /* Identify it fully */
2067                 object_aware(o_ptr);
2068                 object_known(o_ptr);
2069
2070                 /* Mark the item as fully known */
2071                 o_ptr->ident |= (IDENT_MENTAL);
2072
2073                 /* For being treated as random artifact in screen_object() */
2074                 o_ptr->art_name = quark_add("");
2075
2076                 (void)screen_object(o_ptr, 0L);
2077
2078                 if (!get_string(ask_msg, dummy_name, sizeof dummy_name)
2079                     || !dummy_name[0])
2080                 {
2081                         /* Cancelled */
2082                         if (one_in_(2))
2083                         {
2084                                 get_table_sindarin_aux(dummy_name);
2085                         }
2086                         else
2087                         {
2088                                 get_table_name_aux(dummy_name);
2089                         }
2090                 }
2091                 sprintf(new_name, _("《%s》", "'%s'"), dummy_name);
2092                 chg_virtue(V_INDIVIDUALISM, 2);
2093                 chg_virtue(V_ENCHANT, 5);
2094         }
2095         else
2096         {
2097                 get_random_name(o_ptr, new_name, object_is_armour(o_ptr), power_level);
2098         }
2099
2100         /* Save the inscription */
2101         o_ptr->art_name = quark_add(new_name);
2102
2103         msg_format_wizard(CHEAT_OBJECT, _("パワー %d で 価値%ld のランダムアーティファクト生成 バイアスは「%s」",
2104                 "Random artifact generated - Power:%d Value:%d Bias:%s."), max_powers, total_flags, artifact_bias_name[o_ptr->artifact_bias]);
2105
2106         /* Window stuff */
2107         p_ptr->window |= (PW_INVEN | PW_EQUIP);
2108
2109         return TRUE;
2110 }
2111
2112 /*!
2113  * @brief オブジェクトから能力発動IDを取得する。
2114  * @details いくつかのケースで定義されている発動効果から、
2115  * 鍛冶師による付与>固定アーティファクト>エゴ>ランダムアーティファクト>ベースアイテムの優先順位で走査していく。
2116  * @param o_ptr 対象のオブジェクト構造体ポインタ
2117  * @return 発動効果のIDを返す
2118  */
2119 int activation_index(object_type *o_ptr)
2120 {
2121         /* Give priority to weaponsmith's essential activations */
2122         if (object_is_smith(o_ptr))
2123         {
2124                 switch (o_ptr->xtra3 - 1)
2125                 {
2126                 case ESSENCE_TMP_RES_ACID: return ACT_RESIST_ACID;
2127                 case ESSENCE_TMP_RES_ELEC: return ACT_RESIST_ELEC;
2128                 case ESSENCE_TMP_RES_FIRE: return ACT_RESIST_FIRE;
2129                 case ESSENCE_TMP_RES_COLD: return ACT_RESIST_COLD;
2130                 case TR_IMPACT: return ACT_QUAKE;
2131                 }
2132         }
2133
2134         if (object_is_fixed_artifact(o_ptr))
2135         {
2136                 if (have_flag(a_info[o_ptr->name1].flags, TR_ACTIVATE))
2137                 {
2138                         return a_info[o_ptr->name1].act_idx;
2139                 }
2140         }
2141         if (object_is_ego(o_ptr))
2142         {
2143                 if (have_flag(e_info[o_ptr->name2].flags, TR_ACTIVATE))
2144                 {
2145                         return e_info[o_ptr->name2].act_idx;
2146                 }
2147         }
2148         if (!object_is_random_artifact(o_ptr))
2149         {
2150                 if (have_flag(k_info[o_ptr->k_idx].flags, TR_ACTIVATE))
2151                 {
2152                         return k_info[o_ptr->k_idx].act_idx;
2153                 }
2154         }
2155
2156         return o_ptr->xtra2;
2157 }
2158
2159 /*!
2160  * @brief オブジェクトから発動効果構造体のポインタを取得する。
2161  * @details activation_index() 関数の結果から参照する。
2162  * @param o_ptr 対象のオブジェクト構造体ポインタ
2163  * @return 発動効果構造体のポインタを返す
2164  */
2165 const activation_type* find_activation_info(object_type *o_ptr)
2166 {
2167         const int index = activation_index(o_ptr);
2168         const activation_type* p;
2169
2170         for (p = activation_info; p->flag != NULL; ++ p) {
2171                 if (p->index == index)
2172                 {
2173                         return p;
2174                 }
2175         }
2176
2177         return NULL;
2178 }
2179
2180 /*!
2181  * @brief 発動によるブレスの属性をアイテムの耐性から選択し、実行を処理する。/ Dragon breath activation
2182  * @details 対象となる耐性は dragonbreath_info テーブルを参照のこと。
2183  * @param o_ptr 対象のオブジェクト構造体ポインタ
2184  * @return 発動実行の是非を返す。
2185  */
2186 static bool activate_dragon_breath(object_type *o_ptr)
2187 {
2188         u32b flgs[TR_FLAG_SIZE]; /* for resistance flags */
2189         int type[20];
2190         cptr name[20];
2191         int i, dir, t, n = 0;
2192
2193         if (!get_aim_dir(&dir)) return FALSE;
2194
2195         object_flags(o_ptr, flgs);
2196
2197         for (i = 0; dragonbreath_info[i].flag != 0; i++)
2198         {
2199                 if (have_flag(flgs, dragonbreath_info[i].flag))
2200                 {
2201                         type[n] = dragonbreath_info[i].type;
2202                         name[n] = dragonbreath_info[i].name;
2203                         n++;
2204                 }
2205         }
2206
2207         /* Paranoia */
2208         if (n == 0) return FALSE;
2209
2210         /* Stop speaking */
2211         if (music_singing_any()) stop_singing();
2212         if (hex_spelling_any()) stop_hex_spell_all();
2213
2214         t = randint0(n);
2215         msg_format(_("あなたは%sのブレスを吐いた。", "You breathe %s."), name[t]);
2216         fire_ball(type[t], dir, 250, -4);
2217
2218         return TRUE;
2219 }
2220
2221 /*!
2222  * @brief アイテムの発動効果を処理する。
2223  * @details activate_random_artifact()とされているが、実際は全発動が統合された。
2224  * @todo 折を見て関数名を修正すること。
2225  * @param o_ptr 対象のオブジェクト構造体ポインタ
2226  * @return 発動実行の是非を返す。
2227  */
2228 bool activate_random_artifact(object_type *o_ptr)
2229 {
2230         PLAYER_LEVEL plev = p_ptr->lev;
2231         int k, dummy = 0;
2232         DIRECTION dir;
2233         cptr name = k_name + k_info[o_ptr->k_idx].name;
2234         const activation_type* const act_ptr = find_activation_info(o_ptr);
2235
2236         /* Paranoia */
2237         if (!act_ptr) {
2238                 /* Maybe forgot adding information to activation_info table ? */
2239                 msg_print("Activation information is not found.");
2240                 return FALSE;
2241         }
2242
2243         /* Activate for attack */
2244         switch (act_ptr->index)
2245         {
2246                 case ACT_SUNLIGHT:
2247                 {
2248                         if (!get_aim_dir(&dir)) return FALSE;
2249                         msg_print(_("太陽光線が放たれた。", "A line of sunlight appears."));
2250                         (void)lite_line(dir, damroll(6, 8));
2251                         break;
2252                 }
2253
2254                 case ACT_BO_MISS_1:
2255                 {
2256                         msg_print(_("それは眩しいくらいに明るく輝いている...", "It glows extremely brightly..."));
2257                         if (!get_aim_dir(&dir)) return FALSE;
2258                         fire_bolt(GF_MISSILE, dir, damroll(2, 6));
2259                         break;
2260                 }
2261
2262                 case ACT_BA_POIS_1:
2263                 {
2264                         msg_print(_("それは濃緑色に脈動している...","It throbs deep green..."));
2265                         if (!get_aim_dir(&dir)) return FALSE;
2266                         fire_ball(GF_POIS, dir, 12, 3);
2267                         break;
2268                 }
2269
2270                 case ACT_BO_ELEC_1:
2271                 {
2272                         msg_print(_("それは火花に覆われた...", "It is covered in sparks..."));
2273                         if (!get_aim_dir(&dir)) return FALSE;
2274                         fire_bolt(GF_ELEC, dir, damroll(4, 8));
2275                         break;
2276                 }
2277
2278                 case ACT_BO_ACID_1:
2279                 {
2280                         msg_print(_("それは酸に覆われた...","It is covered in acid..."));
2281                         if (!get_aim_dir(&dir)) return FALSE;
2282                         fire_bolt(GF_ACID, dir, damroll(5, 8));
2283                         break;
2284                 }
2285
2286                 case ACT_BO_COLD_1:
2287                 {
2288                         msg_print(_("それは霜に覆われた...","It is covered in frost..."));
2289                         if (!get_aim_dir(&dir)) return FALSE;
2290                         fire_bolt(GF_COLD, dir, damroll(6, 8));
2291                         break;
2292                 }
2293
2294                 case ACT_BO_FIRE_1:
2295                 {
2296                         msg_print(_("それは炎に覆われた...","It is covered in fire..."));
2297                         if (!get_aim_dir(&dir)) return FALSE;
2298                         fire_bolt(GF_FIRE, dir, damroll(9, 8));
2299                         break;
2300                 }
2301
2302                 case ACT_BA_COLD_1:
2303                 {
2304                         msg_print(_("それは霜に覆われた...","It is covered in frost..."));
2305                         if (!get_aim_dir(&dir)) return FALSE;
2306                         fire_ball(GF_COLD, dir, 48, 2);
2307                         break;
2308                 }
2309                 
2310                 case ACT_BA_COLD_2:
2311                 {
2312                         msg_print(_("それは青く激しく輝いた...", "It glows an intense blue..."));
2313                         if (!get_aim_dir(&dir)) return FALSE;
2314                         fire_ball(GF_COLD, dir, 100, 2);
2315                         break;
2316                 }
2317                 
2318                 case ACT_BA_COLD_3:
2319                 {
2320                         msg_print(_("明るく白色に輝いている...", "It glows bright white..."));
2321                         if (!get_aim_dir(&dir)) return FALSE;
2322                         fire_ball(GF_COLD, dir, 400, 3);
2323                         break;
2324                 }
2325
2326                 case ACT_BA_FIRE_1:
2327                 {
2328                         msg_print(_("それは赤く激しく輝いた...","It glows an intense red..."));
2329                         if (!get_aim_dir(&dir)) return FALSE;
2330                         fire_ball(GF_FIRE, dir, 72, 2);
2331                         break;
2332                 }
2333                 
2334                 case ACT_BA_FIRE_2:
2335                 {
2336                         msg_format(_("%sから炎が吹き出した...", "The %s rages in fire..."), name);
2337                         if (!get_aim_dir(&dir)) return FALSE;
2338                         fire_ball(GF_FIRE, dir, 120, 3);
2339                         break;
2340                 }
2341                 
2342                 case ACT_BA_FIRE_3:
2343                 {
2344                         msg_print(_("深赤色に輝いている...", "It glows deep red..."));
2345                         if (!get_aim_dir(&dir)) return FALSE;
2346                         fire_ball(GF_FIRE, dir, 300, 3);
2347                         break;
2348                 }
2349                 
2350                 case ACT_BA_FIRE_4:
2351                 {
2352                         msg_print(_("それは赤く激しく輝いた...","It glows an intense red..."));
2353                         if (!get_aim_dir(&dir)) return FALSE;
2354                         fire_ball(GF_FIRE, dir, 100, 2);
2355                         break;
2356                 }
2357                 
2358                 case ACT_BA_ELEC_2:
2359                 {
2360                         msg_print(_("電気がパチパチ音を立てた...","It crackles with electricity..."));
2361                         if (!get_aim_dir(&dir)) return FALSE;
2362                         fire_ball(GF_ELEC, dir, 100, 3);
2363                         break;
2364                 }
2365                 
2366                 case ACT_BA_ELEC_3:
2367                 {
2368                         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
2369                         if (!get_aim_dir(&dir)) return FALSE;
2370                         fire_ball(GF_ELEC, dir, 500, 3);
2371                         break;
2372                 }
2373                 
2374                 case ACT_BA_ACID_1:
2375                 {
2376                         msg_print(_("それは黒く激しく輝いた...","It glows an intense black..."));
2377                         if (!get_aim_dir(&dir)) return FALSE;
2378                         fire_ball(GF_ACID, dir, 100, 2);
2379                         break;
2380                 }
2381                 
2382                 case ACT_BA_NUKE_1:
2383                 {
2384                         msg_print(_("それは緑に激しく輝いた...","It glows an intense green..."));
2385                         if (!get_aim_dir(&dir)) return FALSE;
2386                         fire_ball(GF_NUKE, dir, 100, 2);
2387                         break;
2388                 }
2389                 
2390                 case ACT_DRAIN_1:
2391                 {
2392                         msg_format(_("あなたは%sに敵を締め殺すよう命じた。", "You order the %s to strangle your opponent."), name);
2393                         if (!get_aim_dir(&dir)) return FALSE;
2394                         if (drain_life(dir, 100))
2395                         break;
2396                 }
2397
2398                 case ACT_DRAIN_2:
2399                 {
2400                         msg_print(_("黒く輝いている...", "It glows black..."));
2401                         if (!get_aim_dir(&dir)) return FALSE;
2402                         drain_life(dir, 120);
2403                         break;
2404                 }
2405
2406                 case ACT_VAMPIRE_1:
2407                 {
2408                         if (!get_aim_dir(&dir)) return FALSE;
2409                         for (dummy = 0; dummy < 3; dummy++)
2410                         {
2411                                 if (drain_life(dir, 50))
2412                                 hp_player(50);
2413                         }
2414                         break;
2415                 }
2416
2417                 case ACT_BO_MISS_2:
2418                 {
2419                         msg_print(_("魔法のトゲが現れた...", "It grows magical spikes..."));
2420                         if (!get_aim_dir(&dir)) return FALSE;
2421                         fire_bolt(GF_ARROW, dir, 150);
2422                         break;
2423                 }
2424
2425                 case ACT_WHIRLWIND:
2426                 {
2427                         {
2428                                 int y = 0, x = 0;
2429                                 cave_type       *c_ptr;
2430                                 monster_type    *m_ptr;
2431
2432                                 for (dir = 0; dir <= 9; dir++)
2433                                 {
2434                                         y = p_ptr->y + ddy[dir];
2435                                         x = p_ptr->x + ddx[dir];
2436                                         c_ptr = &cave[y][x];
2437
2438                                         /* Get the monster */
2439                                         m_ptr = &m_list[c_ptr->m_idx];
2440
2441                                         /* Hack -- attack monsters */
2442                                         if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2443                                                 py_attack(y, x, 0);
2444                                 }
2445                         }
2446                         break;
2447                 }
2448
2449                 case ACT_VAMPIRE_2:
2450                 {
2451                         if (!get_aim_dir(&dir)) return FALSE;
2452                         for (dummy = 0; dummy < 3; dummy++)
2453                         {
2454                                 if (drain_life(dir, 100))
2455                                 hp_player(100);
2456                         }
2457                         break;
2458                 }
2459
2460
2461                 case ACT_CALL_CHAOS:
2462                 {
2463                         msg_print(_("様々な色の火花を発している...","It glows in scintillating colours..."));
2464                         call_chaos();
2465                         break;
2466                 }
2467
2468                 case ACT_ROCKET:
2469                 {
2470                         if (!get_aim_dir(&dir)) return FALSE;
2471                         msg_print(_("ロケットを発射した!", "You launch a rocket!"));
2472                         fire_ball(GF_ROCKET, dir, 250 + plev*3, 2);
2473                         break;
2474                 }
2475
2476                 case ACT_DISP_EVIL:
2477                 {
2478                         msg_print(_("神聖な雰囲気が充満した...", "It floods the area with goodness..."));
2479                         dispel_evil(p_ptr->lev * 5);
2480                         break;
2481                 }
2482
2483                 case ACT_BA_MISS_3:
2484                 {
2485                         if (!get_aim_dir(&dir)) return FALSE;
2486                         msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements."));
2487                         fire_ball(GF_MISSILE, dir, 300, -4);
2488                         break;
2489                 }
2490
2491                 case ACT_DISP_GOOD:
2492                 {
2493                         msg_print(_("邪悪な雰囲気が充満した...", "It floods the area with evil..."));
2494                         dispel_good(p_ptr->lev * 5);
2495                         break;
2496                 }
2497
2498                 case ACT_BO_MANA:
2499                 {
2500                         msg_format(_("%sに魔法のトゲが現れた...", "The %s grows magical spikes..."), name);
2501                         if (!get_aim_dir(&dir)) return FALSE;
2502                         fire_bolt(GF_ARROW, dir, 150);
2503                         break;
2504                 }
2505
2506                 case ACT_BA_WATER:
2507                 {
2508                         msg_format(_("%sが深い青色に鼓動している...", "The %s throbs deep blue..."), name);
2509                         if (!get_aim_dir(&dir)) return FALSE;
2510                         fire_ball(GF_WATER, dir, 200, 3);
2511                         break;
2512                 }
2513
2514                 case ACT_BA_DARK:
2515                 {
2516                         msg_format(_("%sが深い闇に覆われた...","The %s is coverd in pitch-darkness..."), name);
2517                         if (!get_aim_dir(&dir)) return FALSE;
2518                         fire_ball(GF_DARK, dir, 250, 4);
2519                         break;
2520                 }
2521
2522                 case ACT_BA_MANA:
2523                 {
2524                         msg_format(_("%sが青白く光った...", "The %s glows pale..."), name);
2525                         if (!get_aim_dir(&dir)) return FALSE;
2526                         fire_ball(GF_MANA, dir, 250, 4);
2527                         break;
2528                 }
2529
2530                 case ACT_PESTICIDE:
2531                 {
2532                         msg_print(_("あなたは害虫を一掃した。","You exterminate small life."));
2533                         (void)dispel_monsters(4);
2534                         break;
2535                 }
2536
2537                 case ACT_BLINDING_LIGHT:
2538                 {
2539                         msg_format(_("%sが眩しい光で輝いた...", "The %s gleams with blinding light..."), name);
2540                         fire_ball(GF_LITE, 0, 300, 6);
2541                         confuse_monsters(3 * p_ptr->lev / 2);
2542                         break;
2543                 }
2544
2545                 case ACT_BIZARRE:
2546                 {
2547                         msg_format(_("%sは漆黒に輝いた...", "The %s glows intensely black..."), name);
2548                         if (!get_aim_dir(&dir)) return FALSE;
2549                         ring_of_power(dir);
2550                         break;
2551                 }
2552
2553                 case ACT_CAST_BA_STAR:
2554                 {
2555                         HIT_POINT num = damroll(5, 3);
2556                         POSITION y = 0, x = 0;
2557                         int attempts;
2558                         msg_format(_("%sが稲妻で覆われた...","The %s is surrounded by lightning..."), name);
2559                         for (k = 0; k < num; k++)
2560                         {
2561                                 attempts = 1000;
2562
2563                                 while (attempts--)
2564                                 {
2565                                         scatter(&y, &x, p_ptr->y, p_ptr->x, 4, 0);
2566
2567                                         if (!cave_have_flag_bold(y, x, FF_PROJECT)) continue;
2568
2569                                         if (!player_bold(y, x)) break;
2570                                 }
2571
2572                                 project(0, 3, y, x, 150, GF_ELEC,
2573                                                         (PROJECT_THRU | PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
2574                         }
2575
2576                         break;
2577                 }
2578
2579                 case ACT_BLADETURNER:
2580                 {
2581                         if (!get_aim_dir(&dir)) return FALSE;
2582                         msg_print(_("あなたはエレメントのブレスを吐いた。", "You breathe the elements."));
2583                         fire_ball(GF_MISSILE, dir, 300, -4);
2584                         msg_print(_("鎧が様々な色に輝いた...", "Your armor glows many colours..."));
2585                         (void)set_afraid(0);
2586                         (void)set_hero(randint1(50) + 50, FALSE);
2587                         (void)hp_player(10);
2588                         (void)set_blessed(randint1(50) + 50, FALSE);
2589                         (void)set_oppose_acid(randint1(50) + 50, FALSE);
2590                         (void)set_oppose_elec(randint1(50) + 50, FALSE);
2591                         (void)set_oppose_fire(randint1(50) + 50, FALSE);
2592                         (void)set_oppose_cold(randint1(50) + 50, FALSE);
2593                         (void)set_oppose_pois(randint1(50) + 50, FALSE);
2594                         break;
2595                 }
2596
2597                 case ACT_BR_FIRE:
2598                 {
2599                         if (!get_aim_dir(&dir)) return FALSE;
2600                         fire_ball(GF_FIRE, dir, 200, -2);
2601                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES))
2602                         {
2603                                 (void)set_oppose_fire(randint1(20) + 20, FALSE);
2604                         }
2605                         break;
2606                 }
2607                 case ACT_BR_COLD:
2608                 {
2609                         if (!get_aim_dir(&dir)) return FALSE;
2610                         fire_ball(GF_COLD, dir, 200, -2);
2611                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE))
2612                         {
2613                                 (void)set_oppose_cold(randint1(20) + 20, FALSE);
2614                         }
2615                         break;
2616                 }
2617                 case ACT_BR_DRAGON:
2618                 {
2619                         if (!activate_dragon_breath(o_ptr)) return FALSE;
2620                         break;
2621                 }
2622
2623                 /* Activate for other offensive action */
2624
2625                 case ACT_CONFUSE:
2626                 {
2627                         msg_print(_("様々な色の火花を発している...", "It glows in scintillating colours..."));
2628                         if (!get_aim_dir(&dir)) return FALSE;
2629                         confuse_monster(dir, 20);
2630                         break;
2631                 }
2632
2633                 case ACT_SLEEP:
2634                 {
2635                         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
2636                         sleep_monsters_touch();
2637                         break;
2638                 }
2639
2640                 case ACT_QUAKE:
2641                 {
2642                         earthquake(p_ptr->y, p_ptr->x, 5);
2643                         break;
2644                 }
2645
2646                 case ACT_TERROR:
2647                 {
2648                         turn_monsters(40 + p_ptr->lev);
2649                         break;
2650                 }
2651
2652                 case ACT_TELE_AWAY:
2653                 {
2654                         if (!get_aim_dir(&dir)) return FALSE;
2655                         (void)fire_beam(GF_AWAY_ALL, dir, plev);
2656                         break;
2657                 }
2658
2659                 case ACT_BANISH_EVIL:
2660                 {
2661                         if (banish_evil(100))
2662                         {
2663                                 msg_print(_("アーティファクトの力が邪悪を打ち払った!", "The power of the artifact banishes evil!"));
2664                         }
2665                         break;
2666                 }
2667
2668                 case ACT_GENOCIDE:
2669                 {
2670                         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
2671                         (void)symbol_genocide(200, TRUE);
2672                         break;
2673                 }
2674
2675                 case ACT_MASS_GENO:
2676                 {
2677                         msg_print(_("ひどく鋭い音が流れ出た...", "It lets out a long, shrill note..."));
2678                         (void)mass_genocide(200, TRUE);
2679                         break;
2680                 }
2681
2682                 case ACT_SCARE_AREA:
2683                 {
2684                         if (music_singing_any()) stop_singing();
2685                         if (hex_spelling_any()) stop_hex_spell_all();
2686                         msg_print(_("あなたは力強い突風を吹き鳴らした。周囲の敵が震え上っている!",
2687                                         "You wind a mighty blast; your enemies tremble!"));
2688                         (void)turn_monsters((3 * p_ptr->lev / 2) + 10);
2689                         break;
2690                 }
2691
2692                 case ACT_AGGRAVATE:
2693                 {
2694                         if (o_ptr->name1 == ART_HYOUSIGI)
2695                         {
2696                                 msg_print(_("拍子木を打った。", "You beat Your wooden clappers."));
2697                         }
2698                         else
2699                         {
2700                                 msg_format(_("%sは不快な物音を立てた。","The %s sounds an unpleasant noise."), name);
2701                         }
2702                         aggravate_monsters(0);
2703                         break;
2704                 }
2705
2706                 /* Activate for summoning / charming */
2707
2708                 case ACT_CHARM_ANIMAL:
2709                 {
2710                         if (!get_aim_dir(&dir)) return FALSE;
2711                         (void)charm_animal(dir, plev * 2);
2712                         break;
2713                 }
2714
2715                 case ACT_CHARM_UNDEAD:
2716                 {
2717                         if (!get_aim_dir(&dir)) return FALSE;
2718                         (void)control_one_undead(dir, plev * 2);
2719                         break;
2720                 }
2721
2722                 case ACT_CHARM_OTHER:
2723                 {
2724                         if (!get_aim_dir(&dir)) return FALSE;
2725                         (void)charm_monster(dir, plev * 2);
2726                         break;
2727                 }
2728
2729                 case ACT_CHARM_ANIMALS:
2730                 {
2731                         (void)charm_animals(plev * 2);
2732                         break;
2733                 }
2734
2735                 case ACT_CHARM_OTHERS:
2736                 {
2737                         charm_monsters(plev * 2);
2738                         break;
2739                 }
2740
2741                 case ACT_SUMMON_ANIMAL:
2742                 {
2743                         (void)summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET));
2744                         break;
2745                 }
2746
2747                 case ACT_SUMMON_PHANTOM:
2748                 {
2749                         msg_print(_("幻霊を召喚した。", "You summon a phantasmal servant."));
2750                         (void)summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET));
2751                         break;
2752                 }
2753
2754                 case ACT_SUMMON_ELEMENTAL:
2755                 {
2756                         bool pet = one_in_(3);
2757                         u32b mode = 0L;
2758
2759                         if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
2760                         if (pet) mode |= PM_FORCE_PET;
2761                         else mode |= PM_NO_PET;
2762
2763                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), SUMMON_ELEMENTAL, mode))
2764                         {
2765                                 msg_print(_("エレメンタルが現れた...", "An elemental materializes..."));
2766                                 if (pet)
2767                                         msg_print(_("あなたに服従しているようだ。", "It seems obedient to you."));
2768                                 else
2769                                         msg_print(_("それをコントロールできなかった!", "You fail to control it!"));
2770                         }
2771
2772                         break;
2773                 }
2774
2775                 case ACT_SUMMON_DEMON:
2776                 {
2777                         bool pet = one_in_(3);
2778                         u32b mode = 0L;
2779
2780                         if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
2781                         if (pet) mode |= PM_FORCE_PET;
2782                         else mode |= PM_NO_PET;
2783
2784                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), SUMMON_DEMON, mode))
2785                         {
2786                                 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
2787                                 if (pet)
2788                                         msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
2789                                 else
2790                                         msg_print(_("「NON SERVIAM! Wretch! お前の魂を頂くぞ!」", "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
2791                         }
2792
2793                         break;
2794                 }
2795
2796                 case ACT_SUMMON_UNDEAD:
2797                 {
2798                         bool pet = one_in_(3);
2799                         int type;
2800                         u32b mode = 0L;
2801
2802                         type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
2803
2804                         if (!pet || ((plev > 24) && one_in_(3))) mode |= PM_ALLOW_GROUP;
2805                         if (pet) mode |= PM_FORCE_PET;
2806                         else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2807
2808                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), type, mode))
2809                         {
2810                                 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
2811                                                 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
2812                                 if (pet)
2813                                 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
2814                                                 "Ancient, long-dead forms arise from the ground to serve you!"));
2815                                 else
2816                                 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
2817                                                 "'The dead arise... to punish you for disturbing them!'"));
2818                         }
2819
2820                         break;
2821                 }
2822
2823                 case ACT_SUMMON_HOUND:
2824                 {
2825                         u32b mode = PM_ALLOW_GROUP;
2826                         bool pet = !one_in_(5);
2827                         if (pet) mode |= PM_FORCE_PET;
2828                         else mode |= PM_NO_PET;
2829
2830                         if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((p_ptr->lev * 3) / 2), SUMMON_HOUND, mode))
2831                         {
2832
2833                                 if (pet)
2834                                         msg_print(_("ハウンドがあなたの下僕として出現した。",
2835                                                 "A group of hounds appear as your servant."));
2836                                 else
2837                                         msg_print(_("ハウンドはあなたに牙を向けている!",
2838                                                 "A group of hounds appear as your enemy!"));
2839                         }
2840
2841                         break;
2842                 }
2843
2844                 case ACT_SUMMON_DAWN:
2845                 {
2846                         msg_print(_("暁の師団を召喚した。","You summon the Legion of the Dawn."));
2847                         (void)summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, SUMMON_DAWN, (PM_ALLOW_GROUP | PM_FORCE_PET));
2848                         break;
2849                 }
2850
2851                 case ACT_SUMMON_OCTOPUS:
2852                 {
2853                         u32b mode = PM_ALLOW_GROUP;
2854                         bool pet = !one_in_(5);
2855                         if (pet) mode |= PM_FORCE_PET;
2856
2857                         if (summon_named_creature(0, p_ptr->y, p_ptr->x, MON_JIZOTAKO, mode))
2858                         {
2859                                 if (pet)
2860                                         msg_print(_("蛸があなたの下僕として出現した。", "A group of octopuses appear as your servant."));
2861                                 else
2862                                         msg_print(_("蛸はあなたを睨んでいる!", "A group of octopuses appear as your enemy!"));
2863                         }
2864
2865                         break;
2866                 }
2867
2868                 /* Activate for healing */
2869
2870                 case ACT_CHOIR_SINGS:
2871                 {
2872                         msg_print(_("天国の歌が聞こえる...", "A heavenly choir sings..."));
2873                         (void)set_poisoned(0);
2874                         (void)set_cut(0);
2875                         (void)set_stun(0);
2876                         (void)set_confused(0);
2877                         (void)set_blind(0);
2878                         (void)set_afraid(0);
2879                         (void)set_hero(randint1(25) + 25, FALSE);
2880                         (void)hp_player(777);
2881                         break;
2882                 }
2883
2884                 case ACT_CURE_LW:
2885                 {
2886                         (void)set_afraid(0);
2887                         (void)hp_player(30);
2888                         break;
2889                 }
2890
2891                 case ACT_CURE_MW:
2892                 {
2893                         msg_print(_("深紫色の光を発している...", "It radiates deep purple..."));
2894                         hp_player(damroll(4, 8));
2895                         (void)set_cut((p_ptr->cut / 2) - 50);
2896                         break;
2897                 }
2898
2899                 case ACT_CURE_POISON:
2900                 {
2901                         msg_print(_("深青色に輝いている...", "It glows deep blue..."));
2902                         (void)set_afraid(0);
2903                         (void)set_poisoned(0);
2904                         break;
2905                 }
2906
2907                 case ACT_REST_EXP:
2908                 {
2909                         msg_print(_("深紅に輝いている...", "It glows a deep red..."));
2910                         restore_level();
2911                         break;
2912                 }
2913
2914                 case ACT_REST_ALL:
2915                 {
2916                         msg_print(_("濃緑色に輝いている...", "It glows a deep green..."));
2917                         (void)do_res_stat(A_STR);
2918                         (void)do_res_stat(A_INT);
2919                         (void)do_res_stat(A_WIS);
2920                         (void)do_res_stat(A_DEX);
2921                         (void)do_res_stat(A_CON);
2922                         (void)do_res_stat(A_CHR);
2923                         (void)restore_level();
2924                         break;
2925                 }
2926
2927                 case ACT_CURE_700:
2928                 {
2929                         msg_print(_("深青色に輝いている...","It glows deep blue..."));
2930                         msg_print(_("体内に暖かい鼓動が感じられる...","You feel a warm tingling inside..."));
2931                         (void)hp_player(700);
2932                         (void)set_cut(0);
2933                         break;
2934                 }
2935
2936                 case ACT_CURE_1000:
2937                 {
2938                         msg_print(_("白く明るく輝いている...","It glows a bright white..."));
2939                         msg_print(_("ひじょうに気分がよい...","You feel much better..."));
2940                         (void)hp_player(1000);
2941                         (void)set_cut(0);
2942                         break;
2943                 }
2944
2945                 case ACT_CURING:
2946                 {
2947                         msg_format(_("%sの優しさに癒される...", "the %s cures you affectionately ..."), name);
2948                         (void)set_poisoned(0);
2949                         (void)set_confused(0);
2950                         (void)set_blind(0);
2951                         (void)set_stun(0);
2952                         (void)set_cut(0);
2953                         (void)set_image(0);
2954
2955                         break;
2956                 }
2957
2958                 case ACT_CURE_MANA_FULL:
2959                 {
2960                         msg_format(_("%sが青白く光った...","The %s glows pale..."), name);
2961                         if (p_ptr->pclass == CLASS_MAGIC_EATER)
2962                         {
2963                                 int i;
2964                                 for (i = 0; i < EATER_EXT*2; i++)
2965                                 {
2966                                         p_ptr->magic_num1[i] += (p_ptr->magic_num2[i] < 10) ? EATER_CHARGE * 3 : p_ptr->magic_num2[i]*EATER_CHARGE/3;
2967                                         if (p_ptr->magic_num1[i] > p_ptr->magic_num2[i]*EATER_CHARGE) p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
2968                                 }
2969                                 for (; i < EATER_EXT*3; i++)
2970                                 {
2971                                         KIND_OBJECT_IDX k_idx = lookup_kind(TV_ROD, i-EATER_EXT*2);
2972                                         p_ptr->magic_num1[i] -= ((p_ptr->magic_num2[i] < 10) ? EATER_ROD_CHARGE*3 : p_ptr->magic_num2[i]*EATER_ROD_CHARGE/3)*k_info[k_idx].pval;
2973                                         if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
2974                                 }
2975                                 msg_print(_("頭がハッキリとした。", "You feel your head clear."));
2976                                 p_ptr->window |= (PW_PLAYER);
2977                         }
2978                         else if (p_ptr->csp < p_ptr->msp)
2979                         {
2980                                 p_ptr->csp = p_ptr->msp;
2981                                 p_ptr->csp_frac = 0;
2982                                 msg_print(_("頭がハッキリとした。", "You feel your head clear."));
2983                                 p_ptr->redraw |= (PR_MANA);
2984                                 p_ptr->window |= (PW_PLAYER);
2985                                 p_ptr->window |= (PW_SPELL);
2986                         }
2987                         break;
2988                 }
2989
2990                 /* Activate for timed effect */
2991
2992                 case ACT_ESP:
2993                 {
2994                         (void)set_tim_esp(randint1(30) + 25, FALSE);
2995                         break;
2996                 }
2997
2998                 case ACT_BERSERK:
2999                 {
3000                         (void)set_afraid(0);
3001                         (void)set_shero(randint1(25) + 25, FALSE);
3002                         /* (void)set_afraid(0);
3003                         (void)set_hero(randint1(50) + 50, FALSE);
3004                         (void)set_blessed(randint1(50) + 50, FALSE);
3005                         o_ptr->timeout = 100 + randint1(100); */
3006                         break;
3007                 }
3008
3009                 case ACT_PROT_EVIL:
3010                 {
3011                         msg_format(_("%sから鋭い音が流れ出た...", "The %s lets out a shrill wail..."), name);
3012                         k = 3 * p_ptr->lev;
3013                         (void)set_protevil(randint1(25) + k, FALSE);
3014                         break;
3015                 }
3016
3017                 case ACT_RESIST_ALL:
3018                 {
3019                         msg_print(_("様々な色に輝いている...", "It glows many colours..."));
3020                         (void)set_oppose_acid(randint1(40) + 40, FALSE);
3021                         (void)set_oppose_elec(randint1(40) + 40, FALSE);
3022                         (void)set_oppose_fire(randint1(40) + 40, FALSE);
3023                         (void)set_oppose_cold(randint1(40) + 40, FALSE);
3024                         (void)set_oppose_pois(randint1(40) + 40, FALSE);
3025                         break;
3026                 }
3027
3028                 case ACT_SPEED:
3029                 {
3030                         msg_print(_("明るく緑色に輝いている...", "It glows bright green..."));
3031                         (void)set_fast(randint1(20) + 20, FALSE);
3032                         break;
3033                 }
3034
3035                 case ACT_XTRA_SPEED:
3036                 {
3037                         msg_print(_("明るく輝いている...", "It glows brightly..."));
3038                         (void)set_fast(randint1(75) + 75, FALSE);
3039                         break;
3040                 }
3041
3042                 case ACT_WRAITH:
3043                 {
3044                         set_wraith_form(randint1(plev / 2) + (plev / 2), FALSE);
3045                         break;
3046                 }
3047
3048                 case ACT_INVULN:
3049                 {
3050                         (void)set_invuln(randint1(8) + 8, FALSE);
3051                         break;
3052                 }
3053
3054                 case ACT_HELO:
3055                 {
3056                         (void)set_afraid(0);
3057                         set_hero(randint1(25)+25, FALSE);
3058                         hp_player(10);
3059                         break;
3060                 }
3061
3062                 case ACT_HELO_SPEED:
3063                 {
3064                         (void)set_fast(randint1(50) + 50, FALSE);
3065                         hp_player(10);
3066                         set_afraid(0);
3067                         set_hero(randint1(50) + 50, FALSE);
3068                         break;
3069                 }
3070
3071                 case ACT_RESIST_ACID:
3072                 {
3073                         msg_format(_("%sが黒く輝いた...", "The %s grows black."), name);
3074                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ACID))
3075                         {
3076                                 if (!get_aim_dir(&dir)) return FALSE;
3077                                 fire_ball(GF_ACID, dir, 100, 2);
3078                         }
3079                         (void)set_oppose_acid(randint1(20) + 20, FALSE);
3080                         break;
3081                 }
3082
3083                 case ACT_RESIST_FIRE:
3084                 {
3085                         msg_format(_("%sが赤く輝いた...","The %s grows red."), name);
3086                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES))
3087                         {
3088                                 if (!get_aim_dir(&dir)) return FALSE;
3089                                 fire_ball(GF_FIRE, dir, 100, 2);
3090                         }
3091                         (void)set_oppose_fire(randint1(20) + 20, FALSE);
3092                         break;
3093                 }
3094
3095                 case ACT_RESIST_COLD:
3096                 {
3097                         msg_format(_("%sが白く輝いた...","The %s grows white.") , name);
3098                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE))
3099                         {
3100                                 if (!get_aim_dir(&dir)) return FALSE;
3101                                 fire_ball(GF_COLD, dir, 100, 2);
3102                         }
3103                         (void)set_oppose_cold(randint1(20) + 20, FALSE);
3104                         break;
3105                 }
3106
3107                 case ACT_RESIST_ELEC:
3108                 {
3109                         msg_format(_("%sが青く輝いた...", "The %s grows blue."), name);
3110                         if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ELEC))
3111                         {
3112                                 if (!get_aim_dir(&dir)) return FALSE;
3113                                 fire_ball(GF_ELEC, dir, 100, 2);
3114                         }
3115                         (void)set_oppose_elec(randint1(20) + 20, FALSE);
3116                         break;
3117                 }
3118
3119                 case ACT_RESIST_POIS:
3120                 {
3121                         msg_format(_("%sが緑に輝いた...", "The %s grows green."), name);
3122                         (void)set_oppose_pois(randint1(20) + 20, FALSE);
3123                         break;
3124                 }
3125
3126                 /* Activate for general purpose effect (detection etc.) */
3127
3128                 case ACT_LIGHT:
3129                 {
3130                         msg_format(_("%sから澄んだ光があふれ出た...", "The %s wells with clear light..."), name);
3131                         lite_area(damroll(2, 15), 3);
3132                         break;
3133                 }
3134
3135                 case ACT_MAP_LIGHT:
3136                 {
3137                         msg_print(_("眩しく輝いた...", "It shines brightly..."));
3138                         map_area(DETECT_RAD_MAP);
3139                         lite_area(damroll(2, 15), 3);
3140                         break;
3141                 }
3142
3143                 case ACT_DETECT_ALL:
3144                 {
3145                         msg_print(_("白く明るく輝いている...", "It glows bright white..."));
3146                         msg_print(_("心にイメージが浮かんできた...", "An image forms in your mind..."));
3147                         detect_all(DETECT_RAD_DEFAULT);
3148                         break;
3149                 }
3150
3151                 case ACT_DETECT_XTRA:
3152                 {
3153                         msg_print(_("明るく輝いている...", "It glows brightly..."));
3154                         detect_all(DETECT_RAD_DEFAULT);
3155                         probing();
3156                         identify_fully(FALSE);
3157                         break;
3158                 }
3159
3160                 case ACT_ID_FULL:
3161                 {
3162                         msg_print(_("黄色く輝いている...", "It glows yellow..."));
3163                         identify_fully(FALSE);
3164                         break;
3165                 }
3166
3167                 case ACT_ID_PLAIN:
3168                 {
3169                         if (!ident_spell(FALSE)) return FALSE;
3170                         break;
3171                 }
3172
3173                 case ACT_RUNE_EXPLO:
3174                 {
3175                         msg_print(_("明るい赤色に輝いている...", "It glows bright red..."));
3176                         explosive_rune();
3177                         break;
3178                 }
3179
3180                 case ACT_RUNE_PROT:
3181                 {
3182                         msg_print(_("ブルーに明るく輝いている...", "It glows light blue..."));
3183                         warding_glyph();
3184                         break;
3185                 }
3186
3187                 case ACT_SATIATE:
3188                 {
3189                         (void)set_food(PY_FOOD_MAX - 1);
3190                         break;
3191                 }
3192
3193                 case ACT_DEST_DOOR:
3194                 {
3195                         msg_print(_("明るい赤色に輝いている...", "It glows bright red..."));
3196                         destroy_doors_touch();
3197                         break;
3198                 }
3199
3200                 case ACT_STONE_MUD:
3201                 {
3202                         msg_print(_("鼓動している...", "It pulsates..."));
3203                         if (!get_aim_dir(&dir)) return FALSE;
3204                         wall_to_mud(dir, 20 + randint1(30));
3205                         break;
3206                 }
3207
3208                 case ACT_RECHARGE:
3209                 {
3210                         recharge(130);
3211                         break;
3212                 }
3213
3214                 case ACT_ALCHEMY:
3215                 {
3216                         msg_print(_("明るい黄色に輝いている...", "It glows bright yellow..."));
3217                         (void)alchemy();
3218                         break;
3219                 }
3220
3221                 case ACT_DIM_DOOR:
3222                 {
3223                         msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
3224                         if (!dimension_door()) return FALSE;
3225                         break;
3226                 }
3227
3228
3229                 case ACT_TELEPORT:
3230                 {
3231                         msg_print(_("周りの空間が歪んでいる...", "It twists space around you..."));
3232                         teleport_player(100, 0L);
3233                         break;
3234                 }
3235
3236                 case ACT_RECALL:
3237                 {
3238                         msg_print(_("やわらかな白色に輝いている...", "It glows soft white..."));
3239                         if (!word_of_recall()) return FALSE;
3240                         break;
3241                 }
3242
3243                 case ACT_JUDGE:
3244                 {
3245                         msg_format(_("%sは赤く明るく光った!", "The %s flashes bright red!"), name);
3246                         chg_virtue(V_KNOWLEDGE, 1);
3247                         chg_virtue(V_ENLIGHTEN, 1);
3248                         wiz_lite(FALSE);
3249                         
3250                         msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
3251                         take_hit(DAMAGE_LOSELIFE, damroll(3,8), _("審判の宝石", "the Jewel of Judgement"), -1);
3252                         
3253                         (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
3254                         (void)detect_doors(DETECT_RAD_DEFAULT);
3255                         (void)detect_stairs(DETECT_RAD_DEFAULT);
3256                         
3257                         if (get_check(_("帰還の力を使いますか?", "Activate recall? ")))
3258                         {
3259                                 (void)word_of_recall();
3260                         }
3261
3262                         break;
3263                 }
3264
3265                 case ACT_TELEKINESIS:
3266                 {
3267                         if (!get_aim_dir(&dir)) return FALSE;
3268                         msg_format(_("%sを伸ばした。", "You stretched your %s."), name);
3269                         fetch(dir, 500, TRUE);
3270                         break;
3271                 }
3272
3273                 case ACT_DETECT_UNIQUE:
3274                 {
3275                         int i;
3276                         monster_type *m_ptr;
3277                         monster_race *r_ptr;
3278                         msg_print(_("奇妙な場所が頭の中に浮かんだ...", "Some strange places show up in your mind. And you see ..."));
3279                         /* Process the monsters (backwards) */
3280                         for (i = m_max - 1; i >= 1; i--)
3281                         {
3282                                 /* Access the monster */
3283                                 m_ptr = &m_list[i];
3284
3285                                 /* Ignore "dead" monsters */
3286                                 if (!m_ptr->r_idx) continue;
3287
3288                                 r_ptr = &r_info[m_ptr->r_idx];
3289
3290                                 if(r_ptr->flags1 & RF1_UNIQUE)
3291                                 {
3292                                         msg_format(_("%s. ", "%s. "),r_name + r_ptr->name);
3293                                 }
3294                         }
3295                         break;
3296                 }
3297
3298                 case ACT_ESCAPE:
3299                 {
3300                         switch (randint1(13))
3301                         {
3302                         case 1: case 2: case 3: case 4: case 5:
3303                                 teleport_player(10, 0L);
3304                                 break;
3305                         case 6: case 7: case 8: case 9: case 10:
3306                                 teleport_player(222, 0L);
3307                                 break;
3308                         case 11: case 12:
3309                                 (void)stair_creation();
3310                                 break;
3311                         default:
3312                                 if (get_check(_("この階を去りますか?", "Leave this level? ")))
3313                                 {
3314                                         if (autosave_l) do_cmd_save_game(TRUE);
3315
3316                                         /* Leaving */
3317                                         p_ptr->leaving = TRUE;
3318                                 }
3319                         }
3320                         break;
3321                 }
3322
3323                 case ACT_DISP_CURSE_XTRA:
3324                 {
3325                         msg_format(_("%sが真実を照らし出す...", "The %s exhibits the truth..."), name);
3326                         if (remove_all_curse())
3327                         {
3328                                 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
3329                         }
3330                         (void)probing();
3331                         break;
3332                 }
3333
3334                 case ACT_BRAND_FIRE_BOLTS:
3335                 {
3336                         msg_format(_("%sが深紅に輝いた...", "Your %s glows deep red..."), name);
3337                         (void)brand_bolts();
3338                         break;
3339                 }
3340
3341                 case ACT_RECHARGE_XTRA:
3342                 {
3343                         msg_format(_("%sが白く輝いた...", "The %s gleams with blinding light..."), name);
3344                         if (!recharge(1000)) return FALSE;
3345                         break;
3346                 }
3347
3348                 case ACT_LORE:
3349                 {
3350                         msg_print(_("石が隠された秘密を写し出した...", "The stone reveals hidden mysteries..."));
3351                         if (!ident_spell(FALSE)) return FALSE;
3352
3353                         if (mp_ptr->spell_book)
3354                         {
3355                                 /* Sufficient mana */
3356                                 if (20 <= p_ptr->csp)
3357                                 {
3358                                         /* Use some mana */
3359                                         p_ptr->csp -= 20;
3360                                 }
3361
3362                                 /* Over-exert the player */
3363                                 else
3364                                 {
3365                                         int oops = 20 - p_ptr->csp;
3366
3367                                         /* No mana left */
3368                                         p_ptr->csp = 0;
3369                                         p_ptr->csp_frac = 0;
3370
3371                                         /* Message */
3372                                         msg_print(_("石を制御できない!", "You are too weak to control the stone!"));
3373                                         /* Hack -- Bypass free action */
3374                                         (void)set_paralyzed(p_ptr->paralyzed +
3375                                                 randint1(5 * oops + 1));
3376
3377                                         /* Confusing. */
3378                                         (void)set_confused(p_ptr->confused +
3379                                                 randint1(5 * oops + 1));
3380                                 }
3381
3382                                 /* Redraw mana */
3383                                 p_ptr->redraw |= (PR_MANA);
3384                         }
3385                         take_hit(DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1);
3386                         /* Confusing. */
3387                         if (one_in_(5)) (void)set_confused(p_ptr->confused +
3388                                 randint1(10));
3389
3390                         /* Exercise a little care... */
3391                         if (one_in_(20))
3392                                 take_hit(DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1);
3393                         break;
3394                 }
3395
3396                 case ACT_SHIKOFUMI:
3397                 {
3398                         msg_print(_("力強く四股を踏んだ。", "You stamp. (as if you are in a ring.)"));
3399                         (void)set_afraid(0);
3400                         (void)set_hero(randint1(20) + 20, FALSE);
3401                         dispel_evil(p_ptr->lev * 3);
3402                         break;
3403                 }
3404
3405                 case ACT_PHASE_DOOR:
3406                 {
3407                         teleport_player(10, 0L);
3408                         break;
3409                 }
3410
3411                 case ACT_DETECT_ALL_MONS:
3412                 {
3413                         (void)detect_monsters_invis(255);
3414                         (void)detect_monsters_normal(255);
3415                         break;
3416                 }
3417
3418                 case ACT_ULTIMATE_RESIST:
3419                 {
3420                         TIME_EFFECT v = randint1(25)+25;
3421                         (void)set_afraid(0);
3422                         (void)set_hero(v, FALSE);
3423                         (void)hp_player(10);
3424                         (void)set_blessed(v, FALSE);
3425                         (void)set_oppose_acid(v, FALSE);
3426                         (void)set_oppose_elec(v, FALSE);
3427                         (void)set_oppose_fire(v, FALSE);
3428                         (void)set_oppose_cold(v, FALSE);
3429                         (void)set_oppose_pois(v, FALSE);
3430                         (void)set_ultimate_res(v, FALSE);
3431                         break;
3432                 }
3433
3434
3435                 /* Unique activation */
3436                 case ACT_CAST_OFF:
3437                 {
3438                         int inv, t;
3439                         OBJECT_IDX o_idx;
3440                         char o_name[MAX_NLEN];
3441                         object_type forge;
3442
3443                         /* Cast off activated item */
3444                         for (inv = INVEN_RARM; inv <= INVEN_FEET; inv++)
3445                         {
3446                                 if (o_ptr == &inventory[inv]) break;
3447                         }
3448
3449                         /* Paranoia */
3450                         if (inv > INVEN_FEET) return FALSE;
3451
3452                         object_copy(&forge, o_ptr);
3453                         inven_item_increase(inv, (0 - o_ptr->number));
3454                         inven_item_optimize(inv);
3455                         o_idx = drop_near(&forge, 0, p_ptr->y, p_ptr->x);
3456                         o_ptr = &o_list[o_idx];
3457
3458                         object_desc(o_name, o_ptr, OD_NAME_ONLY);
3459                         msg_format(_("%sを脱ぎ捨てた。", "You cast off %s."), o_name);
3460
3461                         /* Get effects */
3462                         msg_print(_("「燃え上がれ俺の小宇宙!」", "You say, 'Burn up my cosmo!"));
3463                         t = 20 + randint1(20);
3464                         (void)set_blind(p_ptr->blind + t);
3465                         (void)set_afraid(0);
3466                         (void)set_tim_esp(p_ptr->tim_esp + t, FALSE);
3467                         (void)set_tim_regen(p_ptr->tim_regen + t, FALSE);
3468                         (void)set_hero(p_ptr->hero + t, FALSE);
3469                         (void)set_blessed(p_ptr->blessed + t, FALSE);
3470                         (void)set_fast(p_ptr->fast + t, FALSE);
3471                         (void)set_shero(p_ptr->shero + t, FALSE);
3472                         if (p_ptr->pclass == CLASS_FORCETRAINER)
3473                         {
3474                                 P_PTR_KI = plev * 5 + 190;
3475                                 msg_print(_("気が爆発寸前になった。", "Your force are immediatly before explosion."));
3476                         }
3477
3478                         break;
3479                 }
3480
3481                 case ACT_FALLING_STAR:
3482                 {
3483                         msg_print(_("あなたは妖刀に魅入られた…", "You are enchanted by cursed blade..."));
3484                         msg_print(_("「狂ほしく 血のごとき 月はのぼれり 秘めおきし 魔剣 いずこぞや」", "'Behold the blade arts.'"));
3485                         massacre();
3486                         break;
3487                 }
3488
3489                 case ACT_GRAND_CROSS:
3490                 {
3491                         msg_print(_("「闇に還れ!」", "You say, 'Return to darkness!'"));
3492                         project(0, 8, p_ptr->y, p_ptr->x, (randint1(100) + 200) * 2, GF_HOLY_FIRE, PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID, -1);
3493                         break;
3494                 }
3495
3496                 case ACT_TELEPORT_LEVEL:
3497                 {
3498                         if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return FALSE;
3499                         teleport_level(0);
3500                         break;
3501                 }
3502
3503                 case ACT_STRAIN_HASTE:
3504                 {
3505                         int t;
3506                         msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
3507                         take_hit(DAMAGE_LOSELIFE, damroll(3, 8), _("加速した疲労", "the strain of haste"), -1);
3508                         t = 25 + randint1(25);
3509                         (void)set_fast(p_ptr->fast + t, FALSE);
3510                         break;
3511                 }
3512
3513                 case ACT_FISHING:
3514                 {
3515                         int x, y;
3516
3517                         if (!get_rep_dir2(&dir)) return FALSE;
3518                         y = p_ptr->y+ddy[dir];
3519                         x = p_ptr->x+ddx[dir];
3520                         tsuri_dir = dir;
3521                         if (!cave_have_flag_bold(y, x, FF_WATER))
3522                         {
3523                                 msg_print(_("そこは水辺ではない。", "There is no fishing place."));
3524                                 return FALSE;
3525                         }
3526                         else if (cave[y][x].m_idx)
3527                         {
3528                                 char m_name[80];
3529                                 monster_desc(m_name, &m_list[cave[y][x].m_idx], 0);
3530                                 msg_format(_("%sが邪魔だ!", "%^s is stand in your way."), m_name);
3531                                 p_ptr->energy_use = 0;
3532                                 return FALSE;
3533                         }
3534                         set_action(ACTION_FISH);
3535                         p_ptr->redraw |= (PR_STATE);
3536                         break;
3537                 }
3538
3539                 case ACT_INROU:
3540                 {
3541                         int count = 0, i;
3542                         monster_type *m_ptr;
3543                         cptr kakusan = "";
3544                         
3545                         if (summon_named_creature(0, p_ptr->y, p_ptr->x, MON_SUKE, PM_FORCE_PET))
3546                         {
3547                                 msg_print(_("『助さん』が現れた。", "Suke-san apperars."));
3548                                 kakusan = "Suke-san";
3549                                 count++;
3550                         }
3551                         if (summon_named_creature(0, p_ptr->y, p_ptr->x, MON_KAKU, PM_FORCE_PET))
3552                         {
3553                                 msg_print(_("『格さん』が現れた。", "Kaku-san appears."));
3554                                 kakusan = "Kaku-san";
3555                                 count++;
3556                         }
3557                         if (!count)
3558                         {
3559                                 for (i = m_max - 1; i > 0; i--)
3560                                 {
3561                                         m_ptr = &m_list[i];
3562                                         if (!m_ptr->r_idx) continue;
3563                                         if (!((m_ptr->r_idx == MON_SUKE) || (m_ptr->r_idx == MON_KAKU))) continue;
3564                                         if (!los(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) continue;
3565                                         if (!projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) continue;
3566                                         count++;
3567                                         break;
3568                                 }
3569                         }
3570
3571                         if (count)
3572                         {
3573                                 msg_format(_("「者ども、ひかえおろう!!!このお方をどなたとこころえる。」", 
3574                                                         "%^s says 'WHO do you think this person is! Bow your head, down your knees!'"), kakusan);
3575                                 sukekaku = TRUE;
3576                                 stun_monsters(120);
3577                                 confuse_monsters(120);
3578                                 turn_monsters(120);
3579                                 stasis_monsters(120);
3580                                 sukekaku = FALSE;
3581                         }
3582                         else
3583                         {
3584                                 msg_print(_("しかし、何も起きなかった。", "Nothing happen."));
3585                         }
3586                         break;
3587                 }
3588
3589                 case ACT_MURAMASA:
3590                 {
3591                         /* Only for Muramasa */
3592                         if (o_ptr->name1 != ART_MURAMASA) return FALSE;
3593                         if (get_check(_("本当に使いますか?", "Are you sure?!")))
3594                         {
3595                                 msg_print(_("村正が震えた...", "The Muramasa pulsates..."));
3596                                 do_inc_stat(A_STR);
3597                                 if (one_in_(2))
3598                                 {
3599                                         msg_print(_("村正は壊れた!", "The Muramasa is destroyed!"));
3600                                         curse_weapon_object(TRUE, o_ptr);
3601                                 }
3602                         }
3603                         break;
3604                 }
3605
3606                 case ACT_BLOODY_MOON:
3607                 {
3608                         /* Only for Bloody Moon */
3609                         if (o_ptr->name1 != ART_BLOOD) return FALSE;
3610                         msg_print(_("鎌が明るく輝いた...", "Your scythe glows brightly!"));
3611                         get_bloody_moon_flags(o_ptr);
3612                         if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
3613                         p_ptr->update |= (PU_BONUS | PU_HP);
3614                         break;
3615                 }
3616
3617                 case ACT_CRIMSON:
3618                 {
3619                         int num = 1;
3620                         int i;
3621                         int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3622                         int tx, ty;
3623
3624                         /* Only for Crimson */
3625                         if (o_ptr->name1 != ART_CRIMSON) return FALSE;
3626
3627                         msg_print(_("せっかくだから『クリムゾン』をぶっぱなすぜ!", "I'll fire CRIMSON! SEKKAKUDAKARA!"));
3628
3629                         if (!get_aim_dir(&dir)) return FALSE;
3630
3631                         /* Use the given direction */
3632                         tx = p_ptr->x + 99 * ddx[dir];
3633                         ty = p_ptr->y + 99 * ddy[dir];
3634
3635                         /* Hack -- Use an actual "target" */
3636                         if ((dir == 5) && target_okay())
3637                         {
3638                                 tx = target_col;
3639                                 ty = target_row;
3640                         }
3641
3642                         if (p_ptr->pclass == CLASS_ARCHER)
3643                         {
3644                                 /* Extra shot at level 10 */
3645                                 if (p_ptr->lev >= 10) num++;
3646
3647                                 /* Extra shot at level 30 */
3648                                 if (p_ptr->lev >= 30) num++;
3649
3650                                 /* Extra shot at level 45 */
3651                                 if (p_ptr->lev >= 45) num++;
3652                         }
3653
3654                         for (i = 0; i < num; i++)
3655                                 project(0, p_ptr->lev/20+1, ty, tx, p_ptr->lev*p_ptr->lev*6/50, GF_ROCKET, flg, -1);
3656                         break;
3657                 }
3658
3659                 default:
3660                 {
3661                         msg_format(_("Unknown activation effect: %d.", "Unknown activation effect: %d."), act_ptr->index);
3662                         return FALSE;
3663                 }
3664         }
3665
3666         /* Set activation timeout */
3667         if (act_ptr->timeout.constant >= 0) {
3668                 o_ptr->timeout = (s16b)act_ptr->timeout.constant;
3669                 if (act_ptr->timeout.dice > 0) {
3670                         o_ptr->timeout += randint1(act_ptr->timeout.dice);
3671                 }
3672         } else {
3673                 /* Activations that have special timeout */
3674                 switch (act_ptr->index) {
3675                 case ACT_BR_FIRE:
3676                         o_ptr->timeout = ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES)) ? 200 : 250;
3677                         break;
3678                 case ACT_BR_COLD:
3679                         o_ptr->timeout = ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE)) ? 200 : 250;
3680                         break;
3681                 case ACT_TERROR:
3682                         o_ptr->timeout = 3 * (p_ptr->lev + 10);
3683                         break;
3684                 case ACT_MURAMASA:
3685                         /* Nothing to do */
3686                         break;
3687                 default:
3688                         msg_format("Special timeout is not implemented: %d.", act_ptr->index);
3689                         return FALSE;
3690                 }
3691         }
3692
3693         return TRUE;
3694 }
3695
3696 /*!
3697  * @brief 固定アーティファクト『ブラッディムーン』の特性を変更する。
3698  * @details スレイ2d2種、及びone_resistance()による耐性1d2種、pval2種を得る。
3699  * @param o_ptr 対象のオブジェクト構造体(ブラッディムーン)のポインタ
3700  * @return なし
3701  */
3702 void get_bloody_moon_flags(object_type *o_ptr)
3703 {
3704         int dummy, i;
3705
3706         for (i = 0; i < TR_FLAG_SIZE; i++)
3707                 o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i];
3708
3709         dummy = randint1(2) + randint1(2);
3710         for (i = 0; i < dummy; i++)
3711         {
3712                 int flag = randint0(26);
3713                 if (flag >= 20) add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20);
3714                 else if (flag == 19) add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
3715                 else if (flag == 18) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
3716                 else add_flag(o_ptr->art_flags, TR_CHAOTIC + flag);
3717         }
3718
3719         dummy = randint1(2);
3720         for (i = 0; i < dummy; i++) one_resistance(o_ptr);
3721
3722         for (i = 0; i < 2; i++)
3723         {
3724                 int tmp = randint0(11);
3725                 if (tmp < 6) add_flag(o_ptr->art_flags, TR_STR + tmp);
3726                 else add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6);
3727         }
3728 }
3729
3730 /*!
3731  * @brief 固定アーティファクト生成時の特別なハードコーディング処理を行う。.
3732  * @details random_artifact_resistance()とあるが実際は固定アーティファクトである。
3733  * 対象は恐怖の仮面、村正、ロビントンのハープ、龍争虎鬪、ブラッディムーン、羽衣、天女の羽衣、ミリム、
3734  * その他追加耐性、特性追加処理。
3735  * @attention プレイヤーの各種ステータスに依存した処理がある。
3736  * @todo 折を見て関数名を変更すること。
3737  * @param o_ptr 対象のオブジェクト構造体ポインタ
3738  * @param a_ptr 生成する固定アーティファクト構造体ポインタ
3739  * @return なし
3740  */
3741 void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
3742 {
3743         bool give_resistance = FALSE, give_power = FALSE;
3744
3745         if (o_ptr->name1 == ART_TERROR) /* Terror Mask is for warriors... */
3746         {
3747                 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_ARCHER || p_ptr->pclass == CLASS_CAVALRY || p_ptr->pclass == CLASS_BERSERKER)
3748                 {
3749                         give_power = TRUE;
3750                         give_resistance = TRUE;
3751                 }
3752                 else
3753                 {
3754                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3755                         add_flag(o_ptr->art_flags, TR_TY_CURSE);
3756                         o_ptr->curse_flags |=
3757                             (TRC_CURSED | TRC_HEAVY_CURSE);
3758                         o_ptr->curse_flags |= get_curse(2, o_ptr);
3759                         return;
3760                 }
3761         }
3762
3763         if (o_ptr->name1 == ART_MURAMASA)
3764         {
3765                 if (p_ptr->pclass != CLASS_SAMURAI)
3766                 {
3767                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3768                         o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3769                 }
3770         }
3771
3772         if (o_ptr->name1 == ART_ROBINTON)
3773         {
3774                 if (p_ptr->pclass == CLASS_BARD)
3775                 {
3776                         add_flag(o_ptr->art_flags, TR_DEC_MANA);
3777                 }
3778         }
3779
3780         if (o_ptr->name1 == ART_XIAOLONG)
3781         {
3782                 if (p_ptr->pclass == CLASS_MONK)
3783                         add_flag(o_ptr->art_flags, TR_BLOWS);
3784         }
3785
3786         if (o_ptr->name1 == ART_BLOOD)
3787         {
3788                 get_bloody_moon_flags(o_ptr);
3789         }
3790
3791         if (o_ptr->name1 == ART_HEAVENLY_MAIDEN)
3792         {
3793                 if (p_ptr->psex != SEX_FEMALE)
3794                 {
3795                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3796                 }
3797         }
3798
3799         if (o_ptr->name1 == ART_MILIM)
3800         {
3801                 if (p_ptr->pseikaku == SEIKAKU_SEXY)
3802                 {
3803                         o_ptr->pval = 3;
3804                         add_flag(o_ptr->art_flags, TR_STR);
3805                         add_flag(o_ptr->art_flags, TR_INT);
3806                         add_flag(o_ptr->art_flags, TR_WIS);
3807                         add_flag(o_ptr->art_flags, TR_DEX);
3808                         add_flag(o_ptr->art_flags, TR_CON);
3809                         add_flag(o_ptr->art_flags, TR_CHR);
3810                 }
3811         }
3812
3813         if (a_ptr->gen_flags & (TRG_XTRA_POWER)) give_power = TRUE;
3814         if (a_ptr->gen_flags & (TRG_XTRA_H_RES)) give_resistance = TRUE;
3815         if (a_ptr->gen_flags & (TRG_XTRA_RES_OR_POWER))
3816         {
3817                 /* Give a resistance OR a power */
3818                 if (one_in_(2)) give_resistance = TRUE;
3819                 else give_power = TRUE;
3820         }
3821
3822         if (give_power)
3823         {
3824                 one_ability(o_ptr);
3825         }
3826
3827         if (give_resistance)
3828         {
3829                 one_high_resistance(o_ptr);
3830         }
3831 }
3832
3833
3834 /*!
3835  * @brief フロアの指定された位置に固定アーティファクトを生成する。 / Create the artifact of the specified number
3836  * @details 固定アーティファクト構造体から基本ステータスをコピーした後、所定の座標でdrop_item()で落とす。
3837  * @param a_idx 生成する固定アーティファクト構造体のID
3838  * @param y アイテムを落とす地点のy座標
3839  * @param x アイテムを落とす地点のx座標
3840  * @return 生成が成功したか否か、失敗はIDの不全、ベースアイテムの不全、drop_item()の失敗時に起こる。
3841  * @attention この処理はdrop_near()内で普通の固定アーティファクトが重ならない性質に依存する.
3842  * 仮に2個以上存在可能かつ装備品以外の固定アーティファクトが作成されれば
3843  * drop_near()関数の返り値は信用できなくなる.
3844  */
3845 bool create_named_art(int a_idx, int y, int x)
3846 {
3847         object_type forge;
3848         object_type *q_ptr;
3849         IDX i;
3850
3851         artifact_type *a_ptr = &a_info[a_idx];
3852
3853         /* Get local object */
3854         q_ptr = &forge;
3855
3856         /* Ignore "empty" artifacts */
3857         if (!a_ptr->name) return FALSE;
3858
3859         /* Acquire the "kind" index */
3860         i = lookup_kind(a_ptr->tval, a_ptr->sval);
3861
3862         /* Oops */
3863         if (!i) return FALSE;
3864
3865         /* Create the artifact */
3866         object_prep(q_ptr, i);
3867
3868         /* Save the name */
3869         q_ptr->name1 = (byte_hack)a_idx;
3870
3871         /* Extract the fields */
3872         q_ptr->pval = a_ptr->pval;
3873         q_ptr->ac = a_ptr->ac;
3874         q_ptr->dd = a_ptr->dd;
3875         q_ptr->ds = a_ptr->ds;
3876         q_ptr->to_a = a_ptr->to_a;
3877         q_ptr->to_h = a_ptr->to_h;
3878         q_ptr->to_d = a_ptr->to_d;
3879         q_ptr->weight = a_ptr->weight;
3880
3881         /* Hack -- extract the "cursed" flag */
3882         if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
3883         if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3884         if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
3885         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
3886         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
3887         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
3888
3889         random_artifact_resistance(q_ptr, a_ptr);
3890
3891         /* Drop the artifact from heaven */
3892         return drop_near(q_ptr, -1, y, x) ? TRUE : FALSE;
3893 }
3894 /*対邪平均ダメージの計算処理*/
3895 int calc_arm_avgdamage(object_type *o_ptr)
3896 {
3897         u32b flgs[TR_FLAG_SIZE];
3898         object_flags(o_ptr, flgs);
3899
3900         HIT_POINT dam, base, s_evil, forced, vorpal;
3901         dam = base = s_evil = forced = vorpal = 0;
3902
3903         dam = base = (o_ptr->dd * o_ptr->ds + o_ptr->dd) / 2;
3904
3905         if(have_flag(flgs, TR_KILL_EVIL))
3906         {
3907                 dam = s_evil = dam * 7 / 2;
3908         }
3909         else if(!have_flag(flgs, TR_KILL_EVIL) && have_flag(flgs, TR_SLAY_EVIL))
3910         {       
3911                 dam = s_evil = dam * 2;
3912         }
3913         else s_evil = dam;
3914
3915         if (have_flag(flgs, TR_FORCE_WEAPON))
3916         {
3917                 dam = forced = dam * 3 / 2 + (o_ptr->dd * o_ptr->ds + o_ptr->dd);
3918         }
3919         else forced = dam;
3920
3921         if(have_flag(flgs, TR_VORPAL))
3922         {
3923                 dam = vorpal = dam * 11 / 9;
3924         }
3925         else vorpal = dam;
3926
3927         dam = dam + o_ptr->to_d;
3928
3929         msg_format_wizard(CHEAT_OBJECT,"素:%d> 対邪:%d> 理力:%d> 切:%d> 最終:%d",
3930                 base, s_evil, forced, vorpal, dam);
3931
3932         return(dam);
3933 }
3934
3935 static int suppression_evil_dam(object_type *o_ptr)
3936 {
3937         int num = FALSE;
3938         u32b flgs[TR_FLAG_SIZE];
3939         object_flags(o_ptr, flgs);
3940
3941         if (have_flag(flgs, TR_VAMPIRIC))
3942         {
3943                 if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 52))
3944                 {
3945                         num = TRUE;
3946                 }
3947                 else if(have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 43))
3948                 {
3949                         num = TRUE;
3950                 }
3951                 else if( have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 33))
3952                 {
3953                         num = TRUE;
3954                 }
3955                 else if (calc_arm_avgdamage(o_ptr) > 63)
3956                 {
3957                         num = TRUE;
3958                 }
3959         }
3960         else
3961         {
3962                 if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 1) && (calc_arm_avgdamage(o_ptr) > 65))
3963                 {
3964                         num = TRUE;
3965                 }
3966                 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 2) && (calc_arm_avgdamage(o_ptr) > 52))
3967                 {
3968                         num = TRUE;
3969                 }
3970                 else if (have_flag(flgs, TR_BLOWS) && (o_ptr->pval == 3) && (calc_arm_avgdamage(o_ptr) > 40))
3971                 {
3972                         num = TRUE;
3973                 }
3974                 else if (calc_arm_avgdamage(o_ptr) > 75)
3975                 {
3976                         num = TRUE;
3977                 }
3978         }
3979         return(num);
3980 }
3981
3982 static int weakening_artifact(object_type *o_ptr)
3983 {
3984          KIND_OBJECT_IDX k_idx = lookup_kind(o_ptr->sval, o_ptr->tval);
3985          object_kind *k_ptr = &k_info[k_idx];
3986
3987          if ((k_ptr->dd < o_ptr->dd) || (k_ptr->ds < o_ptr->ds))
3988          {
3989                 int pre_dd = o_ptr->dd;
3990                 int pre_ds = o_ptr->ds;
3991
3992                 if (o_ptr->dd > o_ptr->ds)
3993                 {
3994                         o_ptr->dd--;
3995                 }
3996                 else
3997                 {
3998                         o_ptr->ds--;
3999                 }
4000
4001                 msg_format_wizard(CHEAT_OBJECT, 
4002                         _("ダイスが抑制されました。%dd%d -> %dd%d", "Dice Supress %dd%d -> %dd%d"),
4003                         pre_dd, pre_ds, o_ptr->dd, o_ptr->ds);
4004                 return 1;
4005         }
4006         
4007         if (o_ptr->to_d > 10)
4008         {
4009                 int pre_damage = o_ptr->to_d;
4010
4011                 o_ptr->to_d = o_ptr->to_d - damroll(1, 6);
4012                 if (o_ptr->to_d < 10)
4013                 {
4014                         o_ptr->to_d = 10;
4015                 }
4016
4017                 msg_format_wizard(CHEAT_OBJECT,
4018                         _("ダメージ修正が抑制されました。 %d -> %d", "Plus-Damage Supress %d -> %d"),
4019                         pre_damage, o_ptr->to_d);
4020
4021                 return 1;
4022          }
4023          return 0;
4024 }