OSDN Git Service

Add some Heavy Crossbow Artifacts.
[hengband/hengband.git] / src / artifact.c
1 /* Purpose: Artifact code */
2
3 /*
4  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research, and
7  * not for profit purposes provided that this copyright and statement are
8  * included in all such copies.
9  */
10
11 #include "angband.h"
12
13
14 /* Chance of using syllables to form the name instead of the "template" files */
15 #define SINDARIN_NAME   10
16 #define TABLE_NAME      20
17 #define A_CURSED        13
18 #define WEIRD_LUCK      12
19 #define BIAS_LUCK       20
20 #define IM_LUCK         7
21
22 /*
23  * Bias luck needs to be higher than weird luck,
24  * since it is usually tested several times...
25  */
26 #define ACTIVATION_CHANCE 3
27
28
29 /*
30  * Use for biased artifact creation
31  */
32 static int artifact_bias;
33
34
35 /*
36  * Choose one random sustain
37  */
38 void one_sustain(object_type *o_ptr)
39 {
40         switch (randint0(6))
41         {
42                 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
43                 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
44                 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
45                 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
46                 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
47                 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
48         }
49 }
50
51
52 /*
53  * Choose one random high resistance
54  */
55 void one_high_resistance(object_type *o_ptr)
56 {
57         switch (randint0(12))
58         {
59                 case  0: add_flag(o_ptr->art_flags, TR_RES_POIS);   break;
60                 case  1: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
61                 case  2: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
62                 case  3: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
63                 case  4: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
64                 case  5: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
65                 case  6: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
66                 case  7: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
67                 case  8: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
68                 case  9: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
69                 case 10: add_flag(o_ptr->art_flags, TR_RES_DISEN);  break;
70                 case 11: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
71         }
72 }
73
74
75 /*
76  * Choose one random high resistance ( except poison and disenchantment )
77  */
78 void one_lordly_high_resistance(object_type *o_ptr)
79 {
80         switch (randint0(10))
81         {
82                 case 0: add_flag(o_ptr->art_flags, TR_RES_LITE);   break;
83                 case 1: add_flag(o_ptr->art_flags, TR_RES_DARK);   break;
84                 case 2: add_flag(o_ptr->art_flags, TR_RES_SHARDS); break;
85                 case 3: add_flag(o_ptr->art_flags, TR_RES_BLIND);  break;
86                 case 4: add_flag(o_ptr->art_flags, TR_RES_CONF);   break;
87                 case 5: add_flag(o_ptr->art_flags, TR_RES_SOUND);  break;
88                 case 6: add_flag(o_ptr->art_flags, TR_RES_NETHER); break;
89                 case 7: add_flag(o_ptr->art_flags, TR_RES_NEXUS);  break;
90                 case 8: add_flag(o_ptr->art_flags, TR_RES_CHAOS);  break;
91                 case 9: add_flag(o_ptr->art_flags, TR_RES_FEAR);   break;
92         }
93 }
94
95
96 /*
97  * Choose one random element resistance
98  */
99 void one_ele_resistance(object_type *o_ptr)
100 {
101         switch (randint0(4))
102         {
103                 case  0: add_flag(o_ptr->art_flags, TR_RES_ACID); break;
104                 case  1: add_flag(o_ptr->art_flags, TR_RES_ELEC); break;
105                 case  2: add_flag(o_ptr->art_flags, TR_RES_COLD); break;
106                 case  3: add_flag(o_ptr->art_flags, TR_RES_FIRE); break;
107         }
108 }
109
110
111 /*
112  * Choose one random element or poison resistance
113  */
114 void one_dragon_ele_resistance(object_type *o_ptr)
115 {
116         if (one_in_(7))
117         {
118                 add_flag(o_ptr->art_flags, TR_RES_POIS);
119         }
120         else
121         {
122                 one_ele_resistance(o_ptr);
123         }
124 }
125
126
127 /*
128  * Choose one lower rank esp
129  */
130 void one_low_esp(object_type *o_ptr)
131 {
132         switch (randint1(10))
133         {
134         case 1:  add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);   break;
135         case 2:  add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);   break;
136         case 3:  add_flag(o_ptr->art_flags, TR_ESP_DEMON);   break;
137         case 4:  add_flag(o_ptr->art_flags, TR_ESP_ORC);   break;
138         case 5:  add_flag(o_ptr->art_flags, TR_ESP_TROLL);   break;
139         case 6:  add_flag(o_ptr->art_flags, TR_ESP_GIANT);   break;
140         case 7:  add_flag(o_ptr->art_flags, TR_ESP_DRAGON);   break;
141         case 8:  add_flag(o_ptr->art_flags, TR_ESP_HUMAN);   break;
142         case 9:  add_flag(o_ptr->art_flags, TR_ESP_GOOD);   break;
143         case 10: add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);   break;
144         }
145 }
146
147
148
149 /*
150  * Choose one random resistance
151  */
152 void one_resistance(object_type *o_ptr)
153 {
154         if (one_in_(3))
155         {
156                 one_ele_resistance(o_ptr);
157         }
158         else
159         {
160                 one_high_resistance(o_ptr);
161         }
162 }
163
164
165 /*
166  * Choose one random ability
167  */
168 void one_ability(object_type *o_ptr)
169 {
170         switch (randint0(10))
171         {
172         case 0: add_flag(o_ptr->art_flags, TR_LEVITATION);     break;
173         case 1: add_flag(o_ptr->art_flags, TR_LITE);        break;
174         case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS);   break;
175         case 3: add_flag(o_ptr->art_flags, TR_WARNING);     break;
176         case 4: add_flag(o_ptr->art_flags, TR_SLOW_DIGEST); break;
177         case 5: add_flag(o_ptr->art_flags, TR_REGEN);       break;
178         case 6: add_flag(o_ptr->art_flags, TR_FREE_ACT);    break;
179         case 7: add_flag(o_ptr->art_flags, TR_HOLD_LIFE);   break;
180         case 8:
181         case 9:
182                 one_low_esp(o_ptr);
183                 break;
184         }
185 }
186
187
188 static void curse_artifact(object_type * o_ptr)
189 {
190         if (o_ptr->pval > 0) o_ptr->pval = 0 - (o_ptr->pval + randint1(4));
191         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - (o_ptr->to_a + randint1(4));
192         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
193         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
194
195         o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
196         remove_flag(o_ptr->art_flags, TR_BLESSED);
197
198         if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
199         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
200         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
201         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
202         if (one_in_(2)) add_flag(o_ptr->art_flags, TR_TELEPORT);
203         else if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
204
205         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))
206                 add_flag(o_ptr->art_flags, TR_NO_MAGIC);
207 }
208
209
210 static void random_plus(object_type * o_ptr)
211 {
212         int this_type = (object_is_weapon_ammo(o_ptr) ? 23 : 19);
213
214         switch (artifact_bias)
215         {
216         case BIAS_WARRIOR:
217                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
218                 {
219                         add_flag(o_ptr->art_flags, TR_STR);
220                         if (one_in_(2)) return;
221                 }
222
223                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
224                 {
225                         add_flag(o_ptr->art_flags, TR_CON);
226                         if (one_in_(2)) return;
227                 }
228
229                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
230                 {
231                         add_flag(o_ptr->art_flags, TR_DEX);
232                         if (one_in_(2)) return;
233                 }
234                 break;
235
236         case BIAS_MAGE:
237                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
238                 {
239                         add_flag(o_ptr->art_flags, TR_INT);
240                         if (one_in_(2)) return;
241                 }
242                 if ((o_ptr->tval == TV_GLOVES) && !(have_flag(o_ptr->art_flags, TR_MAGIC_MASTERY)))
243                 {
244                         add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
245                         if (one_in_(2)) return;
246                 }
247                 break;
248
249         case BIAS_PRIESTLY:
250                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
251                 {
252                         add_flag(o_ptr->art_flags, TR_WIS);
253                         if (one_in_(2)) return;
254                 }
255                 break;
256
257         case BIAS_RANGER:
258                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
259                 {
260                         add_flag(o_ptr->art_flags, TR_DEX);
261                         if (one_in_(2)) return;
262                 }
263
264                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
265                 {
266                         add_flag(o_ptr->art_flags, TR_CON);
267                         if (one_in_(2)) return;
268                 }
269
270                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
271                 {
272                         add_flag(o_ptr->art_flags, TR_STR);
273                         if (one_in_(2)) return;
274                 }
275                 break;
276
277         case BIAS_ROGUE:
278                 if (!(have_flag(o_ptr->art_flags, TR_STEALTH)))
279                 {
280                         add_flag(o_ptr->art_flags, TR_STEALTH);
281                         if (one_in_(2)) return;
282                 }
283                 if (!(have_flag(o_ptr->art_flags, TR_SEARCH)))
284                 {
285                         add_flag(o_ptr->art_flags, TR_SEARCH);
286                         if (one_in_(2)) return;
287                 }
288                 break;
289
290         case BIAS_STR:
291                 if (!(have_flag(o_ptr->art_flags, TR_STR)))
292                 {
293                         add_flag(o_ptr->art_flags, TR_STR);
294                         if (one_in_(2)) return;
295                 }
296                 break;
297
298         case BIAS_WIS:
299                 if (!(have_flag(o_ptr->art_flags, TR_WIS)))
300                 {
301                         add_flag(o_ptr->art_flags, TR_WIS);
302                         if (one_in_(2)) return;
303                 }
304                 break;
305
306         case BIAS_INT:
307                 if (!(have_flag(o_ptr->art_flags, TR_INT)))
308                 {
309                         add_flag(o_ptr->art_flags, TR_INT);
310                         if (one_in_(2)) return;
311                 }
312                 break;
313
314         case BIAS_DEX:
315                 if (!(have_flag(o_ptr->art_flags, TR_DEX)))
316                 {
317                         add_flag(o_ptr->art_flags, TR_DEX);
318                         if (one_in_(2)) return;
319                 }
320                 break;
321
322         case BIAS_CON:
323                 if (!(have_flag(o_ptr->art_flags, TR_CON)))
324                 {
325                         add_flag(o_ptr->art_flags, TR_CON);
326                         if (one_in_(2)) return;
327                 }
328                 break;
329
330         case BIAS_CHR:
331                 if (!(have_flag(o_ptr->art_flags, TR_CHR)))
332                 {
333                         add_flag(o_ptr->art_flags, TR_CHR);
334                         if (one_in_(2)) return;
335                 }
336                 break;
337         }
338
339         if ((artifact_bias == BIAS_MAGE || artifact_bias == BIAS_PRIESTLY) && (o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE))
340         {
341                 if (!(have_flag(o_ptr->art_flags, TR_DEC_MANA)) && one_in_(3))
342                 {
343                         add_flag(o_ptr->art_flags, TR_DEC_MANA);
344                         if (one_in_(2)) return;
345                 }
346         }
347
348         switch (randint1(this_type))
349         {
350         case 1: case 2:
351                 add_flag(o_ptr->art_flags, TR_STR);
352                 if (!artifact_bias && !one_in_(13))
353                         artifact_bias = BIAS_STR;
354                 else if (!artifact_bias && one_in_(7))
355                         artifact_bias = BIAS_WARRIOR;
356                 break;
357         case 3: case 4:
358                 add_flag(o_ptr->art_flags, TR_INT);
359                 if (!artifact_bias && !one_in_(13))
360                         artifact_bias = BIAS_INT;
361                 else if (!artifact_bias && one_in_(7))
362                         artifact_bias = BIAS_MAGE;
363                 break;
364         case 5: case 6:
365                 add_flag(o_ptr->art_flags, TR_WIS);
366                 if (!artifact_bias && !one_in_(13))
367                         artifact_bias = BIAS_WIS;
368                 else if (!artifact_bias && one_in_(7))
369                         artifact_bias = BIAS_PRIESTLY;
370                 break;
371         case 7: case 8:
372                 add_flag(o_ptr->art_flags, TR_DEX);
373                 if (!artifact_bias && !one_in_(13))
374                         artifact_bias = BIAS_DEX;
375                 else if (!artifact_bias && one_in_(7))
376                         artifact_bias = BIAS_ROGUE;
377                 break;
378         case 9: case 10:
379                 add_flag(o_ptr->art_flags, TR_CON);
380                 if (!artifact_bias && !one_in_(13))
381                         artifact_bias = BIAS_CON;
382                 else if (!artifact_bias && one_in_(9))
383                         artifact_bias = BIAS_RANGER;
384                 break;
385         case 11: case 12:
386                 add_flag(o_ptr->art_flags, TR_CHR);
387                 if (!artifact_bias && !one_in_(13))
388                         artifact_bias = BIAS_CHR;
389                 break;
390         case 13: case 14:
391                 add_flag(o_ptr->art_flags, TR_STEALTH);
392                 if (!artifact_bias && one_in_(3))
393                         artifact_bias = BIAS_ROGUE;
394                 break;
395         case 15: case 16:
396                 add_flag(o_ptr->art_flags, TR_SEARCH);
397                 if (!artifact_bias && one_in_(9))
398                         artifact_bias = BIAS_RANGER;
399                 break;
400         case 17: case 18:
401                 add_flag(o_ptr->art_flags, TR_INFRA);
402                 break;
403         case 19:
404                 add_flag(o_ptr->art_flags, TR_SPEED);
405                 if (!artifact_bias && one_in_(11))
406                         artifact_bias = BIAS_ROGUE;
407                 break;
408         case 20: case 21:
409                 add_flag(o_ptr->art_flags, TR_TUNNEL);
410                 break;
411         case 22: case 23:
412                 if (o_ptr->tval == TV_BOW) random_plus(o_ptr);
413                 else
414                 {
415                         add_flag(o_ptr->art_flags, TR_BLOWS);
416                         if (!artifact_bias && one_in_(11))
417                                 artifact_bias = BIAS_WARRIOR;
418                 }
419                 break;
420         }
421 }
422
423
424 static void random_resistance(object_type * o_ptr)
425 {
426         switch (artifact_bias)
427         {
428         case BIAS_ACID:
429                 if (!(have_flag(o_ptr->art_flags, TR_RES_ACID)))
430                 {
431                         add_flag(o_ptr->art_flags, TR_RES_ACID);
432                         if (one_in_(2)) return;
433                 }
434                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ACID)))
435                 {
436                         add_flag(o_ptr->art_flags, TR_IM_ACID);
437                         if (!one_in_(IM_LUCK))
438                         {
439                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
440                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
441                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
442                         }
443                         if (one_in_(2)) return;
444                 }
445                 break;
446
447         case BIAS_ELEC:
448                 if (!(have_flag(o_ptr->art_flags, TR_RES_ELEC)))
449                 {
450                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
451                         if (one_in_(2)) return;
452                 }
453                 if ((o_ptr->tval >= TV_CLOAK) && (o_ptr->tval <= TV_HARD_ARMOR) &&
454                     !(have_flag(o_ptr->art_flags, TR_SH_ELEC)))
455                 {
456                         add_flag(o_ptr->art_flags, TR_SH_ELEC);
457                         if (one_in_(2)) return;
458                 }
459                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_ELEC)))
460                 {
461                         add_flag(o_ptr->art_flags, TR_IM_ELEC);
462                         if (!one_in_(IM_LUCK))
463                         {
464                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
465                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
466                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
467                         }
468
469                         if (one_in_(2)) return;
470                 }
471                 break;
472
473         case BIAS_FIRE:
474                 if (!(have_flag(o_ptr->art_flags, TR_RES_FIRE)))
475                 {
476                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
477                         if (one_in_(2)) return;
478                 }
479                 if ((o_ptr->tval >= TV_CLOAK) &&
480                     (o_ptr->tval <= TV_HARD_ARMOR) &&
481                     !(have_flag(o_ptr->art_flags, TR_SH_FIRE)))
482                 {
483                         add_flag(o_ptr->art_flags, TR_SH_FIRE);
484                         if (one_in_(2)) return;
485                 }
486                 if (one_in_(BIAS_LUCK) &&
487                     !(have_flag(o_ptr->art_flags, TR_IM_FIRE)))
488                 {
489                         add_flag(o_ptr->art_flags, TR_IM_FIRE);
490                         if (!one_in_(IM_LUCK))
491                         {
492                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
493                                 remove_flag(o_ptr->art_flags, TR_IM_COLD);
494                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
495                         }
496                         if (one_in_(2)) return;
497                 }
498                 break;
499
500         case BIAS_COLD:
501                 if (!(have_flag(o_ptr->art_flags, TR_RES_COLD)))
502                 {
503                         add_flag(o_ptr->art_flags, TR_RES_COLD);
504                         if (one_in_(2)) return;
505                 }
506                 if ((o_ptr->tval >= TV_CLOAK) &&
507                     (o_ptr->tval <= TV_HARD_ARMOR) &&
508                     !(have_flag(o_ptr->art_flags, TR_SH_COLD)))
509                 {
510                         add_flag(o_ptr->art_flags, TR_SH_COLD);
511                         if (one_in_(2)) return;
512                 }
513                 if (one_in_(BIAS_LUCK) && !(have_flag(o_ptr->art_flags, TR_IM_COLD)))
514                 {
515                         add_flag(o_ptr->art_flags, TR_IM_COLD);
516                         if (!one_in_(IM_LUCK))
517                         {
518                                 remove_flag(o_ptr->art_flags, TR_IM_ELEC);
519                                 remove_flag(o_ptr->art_flags, TR_IM_ACID);
520                                 remove_flag(o_ptr->art_flags, TR_IM_FIRE);
521                         }
522                         if (one_in_(2)) return;
523                 }
524                 break;
525
526         case BIAS_POIS:
527                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
528                 {
529                         add_flag(o_ptr->art_flags, TR_RES_POIS);
530                         if (one_in_(2)) return;
531                 }
532                 break;
533
534         case BIAS_WARRIOR:
535                 if (!one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_RES_FEAR))))
536                 {
537                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
538                         if (one_in_(2)) return;
539                 }
540                 if (one_in_(3) && (!(have_flag(o_ptr->art_flags, TR_NO_MAGIC))))
541                 {
542                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
543                         if (one_in_(2)) return;
544                 }
545                 break;
546
547         case BIAS_NECROMANTIC:
548                 if (!(have_flag(o_ptr->art_flags, TR_RES_NETHER)))
549                 {
550                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
551                         if (one_in_(2)) return;
552                 }
553                 if (!(have_flag(o_ptr->art_flags, TR_RES_POIS)))
554                 {
555                         add_flag(o_ptr->art_flags, TR_RES_POIS);
556                         if (one_in_(2)) return;
557                 }
558                 if (!(have_flag(o_ptr->art_flags, TR_RES_DARK)))
559                 {
560                         add_flag(o_ptr->art_flags, TR_RES_DARK);
561                         if (one_in_(2)) return;
562                 }
563                 break;
564
565         case BIAS_CHAOS:
566                 if (!(have_flag(o_ptr->art_flags, TR_RES_CHAOS)))
567                 {
568                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
569                         if (one_in_(2)) return;
570                 }
571                 if (!(have_flag(o_ptr->art_flags, TR_RES_CONF)))
572                 {
573                         add_flag(o_ptr->art_flags, TR_RES_CONF);
574                         if (one_in_(2)) return;
575                 }
576                 if (!(have_flag(o_ptr->art_flags, TR_RES_DISEN)))
577                 {
578                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
579                         if (one_in_(2)) return;
580                 }
581                 break;
582         }
583
584         switch (randint1(42))
585         {
586                 case 1:
587                         if (!one_in_(WEIRD_LUCK))
588                                 random_resistance(o_ptr);
589                         else
590                         {
591                                 add_flag(o_ptr->art_flags, TR_IM_ACID);
592                                 if (!artifact_bias)
593                                         artifact_bias = BIAS_ACID;
594                         }
595                         break;
596                 case 2:
597                         if (!one_in_(WEIRD_LUCK))
598                                 random_resistance(o_ptr);
599                         else
600                         {
601                                 add_flag(o_ptr->art_flags, TR_IM_ELEC);
602                                 if (!artifact_bias)
603                                         artifact_bias = BIAS_ELEC;
604                         }
605                         break;
606                 case 3:
607                         if (!one_in_(WEIRD_LUCK))
608                                 random_resistance(o_ptr);
609                         else
610                         {
611                                 add_flag(o_ptr->art_flags, TR_IM_COLD);
612                                 if (!artifact_bias)
613                                         artifact_bias = BIAS_COLD;
614                         }
615                         break;
616                 case 4:
617                         if (!one_in_(WEIRD_LUCK))
618                                 random_resistance(o_ptr);
619                         else
620                         {
621                                 add_flag(o_ptr->art_flags, TR_IM_FIRE);
622                                 if (!artifact_bias)
623                                         artifact_bias = BIAS_FIRE;
624                         }
625                         break;
626                 case 5:
627                 case 6:
628                 case 13:
629                         add_flag(o_ptr->art_flags, TR_RES_ACID);
630                         if (!artifact_bias)
631                                 artifact_bias = BIAS_ACID;
632                         break;
633                 case 7:
634                 case 8:
635                 case 14:
636                         add_flag(o_ptr->art_flags, TR_RES_ELEC);
637                         if (!artifact_bias)
638                                 artifact_bias = BIAS_ELEC;
639                         break;
640                 case 9:
641                 case 10:
642                 case 15:
643                         add_flag(o_ptr->art_flags, TR_RES_FIRE);
644                         if (!artifact_bias)
645                                 artifact_bias = BIAS_FIRE;
646                         break;
647                 case 11:
648                 case 12:
649                 case 16:
650                         add_flag(o_ptr->art_flags, TR_RES_COLD);
651                         if (!artifact_bias)
652                                 artifact_bias = BIAS_COLD;
653                         break;
654                 case 17:
655                 case 18:
656                         add_flag(o_ptr->art_flags, TR_RES_POIS);
657                         if (!artifact_bias && !one_in_(4))
658                                 artifact_bias = BIAS_POIS;
659                         else if (!artifact_bias && one_in_(2))
660                                 artifact_bias = BIAS_NECROMANTIC;
661                         else if (!artifact_bias && one_in_(2))
662                                 artifact_bias = BIAS_ROGUE;
663                         break;
664                 case 19:
665                 case 20:
666                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
667                         if (!artifact_bias && one_in_(3))
668                                 artifact_bias = BIAS_WARRIOR;
669                         break;
670                 case 21:
671                         add_flag(o_ptr->art_flags, TR_RES_LITE);
672                         break;
673                 case 22:
674                         add_flag(o_ptr->art_flags, TR_RES_DARK);
675                         break;
676                 case 23:
677                 case 24:
678                         add_flag(o_ptr->art_flags, TR_RES_BLIND);
679                         break;
680                 case 25:
681                 case 26:
682                         add_flag(o_ptr->art_flags, TR_RES_CONF);
683                         if (!artifact_bias && one_in_(6))
684                                 artifact_bias = BIAS_CHAOS;
685                         break;
686                 case 27:
687                 case 28:
688                         add_flag(o_ptr->art_flags, TR_RES_SOUND);
689                         break;
690                 case 29:
691                 case 30:
692                         add_flag(o_ptr->art_flags, TR_RES_SHARDS);
693                         break;
694                 case 31:
695                 case 32:
696                         add_flag(o_ptr->art_flags, TR_RES_NETHER);
697                         if (!artifact_bias && one_in_(3))
698                                 artifact_bias = BIAS_NECROMANTIC;
699                         break;
700                 case 33:
701                 case 34:
702                         add_flag(o_ptr->art_flags, TR_RES_NEXUS);
703                         break;
704                 case 35:
705                 case 36:
706                         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
707                         if (!artifact_bias && one_in_(2))
708                                 artifact_bias = BIAS_CHAOS;
709                         break;
710                 case 37:
711                 case 38:
712                         add_flag(o_ptr->art_flags, TR_RES_DISEN);
713                         break;
714                 case 39:
715                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
716                                 add_flag(o_ptr->art_flags, TR_SH_ELEC);
717                         else
718                                 random_resistance(o_ptr);
719                         if (!artifact_bias)
720                                 artifact_bias = BIAS_ELEC;
721                         break;
722                 case 40:
723                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
724                                 add_flag(o_ptr->art_flags, TR_SH_FIRE);
725                         else
726                                 random_resistance(o_ptr);
727                         if (!artifact_bias)
728                                 artifact_bias = BIAS_FIRE;
729                         break;
730                 case 41:
731                         if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK ||
732                             o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR)
733                                 add_flag(o_ptr->art_flags, TR_REFLECT);
734                         else
735                                 random_resistance(o_ptr);
736                         break;
737                 case 42:
738                         if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
739                                 add_flag(o_ptr->art_flags, TR_SH_COLD);
740                         else
741                                 random_resistance(o_ptr);
742                         if (!artifact_bias)
743                                 artifact_bias = BIAS_COLD;
744                         break;
745         }
746 }
747
748
749
750 static void random_misc(object_type * o_ptr)
751 {
752         switch (artifact_bias)
753         {
754         case BIAS_RANGER:
755                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
756                 {
757                         add_flag(o_ptr->art_flags, TR_SUST_CON);
758                         if (one_in_(2)) return;
759                 }
760                 break;
761
762         case BIAS_STR:
763                 if (!(have_flag(o_ptr->art_flags, TR_SUST_STR)))
764                 {
765                         add_flag(o_ptr->art_flags, TR_SUST_STR);
766                         if (one_in_(2)) return;
767                 }
768                 break;
769
770         case BIAS_WIS:
771                 if (!(have_flag(o_ptr->art_flags, TR_SUST_WIS)))
772                 {
773                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
774                         if (one_in_(2)) return;
775                 }
776                 break;
777
778         case BIAS_INT:
779                 if (!(have_flag(o_ptr->art_flags, TR_SUST_INT)))
780                 {
781                         add_flag(o_ptr->art_flags, TR_SUST_INT);
782                         if (one_in_(2)) return;
783                 }
784                 break;
785
786         case BIAS_DEX:
787                 if (!(have_flag(o_ptr->art_flags, TR_SUST_DEX)))
788                 {
789                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
790                         if (one_in_(2)) return;
791                 }
792                 break;
793
794         case BIAS_CON:
795                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CON)))
796                 {
797                         add_flag(o_ptr->art_flags, TR_SUST_CON);
798                         if (one_in_(2)) return;
799                 }
800                 break;
801
802         case BIAS_CHR:
803                 if (!(have_flag(o_ptr->art_flags, TR_SUST_CHR)))
804                 {
805                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
806                         if (one_in_(2)) return;
807                 }
808                 break;
809
810         case BIAS_CHAOS:
811                 if (!(have_flag(o_ptr->art_flags, TR_TELEPORT)))
812                 {
813                         add_flag(o_ptr->art_flags, TR_TELEPORT);
814                         if (one_in_(2)) return;
815                 }
816                 break;
817
818         case BIAS_FIRE:
819                 if (!(have_flag(o_ptr->art_flags, TR_LITE)))
820                 {
821                         add_flag(o_ptr->art_flags, TR_LITE); /* Freebie */
822                 }
823                 break;
824         }
825
826         switch (randint1(33))
827         {
828                 case 1:
829                         add_flag(o_ptr->art_flags, TR_SUST_STR);
830                         if (!artifact_bias)
831                                 artifact_bias = BIAS_STR;
832                         break;
833                 case 2:
834                         add_flag(o_ptr->art_flags, TR_SUST_INT);
835                         if (!artifact_bias)
836                                 artifact_bias = BIAS_INT;
837                         break;
838                 case 3:
839                         add_flag(o_ptr->art_flags, TR_SUST_WIS);
840                         if (!artifact_bias)
841                                 artifact_bias = BIAS_WIS;
842                         break;
843                 case 4:
844                         add_flag(o_ptr->art_flags, TR_SUST_DEX);
845                         if (!artifact_bias)
846                                 artifact_bias = BIAS_DEX;
847                         break;
848                 case 5:
849                         add_flag(o_ptr->art_flags, TR_SUST_CON);
850                         if (!artifact_bias)
851                                 artifact_bias = BIAS_CON;
852                         break;
853                 case 6:
854                         add_flag(o_ptr->art_flags, TR_SUST_CHR);
855                         if (!artifact_bias)
856                                 artifact_bias = BIAS_CHR;
857                         break;
858                 case 7:
859                 case 8:
860                 case 14:
861                         add_flag(o_ptr->art_flags, TR_FREE_ACT);
862                         break;
863                 case 9:
864                         add_flag(o_ptr->art_flags, TR_HOLD_LIFE);
865                         if (!artifact_bias && one_in_(5))
866                                 artifact_bias = BIAS_PRIESTLY;
867                         else if (!artifact_bias && one_in_(6))
868                                 artifact_bias = BIAS_NECROMANTIC;
869                         break;
870                 case 10:
871                 case 11:
872                         add_flag(o_ptr->art_flags, TR_LITE);
873                         break;
874                 case 12:
875                 case 13:
876                         add_flag(o_ptr->art_flags, TR_LEVITATION);
877                         break;
878                 case 15:
879                 case 16:
880                 case 17:
881                         add_flag(o_ptr->art_flags, TR_SEE_INVIS);
882                         break;
883                 case 19:
884                 case 20:
885                         add_flag(o_ptr->art_flags, TR_SLOW_DIGEST);
886                         break;
887                 case 21:
888                 case 22:
889                         add_flag(o_ptr->art_flags, TR_REGEN);
890                         break;
891                 case 23:
892                         add_flag(o_ptr->art_flags, TR_TELEPORT);
893                         break;
894                 case 24:
895                 case 25:
896                 case 26:
897                         if (object_is_armour(o_ptr))
898                                 random_misc(o_ptr);
899                         else
900                         {
901                                 o_ptr->to_a = 4 + randint1(11);
902                         }
903                         break;
904                 case 27:
905                 case 28:
906                 case 29:
907                 {
908                         int bonus_h, bonus_d;
909                         add_flag(o_ptr->art_flags, TR_SHOW_MODS);
910                         bonus_h = 4 + (randint1(11));
911                         bonus_d = 4 + (randint1(11));
912                         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))
913                         {
914                                 bonus_h /= 2;
915                                 bonus_d /= 2;
916                         }
917                         o_ptr->to_h += bonus_h;
918                         o_ptr->to_d += bonus_d;
919                         break;
920                 }
921                 case 30:
922                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
923                         break;
924                 case 31:
925                         add_flag(o_ptr->art_flags, TR_NO_TELE);
926                         break;
927                 case 32:
928                         add_flag(o_ptr->art_flags, TR_WARNING);
929                         break;
930
931                 case 18:
932                         switch (randint1(3))
933                         {
934                         case 1:
935                                 add_flag(o_ptr->art_flags, TR_ESP_EVIL);
936                                 if (!artifact_bias && one_in_(3))
937                                         artifact_bias = BIAS_LAW;
938                                 break;
939                         case 2:
940                                 add_flag(o_ptr->art_flags, TR_ESP_NONLIVING);
941                                 if (!artifact_bias && one_in_(3))
942                                         artifact_bias = BIAS_MAGE;
943                                 break;
944                         case 3:
945                                 add_flag(o_ptr->art_flags, TR_TELEPATHY);
946                                 if (!artifact_bias && one_in_(9))
947                                         artifact_bias = BIAS_MAGE;
948                                 break;
949                         }
950                         break;
951
952                 case 33:
953                 {
954                         int idx[3];
955                         int n = randint1(3);
956
957                         idx[0] = randint1(8);
958
959                         idx[1] = randint1(7);
960                         if (idx[1] >= idx[0]) idx[1]++;
961
962                         idx[2] = randint1(6);
963                         if (idx[2] >= idx[0]) idx[2]++;
964                         if (idx[2] >= idx[1]) idx[2]++;
965
966                         while (n--) switch (idx[n])
967                         {
968                         case 1:
969                                 add_flag(o_ptr->art_flags, TR_ESP_ANIMAL);
970                                 if (!artifact_bias && one_in_(4))
971                                         artifact_bias = BIAS_RANGER;
972                                 break;
973                         case 2:
974                                 add_flag(o_ptr->art_flags, TR_ESP_UNDEAD);
975                                 if (!artifact_bias && one_in_(3))
976                                         artifact_bias = BIAS_PRIESTLY;
977                                 else if (!artifact_bias && one_in_(6))
978                                         artifact_bias = BIAS_NECROMANTIC;
979                                 break;
980                         case 3:
981                                 add_flag(o_ptr->art_flags, TR_ESP_DEMON);
982                                 break;
983                         case 4:
984                                 add_flag(o_ptr->art_flags, TR_ESP_ORC);
985                                 break;
986                         case 5:
987                                 add_flag(o_ptr->art_flags, TR_ESP_TROLL);
988                                 break;
989                         case 6:
990                                 add_flag(o_ptr->art_flags, TR_ESP_GIANT);
991                                 break;
992                         case 7:
993                                 add_flag(o_ptr->art_flags, TR_ESP_HUMAN);
994                                 if (!artifact_bias && one_in_(6))
995                                         artifact_bias = BIAS_ROGUE;
996                                 break;
997                         case 8:
998                                 add_flag(o_ptr->art_flags, TR_ESP_GOOD);
999                                 if (!artifact_bias && one_in_(3))
1000                                         artifact_bias = BIAS_LAW;
1001                                 break;
1002                         case 9:
1003                                 add_flag(o_ptr->art_flags, TR_ESP_UNIQUE);
1004                                 if (!artifact_bias && one_in_(3))
1005                                         artifact_bias = BIAS_LAW;
1006                                 break;
1007                         }
1008                         break;
1009                 }
1010         }
1011 }
1012
1013
1014 static void random_slay(object_type *o_ptr)
1015 {
1016         if (o_ptr->tval == TV_BOW)
1017         {
1018                 switch (randint1(6))
1019                 {
1020                         case 1:
1021                         case 2:
1022                         case 3:
1023                                 add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1024                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1025                                 if (!artifact_bias && one_in_(9))
1026                                         artifact_bias = BIAS_RANGER;
1027                                 break;
1028                         default:
1029                                 add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
1030                                 if (!one_in_(7)) remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
1031                                 if (!artifact_bias && one_in_(9))
1032                                         artifact_bias = BIAS_RANGER;
1033                         break;
1034                 }
1035
1036                 return;
1037         }
1038
1039         switch (artifact_bias)
1040         {
1041         case BIAS_CHAOS:
1042                 if (!(have_flag(o_ptr->art_flags, TR_CHAOTIC)))
1043                 {
1044                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1045                         if (one_in_(2)) return;
1046                 }
1047                 break;
1048
1049         case BIAS_PRIESTLY:
1050                 if((o_ptr->tval == TV_SWORD || o_ptr->tval == TV_POLEARM) &&
1051                    !(have_flag(o_ptr->art_flags, TR_BLESSED)))
1052                 {
1053                         /* A free power for "priestly" random artifacts */
1054                         add_flag(o_ptr->art_flags, TR_BLESSED);
1055                 }
1056                 break;
1057
1058         case BIAS_NECROMANTIC:
1059                 if (!(have_flag(o_ptr->art_flags, TR_VAMPIRIC)))
1060                 {
1061                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1062                         if (one_in_(2)) return;
1063                 }
1064                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)) && one_in_(2))
1065                 {
1066                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1067                         if (one_in_(2)) return;
1068                 }
1069                 break;
1070
1071         case BIAS_RANGER:
1072                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_ANIMAL)))
1073                 {
1074                         add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1075                         if (one_in_(2)) return;
1076                 }
1077                 break;
1078
1079         case BIAS_ROGUE:
1080                 if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) ||
1081                      ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR))) &&
1082                          !(have_flag(o_ptr->art_flags, TR_THROW)))
1083                 {
1084                         /* Free power for rogues... */
1085                         add_flag(o_ptr->art_flags, TR_THROW);
1086                 }
1087                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1088                 {
1089                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1090                         if (one_in_(2)) return;
1091                 }
1092                 break;
1093
1094         case BIAS_POIS:
1095                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_POIS)))
1096                 {
1097                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1098                         if (one_in_(2)) return;
1099                 }
1100                 break;
1101
1102         case BIAS_FIRE:
1103                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_FIRE)))
1104                 {
1105                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1106                         if (one_in_(2)) return;
1107                 }
1108                 break;
1109
1110         case BIAS_COLD:
1111                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_COLD)))
1112                 {
1113                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1114                         if (one_in_(2)) return;
1115                 }
1116                 break;
1117
1118         case BIAS_ELEC:
1119                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ELEC)))
1120                 {
1121                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1122                         if (one_in_(2)) return;
1123                 }
1124                 break;
1125
1126         case BIAS_ACID:
1127                 if (!(have_flag(o_ptr->art_flags, TR_BRAND_ACID)))
1128                 {
1129                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1130                         if (one_in_(2)) return;
1131                 }
1132                 break;
1133
1134         case BIAS_LAW:
1135                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_EVIL)))
1136                 {
1137                         add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1138                         if (one_in_(2)) return;
1139                 }
1140                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_UNDEAD)))
1141                 {
1142                         add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1143                         if (one_in_(2)) return;
1144                 }
1145                 if (!(have_flag(o_ptr->art_flags, TR_SLAY_DEMON)))
1146                 {
1147                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1148                         if (one_in_(2)) return;
1149                 }
1150                 break;
1151         }
1152
1153         switch (randint1(36))
1154         {
1155                 case 1:
1156                 case 2:
1157                         add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1158                         break;
1159                 case 3:
1160                 case 4:
1161                         add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1162                         if (!artifact_bias && one_in_(2))
1163                                 artifact_bias = BIAS_LAW;
1164                         else if (!artifact_bias && one_in_(9))
1165                                 artifact_bias = BIAS_PRIESTLY;
1166                         break;
1167                 case 5:
1168                 case 6:
1169                         add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1170                         if (!artifact_bias && one_in_(9))
1171                                 artifact_bias = BIAS_PRIESTLY;
1172                         break;
1173                 case 7:
1174                 case 8:
1175                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1176                         if (!artifact_bias && one_in_(9))
1177                                 artifact_bias = BIAS_PRIESTLY;
1178                         break;
1179                 case 9:
1180                 case 10:
1181                         add_flag(o_ptr->art_flags, TR_SLAY_ORC);
1182                         break;
1183                 case 11:
1184                 case 12:
1185                         add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1186                         break;
1187                 case 13:
1188                 case 14:
1189                         add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1190                         break;
1191                 case 15:
1192                 case 16:
1193                         add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1194                         break;
1195                 case 17:
1196                         add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1197                         break;
1198                 case 18:
1199                 case 19:
1200                         if (o_ptr->tval == TV_SWORD)
1201                         {
1202                                 add_flag(o_ptr->art_flags, TR_VORPAL);
1203                                 if (!artifact_bias && one_in_(9))
1204                                         artifact_bias = BIAS_WARRIOR;
1205                         }
1206                         else
1207                                 random_slay(o_ptr);
1208                         break;
1209                 case 20:
1210                         add_flag(o_ptr->art_flags, TR_IMPACT);
1211                         break;
1212                 case 21:
1213                 case 22:
1214                         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1215                         if (!artifact_bias)
1216                                 artifact_bias = BIAS_FIRE;
1217                         break;
1218                 case 23:
1219                 case 24:
1220                         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
1221                         if (!artifact_bias)
1222                                 artifact_bias = BIAS_COLD;
1223                         break;
1224                 case 25:
1225                 case 26:
1226                         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1227                         if (!artifact_bias)
1228                                 artifact_bias = BIAS_ELEC;
1229                         break;
1230                 case 27:
1231                 case 28:
1232                         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
1233                         if (!artifact_bias)
1234                                 artifact_bias = BIAS_ACID;
1235                         break;
1236                 case 29:
1237                 case 30:
1238                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1239                         if (!artifact_bias && !one_in_(3))
1240                                 artifact_bias = BIAS_POIS;
1241                         else if (!artifact_bias && one_in_(6))
1242                                 artifact_bias = BIAS_NECROMANTIC;
1243                         else if (!artifact_bias)
1244                                 artifact_bias = BIAS_ROGUE;
1245                         break;
1246                 case 31:
1247                         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
1248                         if (!artifact_bias)
1249                                 artifact_bias = BIAS_NECROMANTIC;
1250                         break;
1251                 case 32:
1252                         add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1253                         if (!artifact_bias)
1254                                 artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
1255                         break;
1256                 case 33:
1257                 case 34:
1258                         add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1259                         break;
1260                 default:
1261                         add_flag(o_ptr->art_flags, TR_CHAOTIC);
1262                         if (!artifact_bias)
1263                                 artifact_bias = BIAS_CHAOS;
1264                         break;
1265         }
1266 }
1267
1268
1269 static void give_activation_power(object_type *o_ptr)
1270 {
1271         int type = 0, chance = 0;
1272
1273         switch (artifact_bias)
1274         {
1275                 case BIAS_ELEC:
1276                         if (!one_in_(3))
1277                         {
1278                                 type = ACT_BO_ELEC_1;
1279                         }
1280                         else if (!one_in_(5))
1281                         {
1282                                 type = ACT_BA_ELEC_2;
1283                         }
1284                         else
1285                         {
1286                                 type = ACT_BA_ELEC_3;
1287                         }
1288                         chance = 101;
1289                         break;
1290
1291                 case BIAS_POIS:
1292                         type = ACT_BA_POIS_1;
1293                         chance = 101;
1294                         break;
1295
1296                 case BIAS_FIRE:
1297                         if (!one_in_(3))
1298                         {
1299                                 type = ACT_BO_FIRE_1;
1300                         }
1301                         else if (!one_in_(5))
1302                         {
1303                                 type = ACT_BA_FIRE_1;
1304                         }
1305                         else
1306                         {
1307                                 type = ACT_BA_FIRE_2;
1308                         }
1309                         chance = 101;
1310                         break;
1311
1312                 case BIAS_COLD:
1313                         chance = 101;
1314                         if (!one_in_(3))
1315                                 type = ACT_BO_COLD_1;
1316                         else if (!one_in_(3))
1317                                 type = ACT_BA_COLD_1;
1318                         else if (!one_in_(3))
1319                                 type = ACT_BA_COLD_2;
1320                         else
1321                                 type = ACT_BA_COLD_3;
1322                         break;
1323
1324                 case BIAS_CHAOS:
1325                         chance = 50;
1326                         if (one_in_(6))
1327                                 type = ACT_SUMMON_DEMON;
1328                         else
1329                                 type = ACT_CALL_CHAOS;
1330                         break;
1331
1332                 case BIAS_PRIESTLY:
1333                         chance = 101;
1334
1335                         if (one_in_(13))
1336                                 type = ACT_CHARM_UNDEAD;
1337                         else if (one_in_(12))
1338                                 type = ACT_BANISH_EVIL;
1339                         else if (one_in_(11))
1340                                 type = ACT_DISP_EVIL;
1341                         else if (one_in_(10))
1342                                 type = ACT_PROT_EVIL;
1343                         else if (one_in_(9))
1344                                 type = ACT_CURE_1000;
1345                         else if (one_in_(8))
1346                                 type = ACT_CURE_700;
1347                         else if (one_in_(7))
1348                                 type = ACT_REST_ALL;
1349                         else if (one_in_(6))
1350                                 type = ACT_REST_LIFE;
1351                         else
1352                                 type = ACT_CURE_MW;
1353                         break;
1354
1355                 case BIAS_NECROMANTIC:
1356                         chance = 101;
1357                         if (one_in_(66))
1358                                 type = ACT_WRAITH;
1359                         else if (one_in_(13))
1360                                 type = ACT_DISP_GOOD;
1361                         else if (one_in_(9))
1362                                 type = ACT_MASS_GENO;
1363                         else if (one_in_(8))
1364                                 type = ACT_GENOCIDE;
1365                         else if (one_in_(13))
1366                                 type = ACT_SUMMON_UNDEAD;
1367                         else if (one_in_(9))
1368                                 type = ACT_VAMPIRE_2;
1369                         else if (one_in_(6))
1370                                 type = ACT_CHARM_UNDEAD;
1371                         else
1372                                 type = ACT_VAMPIRE_1;
1373                         break;
1374
1375                 case BIAS_LAW:
1376                         chance = 101;
1377                         if (one_in_(8))
1378                                 type = ACT_BANISH_EVIL;
1379                         else if (one_in_(4))
1380                                 type = ACT_DISP_EVIL;
1381                         else
1382                                 type = ACT_PROT_EVIL;
1383                         break;
1384
1385                 case BIAS_ROGUE:
1386                         chance = 101;
1387                         if (one_in_(50))
1388                                 type = ACT_SPEED;
1389                         else if (one_in_(4))
1390                                 type = ACT_SLEEP;
1391                         else if (one_in_(3))
1392                                 type = ACT_DETECT_ALL;
1393                         else if (one_in_(8))
1394                                 type = ACT_ID_FULL;
1395                         else
1396                                 type = ACT_ID_PLAIN;
1397                         break;
1398
1399                 case BIAS_MAGE:
1400                         chance = 66;
1401                         if (one_in_(20))
1402                                 type = ACT_SUMMON_ELEMENTAL;
1403                         else if (one_in_(10))
1404                                 type = ACT_SUMMON_PHANTOM;
1405                         else if (one_in_(5))
1406                                 type = ACT_RUNE_EXPLO;
1407                         else
1408                                 type = ACT_ESP;
1409                         break;
1410
1411                 case BIAS_WARRIOR:
1412                         chance = 80;
1413                         if (one_in_(100))
1414                                 type = ACT_INVULN;
1415                         else
1416                                 type = ACT_BERSERK;
1417                         break;
1418
1419                 case BIAS_RANGER:
1420                         chance = 101;
1421                         if (one_in_(20))
1422                                 type = ACT_CHARM_ANIMALS;
1423                         else if (one_in_(7))
1424                                 type = ACT_SUMMON_ANIMAL;
1425                         else if (one_in_(6))
1426                                 type = ACT_CHARM_ANIMAL;
1427                         else if (one_in_(4))
1428                                 type = ACT_RESIST_ALL;
1429                         else if (one_in_(3))
1430                                 type = ACT_SATIATE;
1431                         else
1432                                 type = ACT_CURE_POISON;
1433                         break;
1434         }
1435
1436         while (!type || (randint1(100) >= chance))
1437         {
1438                 type = randint1(255);
1439                 switch (type)
1440                 {
1441                         case ACT_SUNLIGHT:
1442                         case ACT_BO_MISS_1:
1443                         case ACT_BA_POIS_1:
1444                         case ACT_BO_ELEC_1:
1445                         case ACT_BO_ACID_1:
1446                         case ACT_BO_COLD_1:
1447                         case ACT_BO_FIRE_1:
1448                         case ACT_CONFUSE:
1449                         case ACT_SLEEP:
1450                         case ACT_QUAKE:
1451                         case ACT_CURE_LW:
1452                         case ACT_CURE_MW:
1453                         case ACT_CURE_POISON:
1454                         case ACT_BERSERK:
1455                         case ACT_LIGHT:
1456                         case ACT_MAP_LIGHT:
1457                         case ACT_DEST_DOOR:
1458                         case ACT_STONE_MUD:
1459                         case ACT_TELEPORT:
1460                                 chance = 101;
1461                                 break;
1462                         case ACT_BA_COLD_1:
1463                         case ACT_BA_FIRE_1:
1464                         case ACT_DRAIN_1:
1465                         case ACT_TELE_AWAY:
1466                         case ACT_ESP:
1467                         case ACT_RESIST_ALL:
1468                         case ACT_DETECT_ALL:
1469                         case ACT_RECALL:
1470                         case ACT_SATIATE:
1471                         case ACT_RECHARGE:
1472                                 chance = 85;
1473                                 break;
1474                         case ACT_TERROR:
1475                         case ACT_PROT_EVIL:
1476                         case ACT_ID_PLAIN:
1477                                 chance = 75;
1478                                 break;
1479                         case ACT_DRAIN_2:
1480                         case ACT_VAMPIRE_1:
1481                         case ACT_BO_MISS_2:
1482                         case ACT_BA_FIRE_2:
1483                         case ACT_REST_LIFE:
1484                                 chance = 66;
1485                                 break;
1486                         case ACT_BA_COLD_3:
1487                         case ACT_BA_ELEC_3:
1488                         case ACT_WHIRLWIND:
1489                         case ACT_VAMPIRE_2:
1490                         case ACT_CHARM_ANIMAL:
1491                                 chance = 50;
1492                                 break;
1493                         case ACT_SUMMON_ANIMAL:
1494                                 chance = 40;
1495                                 break;
1496                         case ACT_DISP_EVIL:
1497                         case ACT_BA_MISS_3:
1498                         case ACT_DISP_GOOD:
1499                         case ACT_BANISH_EVIL:
1500                         case ACT_GENOCIDE:
1501                         case ACT_MASS_GENO:
1502                         case ACT_CHARM_UNDEAD:
1503                         case ACT_CHARM_OTHER:
1504                         case ACT_SUMMON_PHANTOM:
1505                         case ACT_REST_ALL:
1506                         case ACT_RUNE_EXPLO:
1507                                 chance = 33;
1508                                 break;
1509                         case ACT_CALL_CHAOS:
1510                         case ACT_ROCKET:
1511                         case ACT_CHARM_ANIMALS:
1512                         case ACT_CHARM_OTHERS:
1513                         case ACT_SUMMON_ELEMENTAL:
1514                         case ACT_CURE_700:
1515                         case ACT_SPEED:
1516                         case ACT_ID_FULL:
1517                         case ACT_RUNE_PROT:
1518                                 chance = 25;
1519                                 break;
1520                         case ACT_CURE_1000:
1521                         case ACT_XTRA_SPEED:
1522                         case ACT_DETECT_XTRA:
1523                         case ACT_DIM_DOOR:
1524                                 chance = 10;
1525                                 break;
1526                         case ACT_SUMMON_UNDEAD:
1527                         case ACT_SUMMON_DEMON:
1528                         case ACT_WRAITH:
1529                         case ACT_INVULN:
1530                         case ACT_ALCHEMY:
1531                                 chance = 5;
1532                                 break;
1533                         default:
1534                                 chance = 0;
1535                 }
1536         }
1537
1538         /* A type was chosen... */
1539         o_ptr->xtra2 = type;
1540         add_flag(o_ptr->art_flags, TR_ACTIVATE);
1541         o_ptr->timeout = 0;
1542 }
1543
1544
1545 static void get_random_name(char *return_name, bool armour, int power)
1546 {
1547         int prob = randint1(100);
1548
1549         if (prob <= SINDARIN_NAME)
1550         {
1551                 get_table_sindarin(return_name);
1552         }
1553         else if (prob <= TABLE_NAME)
1554         {
1555                 get_table_name(return_name);
1556         }
1557         else
1558         {
1559                 cptr filename;
1560
1561                 switch (armour)
1562                 {
1563                         case 1:
1564                                 switch (power)
1565                                 {
1566                                         case 0:
1567 #ifdef JP
1568                                                 filename = "a_cursed_j.txt";
1569 #else
1570                                                 filename = "a_cursed.txt";
1571 #endif
1572                                                 break;
1573                                         case 1:
1574 #ifdef JP
1575                                                 filename = "a_low_j.txt";
1576 #else
1577                                                 filename = "a_low.txt";
1578 #endif
1579                                                 break;
1580                                         case 2:
1581 #ifdef JP
1582                                                 filename = "a_med_j.txt";
1583 #else
1584                                                 filename = "a_med.txt";
1585 #endif
1586                                                 break;
1587                                         default:
1588 #ifdef JP
1589                                                 filename = "a_high_j.txt";
1590 #else
1591                                                 filename = "a_high.txt";
1592 #endif
1593                                 }
1594                                 break;
1595                         default:
1596                                 switch (power)
1597                                 {
1598                                         case 0:
1599 #ifdef JP
1600                                                 filename = "w_cursed_j.txt";
1601 #else
1602                                                 filename = "w_cursed.txt";
1603 #endif
1604                                                 break;
1605                                         case 1:
1606 #ifdef JP
1607                                                 filename = "w_low_j.txt";
1608 #else
1609                                                 filename = "w_low.txt";
1610 #endif
1611                                                 break;
1612                                         case 2:
1613 #ifdef JP
1614                                                 filename = "w_med_j.txt";
1615 #else
1616                                                 filename = "w_med.txt";
1617 #endif
1618                                                 break;
1619                                         default:
1620 #ifdef JP
1621                                                 filename = "w_high_j.txt";
1622 #else
1623                                                 filename = "w_high.txt";
1624 #endif
1625                                 }
1626                 }
1627
1628                 (void)get_rnd_line(filename, artifact_bias, return_name);
1629 #ifdef JP
1630                  if (return_name[0] == 0) get_table_name(return_name);
1631 #endif
1632         }
1633 }
1634
1635
1636 bool create_artifact(object_type *o_ptr, bool a_scroll)
1637 {
1638         char    new_name[1024];
1639         int     has_pval = 0;
1640         int     powers = randint1(5) + 1;
1641         int     max_type = (object_is_weapon_ammo(o_ptr) ? 7 : 5);
1642         int     power_level;
1643         s32b    total_flags;
1644         bool    a_cursed = FALSE;
1645         int     warrior_artifact_bias = 0;
1646         int i;
1647
1648         /* Reset artifact bias */
1649         artifact_bias = 0;
1650
1651         /* Nuke enchantments */
1652         o_ptr->name1 = 0;
1653         o_ptr->name2 = 0;
1654
1655         for (i = 0; i < TR_FLAG_SIZE; i++)
1656                 o_ptr->art_flags[i] |= k_info[o_ptr->k_idx].flags[i];
1657
1658         if (o_ptr->pval) has_pval = TRUE;
1659
1660         if (a_scroll && one_in_(4))
1661         {
1662                 switch (p_ptr->pclass)
1663                 {
1664                         case CLASS_WARRIOR:
1665                         case CLASS_BERSERKER:
1666                         case CLASS_ARCHER:
1667                         case CLASS_SAMURAI:
1668                         case CLASS_CAVALRY:
1669                         case CLASS_SMITH:
1670                                 artifact_bias = BIAS_WARRIOR;
1671                                 break;
1672                         case CLASS_MAGE:
1673                         case CLASS_HIGH_MAGE:
1674                         case CLASS_SORCERER:
1675                         case CLASS_MAGIC_EATER:
1676                         case CLASS_BLUE_MAGE:
1677                                 artifact_bias = BIAS_MAGE;
1678                                 break;
1679                         case CLASS_PRIEST:
1680                                 artifact_bias = BIAS_PRIESTLY;
1681                                 break;
1682                         case CLASS_ROGUE:
1683                         case CLASS_NINJA:
1684                                 artifact_bias = BIAS_ROGUE;
1685                                 warrior_artifact_bias = 25;
1686                                 break;
1687                         case CLASS_RANGER:
1688                         case CLASS_SNIPER:
1689                                 artifact_bias = BIAS_RANGER;
1690                                 warrior_artifact_bias = 30;
1691                                 break;
1692                         case CLASS_PALADIN:
1693                                 artifact_bias = BIAS_PRIESTLY;
1694                                 warrior_artifact_bias = 40;
1695                                 break;
1696                         case CLASS_WARRIOR_MAGE:
1697                         case CLASS_RED_MAGE:
1698                                 artifact_bias = BIAS_MAGE;
1699                                 warrior_artifact_bias = 40;
1700                                 break;
1701                         case CLASS_CHAOS_WARRIOR:
1702                                 artifact_bias = BIAS_CHAOS;
1703                                 warrior_artifact_bias = 40;
1704                                 break;
1705                         case CLASS_MONK:
1706                         case CLASS_FORCETRAINER:
1707                                 artifact_bias = BIAS_PRIESTLY;
1708                                 break;
1709                         case CLASS_MINDCRAFTER:
1710                         case CLASS_BARD:
1711                                 if (randint1(5) > 2) artifact_bias = BIAS_PRIESTLY;
1712                                 break;
1713                         case CLASS_TOURIST:
1714                                 if (randint1(5) > 2) artifact_bias = BIAS_WARRIOR;
1715                                 break;
1716                         case CLASS_IMITATOR:
1717                                 if (randint1(2) > 1) artifact_bias = BIAS_RANGER;
1718                                 break;
1719                         case CLASS_BEASTMASTER:
1720                                 artifact_bias = BIAS_CHR;
1721                                 warrior_artifact_bias = 50;
1722                                 break;
1723                         case CLASS_MIRROR_MASTER:
1724                                 if (randint1(4) > 1) 
1725                                 {
1726                                     artifact_bias = BIAS_MAGE;
1727                                 }
1728                                 else
1729                                 {
1730                                     artifact_bias = BIAS_ROGUE;
1731                                 }
1732                                 break;
1733                 }
1734         }
1735
1736         if (a_scroll && (randint1(100) <= warrior_artifact_bias))
1737                 artifact_bias = BIAS_WARRIOR;
1738
1739         strcpy(new_name, "");
1740
1741         if (!a_scroll && one_in_(A_CURSED))
1742                 a_cursed = TRUE;
1743         if (((o_ptr->tval == TV_AMULET) || (o_ptr->tval == TV_RING)) && object_is_cursed(o_ptr))
1744                 a_cursed = TRUE;
1745
1746         while (one_in_(powers) || one_in_(7) || one_in_(10))
1747                 powers++;
1748
1749         if (!a_cursed && one_in_(WEIRD_LUCK))
1750                 powers *= 2;
1751
1752         if (a_cursed) powers /= 2;
1753
1754         /* Main loop */
1755         while (powers--)
1756         {
1757                 switch (randint1(max_type))
1758                 {
1759                         case 1: case 2:
1760                                 random_plus(o_ptr);
1761                                 has_pval = TRUE;
1762                                 break;
1763                         case 3: case 4:
1764                                 if (one_in_(2) && object_is_weapon_ammo(o_ptr) && (o_ptr->tval != TV_BOW))
1765                                 {
1766                                         if (a_cursed && !one_in_(13)) break;
1767                                         if (one_in_(13))
1768                                         {
1769                                                 if (one_in_(o_ptr->ds+4)) o_ptr->ds++;
1770                                         }
1771                                         else
1772                                         {
1773                                                 if (one_in_(o_ptr->dd+1)) o_ptr->dd++;
1774                                         }
1775                                 }
1776                                 else
1777                                         random_resistance(o_ptr);
1778                                 break;
1779                         case 5:
1780                                 random_misc(o_ptr);
1781                                 break;
1782                         case 6: case 7:
1783                                 random_slay(o_ptr);
1784                                 break;
1785                         default:
1786                                 if (p_ptr->wizard) msg_print("Switch error in create_artifact!");
1787                                 powers++;
1788                 }
1789         };
1790
1791         if (has_pval)
1792         {
1793 #if 0
1794                 add_flag(o_ptr->art_flags, TR_SHOW_MODS);
1795
1796                 /* This one commented out by gw's request... */
1797                 if (!a_scroll)
1798                         add_flag(o_ptr->art_flags, TR_HIDE_TYPE);
1799 #endif
1800
1801                 if (have_flag(o_ptr->art_flags, TR_BLOWS))
1802                 {
1803                         o_ptr->pval = randint1(2);
1804                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
1805                                 o_ptr->pval++;
1806                 }
1807                 else
1808                 {
1809                         do
1810                         {
1811                                 o_ptr->pval++;
1812                         }
1813                         while (o_ptr->pval < randint1(5) || one_in_(o_ptr->pval));
1814                 }
1815
1816                 if ((o_ptr->pval > 4) && !one_in_(WEIRD_LUCK))
1817                         o_ptr->pval = 4;
1818         }
1819
1820         /* give it some plusses... */
1821         if (object_is_armour(o_ptr))
1822                 o_ptr->to_a += randint1(o_ptr->to_a > 19 ? 1 : 20 - o_ptr->to_a);
1823         else if (object_is_weapon_ammo(o_ptr))
1824         {
1825                 o_ptr->to_h += randint1(o_ptr->to_h > 19 ? 1 : 20 - o_ptr->to_h);
1826                 o_ptr->to_d += randint1(o_ptr->to_d > 19 ? 1 : 20 - o_ptr->to_d);
1827                 if ((have_flag(o_ptr->art_flags, TR_WIS)) && (o_ptr->pval > 0)) add_flag(o_ptr->art_flags, TR_BLESSED);
1828         }
1829
1830         /* Just to be sure */
1831         add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1832         add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1833         add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1834         add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1835
1836         total_flags = flag_cost(o_ptr, o_ptr->pval);
1837         if (cheat_peek) msg_format("%ld", total_flags);
1838
1839         if (a_cursed) curse_artifact(o_ptr);
1840
1841         if (!a_cursed &&
1842             one_in_(object_is_armour(o_ptr) ? ACTIVATION_CHANCE * 2 : ACTIVATION_CHANCE))
1843         {
1844                 o_ptr->xtra2 = 0;
1845                 give_activation_power(o_ptr);
1846         }
1847
1848         if (object_is_armour(o_ptr))
1849         {
1850                 while ((o_ptr->to_d+o_ptr->to_h) > 20)
1851                 {
1852                         if (one_in_(o_ptr->to_d) && one_in_(o_ptr->to_h)) break;
1853                         o_ptr->to_d -= (s16b)randint0(3);
1854                         o_ptr->to_h -= (s16b)randint0(3);
1855                 }
1856                 while ((o_ptr->to_d+o_ptr->to_h) > 10)
1857                 {
1858                         if (one_in_(o_ptr->to_d) || one_in_(o_ptr->to_h)) break;
1859                         o_ptr->to_d -= (s16b)randint0(3);
1860                         o_ptr->to_h -= (s16b)randint0(3);
1861                 }
1862         }
1863
1864         if (((artifact_bias == BIAS_MAGE) || (artifact_bias == BIAS_INT)) && (o_ptr->tval == TV_GLOVES)) add_flag(o_ptr->art_flags, TR_FREE_ACT);
1865
1866         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
1867         {
1868                 o_ptr->to_h = 0;
1869                 o_ptr->to_d = 0;
1870                 remove_flag(o_ptr->art_flags, TR_BLOWS);
1871                 remove_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
1872                 remove_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
1873                 remove_flag(o_ptr->art_flags, TR_SLAY_EVIL);
1874                 remove_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
1875                 remove_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1876                 remove_flag(o_ptr->art_flags, TR_SLAY_ORC);
1877                 remove_flag(o_ptr->art_flags, TR_SLAY_TROLL);
1878                 remove_flag(o_ptr->art_flags, TR_SLAY_GIANT);
1879                 remove_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
1880                 remove_flag(o_ptr->art_flags, TR_KILL_DRAGON);
1881                 remove_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1882                 remove_flag(o_ptr->art_flags, TR_VORPAL);
1883                 remove_flag(o_ptr->art_flags, TR_BRAND_POIS);
1884                 remove_flag(o_ptr->art_flags, TR_BRAND_ACID);
1885                 remove_flag(o_ptr->art_flags, TR_BRAND_ELEC);
1886                 remove_flag(o_ptr->art_flags, TR_BRAND_FIRE);
1887                 remove_flag(o_ptr->art_flags, TR_BRAND_COLD);
1888         }
1889
1890         if (!object_is_weapon_ammo(o_ptr))
1891         {
1892                 /* For armors */
1893                 if (a_cursed) power_level = 0;
1894                 else if (total_flags < 15000) power_level = 1;
1895                 else if (total_flags < 35000) power_level = 2;
1896                 else power_level = 3;
1897         }
1898
1899         else
1900         {
1901                 /* For weapons */
1902                 if (a_cursed) power_level = 0;
1903                 else if (total_flags < 20000) power_level = 1;
1904                 else if (total_flags < 45000) power_level = 2;
1905                 else power_level = 3;
1906         }
1907
1908         if (a_scroll)
1909         {
1910                 char dummy_name[80] = "";
1911 #ifdef JP
1912                 cptr ask_msg = "¤³¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ò²¿¤È̾ÉÕ¤±¤Þ¤¹¤«¡©";
1913 #else
1914                 cptr ask_msg = "What do you want to call the artifact? ";
1915 #endif
1916
1917                 /* Identify it fully */
1918                 object_aware(o_ptr);
1919                 object_known(o_ptr);
1920
1921                 /* Mark the item as fully known */
1922                 o_ptr->ident |= (IDENT_MENTAL);
1923
1924                 (void)screen_object(o_ptr, 0L);
1925
1926                 if (!get_string(ask_msg, dummy_name, sizeof dummy_name)
1927                     || !dummy_name[0])
1928                 {
1929                         /* Cancelled */
1930                         if (one_in_(2))
1931                         {
1932                                 get_table_sindarin_aux(dummy_name);
1933                         }
1934                         else
1935                         {
1936                                 get_table_name_aux(dummy_name);
1937                         }
1938                 }
1939
1940 #ifdef JP
1941                 sprintf(new_name, "¡Ô%s¡Õ", dummy_name);
1942 #else
1943                 sprintf(new_name, "'%s'", dummy_name);
1944 #endif
1945
1946                 chg_virtue(V_INDIVIDUALISM, 2);
1947                 chg_virtue(V_ENCHANT, 5);
1948         }
1949         else
1950         {
1951                 get_random_name(new_name, object_is_armour(o_ptr), power_level);
1952         }
1953
1954         if (cheat_xtra)
1955         {
1956 #ifdef JP
1957                 if (artifact_bias) msg_format("±¿¤ÎÊФä¿¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È: %d¡£", artifact_bias);
1958                 else msg_print("¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ë±¿¤ÎÊФê¤Ê¤·¡£");
1959 #else
1960                 if (artifact_bias) msg_format("Biased artifact: %d.", artifact_bias);
1961                 else msg_print("No bias in artifact.");
1962 #endif
1963         }
1964
1965         /* Save the inscription */
1966         o_ptr->art_name = quark_add(new_name);
1967
1968         /* Window stuff */
1969         p_ptr->window |= (PW_INVEN | PW_EQUIP);
1970
1971         return TRUE;
1972 }
1973
1974
1975 bool activate_random_artifact(object_type * o_ptr)
1976 {
1977         int plev = p_ptr->lev;
1978         int k, dir, dummy = 0;
1979
1980         if (!o_ptr->art_name) return FALSE; /* oops? */
1981
1982         /* Activate for attack */
1983         switch (o_ptr->xtra2)
1984         {
1985                 case ACT_SUNLIGHT:
1986                 {
1987                         if (!get_aim_dir(&dir)) return FALSE;
1988 #ifdef JP
1989                         msg_print("ÂÀÍÛ¸÷Àþ¤¬Êü¤¿¤ì¤¿¡£");
1990 #else
1991                         msg_print("A line of sunlight appears.");
1992 #endif
1993
1994                         (void)lite_line(dir);
1995                         o_ptr->timeout = 10;
1996                         break;
1997                 }
1998
1999                 case ACT_BO_MISS_1:
2000                 {
2001 #ifdef JP
2002                         msg_print("¤½¤ì¤ÏâÁ¤·¤¤¤¯¤é¤¤¤ËÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2003 #else
2004                         msg_print("It glows extremely brightly...");
2005 #endif
2006
2007                         if (!get_aim_dir(&dir)) return FALSE;
2008                         fire_bolt(GF_MISSILE, dir, damroll(2, 6));
2009                         o_ptr->timeout = 2;
2010                         break;
2011                 }
2012
2013                 case ACT_BA_POIS_1:
2014                 {
2015 #ifdef JP
2016                         msg_print("¤½¤ì¤ÏÇ»Î理Ë̮ư¤·¤Æ¤¤¤ë...");
2017 #else
2018                         msg_print("It throbs deep green...");
2019 #endif
2020
2021                         if (!get_aim_dir(&dir)) return FALSE;
2022                         fire_ball(GF_POIS, dir, 12, 3);
2023                         o_ptr->timeout = randint0(4) + 4;
2024                         break;
2025                 }
2026
2027                 case ACT_BO_ELEC_1:
2028                 {
2029 #ifdef JP
2030                         msg_print("¤½¤ì¤Ï²Ð²Ö¤Ëʤ¤ï¤ì¤¿...");
2031 #else
2032                         msg_print("It is covered in sparks...");
2033 #endif
2034
2035                         if (!get_aim_dir(&dir)) return FALSE;
2036                         fire_bolt(GF_ELEC, dir, damroll(4, 8));
2037                         o_ptr->timeout = randint0(5) + 5;
2038                         break;
2039                 }
2040
2041                 case ACT_BO_ACID_1:
2042                 {
2043 #ifdef JP
2044                         msg_print("¤½¤ì¤Ï»À¤Ëʤ¤ï¤ì¤¿...");
2045 #else
2046                         msg_print("It is covered in acid...");
2047 #endif
2048
2049                         if (!get_aim_dir(&dir)) return FALSE;
2050                         fire_bolt(GF_ACID, dir, damroll(5, 8));
2051                         o_ptr->timeout = randint0(6) + 6;
2052                         break;
2053                 }
2054
2055                 case ACT_BO_COLD_1:
2056                 {
2057 #ifdef JP
2058                         msg_print("¤½¤ì¤ÏÁú¤Ëʤ¤ï¤ì¤¿...");
2059 #else
2060                         msg_print("It is covered in frost...");
2061 #endif
2062
2063                         if (!get_aim_dir(&dir)) return FALSE;
2064                         fire_bolt(GF_COLD, dir, damroll(6, 8));
2065                         o_ptr->timeout = randint0(7) + 7;
2066                         break;
2067                 }
2068
2069                 case ACT_BO_FIRE_1:
2070                 {
2071 #ifdef JP
2072                         msg_print("¤½¤ì¤Ï±ê¤Ëʤ¤ï¤ì¤¿...");
2073 #else
2074                         msg_print("It is covered in fire...");
2075 #endif
2076
2077                         if (!get_aim_dir(&dir)) return FALSE;
2078                         fire_bolt(GF_FIRE, dir, damroll(9, 8));
2079                         o_ptr->timeout = randint0(8) + 8;
2080                         break;
2081                 }
2082
2083                 case ACT_BA_COLD_1:
2084                 {
2085 #ifdef JP
2086                         msg_print("¤½¤ì¤ÏÁú¤Ëʤ¤ï¤ì¤¿...");
2087 #else
2088                         msg_print("It is covered in frost...");
2089 #endif
2090
2091                         if (!get_aim_dir(&dir)) return FALSE;
2092                         fire_ball(GF_COLD, dir, 48, 2);
2093                         o_ptr->timeout = 400;
2094                         break;
2095                 }
2096
2097                 case ACT_BA_FIRE_1:
2098                 {
2099 #ifdef JP
2100                         msg_print("¤½¤ì¤ÏÀÖ¤¯·ã¤·¤¯µ±¤¤¤¿...");
2101 #else
2102                         msg_print("It glows an intense red...");
2103 #endif
2104
2105                         if (!get_aim_dir(&dir)) return FALSE;
2106                         fire_ball(GF_FIRE, dir, 72, 2);
2107                         o_ptr->timeout = 400;
2108                         break;
2109                 }
2110
2111                 case ACT_DRAIN_1:
2112                 {
2113 #ifdef JP
2114                         msg_print("¤½¤ì¤Ï¹õ¤¯µ±¤¤¤¿...");
2115 #else
2116                         msg_print("It glows black...");
2117 #endif
2118
2119                         if (!get_aim_dir(&dir)) return FALSE;
2120                         if (drain_life(dir, 100))
2121                         o_ptr->timeout = randint0(100) + 100;
2122                         break;
2123                 }
2124
2125                 case ACT_BA_COLD_2:
2126                 {
2127 #ifdef JP
2128                         msg_print("¤½¤ì¤ÏÀĤ¯·ã¤·¤¯µ±¤¤¤¿...");
2129 #else
2130                         msg_print("It glows an intense blue...");
2131 #endif
2132
2133                         if (!get_aim_dir(&dir)) return FALSE;
2134                         fire_ball(GF_COLD, dir, 100, 2);
2135                         o_ptr->timeout = 300;
2136                         break;
2137                 }
2138
2139                 case ACT_BA_ELEC_2:
2140                 {
2141 #ifdef JP
2142                         msg_print("Åŵ¤¤¬¥Ñ¥Á¥Ñ¥Á²»¤òΩ¤Æ¤¿...");
2143 #else
2144                         msg_print("It crackles with electricity...");
2145 #endif
2146
2147                         if (!get_aim_dir(&dir)) return FALSE;
2148                         fire_ball(GF_ELEC, dir, 100, 3);
2149                         o_ptr->timeout = 500;
2150                         break;
2151                 }
2152
2153                 case ACT_DRAIN_2:
2154                 {
2155 #ifdef JP
2156                         msg_print("¹õ¤¯µ±¤¤¤Æ¤¤¤ë...");
2157 #else
2158                         msg_print("It glows black...");
2159 #endif
2160
2161                         if (!get_aim_dir(&dir)) return FALSE;
2162                         drain_life(dir, 120);
2163                         o_ptr->timeout = 400;
2164                         break;
2165                 }
2166
2167                 case ACT_VAMPIRE_1:
2168                 {
2169                         if (!get_aim_dir(&dir)) return FALSE;
2170                         for (dummy = 0; dummy < 3; dummy++)
2171                         {
2172                                 if (drain_life(dir, 50))
2173                                 hp_player(50);
2174                         }
2175                         o_ptr->timeout = 400;
2176                         break;
2177                 }
2178
2179                 case ACT_BO_MISS_2:
2180                 {
2181 #ifdef JP
2182                         msg_print("ËâË¡¤Î¥È¥²¤¬¸½¤ì¤¿...");
2183 #else
2184                         msg_print("It grows magical spikes...");
2185 #endif
2186
2187                         if (!get_aim_dir(&dir)) return FALSE;
2188                         fire_bolt(GF_ARROW, dir, 150);
2189                         o_ptr->timeout = randint0(90) + 90;
2190                         break;
2191                 }
2192
2193                 case ACT_BA_FIRE_2:
2194                 {
2195 #ifdef JP
2196                         msg_print("¿¼ÀÖ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2197 #else
2198                         msg_print("It glows deep red...");
2199 #endif
2200
2201                         if (!get_aim_dir(&dir)) return FALSE;
2202                         fire_ball(GF_FIRE, dir, 120, 3);
2203                         o_ptr->timeout = randint0(225) + 225;
2204                         break;
2205                 }
2206
2207                 case ACT_BA_COLD_3:
2208                 {
2209 #ifdef JP
2210                         msg_print("ÌÀ¤ë¤¯Çò¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2211 #else
2212                         msg_print("It glows bright white...");
2213 #endif
2214
2215                         if (!get_aim_dir(&dir)) return FALSE;
2216                         fire_ball(GF_COLD, dir, 200, 3);
2217                         o_ptr->timeout = randint0(325) + 325;
2218                         break;
2219                 }
2220
2221                 case ACT_BA_ELEC_3:
2222                 {
2223 #ifdef JP
2224                         msg_print("¿¼ÀÄ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2225 #else
2226                         msg_print("It glows deep blue...");
2227 #endif
2228
2229                         if (!get_aim_dir(&dir)) return FALSE;
2230                         fire_ball(GF_ELEC, dir, 250, 3);
2231                         o_ptr->timeout = randint0(425) + 425;
2232                         break;
2233                 }
2234
2235                 case ACT_WHIRLWIND:
2236                 {
2237                         {
2238                                 int y = 0, x = 0;
2239                                 cave_type       *c_ptr;
2240                                 monster_type    *m_ptr;
2241
2242                                 for (dir = 0; dir <= 9; dir++)
2243                                 {
2244                                         y = py + ddy[dir];
2245                                         x = px + ddx[dir];
2246                                         c_ptr = &cave[y][x];
2247
2248                                         /* Get the monster */
2249                                         m_ptr = &m_list[c_ptr->m_idx];
2250
2251                                         /* Hack -- attack monsters */
2252                                         if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2253                                                 py_attack(y, x, 0);
2254                                 }
2255                         }
2256                         o_ptr->timeout = 250;
2257                         break;
2258                 }
2259
2260                 case ACT_VAMPIRE_2:
2261                 {
2262                         if (!get_aim_dir(&dir)) return FALSE;
2263                         for (dummy = 0; dummy < 3; dummy++)
2264                         {
2265                                 if (drain_life(dir, 100))
2266                                 hp_player(100);
2267                         }
2268
2269                         o_ptr->timeout = 400;
2270                         break;
2271                 }
2272
2273
2274                 case ACT_CALL_CHAOS:
2275                 {
2276 #ifdef JP
2277                         msg_print("ÍÍ¡¹¤Ê¿§¤Î²Ð²Ö¤òȯ¤·¤Æ¤¤¤ë...");
2278 #else
2279                         msg_print("It glows in scintillating colours...");
2280 #endif
2281
2282                         call_chaos();
2283                         o_ptr->timeout = 350;
2284                         break;
2285                 }
2286
2287                 case ACT_ROCKET:
2288                 {
2289                         if (!get_aim_dir(&dir)) return FALSE;
2290 #ifdef JP
2291                         msg_print("¥í¥±¥Ã¥È¤òȯ¼Í¤·¤¿¡ª");
2292 #else
2293                         msg_print("You launch a rocket!");
2294 #endif
2295
2296                         fire_ball(GF_ROCKET, dir, 250 + plev*3, 2);
2297                         o_ptr->timeout = 400;
2298                         break;
2299                 }
2300
2301                 case ACT_DISP_EVIL:
2302                 {
2303 #ifdef JP
2304                         msg_print("¿ÀÀ»¤ÊÊ·°Ïµ¤¤¬½¼Ëþ¤·¤¿...");
2305 #else
2306                         msg_print("It floods the area with goodness...");
2307 #endif
2308
2309                         dispel_evil(p_ptr->lev * 5);
2310                         o_ptr->timeout = randint0(300) + 300;
2311                         break;
2312                 }
2313
2314                 case ACT_DISP_GOOD:
2315                 {
2316 #ifdef JP
2317                         msg_print("¼Ù°­¤ÊÊ·°Ïµ¤¤¬½¼Ëþ¤·¤¿...");
2318 #else
2319                         msg_print("It floods the area with evil...");
2320 #endif
2321
2322                         dispel_good(p_ptr->lev * 5);
2323                         o_ptr->timeout = randint0(300) + 300;
2324                         break;
2325                 }
2326
2327                 case ACT_BA_MISS_3:
2328                 {
2329                         if (!get_aim_dir(&dir)) return FALSE;
2330 #ifdef JP
2331                         msg_print("¤¢¤Ê¤¿¤Ï¥¨¥ì¥á¥ó¥È¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£");
2332 #else
2333                         msg_print("You breathe the elements.");
2334 #endif
2335
2336                         fire_ball(GF_MISSILE, dir, 300, 4);
2337                         o_ptr->timeout = 500;
2338                         break;
2339                 }
2340
2341                 /* Activate for other offensive action */
2342
2343                 case ACT_CONFUSE:
2344                 {
2345 #ifdef JP
2346                         msg_print("ÍÍ¡¹¤Ê¿§¤Î²Ð²Ö¤òȯ¤·¤Æ¤¤¤ë...");
2347 #else
2348                         msg_print("It glows in scintillating colours...");
2349 #endif
2350
2351                         if (!get_aim_dir(&dir)) return FALSE;
2352                         confuse_monster(dir, 20);
2353                         o_ptr->timeout = 15;
2354                         break;
2355                 }
2356
2357                 case ACT_SLEEP:
2358                 {
2359 #ifdef JP
2360                         msg_print("¿¼ÀÄ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2361 #else
2362                         msg_print("It glows deep blue...");
2363 #endif
2364
2365                         sleep_monsters_touch();
2366                         o_ptr->timeout = 55;
2367                         break;
2368                 }
2369
2370                 case ACT_QUAKE:
2371                 {
2372                         earthquake(py, px, 10);
2373                         o_ptr->timeout = 50;
2374                         break;
2375                 }
2376
2377                 case ACT_TERROR:
2378                 {
2379                         turn_monsters(40 + p_ptr->lev);
2380                         o_ptr->timeout = 3 * (p_ptr->lev + 10);
2381                         break;
2382                 }
2383
2384                 case ACT_TELE_AWAY:
2385                 {
2386                         if (!get_aim_dir(&dir)) return FALSE;
2387                         (void)fire_beam(GF_AWAY_ALL, dir, plev);
2388                         o_ptr->timeout = 200;
2389                         break;
2390                 }
2391
2392                 case ACT_BANISH_EVIL:
2393                 {
2394                         if (banish_evil(100))
2395                         {
2396 #ifdef JP
2397                                 msg_print("¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ÎÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª");
2398 #else
2399                                 msg_print("The power of the artifact banishes evil!");
2400 #endif
2401
2402                         }
2403                         o_ptr->timeout = 250 + randint1(250);
2404                         break;
2405                 }
2406
2407                 case ACT_GENOCIDE:
2408                 {
2409 #ifdef JP
2410                         msg_print("¿¼ÀÄ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2411 #else
2412                         msg_print("It glows deep blue...");
2413 #endif
2414
2415                         (void)symbol_genocide(200, TRUE);
2416                         o_ptr->timeout = 500;
2417                         break;
2418                 }
2419
2420                 case ACT_MASS_GENO:
2421                 {
2422 #ifdef JP
2423                         msg_print("¤Ò¤É¤¯±Ô¤¤²»¤¬Î®¤ì½Ð¤¿...");
2424 #else
2425                         msg_print("It lets out a long, shrill note...");
2426 #endif
2427
2428                         (void)mass_genocide(200, TRUE);
2429                         o_ptr->timeout = 1000;
2430                         break;
2431                 }
2432
2433                 /* Activate for summoning / charming */
2434
2435                 case ACT_CHARM_ANIMAL:
2436                 {
2437                         if (!get_aim_dir(&dir)) return FALSE;
2438                         (void)charm_animal(dir, plev);
2439                         o_ptr->timeout = 300;
2440                         break;
2441                 }
2442
2443                 case ACT_CHARM_UNDEAD:
2444                 {
2445                         if (!get_aim_dir(&dir)) return FALSE;
2446                         (void)control_one_undead(dir, plev);
2447                         o_ptr->timeout = 333;
2448                         break;
2449                 }
2450
2451                 case ACT_CHARM_OTHER:
2452                 {
2453                         if (!get_aim_dir(&dir)) return FALSE;
2454                         (void)charm_monster(dir, plev);
2455                         o_ptr->timeout = 400;
2456                         break;
2457                 }
2458
2459                 case ACT_CHARM_ANIMALS:
2460                 {
2461                         (void)charm_animals(plev * 2);
2462                         o_ptr->timeout = 500;
2463                         break;
2464                 }
2465
2466                 case ACT_CHARM_OTHERS:
2467                 {
2468                         charm_monsters(plev * 2);
2469                         o_ptr->timeout = 750;
2470                         break;
2471                 }
2472
2473                 case ACT_SUMMON_ANIMAL:
2474                 {
2475                         (void)summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET));
2476                         o_ptr->timeout = 200 + randint1(300);
2477                         break;
2478                 }
2479
2480                 case ACT_SUMMON_PHANTOM:
2481                 {
2482 #ifdef JP
2483                         msg_print("¸¸Îî¤ò¾¤´­¤·¤¿¡£");
2484 #else
2485                         msg_print("You summon a phantasmal servant.");
2486 #endif
2487
2488                         (void)summon_specific(-1, py, px, dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET));
2489                         o_ptr->timeout = 200 + randint1(200);
2490                         break;
2491                 }
2492
2493                 case ACT_SUMMON_ELEMENTAL:
2494                 {
2495                         bool pet = one_in_(3);
2496                         u32b mode = 0L;
2497
2498                         if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
2499                         if (pet) mode |= PM_FORCE_PET;
2500                         else mode |= PM_NO_PET;
2501
2502                         if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), SUMMON_ELEMENTAL, mode))
2503                         {
2504 #ifdef JP
2505                                 msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤¬¸½¤ì¤¿...");
2506 #else
2507                                 msg_print("An elemental materializes...");
2508 #endif
2509
2510
2511                                 if (pet)
2512 #ifdef JP
2513                                         msg_print("¤¢¤Ê¤¿¤ËÉþ½¾¤·¤Æ¤¤¤ë¤è¤¦¤À¡£");
2514 #else
2515                                         msg_print("It seems obedient to you.");
2516 #endif
2517
2518                                 else
2519 #ifdef JP
2520                                         msg_print("¤½¤ì¤ò¥³¥ó¥È¥í¡¼¥ë¤Ç¤­¤Ê¤«¤Ã¤¿¡ª");
2521 #else
2522                                         msg_print("You fail to control it!");
2523 #endif
2524
2525                         }
2526
2527                         o_ptr->timeout = 750;
2528                         break;
2529                 }
2530
2531                 case ACT_SUMMON_DEMON:
2532                 {
2533                         bool pet = one_in_(3);
2534                         u32b mode = 0L;
2535
2536                         if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
2537                         if (pet) mode |= PM_FORCE_PET;
2538                         else mode |= PM_NO_PET;
2539
2540                         if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), SUMMON_DEMON, mode))
2541                         {
2542 #ifdef JP
2543                                 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
2544 #else
2545                                 msg_print("The area fills with a stench of sulphur and brimstone.");
2546 #endif
2547
2548                                 if (pet)
2549 #ifdef JP
2550                                         msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
2551 #else
2552                                         msg_print("'What is thy bidding... Master?'");
2553 #endif
2554
2555                                 else
2556 #ifdef JP
2557                                         msg_print("¡ÖNON SERVIAM! Wretch! ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×");
2558 #else
2559                                         msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'");
2560 #endif
2561
2562                         }
2563
2564                         o_ptr->timeout = 666 + randint1(333);
2565                         break;
2566                 }
2567
2568                 case ACT_SUMMON_UNDEAD:
2569                 {
2570                         bool pet = one_in_(3);
2571                         int type;
2572                         u32b mode = 0L;
2573
2574                         type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
2575
2576                         if (!pet || ((plev > 24) && one_in_(3))) mode |= PM_ALLOW_GROUP;
2577                         if (pet) mode |= PM_FORCE_PET;
2578                         else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2579
2580                         if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), type, mode))
2581                         {
2582 #ifdef JP
2583                                 msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
2584 #else
2585                                 msg_print("Cold winds begin to blow around you, carrying with them the stench of decay...");
2586 #endif
2587
2588                                 if (pet)
2589 #ifdef JP
2590                                         msg_print("¸Å¤¨¤Î»à¤»¤ë¼Ô¶¦¤¬¤¢¤Ê¤¿¤Ë»Å¤¨¤ë¤¿¤áÅÚ¤«¤éᴤä¿¡ª");
2591 #else
2592                                         msg_print("Ancient, long-dead forms arise from the ground to serve you!");
2593 #endif
2594
2595                                 else
2596 #ifdef JP
2597                                         msg_print("»à¼Ô¤¬á´¤Ã¤¿¡£Ì²¤ê¤ò˸¤²¤ë¤¢¤Ê¤¿¤òȳ¤¹¤ë¤¿¤á¤Ë¡ª");
2598 #else
2599                                         msg_print("'The dead arise... to punish you for disturbing them!'");
2600 #endif
2601
2602                         }
2603
2604                         o_ptr->timeout = 666 + randint1(333);
2605                         break;
2606                 }
2607
2608                 /* Activate for healing */
2609
2610                 case ACT_CURE_LW:
2611                 {
2612                         (void)set_afraid(0);
2613                         (void)hp_player(30);
2614                         o_ptr->timeout = 10;
2615                         break;
2616                 }
2617
2618                 case ACT_CURE_MW:
2619                 {
2620 #ifdef JP
2621                         msg_print("¿¼»ç¿§¤Î¸÷¤òȯ¤·¤Æ¤¤¤ë...");
2622 #else
2623                         msg_print("It radiates deep purple...");
2624 #endif
2625
2626                         hp_player(damroll(4, 8));
2627                         (void)set_cut((p_ptr->cut / 2) - 50);
2628                         o_ptr->timeout = randint0(3) + 3;
2629                         break;
2630                 }
2631
2632                 case ACT_CURE_POISON:
2633                 {
2634 #ifdef JP
2635                         msg_print("¿¼ÀÄ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2636 #else
2637                         msg_print("It glows deep blue...");
2638 #endif
2639
2640                         (void)set_afraid(0);
2641                         (void)set_poisoned(0);
2642                         o_ptr->timeout = 5;
2643                         break;
2644                 }
2645
2646                 case ACT_REST_LIFE:
2647                 {
2648 #ifdef JP
2649                         msg_print("¿¼¹È¤Ëµ±¤¤¤Æ¤¤¤ë...");
2650 #else
2651                         msg_print("It glows a deep red...");
2652 #endif
2653
2654                         restore_level();
2655                         o_ptr->timeout = 450;
2656                         break;
2657                 }
2658
2659                 case ACT_REST_ALL:
2660                 {
2661 #ifdef JP
2662                         msg_print("Ç»Îп§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2663 #else
2664                         msg_print("It glows a deep green...");
2665 #endif
2666
2667                         (void)do_res_stat(A_STR);
2668                         (void)do_res_stat(A_INT);
2669                         (void)do_res_stat(A_WIS);
2670                         (void)do_res_stat(A_DEX);
2671                         (void)do_res_stat(A_CON);
2672                         (void)do_res_stat(A_CHR);
2673                         (void)restore_level();
2674                         o_ptr->timeout = 750;
2675                         break;
2676                 }
2677
2678                 case ACT_CURE_700:
2679                 {
2680 #ifdef JP
2681                         msg_print("¿¼ÀÄ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2682 #else
2683                         msg_print("It glows deep blue...");
2684 #endif
2685
2686 #ifdef JP
2687                         msg_print("ÂÎÆâ¤ËÃȤ«¤¤¸ÝÆ°¤¬´¶¤¸¤é¤ì¤ë...");
2688 #else
2689                         msg_print("You feel a warm tingling inside...");
2690 #endif
2691
2692                         (void)hp_player(700);
2693                         (void)set_cut(0);
2694                         o_ptr->timeout = 250;
2695                         break;
2696                 }
2697
2698                 case ACT_CURE_1000:
2699                 {
2700 #ifdef JP
2701                         msg_print("Çò¤¯ÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2702 #else
2703                         msg_print("It glows a bright white...");
2704 #endif
2705
2706 #ifdef JP
2707                         msg_print("¤Ò¤¸¤ç¤¦¤Ëµ¤Ê¬¤¬¤è¤¤...");
2708 #else
2709                         msg_print("You feel much better...");
2710 #endif
2711
2712                         (void)hp_player(1000);
2713                         (void)set_cut(0);
2714                         o_ptr->timeout = 888;
2715                         break;
2716                 }
2717
2718                 /* Activate for timed effect */
2719
2720                 case ACT_ESP:
2721                 {
2722                         (void)set_tim_esp(randint1(30) + 25, FALSE);
2723                         o_ptr->timeout = 200;
2724                         break;
2725                 }
2726
2727                 case ACT_BERSERK:
2728                 {
2729                         (void)set_afraid(0);
2730                         (void)set_hero(randint1(50) + 50, FALSE);
2731                         (void)set_blessed(randint1(50) + 50, FALSE);
2732                         o_ptr->timeout = 100 + randint1(100);
2733                         break;
2734                 }
2735
2736                 case ACT_PROT_EVIL:
2737                 {
2738 #ifdef JP
2739                         msg_print("±Ô¤¤²»¤¬Î®¤ì½Ð¤¿...");
2740 #else
2741                         msg_print("It lets out a shrill wail...");
2742 #endif
2743
2744                         k = 3 * p_ptr->lev;
2745                         (void)set_protevil(randint1(25) + k, FALSE);
2746                         o_ptr->timeout = randint0(225) + 225;
2747                         break;
2748                 }
2749
2750                 case ACT_RESIST_ALL:
2751                 {
2752 #ifdef JP
2753                         msg_print("ÍÍ¡¹¤Ê¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2754 #else
2755                         msg_print("It glows many colours...");
2756 #endif
2757
2758                         (void)set_oppose_acid(randint1(40) + 40, FALSE);
2759                         (void)set_oppose_elec(randint1(40) + 40, FALSE);
2760                         (void)set_oppose_fire(randint1(40) + 40, FALSE);
2761                         (void)set_oppose_cold(randint1(40) + 40, FALSE);
2762                         (void)set_oppose_pois(randint1(40) + 40, FALSE);
2763                         o_ptr->timeout = 200;
2764                         break;
2765                 }
2766
2767                 case ACT_SPEED:
2768                 {
2769 #ifdef JP
2770                         msg_print("ÌÀ¤ë¤¯Îп§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2771 #else
2772                         msg_print("It glows bright green...");
2773 #endif
2774
2775                         (void)set_fast(randint1(20) + 20, FALSE);
2776                         o_ptr->timeout = 250;
2777                         break;
2778                 }
2779
2780                 case ACT_XTRA_SPEED:
2781                 {
2782 #ifdef JP
2783                         msg_print("ÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2784 #else
2785                         msg_print("It glows brightly...");
2786 #endif
2787
2788                         (void)set_fast(randint1(75) + 75, FALSE);
2789                         o_ptr->timeout = randint0(200) + 200;
2790                         break;
2791                 }
2792
2793                 case ACT_WRAITH:
2794                 {
2795                         set_wraith_form(randint1(plev / 2) + (plev / 2), FALSE);
2796                         o_ptr->timeout = 1000;
2797                         break;
2798                 }
2799
2800                 case ACT_INVULN:
2801                 {
2802                         (void)set_invuln(randint1(8) + 8, FALSE);
2803                         o_ptr->timeout = 1000;
2804                         break;
2805                 }
2806
2807                 /* Activate for general purpose effect (detection etc.) */
2808
2809                 case ACT_LIGHT:
2810                 {
2811 #ifdef JP
2812                         msg_print("À¡¤ó¤À¸÷¤¬¤¢¤Õ¤ì½Ð¤¿...");
2813 #else
2814                         msg_print("It wells with clear light...");
2815 #endif
2816
2817                         lite_area(damroll(2, 15), 3);
2818                         o_ptr->timeout = randint0(10) + 10;
2819                         break;
2820                 }
2821
2822                 case ACT_MAP_LIGHT:
2823                 {
2824 #ifdef JP
2825                         msg_print("âÁ¤·¤¯µ±¤¤¤¿...");
2826 #else
2827                         msg_print("It shines brightly...");
2828 #endif
2829
2830                         map_area(DETECT_RAD_MAP);
2831                         lite_area(damroll(2, 15), 3);
2832                         o_ptr->timeout = randint0(50) + 50;
2833                         break;
2834                 }
2835
2836                 case ACT_DETECT_ALL:
2837                 {
2838 #ifdef JP
2839                         msg_print("Çò¤¯ÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2840 #else
2841                         msg_print("It glows bright white...");
2842 #endif
2843
2844 #ifdef JP
2845                         msg_print("¿´¤Ë¥¤¥á¡¼¥¸¤¬É⤫¤ó¤Ç¤­¤¿...");
2846 #else
2847                         msg_print("An image forms in your mind...");
2848 #endif
2849
2850                         detect_all(DETECT_RAD_DEFAULT);
2851                         o_ptr->timeout = randint0(55) + 55;
2852                         break;
2853                 }
2854
2855                 case ACT_DETECT_XTRA:
2856                 {
2857 #ifdef JP
2858                         msg_print("ÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2859 #else
2860                         msg_print("It glows brightly...");
2861 #endif
2862
2863                         detect_all(DETECT_RAD_DEFAULT);
2864                         probing();
2865                         identify_fully(FALSE);
2866                         o_ptr->timeout = 1000;
2867                         break;
2868                 }
2869
2870                 case ACT_ID_FULL:
2871                 {
2872 #ifdef JP
2873                         msg_print("²«¿§¤¯µ±¤¤¤Æ¤¤¤ë...");
2874 #else
2875                         msg_print("It glows yellow...");
2876 #endif
2877
2878                         identify_fully(FALSE);
2879                         o_ptr->timeout = 750;
2880                         break;
2881                 }
2882
2883                 case ACT_ID_PLAIN:
2884                 {
2885                         if (!ident_spell(FALSE)) return FALSE;
2886                         o_ptr->timeout = 10;
2887                         break;
2888                 }
2889
2890                 case ACT_RUNE_EXPLO:
2891                 {
2892 #ifdef JP
2893                         msg_print("ÌÀ¤ë¤¤ÀÖ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2894 #else
2895                         msg_print("It glows bright red...");
2896 #endif
2897
2898                         explosive_rune();
2899                         o_ptr->timeout = 200;
2900                         break;
2901                 }
2902
2903                 case ACT_RUNE_PROT:
2904                 {
2905 #ifdef JP
2906                         msg_print("¥Ö¥ë¡¼¤ËÌÀ¤ë¤¯µ±¤¤¤Æ¤¤¤ë...");
2907 #else
2908                         msg_print("It glows light blue...");
2909 #endif
2910
2911                         warding_glyph();
2912                         o_ptr->timeout = 400;
2913                         break;
2914                 }
2915
2916                 case ACT_SATIATE:
2917                 {
2918                         (void)set_food(PY_FOOD_MAX - 1);
2919                         o_ptr->timeout = 200;
2920                         break;
2921                 }
2922
2923                 case ACT_DEST_DOOR:
2924                 {
2925 #ifdef JP
2926                         msg_print("ÌÀ¤ë¤¤ÀÖ¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2927 #else
2928                         msg_print("It glows bright red...");
2929 #endif
2930
2931                         destroy_doors_touch();
2932                         o_ptr->timeout = 10;
2933                         break;
2934                 }
2935
2936                 case ACT_STONE_MUD:
2937                 {
2938 #ifdef JP
2939                         msg_print("¸ÝÆ°¤·¤Æ¤¤¤ë...");
2940 #else
2941                         msg_print("It pulsates...");
2942 #endif
2943
2944                         if (!get_aim_dir(&dir)) return FALSE;
2945                         wall_to_mud(dir);
2946                         o_ptr->timeout = 5;
2947                         break;
2948                 }
2949
2950                 case ACT_RECHARGE:
2951                 {
2952                         recharge(130);
2953                         o_ptr->timeout = 70;
2954                         break;
2955                 }
2956
2957                 case ACT_ALCHEMY:
2958                 {
2959 #ifdef JP
2960                         msg_print("ÌÀ¤ë¤¤²«¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
2961 #else
2962                         msg_print("It glows bright yellow...");
2963 #endif
2964
2965                         (void)alchemy();
2966                         o_ptr->timeout = 500;
2967                         break;
2968                 }
2969
2970                 case ACT_DIM_DOOR:
2971                 {
2972 #ifdef JP
2973                         msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
2974 #else
2975                         msg_print("You open a dimensional gate. Choose a destination.");
2976 #endif
2977
2978                         if (!dimension_door()) return FALSE;
2979                         o_ptr->timeout = 100;
2980                         break;
2981                 }
2982
2983
2984                 case ACT_TELEPORT:
2985                 {
2986 #ifdef JP
2987                         msg_print("¼þ¤ê¤Î¶õ´Ö¤¬ÏĤó¤Ç¤¤¤ë...");
2988 #else
2989                         msg_print("It twists space around you...");
2990 #endif
2991
2992                         teleport_player(100, 0L);
2993                         o_ptr->timeout = 45;
2994                         break;
2995                 }
2996
2997                 case ACT_RECALL:
2998                 {
2999 #ifdef JP
3000                         msg_print("¤ä¤ï¤é¤«¤ÊÇò¿§¤Ëµ±¤¤¤Æ¤¤¤ë...");
3001 #else
3002                         msg_print("It glows soft white...");
3003 #endif
3004                         if (!word_of_recall()) return FALSE;
3005                         o_ptr->timeout = 200;
3006                         break;
3007                 }
3008
3009                 default:
3010                 {
3011 #ifdef JP
3012                         msg_format("Unknown activation effect: %d.", o_ptr->xtra2);
3013 #else
3014                         msg_format("Unknown activation effect: %d.", o_ptr->xtra2);
3015 #endif
3016
3017                         return FALSE;
3018                 }
3019         }
3020
3021         return TRUE;
3022 }
3023
3024
3025 void get_bloody_moon_flags(object_type *o_ptr)
3026 {
3027         int dummy, i;
3028
3029         for (i = 0; i < TR_FLAG_SIZE; i++)
3030                 o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i];
3031
3032         dummy = randint1(2) + randint1(2);
3033         for (i = 0; i < dummy; i++)
3034         {
3035                 int flag = randint0(26);
3036                 if (flag >= 20) add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20);
3037                 else if (flag == 19) add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
3038                 else if (flag == 18) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
3039                 else add_flag(o_ptr->art_flags, TR_CHAOTIC + flag);
3040         }
3041
3042         dummy = randint1(2);
3043         for (i = 0; i < dummy; i++) one_resistance(o_ptr);
3044
3045         for (i = 0; i < 2; i++)
3046         {
3047                 int tmp = randint0(11);
3048                 if (tmp < 6) add_flag(o_ptr->art_flags, TR_STR + tmp);
3049                 else add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6);
3050         }
3051 }
3052
3053
3054 void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
3055 {
3056         bool give_resistance = FALSE, give_power = FALSE;
3057
3058         if (o_ptr->name1 == ART_TERROR) /* Terror Mask is for warriors... */
3059         {
3060                 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_ARCHER || p_ptr->pclass == CLASS_CAVALRY || p_ptr->pclass == CLASS_BERSERKER)
3061                 {
3062                         give_power = TRUE;
3063                         give_resistance = TRUE;
3064                 }
3065                 else
3066                 {
3067                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3068                         add_flag(o_ptr->art_flags, TR_TY_CURSE);
3069                         o_ptr->curse_flags |=
3070                             (TRC_CURSED | TRC_HEAVY_CURSE);
3071                         o_ptr->curse_flags |= get_curse(2, o_ptr);
3072                         return;
3073                 }
3074         }
3075
3076         if (o_ptr->name1 == ART_MURAMASA)
3077         {
3078                 if (p_ptr->pclass != CLASS_SAMURAI)
3079                 {
3080                         add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3081                         o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3082                 }
3083         }
3084
3085         if (o_ptr->name1 == ART_XIAOLONG)
3086         {
3087                 if (p_ptr->pclass == CLASS_MONK)
3088                         add_flag(o_ptr->art_flags, TR_BLOWS);
3089         }
3090
3091         if (o_ptr->name1 == ART_BLOOD)
3092         {
3093                 get_bloody_moon_flags(o_ptr);
3094         }
3095
3096         if (o_ptr->name1 == ART_HEAVENLY_MAIDEN)
3097         {
3098                 if (p_ptr->psex != SEX_FEMALE)
3099                 {
3100                         add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3101                 }
3102         }
3103
3104         if (a_ptr->gen_flags & (TRG_XTRA_POWER)) give_power = TRUE;
3105         if (a_ptr->gen_flags & (TRG_XTRA_H_RES)) give_resistance = TRUE;
3106         if (a_ptr->gen_flags & (TRG_XTRA_RES_OR_POWER))
3107         {
3108                 /* Give a resistance OR a power */
3109                 if (one_in_(2)) give_resistance = TRUE;
3110                 else give_power = TRUE;
3111         }
3112
3113         if (give_power)
3114         {
3115                 one_ability(o_ptr);
3116         }
3117
3118         if (give_resistance)
3119         {
3120                 one_high_resistance(o_ptr);
3121         }
3122 }
3123
3124
3125 /*
3126  * Create the artifact of the specified number
3127  */
3128 bool create_named_art(int a_idx, int y, int x)
3129 {
3130         object_type forge;
3131         object_type *q_ptr;
3132         int i;
3133
3134         artifact_type *a_ptr = &a_info[a_idx];
3135
3136         /* Get local object */
3137         q_ptr = &forge;
3138
3139         /* Ignore "empty" artifacts */
3140         if (!a_ptr->name) return FALSE;
3141
3142         /* Acquire the "kind" index */
3143         i = lookup_kind(a_ptr->tval, a_ptr->sval);
3144
3145         /* Oops */
3146         if (!i) return FALSE;
3147
3148         /* Create the artifact */
3149         object_prep(q_ptr, i);
3150
3151         /* Save the name */
3152         q_ptr->name1 = a_idx;
3153
3154         /* Extract the fields */
3155         q_ptr->pval = a_ptr->pval;
3156         q_ptr->ac = a_ptr->ac;
3157         q_ptr->dd = a_ptr->dd;
3158         q_ptr->ds = a_ptr->ds;
3159         q_ptr->to_a = a_ptr->to_a;
3160         q_ptr->to_h = a_ptr->to_h;
3161         q_ptr->to_d = a_ptr->to_d;
3162         q_ptr->weight = a_ptr->weight;
3163
3164         /* Hack -- extract the "cursed" flag */
3165         if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
3166         if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3167         if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
3168         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
3169         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
3170         if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
3171
3172         random_artifact_resistance(q_ptr, a_ptr);
3173
3174         /*
3175          * drop_near()Æâ¤ÇÉáÄ̤θÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤¬½Å¤Ê¤é¤Ê¤¤À­¼Á¤Ë°Í¸¤¹¤ë.
3176          * ²¾¤Ë2¸Ä°Ê¾å¸ºß²Äǽ¤«¤ÄÁõÈ÷Éʰʳ°¤Î¸ÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤¬ºîÀ®¤µ¤ì¤ì¤Ð
3177          * ¤³¤Î´Ø¿ô¤ÎÊÖ¤êÃͤϿ®ÍѤǤ­¤Ê¤¯¤Ê¤ë.
3178          */
3179
3180         /* Drop the artifact from heaven */
3181         return drop_near(q_ptr, -1, y, x) ? TRUE : FALSE;
3182 }