OSDN Git Service

hengband 1.0.8 fix2
[hengband/hengband.git] / src / wizard1.c
1 /* File: wizard1.c */
2
3 /* Purpose: Spoiler generation -BEN- */
4
5 #include "angband.h"
6
7
8 #ifdef ALLOW_SPOILERS
9
10
11 /*
12  * The spoiler file being created
13  */
14 static FILE *fff = NULL;
15
16
17
18 /*
19  * Extract a textual representation of an attribute
20  */
21 static cptr attr_to_text(byte a)
22 {
23         switch (a)
24         {
25 #ifdef JP000
26 case TERM_DARK:    return ("XXX¤¤");
27 case TERM_WHITE:   return ("Çò¤¤");
28 case TERM_SLATE:   return ("Àij¥¿§¤Î");
29 case TERM_ORANGE:  return ("¥ª¥ì¥ó¥¸¤Î");
30 case TERM_RED:     return ("ÀÖ¤¤");
31 case TERM_GREEN:   return ("ÎФÎ");
32 case TERM_BLUE:    return ("ÀĤ¤");
33 case TERM_UMBER:   return ("àèàῧ¤Î");
34 case TERM_L_DARK:  return ("³¥¿§¤Î");
35 case TERM_L_WHITE: return ("ÌÀÀij¥¿§¤Î");
36 case TERM_VIOLET:  return ("»ç¤Î");
37 case TERM_YELLOW:  return ("²«¿§¤¤");
38 case TERM_L_RED:   return ("ÌÀ¤¤ÀÖ¤Î");
39 case TERM_L_GREEN: return ("ÌÀ¤¤ÎФÎ");
40 case TERM_L_BLUE:  return ("ÌÀ¤¤ÀĤÎ");
41 case TERM_L_UMBER: return ("ÌÀ¤¤àèàῧ¤Î");
42 #else
43                 case TERM_DARK:    return ("xxx");
44                 case TERM_WHITE:   return ("White");
45                 case TERM_SLATE:   return ("Slate");
46                 case TERM_ORANGE:  return ("Orange");
47                 case TERM_RED:     return ("Red");
48                 case TERM_GREEN:   return ("Green");
49                 case TERM_BLUE:    return ("Blue");
50                 case TERM_UMBER:   return ("Umber");
51                 case TERM_L_DARK:  return ("L.Dark");
52                 case TERM_L_WHITE: return ("L.Slate");
53                 case TERM_VIOLET:  return ("Violet");
54                 case TERM_YELLOW:  return ("Yellow");
55                 case TERM_L_RED:   return ("L.Red");
56                 case TERM_L_GREEN: return ("L.Green");
57                 case TERM_L_BLUE:  return ("L.Blue");
58                 case TERM_L_UMBER: return ("L.Umber");
59 #endif
60
61         }
62
63         /* Oops */
64 #ifdef JP000
65 return ("ÊѤÊ");
66 #else
67         return ("Icky");
68 #endif
69
70 }
71
72
73
74 /*
75  * A tval grouper
76  */
77 typedef struct
78 {
79         byte tval;
80         cptr name;
81 } grouper;
82
83
84
85 /*
86  * Item Spoilers by: benh@phial.com (Ben Harrison)
87  */
88
89
90 /*
91  * The basic items categorized by type
92  */
93 static grouper group_item[] =
94 {
95 #ifdef JP
96 { TV_SHOT,          "¼Í·âʪ" },
97 #else
98         { TV_SHOT,          "Ammo" },
99 #endif
100
101         { TV_ARROW,         NULL },
102         { TV_BOLT,          NULL },
103
104 #ifdef JP
105 { TV_BOW,           "µÝ" },
106 #else
107         { TV_BOW,           "Bows" },
108 #endif
109
110
111 #ifdef JP
112 { TV_SWORD,         "Éð´ï" },
113 #else
114         { TV_SWORD,         "Weapons" },
115 #endif
116
117         { TV_POLEARM,       NULL },
118         { TV_HAFTED,        NULL },
119         { TV_DIGGING,       NULL },
120
121 #ifdef JP
122 { TV_SOFT_ARMOR,    "Ëɶñ¡ÊÂΡË" },
123 #else
124         { TV_SOFT_ARMOR,    "Armour (Body)" },
125 #endif
126
127         { TV_HARD_ARMOR,    NULL },
128         { TV_DRAG_ARMOR,    NULL },
129
130 #ifdef JP
131 { TV_CLOAK,         "Ëɶñ¡Ê¤½¤Î¾¡Ë" },
132 #else
133         { TV_CLOAK,         "Armour (Misc)" },
134 #endif
135
136         { TV_SHIELD,        NULL },
137         { TV_HELM,          NULL },
138         { TV_CROWN,         NULL },
139         { TV_GLOVES,        NULL },
140         { TV_BOOTS,         NULL },
141
142 #ifdef JP
143 { TV_AMULET,        "¥¢¥ß¥å¥ì¥Ã¥È" },
144 { TV_RING,          "»ØÎØ" },
145 #else
146         { TV_AMULET,        "Amulets" },
147         { TV_RING,          "Rings" },
148 #endif
149
150
151 #ifdef JP
152 { TV_SCROLL,        "´¬Êª" },
153 { TV_POTION,        "Ìô" },
154 { TV_FOOD,          "¿©ÎÁ" },
155 #else
156         { TV_SCROLL,        "Scrolls" },
157         { TV_POTION,        "Potions" },
158         { TV_FOOD,          "Food" },
159 #endif
160
161
162 #ifdef JP
163 { TV_ROD,           "¥í¥Ã¥É" },
164 { TV_WAND,          "ËâË¡ËÀ" },
165 { TV_STAFF,         "¾ó" },
166 #else
167         { TV_ROD,           "Rods" },
168         { TV_WAND,          "Wands" },
169         { TV_STAFF,         "Staffs" },
170 #endif
171
172
173 #ifdef JP
174 { TV_LIFE_BOOK,     "ËâË¡½ñ¡ÊÀ¸Ì¿¡Ë" },
175 { TV_SORCERY_BOOK,  "ËâË¡½ñ¡ÊÀç½Ñ¡Ë" },
176 { TV_NATURE_BOOK,   "ËâË¡½ñ¡Ê¼«Á³¡Ë" },
177 { TV_CHAOS_BOOK,    "ËâË¡½ñ¡Ê¥«¥ª¥¹¡Ë" },
178 { TV_DEATH_BOOK,    "ËâË¡½ñ¡Ê°Å¹õ¡Ë" },
179 { TV_TRUMP_BOOK,    "ËâË¡½ñ¡Ê¥È¥é¥ó¥×¡Ë" },
180 { TV_ARCANE_BOOK,   "ËâË¡½ñ¡ÊÈë½Ñ¡Ë" },
181 { TV_ENCHANT_BOOK,  "ËâË¡½ñ¡Ê¾¢¡Ë" },
182 { TV_DAEMON_BOOK,   "ËâË¡½ñ¡Ê°­Ëâ¡Ë" },
183 { TV_MUSIC_BOOK,    "²Î½¸" },
184 { TV_HISSATSU_BOOK, "Éð·Ý¤Î½ñ" },
185 #else
186         { TV_LIFE_BOOK,     "Books (Life)" },
187         { TV_SORCERY_BOOK,  "Books (Sorcery)" },
188         { TV_NATURE_BOOK,   "Books (Nature)" },
189         { TV_CHAOS_BOOK,    "Books (Chaos)" },
190         { TV_DEATH_BOOK,    "Books (Death)" },
191         { TV_TRUMP_BOOK,    "Books (Trump)" },
192         { TV_ARCANE_BOOK,   "Books (Arcane)" },
193         { TV_ENCHANT_BOOK,  "Books (Craft)" },
194         { TV_DAEMON_BOOK,   "Books (Daemon)" },
195         { TV_MUSIC_BOOK,    "Song Books" },
196         { TV_HISSATSU_BOOK, "Books (Kendo)" },
197 #endif
198
199 #ifdef JP
200 { TV_PARCHEMENT,    "ÍÓÈé»æ" },
201 #else
202 { TV_PARCHEMENT,    "Parchement" },
203 #endif
204
205 #ifdef JP
206 { TV_CHEST,         "Ȣ" },
207 #else
208         { TV_CHEST,         "Chests" },
209 #endif
210
211 #ifdef JP
212 { TV_CAPTURE,         "¥­¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë" },
213 #else
214         { TV_CAPTURE,         "Capture Ball" },
215 #endif
216
217 #ifdef JP
218 { TV_CARD,         "¥¨¥¯¥¹¥×¥ì¥¹¥«¡¼¥É" },
219 #else
220         { TV_CARD,         "Express Card" },
221 #endif
222
223         { TV_FIGURINE,      "Magical Figurines" },
224         { TV_STATUE,        "Statues" },
225         { TV_CORPSE,        "Corpses" },
226
227 #ifdef JP
228 { TV_WHISTLE,         "ū" },
229 #else
230         { TV_WHISTLE,         "Whistle" },
231 #endif
232
233 #ifdef JP
234 { TV_SPIKE,         "¤¯¤µ¤Ó" },
235 #else
236         { TV_SPIKE,         "Spike" },
237 #endif
238
239         { TV_LITE,          NULL },
240         { TV_FLASK,         NULL },
241         { TV_JUNK,          NULL },
242         { TV_BOTTLE,        NULL },
243         { TV_SKELETON,      NULL },
244
245         { 0, "" }
246 };
247
248
249 /*
250  * Describe the kind
251  */
252 static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int k)
253 {
254         object_type forge;
255         object_type *q_ptr;
256
257
258         /* Get local object */
259         q_ptr = &forge;
260
261         /* Prepare a fake item */
262         object_prep(q_ptr, k);
263
264         /* It is known */
265         q_ptr->ident |= (IDENT_KNOWN);
266
267         /* Cancel bonuses */
268         q_ptr->pval = 0;
269         q_ptr->to_a = 0;
270         q_ptr->to_h = 0;
271         q_ptr->to_d = 0;
272
273
274         /* Level */
275         (*lev) = get_object_level(q_ptr);
276
277         /* Value */
278         (*val) = object_value(q_ptr);
279
280
281         /* Hack */
282         if (!buf || !dam || !wgt) return;
283
284
285         /* Description (too brief) */
286         object_desc_store(buf, q_ptr, FALSE, 0);
287
288
289         /* Misc info */
290         strcpy(dam, "");
291
292         /* Damage */
293         switch (q_ptr->tval)
294         {
295                 /* Bows */
296                 case TV_BOW:
297                 {
298                         break;
299                 }
300
301                 /* Ammo */
302                 case TV_SHOT:
303                 case TV_BOLT:
304                 case TV_ARROW:
305                 {
306                         sprintf(dam, "%dd%d", q_ptr->dd, q_ptr->ds);
307                         break;
308                 }
309
310                 /* Weapons */
311                 case TV_HAFTED:
312                 case TV_POLEARM:
313                 case TV_SWORD:
314                 case TV_DIGGING:
315                 {
316                         sprintf(dam, "%dd%d", q_ptr->dd, q_ptr->ds);
317                         break;
318                 }
319
320                 /* Armour */
321                 case TV_BOOTS:
322                 case TV_GLOVES:
323                 case TV_CLOAK:
324                 case TV_CROWN:
325                 case TV_HELM:
326                 case TV_SHIELD:
327                 case TV_SOFT_ARMOR:
328                 case TV_HARD_ARMOR:
329                 case TV_DRAG_ARMOR:
330                 {
331                         sprintf(dam, "%d", q_ptr->ac);
332                         break;
333                 }
334         }
335
336
337         /* Weight */
338         sprintf(wgt, "%3d.%d", q_ptr->weight / 10, q_ptr->weight % 10);
339 }
340
341
342 /*
343  * Create a spoiler file for items
344  */
345 static void spoil_obj_desc(cptr fname)
346 {
347         int i, k, s, t, n = 0;
348
349         u16b who[200];
350
351         char buf[1024];
352
353         char wgt[80];
354         char dam[80];
355
356
357         /* Build the filename */
358         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
359
360         /* File type is "TEXT" */
361         FILE_TYPE(FILE_TYPE_TEXT);
362
363         /* Open the file */
364         fff = my_fopen(buf, "w");
365
366         /* Oops */
367         if (!fff)
368         {
369                 msg_print("Cannot create spoiler file.");
370                 return;
371         }
372
373
374         /* Header */
375         fprintf(fff, "Spoiler File -- Basic Items (Hengband %d.%d.%d)\n\n\n",
376                 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
377
378         /* More Header */
379         fprintf(fff, "%-45s     %8s%7s%5s%9s\n",
380                 "Description", "Dam/AC", "Wgt", "Lev", "Cost");
381         fprintf(fff, "%-45s     %8s%7s%5s%9s\n",
382                 "----------------------------------------",
383                 "------", "---", "---", "----");
384
385         /* List the groups */
386         for (i = 0; TRUE; i++)
387         {
388                 /* Write out the group title */
389                 if (group_item[i].name)
390                 {
391                         /* Hack -- bubble-sort by cost and then level */
392                         for (s = 0; s < n - 1; s++)
393                         {
394                                 for (t = 0; t < n - 1; t++)
395                                 {
396                                         int i1 = t;
397                                         int i2 = t + 1;
398
399                                         int e1;
400                                         int e2;
401
402                                         s32b t1;
403                                         s32b t2;
404
405                                         kind_info(NULL, NULL, NULL, &e1, &t1, who[i1]);
406                                         kind_info(NULL, NULL, NULL, &e2, &t2, who[i2]);
407
408                                         if ((t1 > t2) || ((t1 == t2) && (e1 > e2)))
409                                         {
410                                                 int tmp = who[i1];
411                                                 who[i1] = who[i2];
412                                                 who[i2] = tmp;
413                                         }
414                                 }
415                         }
416
417                         /* Spoil each item */
418                         for (s = 0; s < n; s++)
419                         {
420                                 int e;
421                                 s32b v;
422
423                                 /* Describe the kind */
424                                 kind_info(buf, dam, wgt, &e, &v, who[s]);
425
426                                 /* Dump it */
427                                 fprintf(fff, "     %-45s%8s%7s%5d%9ld\n",
428                                         buf, dam, wgt, e, (long)(v));
429                         }
430
431                         /* Start a new set */
432                         n = 0;
433
434                         /* Notice the end */
435                         if (!group_item[i].tval) break;
436
437                         /* Start a new set */
438                         fprintf(fff, "\n\n%s\n\n", group_item[i].name);
439                 }
440
441                 /* Acquire legal item types */
442                 for (k = 1; k < max_k_idx; k++)
443                 {
444                         object_kind *k_ptr = &k_info[k];
445
446                         /* Skip wrong tval's */
447                         if (k_ptr->tval != group_item[i].tval) continue;
448
449                         /* Hack -- Skip instant-artifacts */
450                         if (k_ptr->flags3 & (TR3_INSTA_ART)) continue;
451
452                         /* Save the index */
453                         who[n++] = k;
454                 }
455         }
456
457
458         /* Check for errors */
459         if (ferror(fff) || my_fclose(fff))
460         {
461                 msg_print("Cannot close spoiler file.");
462                 return;
463         }
464
465         /* Message */
466         msg_print("Successfully created a spoiler file.");
467 }
468
469
470 /*
471  * Artifact Spoilers by: randy@PICARD.tamu.edu (Randy Hutson)
472  */
473
474
475 /*
476  * Returns a "+" string if a number is non-negative and an empty
477  * string if negative
478  */
479 #define POSITIZE(v) (((v) >= 0) ? "+" : "")
480
481 /*
482  * These are used to format the artifact spoiler file. INDENT1 is used
483  * to indent all but the first line of an artifact spoiler. INDENT2 is
484  * used when a line "wraps". (Bladeturner's resistances cause this.)
485  */
486 #define INDENT1 "    "
487 #define INDENT2 "      "
488
489 /*
490  * MAX_LINE_LEN specifies when a line should wrap.
491  */
492 #define MAX_LINE_LEN 75
493
494 /*
495  * Given an array, determine how many elements are in the array
496  */
497 #define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0]))
498
499 /*
500  * The artifacts categorized by type
501  */
502 static grouper group_artifact[] =
503 {
504 #ifdef JP
505         { TV_SWORD,             "Åá·õ" },
506         { TV_POLEARM,           "Áä/Éà" },
507         { TV_HAFTED,            "Æß´ï" },
508         { TV_BOW,               "Èô¤ÓÆ»¶ñ" },
509
510         { TV_SOFT_ARMOR,        "³»" },
511         { TV_HARD_ARMOR,        NULL },
512         { TV_DRAG_ARMOR,        NULL },
513
514         { TV_CLOAK,             "¥¯¥í¡¼¥¯" },
515         { TV_SHIELD,            "½â" },
516         { TV_HELM,              "³õ/´§" },
517         { TV_CROWN,             NULL },
518         { TV_GLOVES,            "äƼê" },
519         { TV_BOOTS,             "·¤" },
520
521         { TV_LITE,              "¸÷¸»" },
522         { TV_AMULET,            "¥¢¥ß¥å¥ì¥Ã¥È" },
523         { TV_RING,              "»ØÎØ" },
524 #else
525         { TV_SWORD,             "Edged Weapons" },
526         { TV_POLEARM,           "Polearms" },
527         { TV_HAFTED,            "Hafted Weapons" },
528         { TV_BOW,               "Bows" },
529
530         { TV_SOFT_ARMOR,        "Body Armor" },
531         { TV_HARD_ARMOR,        NULL },
532         { TV_DRAG_ARMOR,        NULL },
533
534         { TV_CLOAK,             "Cloaks" },
535         { TV_SHIELD,            "Shields" },
536         { TV_HELM,              "Helms/Crowns" },
537         { TV_CROWN,             NULL },
538         { TV_GLOVES,            "Gloves" },
539         { TV_BOOTS,             "Boots" },
540
541         { TV_LITE,              "Light Sources" },
542         { TV_AMULET,            "Amulets" },
543         { TV_RING,              "Rings" },
544 #endif
545
546         { 0, NULL }
547 };
548
549
550
551 /*
552  * Pair together a constant flag with a textual description.
553  *
554  * Used by both "init.c" and "wiz-spo.c".
555  *
556  * Note that it sometimes more efficient to actually make an array
557  * of textual names, where entry 'N' is assumed to be paired with
558  * the flag whose value is "1L << N", but that requires hard-coding.
559  */
560
561 typedef struct flag_desc flag_desc;
562
563 struct flag_desc
564 {
565         const u32b flag;
566         const char *const desc;
567 };
568
569
570
571 /*
572  * These are used for "+3 to STR, DEX", etc. These are separate from
573  * the other pval affected traits to simplify the case where an object
574  * affects all stats.  In this case, "All stats" is used instead of
575  * listing each stat individually.
576  */
577
578 static flag_desc stat_flags_desc[] =
579 {
580 #ifdef JP
581         { TR1_STR,        "ÏÓÎÏ" },
582         { TR1_INT,        "ÃÎǽ" },
583         { TR1_WIS,        "¸­¤µ" },
584         { TR1_DEX,        "´ïÍѤµ" },
585         { TR1_CON,        "Âѵ×ÎÏ" },
586         { TR1_CHR,        "Ì¥ÎÏ" }
587 #else
588         { TR1_STR,        "STR" },
589         { TR1_INT,        "INT" },
590         { TR1_WIS,        "WIS" },
591         { TR1_DEX,        "DEX" },
592         { TR1_CON,        "CON" },
593         { TR1_CHR,        "CHR" }
594 #endif
595 };
596
597 /*
598  * Besides stats, these are the other player traits
599  * which may be affected by an object's pval
600  */
601
602 static flag_desc pval_flags1_desc[] =
603 {
604 #ifdef JP
605         { TR1_MAGIC_MASTERY,    "ËâË¡Æ»¶ñ»ÈÍÑǽÎÏ" },
606         { TR1_STEALTH,    "±£Ì©" },
607         { TR1_SEARCH,     "õº÷" },
608         { TR1_INFRA,      "ÀÖ³°Àþ»ëÎÏ" },
609         { TR1_TUNNEL,     "ºÎ·¡" },
610         { TR1_BLOWS,      "¹¶·â²ó¿ô" },
611         { TR1_SPEED,      "¥¹¥Ô¡¼¥É" }
612 #else
613         { TR1_STEALTH,    "Stealth" },
614         { TR1_SEARCH,     "Searching" },
615         { TR1_INFRA,      "Infravision" },
616         { TR1_TUNNEL,     "Tunneling" },
617         { TR1_BLOWS,      "Attacks" },
618         { TR1_SPEED,      "Speed" }
619 #endif
620 };
621
622 /*
623  * Slaying preferences for weapons
624  */
625
626 static flag_desc slay_flags_desc[] =
627 {
628 #ifdef JP
629         { TR1_SLAY_ANIMAL,        "ưʪ" },
630         { TR1_SLAY_EVIL,          "¼Ù°­" },
631         { TR1_SLAY_UNDEAD,        "¥¢¥ó¥Ç¥Ã¥É" },
632         { TR1_SLAY_DEMON,         "°­Ëâ" },
633         { TR1_SLAY_ORC,           "¥ª¡¼¥¯" },
634         { TR1_SLAY_TROLL,         "¥È¥í¥ë" },
635         { TR1_SLAY_GIANT,         "µð¿Í" },
636         { TR1_SLAY_DRAGON,        "¥É¥é¥´¥ó" },
637         { TR1_KILL_DRAGON,        "*¥É¥é¥´¥ó*" },
638 #else
639         { TR1_SLAY_ANIMAL,        "Animal" },
640         { TR1_SLAY_EVIL,          "Evil" },
641         { TR1_SLAY_UNDEAD,        "Undead" },
642         { TR1_SLAY_DEMON,         "Demon" },
643         { TR1_SLAY_ORC,           "Orc" },
644         { TR1_SLAY_TROLL,         "Troll" },
645         { TR1_SLAY_GIANT,         "Giant" },
646         { TR1_SLAY_DRAGON,        "Dragon" },
647         { TR1_KILL_DRAGON,        "Xdragon" }
648 #endif
649 };
650
651 /*
652  * Elemental brands for weapons
653  *
654  * Clearly, TR1_IMPACT is a bit out of place here. To simplify
655  * coding, it has been included here along with the elemental
656  * brands. It does seem to fit in with the brands and slaying
657  * more than the miscellaneous section.
658  */
659 static flag_desc brand_flags_desc[] =
660 {
661 #ifdef JP
662         { TR1_BRAND_ACID,         "Íϲò" },
663         { TR1_BRAND_ELEC,         "ÅÅ·â" },
664         { TR1_BRAND_FIRE,         "¾Æ´þ" },
665         { TR1_BRAND_COLD,         "Åà·ë" },
666         { TR1_BRAND_POIS,         "ÆÇ»¦" },
667
668         { TR1_FORCE_WEPON,            "ÍýÎÏ" },
669         { TR1_CHAOTIC,            "º®ÆÙ" },
670         { TR1_VAMPIRIC,           "µÛ·ì" },
671         { TR1_IMPACT,             "ÃÏ¿Ì" },
672         { TR1_VORPAL,             "ÀÚ¤ìÌ£" },
673 #else
674         { TR1_BRAND_ACID,         "Acid Brand" },
675         { TR1_BRAND_ELEC,         "Lightning Brand" },
676         { TR1_BRAND_FIRE,         "Flame Tongue" },
677         { TR1_BRAND_COLD,         "Frost Brand" },
678         { TR1_BRAND_POIS,         "Poisoned" },
679
680         { TR1_FORCE_WEPON,            "Force" },
681         { TR1_CHAOTIC,            "Mark of Chaos" },
682         { TR1_VAMPIRIC,           "Vampiric" },
683         { TR1_IMPACT,             "Earthquake impact on hit" },
684         { TR1_VORPAL,             "Very sharp" },
685 #endif
686 };
687
688
689 /*
690  * The 15 resistables
691  */
692 static const flag_desc resist_flags_desc[] =
693 {
694 #ifdef JP
695         { TR2_RES_ACID,   "»À" },
696         { TR2_RES_ELEC,   "ÅÅ·â" },
697         { TR2_RES_FIRE,   "²Ð±ê" },
698         { TR2_RES_COLD,   "Î䵤" },
699         { TR2_RES_POIS,   "ÆÇ" },
700         { TR2_RES_FEAR,   "¶²ÉÝ"},
701         { TR2_RES_LITE,   "Á®¸÷" },
702         { TR2_RES_DARK,   "°Å¹õ" },
703         { TR2_RES_BLIND,  "ÌÕÌÜ" },
704         { TR2_RES_CONF,   "º®Íð" },
705         { TR2_RES_SOUND,  "¹ì²»" },
706         { TR2_RES_SHARDS, "ÇËÊÒ" },
707         { TR2_RES_NETHER, "ÃϹö" },
708         { TR2_RES_NEXUS,  "°ø²Ìº®Íð" },
709         { TR2_RES_CHAOS,  "¥«¥ª¥¹" },
710         { TR2_RES_DISEN,  "Îô²½" },
711 #else
712         { TR2_RES_ACID,   "Acid" },
713         { TR2_RES_ELEC,   "Lightning" },
714         { TR2_RES_FIRE,   "Fire" },
715         { TR2_RES_COLD,   "Cold" },
716         { TR2_RES_POIS,   "Poison" },
717         { TR2_RES_FEAR,   "Fear"},
718         { TR2_RES_LITE,   "Light" },
719         { TR2_RES_DARK,   "Dark" },
720         { TR2_RES_BLIND,  "Blindness" },
721         { TR2_RES_CONF,   "Confusion" },
722         { TR2_RES_SOUND,  "Sound" },
723         { TR2_RES_SHARDS, "Shards" },
724         { TR2_RES_NETHER, "Nether" },
725         { TR2_RES_NEXUS,  "Nexus" },
726         { TR2_RES_CHAOS,  "Chaos" },
727         { TR2_RES_DISEN,  "Disenchantment" },
728 #endif
729 };
730
731 /*
732  * Elemental immunities (along with poison)
733  */
734
735 static const flag_desc immune_flags_desc[] =
736 {
737 #ifdef JP
738         { TR2_IM_ACID,    "»À" },
739         { TR2_IM_ELEC,    "ÅÅ·â" },
740         { TR2_IM_FIRE,    "²Ð±ê" },
741         { TR2_IM_COLD,    "Î䵤" },
742 #else
743         { TR2_IM_ACID,    "Acid" },
744         { TR2_IM_ELEC,    "Lightning" },
745         { TR2_IM_FIRE,    "Fire" },
746         { TR2_IM_COLD,    "Cold" },
747 #endif
748 };
749
750 /*
751  * Sustain stats -  these are given their "own" line in the
752  * spoiler file, mainly for simplicity
753  */
754 static const flag_desc sustain_flags_desc[] =
755 {
756 #ifdef JP
757         { TR2_SUST_STR,   "ÏÓÎÏ" },
758         { TR2_SUST_INT,   "ÃÎǽ" },
759         { TR2_SUST_WIS,   "¸­¤µ" },
760         { TR2_SUST_DEX,   "´ïÍѤµ" },
761         { TR2_SUST_CON,   "Âѵ×ÎÏ" },
762         { TR2_SUST_CHR,   "Ì¥ÎÏ" },
763 #else
764         { TR2_SUST_STR,   "STR" },
765         { TR2_SUST_INT,   "INT" },
766         { TR2_SUST_WIS,   "WIS" },
767         { TR2_SUST_DEX,   "DEX" },
768         { TR2_SUST_CON,   "CON" },
769         { TR2_SUST_CHR,   "CHR" },
770 #endif
771 };
772
773 /*
774  * Miscellaneous magic given by an object's "flags2" field
775  */
776
777 static const flag_desc misc_flags2_desc[] =
778 {
779 #ifdef JP
780         { TR2_THROW,      "ÅêÚ³" },
781         { TR2_REFLECT,    "È¿¼Í" },
782         { TR2_FREE_ACT,   "ËãáãÃΤ餺" },
783         { TR2_HOLD_LIFE,  "À¸Ì¿ÎÏ°Ý»ý" },
784 #else
785         { TR2_THROW,      "Throwing" },
786         { TR2_REFLECT,    "Reflection" },
787         { TR2_FREE_ACT,   "Free Action" },
788         { TR2_HOLD_LIFE,  "Hold Life" },
789 #endif
790 };
791
792 /*
793  * Miscellaneous magic given by an object's "flags3" field
794  *
795  * Note that cursed artifacts and objects with permanent light
796  * are handled "directly" -- see analyze_misc_magic()
797  */
798
799 static const flag_desc misc_flags3_desc[] =
800 {
801 #ifdef JP
802         { TR3_SH_FIRE,            "²Ð±ê¥ª¡¼¥é" },
803         { TR3_SH_ELEC,            "Åŷ⥪¡¼¥é" },
804         { TR3_SH_COLD,            "Î䵤¥ª¡¼¥é" },
805         { TR3_NO_TELE,            "È¿¥Æ¥ì¥Ý¡¼¥È" },
806         { TR3_NO_MAGIC,           "È¿ËâË¡" },
807         { TR3_FEATHER,            "ÉâÍ·" },
808         { TR3_SEE_INVIS,          "²Ä»ëÆ©ÌÀ" },
809         { TR3_TELEPATHY,          "¥Æ¥ì¥Ñ¥·¡¼" },
810         { TR3_SLOW_DIGEST,        "Ãپò½" },
811         { TR3_REGEN,              "µÞ®²óÉü" },
812 /*      { TR3_XTRA_MIGHT,         "¶¯Îϼͷâ" }, */
813         { TR3_XTRA_SHOTS,         "Äɲüͷâ" },        /* always +1? */
814         { TR3_DRAIN_EXP,          "·Ð¸³Ã͵ۼý" },
815         { TR3_AGGRAVATE,          "È¿´¶" },
816         { TR3_BLESSED,            "½ËÊ¡" },
817         { TR3_DEC_MANA,           "¾ÃÈñËâÎϸº¾¯" },
818 #else
819         { TR3_SH_FIRE,            "Fiery Aura" },
820         { TR3_SH_ELEC,            "Electric Aura" },
821         { TR3_SH_COLD,            "Coldly Aura" },
822         { TR3_NO_TELE,            "Prevent Teleportation" },
823         { TR3_NO_MAGIC,           "Anti-Magic" },
824         { TR3_FEATHER,            "Levitation" },
825         { TR3_SEE_INVIS,          "See Invisible" },
826         { TR3_TELEPATHY,          "ESP" },
827         { TR3_SLOW_DIGEST,        "Slow Digestion" },
828         { TR3_REGEN,              "Regeneration" },
829 /*      { TR3_XTRA_MIGHT,         "Extra Might" }, */
830         { TR3_XTRA_SHOTS,         "+1 Extra Shot" },        /* always +1? */
831         { TR3_DRAIN_EXP,          "Drains Experience" },
832         { TR3_AGGRAVATE,          "Aggravates" },
833         { TR3_BLESSED,            "Blessed Blade" },
834         { TR3_DEC_MANA,           "Decrease Shouhi Mana" },
835 #endif
836 };
837
838
839 /*
840  * A special type used just for deailing with pvals
841  */
842 typedef struct
843 {
844         /*
845          * This will contain a string such as "+2", "-10", etc.
846          */
847         char pval_desc[12];
848
849         /*
850          * A list of various player traits affected by an object's pval such
851          * as stats, speed, stealth, etc.  "Extra attacks" is NOT included in
852          * this list since it will probably be desirable to format its
853          * description differently.
854          *
855          * Note that room need only be reserved for the number of stats - 1
856          * since the description "All stats" is used if an object affects all
857          * all stats. Also, room must be reserved for a sentinel NULL pointer.
858          *
859          * This will be a list such as ["STR", "DEX", "Stealth", NULL] etc.
860          *
861          * This list includes extra attacks, for simplicity.
862          */
863         cptr pval_affects[N_ELEMENTS(stat_flags_desc) - 1 +
864                           N_ELEMENTS(pval_flags1_desc) + 1];
865
866 } pval_info_type;
867
868
869 /*
870  * An "object analysis structure"
871  *
872  * It will be filled with descriptive strings detailing an object's
873  * various magical powers. The "ignore X" traits are not noted since
874  * all artifacts ignore "normal" destruction.
875  */
876
877 typedef struct
878 {
879         /* "The Longsword Dragonsmiter (6d4) (+20, +25)" */
880         char description[MAX_NLEN];
881
882         /* Description of what is affected by an object's pval */
883         pval_info_type pval_info;
884
885         /* A list of an object's slaying preferences */
886         cptr slays[N_ELEMENTS(slay_flags_desc) + 1];
887
888         /* A list if an object's elemental brands */
889         cptr brands[N_ELEMENTS(brand_flags_desc) + 1];
890
891         /* A list of immunities granted by an object */
892         cptr immunities[N_ELEMENTS(immune_flags_desc) + 1];
893
894         /* A list of resistances granted by an object */
895         cptr resistances[N_ELEMENTS(resist_flags_desc) + 1];
896
897         /* A list of stats sustained by an object */
898         cptr sustains[N_ELEMENTS(sustain_flags_desc)  - 1 + 1];
899
900         /* A list of various magical qualities an object may have */
901         cptr misc_magic[N_ELEMENTS(misc_flags2_desc) + N_ELEMENTS(misc_flags3_desc)
902                         + 1       /* Permanent Light */
903                         + 1       /* TY curse */
904                         + 1       /* type of curse */
905                         + 1];     /* sentinel NULL */
906
907         /* A string describing an artifact's activation */
908         cptr activation;
909
910         /* "Level 20, Rarity 30, 3.0 lbs, 20000 Gold" */
911         char misc_desc[80];
912 } obj_desc_list;
913
914
915 /*
916  * Write out `n' of the character `c' to the spoiler file
917  */
918 static void spoiler_out_n_chars(int n, char c)
919 {
920         while (--n >= 0) fputc(c, fff);
921 }
922
923
924 /*
925  * Write out `n' blank lines to the spoiler file
926  */
927 static void spoiler_blanklines(int n)
928 {
929         spoiler_out_n_chars(n, '\n');
930 }
931
932
933 /*
934  * Write a line to the spoiler file and then "underline" it with hypens
935  */
936 static void spoiler_underline(cptr str)
937 {
938         fprintf(fff, "%s\n", str);
939         spoiler_out_n_chars(strlen(str), '-');
940         fprintf(fff, "\n");
941 }
942
943
944
945 /*
946  * This function does most of the actual "analysis". Given a set of bit flags
947  * (which will be from one of the flags fields from the object in question),
948  * a "flag description structure", a "description list", and the number of
949  * elements in the "flag description structure", this function sets the
950  * "description list" members to the appropriate descriptions contained in
951  * the "flag description structure".
952  *
953  * The possibly updated description pointer is returned.
954  */
955 static cptr *spoiler_flag_aux(const u32b art_flags, const flag_desc *flag_ptr,
956                               cptr *desc_ptr, const int n_elmnts)
957 {
958         int i;
959
960         for (i = 0; i < n_elmnts; ++i)
961         {
962                 if (art_flags & flag_ptr[i].flag)
963                 {
964                         *desc_ptr++ = flag_ptr[i].desc;
965                 }
966         }
967
968         return desc_ptr;
969 }
970
971
972 /*
973  * Acquire a "basic" description "The Cloak of Death [1,+10]"
974  */
975 static void analyze_general (object_type *o_ptr, char *desc_ptr)
976 {
977         /* Get a "useful" description of the object */
978         object_desc_store(desc_ptr, o_ptr, TRUE, 1);
979 }
980
981
982 /*
983  * List "player traits" altered by an artifact's pval. These include stats,
984  * speed, infravision, tunneling, stealth, searching, and extra attacks.
985  */
986 static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr)
987 {
988         const u32b all_stats = (TR1_STR | TR1_INT | TR1_WIS |
989                                 TR1_DEX | TR1_CON | TR1_CHR);
990
991         u32b f1, f2, f3;
992
993         cptr *affects_list;
994
995         /* If pval == 0, there is nothing to do. */
996         if (!o_ptr->pval)
997         {
998                 /* An "empty" pval description indicates that pval == 0 */
999                 p_ptr->pval_desc[0] = '\0';
1000                 return;
1001         }
1002
1003         /* Extract the flags */
1004         object_flags(o_ptr, &f1, &f2, &f3);
1005
1006         affects_list = p_ptr->pval_affects;
1007
1008         /* Create the "+N" string */
1009         sprintf(p_ptr->pval_desc, "%s%d", POSITIZE(o_ptr->pval), o_ptr->pval);
1010
1011         /* First, check to see if the pval affects all stats */
1012         if ((f1 & all_stats) == all_stats)
1013         {
1014 #ifdef JP
1015                 *affects_list++ = "Á´Ç½ÎÏ";
1016 #else
1017                 *affects_list++ = "All stats";
1018 #endif
1019         }
1020
1021         /* Are any stats affected? */
1022         else if (f1 & all_stats)
1023         {
1024                 affects_list = spoiler_flag_aux(f1, stat_flags_desc,
1025                                                 affects_list,
1026                                                 N_ELEMENTS(stat_flags_desc));
1027         }
1028
1029         /* And now the "rest" */
1030         affects_list = spoiler_flag_aux(f1, pval_flags1_desc,
1031                                         affects_list,
1032                                         N_ELEMENTS(pval_flags1_desc));
1033
1034         /* Terminate the description list */
1035         *affects_list = NULL;
1036 }
1037
1038
1039 /* Note the slaying specialties of a weapon */
1040 static void analyze_slay (object_type *o_ptr, cptr *slay_list)
1041 {
1042         u32b f1, f2, f3;
1043
1044         object_flags(o_ptr, &f1, &f2, &f3);
1045
1046         slay_list = spoiler_flag_aux(f1, slay_flags_desc, slay_list,
1047                                      N_ELEMENTS(slay_flags_desc));
1048
1049         /* Terminate the description list */
1050         *slay_list = NULL;
1051 }
1052
1053 /* Note an object's elemental brands */
1054 static void analyze_brand (object_type *o_ptr, cptr *brand_list)
1055 {
1056         u32b f1, f2, f3;
1057
1058         object_flags(o_ptr, &f1, &f2, &f3);
1059
1060         brand_list = spoiler_flag_aux(f1, brand_flags_desc, brand_list,
1061                                       N_ELEMENTS(brand_flags_desc));
1062
1063         /* Terminate the description list */
1064         *brand_list = NULL;
1065 }
1066
1067
1068 /* Note the resistances granted by an object */
1069 static void analyze_resist (object_type *o_ptr, cptr *resist_list)
1070 {
1071         u32b f1, f2, f3;
1072
1073         object_flags(o_ptr, &f1, &f2, &f3);
1074
1075         resist_list = spoiler_flag_aux(f2, resist_flags_desc,
1076                                        resist_list, N_ELEMENTS(resist_flags_desc));
1077
1078         /* Terminate the description list */
1079         *resist_list = NULL;
1080 }
1081
1082
1083 /* Note the immunities granted by an object */
1084 static void analyze_immune (object_type *o_ptr, cptr *immune_list)
1085 {
1086         u32b f1, f2, f3;
1087
1088         object_flags(o_ptr, &f1, &f2, &f3);
1089
1090         immune_list = spoiler_flag_aux(f2, immune_flags_desc,
1091                                        immune_list, N_ELEMENTS(immune_flags_desc));
1092
1093         /* Terminate the description list */
1094         *immune_list = NULL;
1095 }
1096
1097 /* Note which stats an object sustains */
1098
1099 static void analyze_sustains (object_type *o_ptr, cptr *sustain_list)
1100 {
1101         const u32b all_sustains = (TR2_SUST_STR | TR2_SUST_INT | TR2_SUST_WIS |
1102                                    TR2_SUST_DEX | TR2_SUST_CON | TR2_SUST_CHR);
1103
1104         u32b f1, f2, f3;
1105
1106         object_flags(o_ptr, &f1, &f2, &f3);
1107
1108         /* Simplify things if an item sustains all stats */
1109         if ((f2 & all_sustains) == all_sustains)
1110         {
1111 #ifdef JP
1112                 *sustain_list++ = "Á´Ç½ÎÏ";
1113 #else
1114                 *sustain_list++ = "All stats";
1115 #endif
1116         }
1117
1118         /* Should we bother? */
1119         else if ((f2 & all_sustains))
1120         {
1121                 sustain_list = spoiler_flag_aux(f2, sustain_flags_desc,
1122                                                 sustain_list,
1123                                                 N_ELEMENTS(sustain_flags_desc));
1124         }
1125
1126         /* Terminate the description list */
1127         *sustain_list = NULL;
1128 }
1129
1130
1131 /*
1132  * Note miscellaneous powers bestowed by an artifact such as see invisible,
1133  * free action, permanent light, etc.
1134  */
1135 static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list)
1136 {
1137         u32b f1, f2, f3;
1138
1139         object_flags(o_ptr, &f1, &f2, &f3);
1140
1141         misc_list = spoiler_flag_aux(f2, misc_flags2_desc, misc_list,
1142                                      N_ELEMENTS(misc_flags2_desc));
1143
1144         misc_list = spoiler_flag_aux(f3, misc_flags3_desc, misc_list,
1145                                      N_ELEMENTS(misc_flags3_desc));
1146
1147         /*
1148          * Artifact lights -- large radius light.
1149          */
1150         if ((o_ptr->tval == TV_LITE) && artifact_p(o_ptr))
1151         {
1152 #ifdef JP
1153                 *misc_list++ = "±Êµ×¸÷¸»(Ⱦ·Â3)";
1154 #else
1155                 *misc_list++ = "Permanent Light(3)";
1156 #endif
1157         }
1158
1159         /*
1160          * Glowing artifacts -- small radius light.
1161          */
1162         if (f3 & (TR3_LITE))
1163         {
1164 #ifdef JP
1165                 *misc_list++ = "±Êµ×¸÷¸»(Ⱦ·Â1)";
1166 #else
1167                 *misc_list++ = "Permanent Light(1)";
1168 #endif
1169         }
1170
1171         /*
1172          * Handle cursed objects here to avoid redundancies such as noting
1173          * that a permanently cursed object is heavily cursed as well as
1174          * being "lightly cursed".
1175          */
1176
1177 /*      if (cursed_p(o_ptr)) */
1178         if (1)
1179         {
1180                 if (f3 & TR3_TY_CURSE)
1181                 {
1182 #ifdef JP
1183                         *misc_list++ = "ÂÀ¸Å¤Î±åÇ°";
1184 #else
1185                         *misc_list++ = "Ancient Curse";
1186 #endif
1187                 }
1188                 if (f3 & TR3_PERMA_CURSE)
1189                 {
1190 #ifdef JP
1191                         *misc_list++ = "±Ê±ó¤Î¼ö¤¤";
1192 #else
1193                         *misc_list++ = "Permanently Cursed";
1194 #endif
1195                 }
1196                 else if (f3 & TR3_HEAVY_CURSE)
1197                 {
1198 #ifdef JP
1199                         *misc_list++ = "¶¯ÎϤʼö¤¤";
1200 #else
1201                         *misc_list++ = "Heavily Cursed";
1202 #endif
1203                 }
1204 /*              else */
1205                 else if (f3 & TR3_CURSED)
1206                 {
1207 #ifdef JP
1208                         *misc_list++ = "¼ö¤¤";
1209 #else
1210                         *misc_list++ = "Cursed";
1211 #endif
1212                 }
1213         }
1214
1215         /* Terminate the description list */
1216         *misc_list = NULL;
1217 }
1218
1219
1220
1221
1222 /*
1223  * Determine the minimum depth an artifact can appear, its rarity, its weight,
1224  * and its value in gold pieces
1225  */
1226 static void analyze_misc (object_type *o_ptr, char *misc_desc)
1227 {
1228         artifact_type *a_ptr = &a_info[o_ptr->name1];
1229
1230 #ifdef JP
1231         sprintf(misc_desc, "¥ì¥Ù¥ë %u, ´õ¾¯ÅÙ %u, %d.%d kg, ¡ð%ld",
1232                 a_ptr->level, a_ptr->rarity,
1233                 lbtokg1(a_ptr->weight), lbtokg2(a_ptr->weight), a_ptr->cost);
1234 #else
1235         sprintf(misc_desc, "Level %u, Rarity %u, %d.%d lbs, %ld Gold",
1236                 a_ptr->level, a_ptr->rarity,
1237                 a_ptr->weight / 10, a_ptr->weight % 10, a_ptr->cost);
1238 #endif
1239 }
1240
1241
1242 /*
1243  * Fill in an object description structure for a given object
1244  */
1245 static void object_analyze(object_type *o_ptr, obj_desc_list *desc_ptr)
1246 {
1247         analyze_general(o_ptr, desc_ptr->description);
1248
1249         analyze_pval(o_ptr, &desc_ptr->pval_info);
1250
1251         analyze_brand(o_ptr, desc_ptr->brands);
1252
1253         analyze_slay(o_ptr, desc_ptr->slays);
1254
1255         analyze_immune(o_ptr, desc_ptr->immunities);
1256
1257         analyze_resist(o_ptr, desc_ptr->resistances);
1258
1259         analyze_sustains(o_ptr, desc_ptr->sustains);
1260
1261         analyze_misc_magic(o_ptr, desc_ptr->misc_magic);
1262
1263         analyze_misc(o_ptr, desc_ptr->misc_desc);
1264
1265         desc_ptr->activation = item_activation(o_ptr);
1266 }
1267
1268
1269 static void print_header(void)
1270 {
1271         char buf[80];
1272
1273 #ifndef FAKE_VERSION
1274         sprintf(buf, "Artifact Spoilers for Angband Version %d.%d.%d",
1275                 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
1276         spoiler_underline(buf);
1277 #else /* FAKE_VERSION */
1278         sprintf(buf, "Artifact Spoilers for Hengband Version %d.%d.%d",
1279                 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1280         spoiler_underline(buf);
1281 #endif /* FAKE_VERSION */
1282
1283 }
1284
1285 /*
1286  * This is somewhat ugly.
1287  *
1288  * Given a header ("Resist", e.g.), a list ("Fire", "Cold", Acid", e.g.),
1289  * and a separator character (',', e.g.), write the list to the spoiler file
1290  * in a "nice" format, such as:
1291  *
1292  *      Resist Fire, Cold, Acid
1293  *
1294  * That was a simple example, but when the list is long, a line wrap
1295  * should occur, and this should induce a new level of indention if
1296  * a list is being spread across lines. So for example, Bladeturner's
1297  * list of resistances should look something like this
1298  *
1299  *     Resist Acid, Lightning, Fire, Cold, Poison, Light, Dark, Blindness,
1300  *       Confusion, Sound, Shards, Nether, Nexus, Chaos, Disenchantment
1301  *
1302  * However, the code distinguishes between a single list of many items vs.
1303  * many lists. (The separator is used to make this determination.) A single
1304  * list of many items will not cause line wrapping (since there is no
1305  * apparent reason to do so). So the lists of Ulmo's miscellaneous traits
1306  * might look like this:
1307  *
1308  *     Free Action; Hold Life; See Invisible; Slow Digestion; Regeneration
1309  *     Blessed Blade
1310  *
1311  * So comparing the two, "Regeneration" has no trailing separator and
1312  * "Blessed Blade" was not indented. (Also, Ulmo's lists have no headers,
1313  * but that's not relevant to line wrapping and indention.)
1314  */
1315
1316 /* ITEM_SEP separates items within a list */
1317 #define ITEM_SEP ','
1318
1319
1320 /* LIST_SEP separates lists */
1321 #ifdef JP
1322 #define LIST_SEP ','
1323 #else
1324 #define LIST_SEP ';'
1325 #endif
1326
1327 static void spoiler_outlist(cptr header, cptr *list, char separator)
1328 {
1329         int line_len, buf_len;
1330         char line[MAX_LINE_LEN+1], buf[80];
1331
1332         /* Ignore an empty list */
1333         if (*list == NULL) return;
1334
1335         /* This function always indents */
1336         strcpy(line, INDENT1);
1337
1338         /* Create header (if one was given) */
1339         if (header && (header[0]))
1340         {
1341                 strcat(line, header);
1342                 strcat(line, " ");
1343         }
1344
1345         line_len = strlen(line);
1346
1347         /* Now begin the tedious task */
1348         while (1)
1349         {
1350                 /* Copy the current item to a buffer */
1351                 strcpy(buf, *list);
1352
1353                 /* Note the buffer's length */
1354                 buf_len = strlen(buf);
1355
1356                 /*
1357                  * If there is an item following this one, pad with separator and
1358                  * a space and adjust the buffer length
1359                  */
1360
1361                 if (list[1])
1362                 {
1363                         sprintf(buf + buf_len, "%c ", separator);
1364                         buf_len += 2;
1365                 }
1366
1367                 /*
1368                  * If the buffer will fit on the current line, just append the
1369                  * buffer to the line and adjust the line length accordingly.
1370                  */
1371
1372                 if (line_len + buf_len <= MAX_LINE_LEN)
1373                 {
1374                         strcat(line, buf);
1375                         line_len += buf_len;
1376                 }
1377
1378                 /* Apply line wrapping and indention semantics described above */
1379                 else
1380                 {
1381                         /*
1382                          * Don't print a trailing list separator but do print a trailing
1383                          * item separator.
1384                          */
1385                         if (line_len > 1 && line[line_len - 1] == ' '
1386                             && line[line_len - 2] == LIST_SEP)
1387                         {
1388                                 /* Ignore space and separator */
1389                                 line[line_len - 2] = '\0';
1390
1391                                 /* Write to spoiler file */
1392                                 fprintf(fff, "%s\n", line);
1393
1394                                 /* Begin new line at primary indention level */
1395                                 sprintf(line, "%s%s", INDENT1, buf);
1396                         }
1397
1398                         else
1399                         {
1400                                 /* Write to spoiler file */
1401                                 fprintf(fff, "%s\n", line);
1402
1403                                 /* Begin new line at secondary indention level */
1404                                 sprintf(line, "%s%s", INDENT2, buf);
1405                         }
1406
1407                         line_len = strlen(line);
1408                 }
1409
1410                 /* Advance, with break */
1411                 if (!*++list) break;
1412         }
1413
1414         /* Write what's left to the spoiler file */
1415         fprintf(fff, "%s\n", line);
1416 }
1417
1418
1419 /* Create a spoiler file entry for an artifact */
1420
1421 static void spoiler_print_art(obj_desc_list *art_ptr)
1422 {
1423         pval_info_type *pval_ptr = &art_ptr->pval_info;
1424
1425         char buf[80];
1426
1427         /* Don't indent the first line */
1428         fprintf(fff, "%s\n", art_ptr->description);
1429
1430         /* An "empty" pval description indicates that the pval affects nothing */
1431         if (pval_ptr->pval_desc[0])
1432         {
1433                 /* Mention the effects of pval */
1434 #ifdef JP
1435                 sprintf(buf, "%s¤Î½¤Àµ:", pval_ptr->pval_desc);
1436 #else
1437                 sprintf(buf, "%s to", pval_ptr->pval_desc);
1438 #endif
1439                 spoiler_outlist(buf, pval_ptr->pval_affects, ITEM_SEP);
1440         }
1441
1442         /* Now deal with the description lists */
1443
1444 #ifdef JP
1445         spoiler_outlist("ÂÐ:", art_ptr->slays, ITEM_SEP);
1446
1447         spoiler_outlist("Éð´ï°À­:", art_ptr->brands, LIST_SEP);
1448
1449         spoiler_outlist("ÌȱÖ:", art_ptr->immunities, ITEM_SEP);
1450
1451         spoiler_outlist("ÂÑÀ­:", art_ptr->resistances, ITEM_SEP);
1452
1453         spoiler_outlist("°Ý»ý:", art_ptr->sustains, ITEM_SEP);
1454 #else
1455         spoiler_outlist("Slay", art_ptr->slays, ITEM_SEP);
1456
1457         spoiler_outlist("", art_ptr->brands, LIST_SEP);
1458
1459         spoiler_outlist("Immunity to", art_ptr->immunities, ITEM_SEP);
1460
1461         spoiler_outlist("Resist", art_ptr->resistances, ITEM_SEP);
1462
1463         spoiler_outlist("Sustain", art_ptr->sustains, ITEM_SEP);
1464 #endif
1465         spoiler_outlist("", art_ptr->misc_magic, LIST_SEP);
1466
1467
1468         /* Write out the possible activation at the primary indention level */
1469         if (art_ptr->activation)
1470         {
1471 #ifdef JP
1472                 fprintf(fff, "%sȯư: %s\n", INDENT1, art_ptr->activation);
1473 #else
1474                 fprintf(fff, "%sActivates for %s\n", INDENT1, art_ptr->activation);
1475 #endif
1476         }
1477
1478         /* End with the miscellaneous facts */
1479         fprintf(fff, "%s%s\n\n", INDENT1, art_ptr->misc_desc);
1480 }
1481
1482
1483 /*
1484  * Hack -- Create a "forged" artifact
1485  */
1486 static bool make_fake_artifact(object_type *o_ptr, int name1)
1487 {
1488         int i;
1489
1490         artifact_type *a_ptr = &a_info[name1];
1491
1492
1493         /* Ignore "empty" artifacts */
1494         if (!a_ptr->name) return FALSE;
1495
1496         /* Acquire the "kind" index */
1497         i = lookup_kind(a_ptr->tval, a_ptr->sval);
1498
1499         /* Oops */
1500         if (!i) return (FALSE);
1501
1502         /* Create the artifact */
1503         object_prep(o_ptr, i);
1504
1505         /* Save the name */
1506         o_ptr->name1 = name1;
1507
1508         /* Extract the fields */
1509         o_ptr->pval = a_ptr->pval;
1510         o_ptr->ac = a_ptr->ac;
1511         o_ptr->dd = a_ptr->dd;
1512         o_ptr->ds = a_ptr->ds;
1513         o_ptr->to_a = a_ptr->to_a;
1514         o_ptr->to_h = a_ptr->to_h;
1515         o_ptr->to_d = a_ptr->to_d;
1516         o_ptr->weight = a_ptr->weight;
1517
1518         /* Success */
1519         return (TRUE);
1520 }
1521
1522
1523 /*
1524  * Create a spoiler file for artifacts
1525  */
1526 static void spoil_artifact(cptr fname)
1527 {
1528         int i, j;
1529
1530         object_type forge;
1531         object_type *q_ptr;
1532
1533         obj_desc_list artifact;
1534
1535         char buf[1024];
1536
1537
1538         /* Build the filename */
1539         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
1540
1541         /* File type is "TEXT" */
1542         FILE_TYPE(FILE_TYPE_TEXT);
1543
1544         /* Open the file */
1545         fff = my_fopen(buf, "w");
1546
1547         /* Oops */
1548         if (!fff)
1549         {
1550                 msg_print("Cannot create spoiler file.");
1551                 return;
1552         }
1553
1554         /* Dump the header */
1555         print_header();
1556
1557         /* List the artifacts by tval */
1558         for (i = 0; group_artifact[i].tval; i++)
1559         {
1560                 /* Write out the group title */
1561                 if (group_artifact[i].name)
1562                 {
1563                         spoiler_blanklines(2);
1564                         spoiler_underline(group_artifact[i].name);
1565                         spoiler_blanklines(1);
1566                 }
1567
1568                 /* Now search through all of the artifacts */
1569                 for (j = 1; j < max_a_idx; ++j)
1570                 {
1571                         artifact_type *a_ptr = &a_info[j];
1572
1573                         /* We only want objects in the current group */
1574                         if (a_ptr->tval != group_artifact[i].tval) continue;
1575
1576                         /* Get local object */
1577                         q_ptr = &forge;
1578
1579                         /* Wipe the object */
1580                         object_wipe(q_ptr);
1581
1582                         /* Attempt to "forge" the artifact */
1583                         if (!make_fake_artifact(q_ptr, j)) continue;
1584
1585                         /* Analyze the artifact */
1586                         object_analyze(q_ptr, &artifact);
1587
1588                         /* Write out the artifact description to the spoiler file */
1589                         spoiler_print_art(&artifact);
1590                 }
1591         }
1592
1593         /* Check for errors */
1594         if (ferror(fff) || my_fclose(fff))
1595         {
1596                 msg_print("Cannot close spoiler file.");
1597                 return;
1598         }
1599
1600         /* Message */
1601         msg_print("Successfully created a spoiler file.");
1602 }
1603
1604
1605
1606
1607
1608 /*
1609  * Create a spoiler file for monsters   -BEN-
1610  */
1611 static void spoil_mon_desc(cptr fname)
1612 {
1613         int i, n = 0;
1614
1615         u16b why = 2;
1616         s16b *who;
1617
1618         char buf[1024];
1619
1620         char nam[80];
1621         char lev[80];
1622         char rar[80];
1623         char spd[80];
1624         char ac[80];
1625         char hp[80];
1626         char exp[80];
1627
1628         /* Allocate the "who" array */
1629         C_MAKE(who, max_r_idx, s16b);
1630
1631         /* Build the filename */
1632         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
1633
1634         /* File type is "TEXT" */
1635         FILE_TYPE(FILE_TYPE_TEXT);
1636
1637         /* Open the file */
1638         fff = my_fopen(buf, "w");
1639
1640         /* Oops */
1641         if (!fff)
1642         {
1643                 msg_print("Cannot create spoiler file.");
1644                 return;
1645         }
1646
1647         /* Dump the header */
1648
1649 #ifndef FAKE_VERSION
1650         fprintf(fff, "Monster Spoilers for Angband Version %d.%d.%d\n",
1651                 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
1652         fprintf(fff, "------------------------------------------\n\n");
1653 #else
1654         fprintf(fff, "Monster Spoilers for Hengband Version %d.%d.%d\n",
1655                 FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1656         fprintf(fff, "------------------------------------------\n\n");
1657 #endif
1658
1659         /* Dump the header */
1660         fprintf(fff, "    %-38.38s%4s%4s%4s%7s%5s  %11.11s\n",
1661                 "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info");
1662         fprintf(fff, "%-42.42s%4s%4s%4s%7s%5s  %11.11s\n",
1663                 "--------", "---", "---", "---", "--", "--", "-----------");
1664
1665
1666         /* Scan the monsters */
1667         for (i = 1; i < max_r_idx; i++)
1668         {
1669                 monster_race *r_ptr = &r_info[i];
1670
1671                 /* Use that monster */
1672                 if (r_ptr->name) who[n++] = i;
1673         }
1674
1675         /* Select the sort method */
1676         ang_sort_comp = ang_sort_comp_hook;
1677         ang_sort_swap = ang_sort_swap_hook;
1678
1679         /* Sort the array by dungeon depth of monsters */
1680         ang_sort(who, &why, n);
1681
1682         /* Scan again */
1683         for (i = 0; i < n; i++)
1684         {
1685                 monster_race *r_ptr = &r_info[who[i]];
1686
1687                 cptr name = (r_name + r_ptr->name);
1688                 if (r_ptr->flags7 & (RF7_KAGE)) continue;
1689
1690                 /* Get the "name" */
1691 /*              if (r_ptr->flags1 & (RF1_QUESTOR)) */
1692                 if (0)
1693                 {
1694                         sprintf(nam, "[Q] %s", name);
1695                 }
1696                 else if (r_ptr->flags1 & (RF1_UNIQUE))
1697                 {
1698                         sprintf(nam, "[U] %s", name);
1699                 }
1700                 else
1701                 {
1702 #ifdef JP
1703                         sprintf(nam, "    %s", name);
1704 #else
1705                         sprintf(nam, "The %s", name);
1706 #endif
1707                 }
1708
1709
1710                 /* Level */
1711                 sprintf(lev, "%d", r_ptr->level);
1712
1713                 /* Rarity */
1714                 sprintf(rar, "%d", r_ptr->rarity);
1715
1716                 /* Speed */
1717                 if (r_ptr->speed >= 110)
1718                 {
1719                         sprintf(spd, "+%d", (r_ptr->speed - 110));
1720                 }
1721                 else
1722                 {
1723                         sprintf(spd, "-%d", (110 - r_ptr->speed));
1724                 }
1725
1726                 /* Armor Class */
1727                 sprintf(ac, "%d", r_ptr->ac);
1728
1729                 /* Hitpoints */
1730                 if ((r_ptr->flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
1731                 {
1732                         sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside);
1733                 }
1734                 else
1735                 {
1736                         sprintf(hp, "%dd%d", r_ptr->hdice, r_ptr->hside);
1737                 }
1738
1739
1740                 /* Experience */
1741                 sprintf(exp, "%ld", (long)(r_ptr->mexp));
1742
1743                 /* Hack -- use visual instead */
1744                 sprintf(exp, "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char);
1745
1746                 /* Dump the info */
1747                 fprintf(fff, "%-42.42s%4s%4s%4s%7s%5s  %11.11s\n",
1748                         nam, lev, rar, spd, hp, ac, exp);
1749         }
1750
1751         /* End it */
1752         fprintf(fff, "\n");
1753
1754
1755         /* Check for errors */
1756         if (ferror(fff) || my_fclose(fff))
1757         {
1758                 msg_print("Cannot close spoiler file.");
1759                 return;
1760         }
1761
1762         /* Worked */
1763         msg_print("Successfully created a spoiler file.");
1764 }
1765
1766
1767
1768
1769 /*
1770  * Monster spoilers by: smchorse@ringer.cs.utsa.edu (Shawn McHorse)
1771  *
1772  * Primarily based on code already in mon-desc.c, mostly by -BEN-
1773  */
1774
1775 /*
1776  * Pronoun arrays
1777  */
1778 static cptr wd_che[3] =
1779 #ifdef JP
1780 { "¤½¤ì", "Èà", "Èà½÷" };
1781 #else
1782 { "It", "He", "She" };
1783 #endif
1784
1785 #ifndef JP
1786 static cptr wd_lhe[3] =
1787 { "it", "he", "she" };
1788 #endif
1789
1790
1791 /*
1792  * Buffer text to the given file. (-SHAWN-)
1793  * This is basically c_roff() from mon-desc.c with a few changes.
1794  */
1795 static void spoil_out(cptr str)
1796 {
1797         cptr r;
1798
1799         /* Line buffer */
1800         static char roff_buf[256];
1801
1802 #ifdef JP
1803         char iskanji2=0;
1804 #endif
1805         /* Current pointer into line roff_buf */
1806         static char *roff_p = roff_buf;
1807
1808         /* Last space saved into roff_buf */
1809         static char *roff_s = NULL;
1810
1811         /* Special handling for "new sequence" */
1812         if (!str)
1813         {
1814                 if (roff_p != roff_buf) roff_p--;
1815                 while (*roff_p == ' ' && roff_p != roff_buf) roff_p--;
1816                 if (roff_p == roff_buf) fprintf(fff, "\n");
1817                 else
1818                 {
1819                         *(roff_p + 1) = '\0';
1820                         fprintf(fff, "%s\n\n", roff_buf);
1821                 }
1822                 roff_p = roff_buf;
1823                 roff_s = NULL;
1824                 roff_buf[0] = '\0';
1825                 return;
1826         }
1827
1828         /* Scan the given string, character at a time */
1829         for (; *str; str++)
1830         {
1831 #ifdef JP
1832                 char cbak;
1833                 int k_flag = iskanji((unsigned char)(*str));
1834 #endif
1835                 char ch = *str;
1836                 int wrap = (ch == '\n');
1837
1838 #ifdef JP
1839                 if (!isprint(ch) && !k_flag && !iskanji2) ch = ' ';
1840                 if(k_flag && !iskanji2)iskanji2=1;else iskanji2=0;
1841 #else
1842                 if (!isprint(ch)) ch = ' ';
1843 #endif
1844
1845 #ifdef JP
1846                 if ( roff_p >= roff_buf+( (k_flag) ? 74 : 75) ) wrap=1;
1847                 if ((ch == ' ') && (roff_p + 2 >= roff_buf + ((k_flag) ? 74 : 75))) wrap = 1;
1848 #else
1849                 if (roff_p >= roff_buf + 75) wrap = 1;
1850                 if ((ch == ' ') && (roff_p + 2 >= roff_buf + 75)) wrap = 1;
1851 #endif
1852
1853
1854                 /* Handle line-wrap */
1855                 if (wrap)
1856                 {
1857                         *roff_p = '\0';
1858                         r = roff_p;
1859 #ifdef JP
1860                                 cbak=' ';
1861 #endif
1862                         if (roff_s && (ch != ' '))
1863                         {
1864 #ifdef JP
1865                                 cbak=*roff_s;
1866 #endif
1867                                 *roff_s = '\0';
1868                                 r = roff_s + 1;
1869                         }
1870                         fprintf(fff, "%s\n", roff_buf);
1871                         roff_s = NULL;
1872                         roff_p = roff_buf;
1873 #ifdef JP
1874                         if(cbak != ' ') *roff_p++ = cbak; 
1875 #endif
1876                         while (*r) *roff_p++ = *r++;
1877                 }
1878
1879                 /* Save the char */
1880                 if ((roff_p > roff_buf) || (ch != ' '))
1881                 {
1882 #ifdef JP
1883                   if( !k_flag ){
1884                         if (ch == ' ' || ch == '(' ) roff_s = roff_p;
1885                   }
1886                   else{
1887                     if( iskanji2 && 
1888                         strncmp(str, "¡£", 2) != 0 && 
1889                         strncmp(str, "¡¢", 2) != 0 &&
1890                         strncmp(str, "¥£", 2) != 0 &&
1891                         strncmp(str, "¡¼", 2) != 0) roff_s = roff_p;
1892                   }
1893 #else
1894                         if (ch == ' ') roff_s = roff_p;
1895 #endif
1896
1897                         *roff_p++ = ch;
1898                 }
1899         }
1900 }
1901
1902
1903 /*
1904  * Create a spoiler file for monsters (-SHAWN-)
1905  */
1906 static void spoil_mon_info(cptr fname)
1907 {
1908         char buf[1024];
1909         int msex, vn, i, j, k, l, n=0;
1910         bool breath, magic, sin;
1911         cptr p, q;
1912         cptr vp[64];
1913         u32b flags1, flags2, flags3, flags4, flags5, flags6, flags7;
1914
1915         u16b why = 2;
1916         s16b *who;
1917
1918
1919 #ifdef JP
1920         char            jverb_buf[64];
1921 #endif
1922         /* Build the filename */
1923         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
1924
1925         /* File type is "TEXT" */
1926         FILE_TYPE(FILE_TYPE_TEXT);
1927
1928         /* Open the file */
1929         fff = my_fopen(buf, "w");
1930
1931         /* Oops */
1932         if (!fff)
1933         {
1934                 msg_print("Cannot create spoiler file.");
1935                 return;
1936         }
1937
1938
1939         /* Dump the header */
1940 #ifndef FAKE_VERSION
1941         sprintf(buf, "Monster Spoilers for Angband Version %d.%d.%d\n",
1942                 VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
1943 #else
1944         sprintf(buf, "Monster Spoilers for Hengband Version %d.%d.%d\n",
1945              FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
1946 #endif
1947
1948         spoil_out(buf);
1949         spoil_out("------------------------------------------\n\n");
1950
1951         /* Allocate the "who" array */
1952         C_MAKE(who, max_r_idx, s16b);
1953
1954         /* Scan the monsters */
1955         for (i = 1; i < max_r_idx; i++)
1956         {
1957                 monster_race *r_ptr = &r_info[i];
1958
1959                 /* Use that monster */
1960                 if (r_ptr->name) who[n++] = i;
1961         }
1962
1963         /* Select the sort method */
1964         ang_sort_comp = ang_sort_comp_hook;
1965         ang_sort_swap = ang_sort_swap_hook;
1966
1967         /* Sort the array by dungeon depth of monsters */
1968         ang_sort(who, &why, n);
1969
1970
1971         /*
1972          * List all monsters in order
1973          */
1974         for (l = 0; l < n; l++)
1975         {
1976                 monster_race *r_ptr = &r_info[who[l]];
1977
1978                 /* Extract the flags */
1979                 flags1 = r_ptr->flags1;
1980                 flags2 = r_ptr->flags2;
1981                 flags3 = r_ptr->flags3;
1982                 flags4 = r_ptr->flags4;
1983                 flags5 = r_ptr->flags5;
1984                 flags6 = r_ptr->flags6;
1985                 flags7 = r_ptr->flags7;
1986                 breath = FALSE;
1987                 magic = FALSE;
1988
1989                 /* Extract a gender (if applicable) */
1990                 if (flags1 & (RF1_FEMALE)) msex = 2;
1991                 else if (flags1 & (RF1_MALE)) msex = 1;
1992                 else msex = 0;
1993
1994
1995                 /* Prefix */
1996                 if (flags1 & (RF1_QUESTOR))
1997                 {
1998                         spoil_out("[Q] ");
1999                 }
2000                 else if (flags1 & (RF1_UNIQUE))
2001                 {
2002                         spoil_out("[U] ");
2003                 }
2004                 else
2005                 {
2006 #ifndef JP
2007                         spoil_out("The ");
2008 #endif
2009                 }
2010
2011                 /* Name */
2012 #ifdef JP
2013                 sprintf(buf, "%s/%s  (", (r_name + r_ptr->name),(E_r_name+r_ptr->E_name));  /* ---)--- */
2014 #else
2015                 sprintf(buf, "%s  (", (r_name + r_ptr->name));  /* ---)--- */
2016 #endif
2017
2018                 spoil_out(buf);
2019
2020                 /* Color */
2021                 spoil_out(attr_to_text(r_ptr->d_attr));
2022
2023                 /* Symbol --(-- */
2024                 sprintf(buf, " '%c')\n", r_ptr->d_char);
2025                 spoil_out(buf);
2026
2027
2028                 /* Indent */
2029                 sprintf(buf, "=== ");
2030                 spoil_out(buf);
2031
2032                 /* Number */
2033                 sprintf(buf, "Num:%d  ", n);
2034                 spoil_out(buf);
2035
2036                 /* Level */
2037                 sprintf(buf, "Lev:%d  ", r_ptr->level);
2038                 spoil_out(buf);
2039
2040                 /* Rarity */
2041                 sprintf(buf, "Rar:%d  ", r_ptr->rarity);
2042                 spoil_out(buf);
2043
2044                 /* Speed */
2045                 if (r_ptr->speed >= 110)
2046                 {
2047                         sprintf(buf, "Spd:+%d  ", (r_ptr->speed - 110));
2048                 }
2049                 else
2050                 {
2051                         sprintf(buf, "Spd:-%d  ", (110 - r_ptr->speed));
2052                 }
2053                 spoil_out(buf);
2054
2055                 /* Hitpoints */
2056                 if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
2057                 {
2058                         sprintf(buf, "Hp:%d  ", r_ptr->hdice * r_ptr->hside);
2059                 }
2060                 else
2061                 {
2062                         sprintf(buf, "Hp:%dd%d  ", r_ptr->hdice, r_ptr->hside);
2063                 }
2064                 spoil_out(buf);
2065
2066                 /* Armor Class */
2067                 sprintf(buf, "Ac:%d  ", r_ptr->ac);
2068                 spoil_out(buf);
2069
2070                 /* Experience */
2071                 sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp));
2072                 spoil_out(buf);
2073
2074
2075                 /* Describe */
2076                 spoil_out(r_text + r_ptr->text);
2077 #ifdef JP
2078                 spoil_out("¡£ ");
2079 #else
2080                 spoil_out("  ");
2081 #endif
2082
2083
2084
2085 #ifdef JP
2086                 spoil_out("¤³¤Î");
2087
2088 if (flags2 & RF2_ELDRITCH_HORROR) spoil_out("¶¸µ¤¤òͶ¤¦");/*nuke me*/
2089 if (flags3 & RF3_ANIMAL)          spoil_out("¼«Á³³¦¤Î");
2090 if (flags3 & RF3_EVIL)            spoil_out("¼Ù°­¤Ê¤ë");
2091 if (flags3 & RF3_GOOD)            spoil_out("Á±ÎɤÊ");
2092 if (flags3 & RF3_UNDEAD)          spoil_out("¥¢¥ó¥Ç¥Ã¥É¤Î");
2093
2094 if ((flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC | RF3_AMBERITE)) || (flags2 & RF2_QUANTUM))
2095 {
2096      if (flags3 & RF3_DRAGON)   spoil_out("¥É¥é¥´¥ó");
2097      if (flags3 & RF3_DEMON)    spoil_out("¥Ç¡¼¥â¥ó");
2098      if (flags3 & RF3_GIANT)    spoil_out("¥¸¥ã¥¤¥¢¥ó¥È");
2099      if (flags3 & RF3_TROLL)    spoil_out("¥È¥í¥ë");
2100      if (flags3 & RF3_ORC)      spoil_out("¥ª¡¼¥¯");
2101      if (flags3 & RF3_AMBERITE) spoil_out("¥¢¥ó¥Ð¡¼¤Î²¦Â²");/*nuke me*/
2102      if (flags2 & RF2_QUANTUM)  spoil_out("ÎÌ»ÒÀ¸Êª");
2103 }
2104 else                            spoil_out("¥â¥ó¥¹¥¿¡¼");
2105 #else
2106                 spoil_out("This");
2107
2108                 if (flags2 & (RF2_ELDRITCH_HORROR)) spoil_out (" sanity-blasting");
2109                 if (flags3 & (RF3_ANIMAL)) spoil_out(" natural");
2110                 if (flags3 & (RF3_EVIL)) spoil_out(" evil");
2111                 if (flags3 & (RF3_GOOD)) spoil_out(" good");
2112                 if (flags3 & (RF3_UNDEAD)) spoil_out(" undead");
2113
2114                 if (flags3 & (RF3_DRAGON)) spoil_out(" dragon");
2115                 else if (flags3 & (RF3_DEMON)) spoil_out(" demon");
2116                 else if (flags3 & (RF3_GIANT)) spoil_out(" giant");
2117                 else if (flags3 & (RF3_TROLL)) spoil_out(" troll");
2118                 else if (flags3 & (RF3_ORC)) spoil_out(" orc");
2119                 else if (flags3 & (RF3_AMBERITE)) spoil_out (" Amberite");
2120                 else spoil_out(" creature");
2121 #endif
2122
2123
2124 #ifdef JP
2125                 spoil_out("¤Ï");
2126 #else
2127                 spoil_out(" moves");
2128 #endif
2129
2130
2131                 if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25)))
2132                 {
2133 #ifdef JP
2134 spoil_out("¤«¤Ê¤êÉÔµ¬Â§¤Ë");
2135 #else
2136                         spoil_out(" extremely erratically");
2137 #endif
2138
2139                 }
2140                 else if (flags1 & (RF1_RAND_50))
2141                 {
2142 #ifdef JP
2143 spoil_out("´öʬÉÔµ¬Â§¤Ë");
2144 #else
2145                         spoil_out(" somewhat erratically");
2146 #endif
2147
2148                 }
2149                 else if (flags1 & (RF1_RAND_25))
2150                 {
2151 #ifdef JP
2152 spoil_out("¾¯¡¹ÉÔµ¬Â§¤Ë");
2153 #else
2154                         spoil_out(" a bit erratically");
2155 #endif
2156
2157                 }
2158                 else
2159                 {
2160 #ifdef JP
2161 spoil_out("ÉáÄ̤Ë");
2162 #else
2163                         spoil_out(" normally");
2164 #endif
2165
2166                 }
2167
2168 #ifdef JP
2169 spoil_out("Æ°¤¤¤Æ¤¤¤ë");
2170 #endif
2171                 if (flags1 & (RF1_NEVER_MOVE))
2172                 {
2173 #ifdef JP
2174 spoil_out("¤¬¡¢¿¯Æþ¼Ô¤òÄÉÀפ·¤Ê¤¤");
2175 #else
2176                         spoil_out(", but does not deign to chase intruders");
2177 #endif
2178
2179                 }
2180
2181 #ifdef JP
2182                         spoil_out("¤³¤È¤¬¤¢¤ë¡£");
2183 #else
2184                 spoil_out(".  ");
2185 #endif
2186
2187
2188                 if (!r_ptr->level || (flags1 & (RF1_FORCE_DEPTH)))
2189                 {
2190                         sprintf(buf, "%s is never found out of depth.  ", wd_che[msex]);
2191                         spoil_out(buf);
2192                 }
2193
2194                 if (flags1 & (RF1_FORCE_SLEEP))
2195                 {
2196                         sprintf(buf, "%s is always created sluggish.  ", wd_che[msex]);
2197                         spoil_out(buf);
2198                 }
2199
2200                 if (flags2 & (RF2_AURA_FIRE))
2201                 {
2202                         sprintf(buf, "%s is surrounded by flames.  ", wd_che[msex]);
2203                         spoil_out(buf);
2204                 }
2205
2206                 if (flags3 & (RF3_AURA_COLD))
2207                 {
2208                         sprintf(buf, "%s is surrounded by ice.  ", wd_che[msex]);
2209                         spoil_out(buf);
2210                 }
2211
2212                 if (flags2 & (RF2_AURA_ELEC))
2213                 {
2214                         sprintf(buf, "%s is surrounded by electricity.  ", wd_che[msex]);
2215                         spoil_out(buf);
2216                 }
2217
2218                 if (flags2 & (RF2_REFLECTING))
2219                 {
2220                         sprintf(buf, "%s reflects bolt spells.  ", wd_che[msex]);
2221                         spoil_out(buf);
2222                 }
2223
2224                 if (flags1 & (RF1_ESCORT))
2225                 {
2226                         sprintf(buf, "%s usually appears with ", wd_che[msex]);
2227                         spoil_out(buf);
2228                         if (flags1 & (RF1_ESCORTS)) spoil_out("escorts.  ");
2229                         else spoil_out("an escort.  ");
2230                 }
2231
2232                 if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS))
2233                 {
2234                         sprintf(buf, "%s usually appears in groups.  ", wd_che[msex]);
2235                         spoil_out(buf);
2236                 }
2237
2238                 /* Collect inate attacks */
2239                 vn = 0;
2240 #ifdef JP
2241 if (flags4 & RF4_SHRIEK)  vp[vn++] = "ÈáÌĤǽõ¤±¤òµá¤á¤ë";
2242 if (flags4 & RF4_ROCKET)  vp[vn++] = "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë";
2243 if (flags4 & RF4_ARROW_2) vp[vn++] = "¿ô²óÌð¤ò·â¤Ä";
2244 if (flags4 & RF4_ARROW_2) vp[vn++] = "¿ô²óÌð¤ò·â¤Ä";
2245 if (flags4 & RF4_ARROW_4) vp[vn++] = "¿ô²ó¼Í·â¤ò¤¹¤ë";
2246 if (flags4 & RF4_ARROW_4) vp[vn++] = "¿ô²ó¼Í·â¤ò¤¹¤ë";
2247 if (flags6 & (RF6_SPECIAL)) vp[vn++] = "ÆÃÊ̤ʹÔÆ°¤ò¤¹¤ë";
2248 #else
2249                 if (flags4 & RF4_SHRIEK)  vp[vn++] = "shriek for help";
2250                 if (flags4 & RF4_ROCKET)  vp[vn++] = "shoot a rocket";
2251                 if (flags4 & RF4_ARROW_1) vp[vn++] = "fire arrows";
2252                 if (flags4 & RF4_ARROW_2) vp[vn++] = "fire arrows";
2253                 if (flags4 & RF4_ARROW_3) vp[vn++] = "fire missiles";
2254                 if (flags4 & RF4_ARROW_4) vp[vn++] = "fire missiles";
2255                 if (flags6 & (RF6_SPECIAL)) vp[vn++] = "do something";
2256 #endif
2257
2258
2259                 if (vn)
2260                 {
2261 #ifdef JP
2262                         spoil_out(wd_che[msex]);
2263                         spoil_out("¤Ï");
2264 #else
2265                         spoil_out(wd_che[msex]);
2266 #endif
2267
2268                         for (i = 0; i < vn; i++)
2269                         {
2270 #ifdef JP
2271                         if(i!=vn-1){
2272                           jverb3(vp[i],jverb_buf);
2273                           spoil_out(jverb_buf);
2274                           spoil_out("¤ê¡¢");
2275                         }
2276                         else  spoil_out(vp[i]);
2277 #else
2278                                 if (!i) spoil_out(" may ");
2279                                 else if (i < vn-1) spoil_out(", ");
2280                                 else spoil_out(" or ");
2281                                 spoil_out(vp[i]);
2282 #endif
2283
2284                         }
2285 #ifdef JP
2286                         spoil_out("¤³¤È¤¬¤Ç¤­¤ë¡£");
2287 #else
2288                         spoil_out(".  ");
2289 #endif
2290
2291                 }
2292
2293                 /* Collect breaths */
2294                 vn = 0;
2295 #ifdef JP
2296 if (flags4 & (RF4_BR_ACID))             vp[vn++] = "»À";
2297 if (flags4 & (RF4_BR_ELEC))             vp[vn++] = "°ðºÊ";
2298 if (flags4 & (RF4_BR_FIRE))             vp[vn++] = "²Ð±ê";
2299 if (flags4 & (RF4_BR_COLD))             vp[vn++] = "Î䵤";
2300 if (flags4 & (RF4_BR_POIS))             vp[vn++] = "ÆÇ";
2301 if (flags4 & (RF4_BR_NETH))             vp[vn++] = "ÃϹö";
2302 if (flags4 & (RF4_BR_LITE))             vp[vn++] = "Á®¸÷";
2303 if (flags4 & (RF4_BR_DARK))             vp[vn++] = "°Å¹õ";
2304 if (flags4 & (RF4_BR_CONF))             vp[vn++] = "º®Íð";
2305 if (flags4 & (RF4_BR_SOUN))             vp[vn++] = "¹ì²»";
2306 if (flags4 & (RF4_BR_CHAO))             vp[vn++] = "¥«¥ª¥¹";
2307 if (flags4 & (RF4_BR_DISE))             vp[vn++] = "Îô²½";
2308 if (flags4 & (RF4_BR_NEXU))             vp[vn++] = "°ø²Ìº®Íð";
2309 if (flags4 & (RF4_BR_TIME))             vp[vn++] = "»þ´ÖµÕž";
2310 if (flags4 & (RF4_BR_INER))             vp[vn++] = "ÃÙÆß";
2311 if (flags4 & (RF4_BR_GRAV))             vp[vn++] = "½ÅÎÏ";
2312 if (flags4 & (RF4_BR_SHAR))             vp[vn++] = "ÇËÊÒ";
2313 if (flags4 & (RF4_BR_PLAS))             vp[vn++] = "¥×¥é¥º¥Þ";
2314 if (flags4 & (RF4_BR_WALL))             vp[vn++] = "¥Õ¥©¡¼¥¹";
2315 if (flags4 & (RF4_BR_MANA))             vp[vn++] = "ËâÎÏ";
2316 if (flags4 & (RF4_BR_NUKE))             vp[vn++] = "Êü¼ÍÀ­ÇÑ´þʪ";
2317 if (flags4 & (RF4_BR_DISI))             vp[vn++] = "ʬ²ò";
2318 #else
2319                 if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid";
2320                 if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning";
2321                 if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire";
2322                 if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost";
2323                 if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison";
2324                 if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether";
2325                 if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light";
2326                 if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness";
2327                 if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion";
2328                 if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound";
2329                 if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos";
2330                 if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment";
2331                 if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus";
2332                 if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time";
2333                 if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia";
2334                 if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity";
2335                 if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards";
2336                 if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma";
2337                 if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force";
2338                 if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana";
2339                 if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste";
2340                 if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration";
2341 #endif
2342
2343
2344                 if (vn)
2345                 {
2346                         breath = TRUE;
2347 #ifdef JP
2348                         spoil_out(wd_che[msex]);
2349                         spoil_out("¤Ï");
2350 #else
2351                         spoil_out(wd_che[msex]);
2352 #endif
2353
2354 #ifdef JP
2355                         spoil_out("¤Ï");
2356 #endif
2357                         for (i = 0; i < vn; i++)
2358                         {
2359 #ifdef JP
2360                         if ( i != 0 ) spoil_out("¤ä");
2361 #else
2362                                 if (!i) spoil_out(" may breathe ");
2363                                 else if (i < vn-1) spoil_out(", ");
2364                                 else spoil_out(" or ");
2365 #endif
2366
2367                                 spoil_out(vp[i]);
2368                         }
2369 #ifdef JP
2370                         spoil_out("¤Î¥Ö¥ì¥¹¤ò");
2371                         if (flags2 & (RF2_POWERFUL)) spoil_out("¶¯ÎϤË");
2372                         spoil_out("ÅǤ¯¤³¤È¤¬¤¢");
2373 #else
2374                         if (flags2 & (RF2_POWERFUL)) spoil_out(" powerfully");
2375 #endif
2376
2377                 }
2378
2379                 /* Collect spells */
2380                 vn = 0;
2381 #ifdef JP
2382 if (flags5 & (RF5_BA_ACID))         vp[vn++] = "¥¢¥·¥Ã¥É¡¦¥Ü¡¼¥ë¤Î";
2383 if (flags5 & (RF5_BA_ELEC))         vp[vn++] = "¥µ¥ó¥À¡¼¡¦¥Ü¡¼¥ë¤Î";
2384 if (flags5 & (RF5_BA_FIRE))         vp[vn++] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë¤Î";
2385 if (flags5 & (RF5_BA_COLD))         vp[vn++] = "¥¢¥¤¥¹¡¦¥Ü¡¼¥ë¤Î";
2386 if (flags5 & (RF5_BA_POIS))         vp[vn++] = "°­½­±À¤Î";
2387 if (flags5 & (RF5_BA_NETH))         vp[vn++] = "ÃϹöµå¤Î";
2388 if (flags5 & (RF5_BA_WATE))         vp[vn++] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¡¼¥ë¤Î";
2389 if (flags4 & (RF4_BA_NUKE))         vp[vn++] = "Êü¼Íǽµå¤Î";
2390 #else
2391                 if (flags5 & (RF5_BA_ACID))           vp[vn++] = "produce acid balls";
2392                 if (flags5 & (RF5_BA_ELEC))           vp[vn++] = "produce lightning balls";
2393                 if (flags5 & (RF5_BA_FIRE))           vp[vn++] = "produce fire balls";
2394                 if (flags5 & (RF5_BA_COLD))           vp[vn++] = "produce frost balls";
2395                 if (flags5 & (RF5_BA_POIS))           vp[vn++] = "produce poison balls";
2396                 if (flags5 & (RF5_BA_NETH))           vp[vn++] = "produce nether balls";
2397                 if (flags5 & (RF5_BA_WATE))           vp[vn++] = "produce water balls";
2398                 if (flags4 & (RF4_BA_NUKE))           vp[vn++] = "produce balls of radiation";
2399 #endif
2400
2401 #ifdef JP
2402 if (flags5 & (RF5_BA_MANA))         vp[vn++] = "ËâÎϤÎÍò¤Î";
2403 if (flags5 & (RF5_BA_DARK))         vp[vn++] = "°Å¹õ¤ÎÍò¤Î";
2404 if (flags5 & (RF5_BA_LITE))         vp[vn++] = "¥¹¥¿¡¼¥Ð¡¼¥¹¥È¤Î";
2405 if (flags4 & (RF4_BA_CHAO))         vp[vn++] = "½ã¥í¥°¥ë¥¹¤Î";
2406 #else
2407                 if (flags5 & (RF5_BA_MANA))           vp[vn++] = "produce mana storms";
2408                 if (flags5 & (RF5_BA_DARK))           vp[vn++] = "produce darkness storms";
2409                 if (flags4 & (RF5_BA_LITE))           vp[vn++] = "produce starburst";
2410                 if (flags4 & (RF4_BA_CHAO))           vp[vn++] = "invoke raw Logrus";
2411 #endif
2412 #ifdef JP
2413 if (flags6 & (RF6_HAND_DOOM))       vp[vn++] = "ÇËÌǤμê¤Î";
2414 if (flags6 & (RF6_PSY_SPEAR))       vp[vn++] = "¸÷¤Î·õ¤Î";
2415 if (flags5 & (RF5_DRAIN_MANA))      vp[vn++] = "ËâÎϤòµÛ¤¤¼è¤ë";
2416 if (flags5 & (RF5_MIND_BLAST))      vp[vn++] = "Àº¿À¤ò¹¶·â¤¹¤ë";
2417 if (flags5 & (RF5_BRAIN_SMASH))     vp[vn++] = "Ǿ¤ò¹¶·â¤¹¤ë";
2418 if (flags5 & (RF5_CAUSE_1))         vp[vn++] = "·Ú½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë";
2419 if (flags5 & (RF5_CAUSE_2))         vp[vn++] = "½Å½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë";
2420 if (flags5 & (RF5_CAUSE_3))         vp[vn++] = "Ã×Ì¿½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë";
2421 if (flags5 & (RF5_CAUSE_4))         vp[vn++] = "È빦¤òÆͤ¯";
2422 if (flags5 & (RF5_BO_ACID))         vp[vn++] = "¥¢¥·¥Ã¥É¡¦¥Ü¥ë¥È¤Î";
2423 if (flags5 & (RF5_BO_ELEC))         vp[vn++] = "¥µ¥ó¥À¡¼¡¦¥Ü¥ë¥È¤Î";
2424 if (flags5 & (RF5_BO_FIRE))         vp[vn++] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È¤Î";
2425 if (flags5 & (RF5_BO_COLD))         vp[vn++] = "¥¢¥¤¥¹¡¦¥Ü¥ë¥È¤Î";
2426 if (flags5 & (RF5_BO_NETH))         vp[vn++] = "ÃϹö¤ÎÌð¤Î";
2427 if (flags5 & (RF5_BO_WATE))         vp[vn++] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¥ë¥È¤Î";
2428 if (flags5 & (RF5_BO_MANA))         vp[vn++] = "ËâÎϤÎÌð¤Î";
2429 if (flags5 & (RF5_BO_PLAS))         vp[vn++] = "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È¤Î";
2430 if (flags5 & (RF5_BO_ICEE))         vp[vn++] = "¶Ë´¨¤ÎÌð¤Î";
2431 if (flags5 & (RF5_MISSILE))         vp[vn++] = "¥Þ¥¸¥Ã¥¯¥ß¥µ¥¤¥ë¤Î";
2432 if (flags5 & (RF5_SCARE))           vp[vn++] = "¶²Éݤò¸Æ¤Óµ¯¤³¤¹";
2433 if (flags5 & (RF5_BLIND))           vp[vn++] = "Ìܤò¤¯¤é¤Þ¤»¤ë";
2434 if (flags5 & (RF5_CONF))            vp[vn++] = "º®Í𤵤»¤ë";
2435 if (flags5 & (RF5_SLOW))            vp[vn++] = "¸ºÂ®¤µ¤»¤ë";
2436 if (flags5 & (RF5_HOLD))            vp[vn++] = "Ëãá㤵¤»¤ë";
2437 if (flags6 & (RF6_HASTE))           vp[vn++] = "¼«Ê¬¤ò²Ã®¤¹¤ë";
2438 if (flags6 & (RF6_HEAL))            vp[vn++] = "¼«Ê¬¤ò¼£Ìþ¤¹¤ë";
2439 if (flags6 & (RF6_INVULNER))        vp[vn++] = "̵½ý¤Îµå¤Î";
2440 if (flags4 & (RF4_DISPEL))          vp[vn++] = "ËâÎϤò¾Ã¤·µî¤ë";
2441 if (flags6 & (RF6_BLINK))           vp[vn++] = "½Ö»þ¤Ë¾Ã¤¨¤ë";
2442 if (flags6 & (RF6_TPORT))           vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤¹¤ë";
2443 if (flags6 & (RF6_WORLD))           vp[vn++] = "»þ¤ò»ß¤á¤ë";
2444 if (flags6 & (RF6_TELE_TO))         vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤Ç°ú¤­Ì᤹";
2445 if (flags6 & (RF6_TELE_AWAY))       vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë";
2446 if (flags6 & (RF6_TELE_LEVEL))      vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë¤µ¤»¤ë";
2447 if (flags6 & (RF6_DARKNESS))        vp[vn++] = "°Å°Ç¤òºî¤ë";
2448 if (flags6 & (RF6_TRAPS))           vp[vn++] = "¥È¥é¥Ã¥×¤òºî¤ë";
2449 if (flags6 & (RF6_FORGET))          vp[vn++] = "µ­²±¤ò¾Ãµî¤¹¤ë";
2450 if (flags6 & (RF6_RAISE_DEAD))      vp[vn++] = "»à¼Ô¤òᴤ餻¤ë";
2451 if (flags6 & (RF6_S_MONSTER))       vp[vn++] = "°ìÂΤΥâ¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë";
2452 if (flags6 & (RF6_S_MONSTERS))      vp[vn++] = "Ê£¿ô¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë";
2453 if (flags6 & (RF6_S_KIN))           vp[vn++] = "µß±ç¤ò¾¤´­¤¹¤ë";
2454 if (flags6 & (RF6_S_ANT))           vp[vn++] = "¥¢¥ê¤ò¾¤´­¤¹¤ë";
2455 if (flags6 & (RF6_S_SPIDER))        vp[vn++] = "¥¯¥â¤ò¾¤´­¤¹¤ë";
2456 if (flags6 & (RF6_S_HOUND))         vp[vn++] = "¥Ï¥¦¥ó¥É¤ò¾¤´­¤¹¤ë";
2457 if (flags6 & (RF6_S_HYDRA))         vp[vn++] = "¥Ò¥É¥é¤ò¾¤´­¤¹¤ë";
2458 if (flags6 & (RF6_S_ANGEL))         vp[vn++] = "°ìÂΤÎÅ·»È¤ò¾¤´­¤¹¤ë";
2459 if (flags6 & (RF6_S_DEMON))         vp[vn++] = "°ìÂΤΥǡ¼¥â¥ó¤ò¾¤´­¤¹¤ë";
2460 if (flags6 & (RF6_S_UNDEAD))        vp[vn++] = "°ìÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë";
2461 if (flags6 & (RF6_S_DRAGON))        vp[vn++] = "°ìÂΤΥɥ饴¥ó¤ò¾¤´­¤¹¤ë";
2462 if (flags6 & (RF6_S_HI_UNDEAD))     vp[vn++] = "¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë";
2463 if (flags6 & (RF6_S_HI_DRAGON))     vp[vn++] = "¸ÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤¹¤ë";
2464 if (flags6 & (RF6_S_CYBER))         vp[vn++] = "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë";
2465 if (flags6 & (RF6_S_AMBERITES))     vp[vn++] = "¥¢¥ó¥Ð¡¼¤Î²¦¤ò¾¤´­¤¹¤ë";
2466 if (flags6 & (RF6_S_UNIQUE))        vp[vn++] = "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë";
2467 #else
2468                 if (flags6 & (RF6_HAND_DOOM))         vp[vn++] = "invoke the Hand of Doom";
2469                 if (flags6 & (RF6_PSY_SPEAR))         vp[vn++] = "psycho-spear";
2470                 if (flags5 & (RF5_DRAIN_MANA))        vp[vn++] = "drain mana";
2471                 if (flags5 & (RF5_MIND_BLAST))        vp[vn++] = "cause mind blasting";
2472                 if (flags5 & (RF5_BRAIN_SMASH))       vp[vn++] = "cause brain smashing";
2473                 if (flags5 & (RF5_CAUSE_1))           vp[vn++] = "cause light wounds and cursing";
2474                 if (flags5 & (RF5_CAUSE_2))           vp[vn++] = "cause serious wounds and cursing";
2475                 if (flags5 & (RF5_CAUSE_3))           vp[vn++] = "cause critical wounds and cursing";
2476                 if (flags5 & (RF5_CAUSE_4))           vp[vn++] = "cause mortal wounds";
2477                 if (flags5 & (RF5_BO_ACID))           vp[vn++] = "produce acid bolts";
2478                 if (flags5 & (RF5_BO_ELEC))           vp[vn++] = "produce lightning bolts";
2479                 if (flags5 & (RF5_BO_FIRE))           vp[vn++] = "produce fire bolts";
2480                 if (flags5 & (RF5_BO_COLD))           vp[vn++] = "produce frost bolts";
2481                 if (flags5 & (RF5_BO_NETH))           vp[vn++] = "produce nether bolts";
2482                 if (flags5 & (RF5_BO_WATE))           vp[vn++] = "produce water bolts";
2483                 if (flags5 & (RF5_BO_MANA))           vp[vn++] = "produce mana bolts";
2484                 if (flags5 & (RF5_BO_PLAS))           vp[vn++] = "produce plasma bolts";
2485                 if (flags5 & (RF5_BO_ICEE))           vp[vn++] = "produce ice bolts";
2486                 if (flags5 & (RF5_MISSILE))           vp[vn++] = "produce magic missiles";
2487                 if (flags5 & (RF5_SCARE))             vp[vn++] = "terrify";
2488                 if (flags5 & (RF5_BLIND))             vp[vn++] = "blind";
2489                 if (flags5 & (RF5_CONF))              vp[vn++] = "confuse";
2490                 if (flags5 & (RF5_SLOW))              vp[vn++] = "slow";
2491                 if (flags5 & (RF5_HOLD))              vp[vn++] = "paralyze";
2492                 if (flags6 & (RF6_HASTE))             vp[vn++] = "haste-self";
2493                 if (flags6 & (RF6_HEAL))              vp[vn++] = "heal-self";
2494                 if (flags6 & (RF6_INVULNER))          vp[vn++] = "make invulnerable";
2495                 if (flags6 & (RF6_BLINK))             vp[vn++] = "blink-self";
2496                 if (flags6 & (RF6_TPORT))             vp[vn++] = "teleport-self";
2497                 if (flags6 & (RF6_WORLD))             vp[vn++] = "stop the time";
2498                 if (flags6 & (RF6_TELE_TO))           vp[vn++] = "teleport to";
2499                 if (flags6 & (RF6_TELE_AWAY))         vp[vn++] = "teleport away";
2500                 if (flags6 & (RF6_TELE_LEVEL))        vp[vn++] = "teleport level";
2501                 if (flags6 & (RF6_DARKNESS))          vp[vn++] = "create darkness";
2502                 if (flags6 & (RF6_TRAPS))             vp[vn++] = "create traps";
2503                 if (flags6 & (RF6_FORGET))            vp[vn++] = "cause amnesia";
2504                 if (flags6 & (RF6_RAISE_DEAD))        vp[vn++] = "raise dead";
2505                 if (flags6 & (RF6_S_MONSTER))         vp[vn++] = "summon a monster";
2506                 if (flags6 & (RF6_S_MONSTERS))        vp[vn++] = "summon monsters";
2507                 if (flags6 & (RF6_S_KIN))             vp[vn++] = "summon aid";
2508                 if (flags6 & (RF6_S_ANT))             vp[vn++] = "summon ants";
2509                 if (flags6 & (RF6_S_SPIDER))          vp[vn++] = "summon spiders";
2510                 if (flags6 & (RF6_S_HOUND))           vp[vn++] = "summon hounds";
2511                 if (flags6 & (RF6_S_HYDRA))           vp[vn++] = "summon hydras";
2512                 if (flags6 & (RF6_S_ANGEL))           vp[vn++] = "summon an angel";
2513                 if (flags6 & (RF6_S_DEMON))           vp[vn++] = "summon a demon";
2514                 if (flags6 & (RF6_S_UNDEAD))          vp[vn++] = "summon an undead";
2515                 if (flags6 & (RF6_S_DRAGON))          vp[vn++] = "summon a dragon";
2516                 if (flags6 & (RF6_S_HI_UNDEAD))       vp[vn++] = "summon greater undead";
2517                 if (flags6 & (RF6_S_HI_DRAGON))       vp[vn++] = "summon ancient dragons";
2518                 if (flags6 & (RF6_S_CYBER))           vp[vn++] = "summon Cyberdemons";
2519                 if (flags6 & (RF6_S_AMBERITES))       vp[vn++] = "summon Lords of Amber";
2520                 if (flags6 & (RF6_S_UNIQUE))          vp[vn++] = "summon unique monsters";
2521 #endif
2522
2523
2524                 if (vn)
2525                 {
2526                         magic = TRUE;
2527                         if (breath)
2528                         {
2529 #ifdef JP
2530                                 spoil_out("¤ê¡¢¤Ê¤ª¤«¤Ä");
2531 #else
2532                                 spoil_out(", and is also");
2533 #endif
2534
2535                         }
2536                         else
2537                         {
2538 #ifdef JP
2539                                 spoil_out(wd_che[msex]);
2540                                 spoil_out("¤Ï");
2541 #else
2542                                 spoil_out(wd_che[msex]);
2543                                 spoil_out(" is");
2544 #endif
2545
2546                         }
2547
2548 #ifdef JP
2549                         /* Adverb */
2550                         if (flags2 & (RF2_SMART)) spoil_out("Ū³Î¤Ë");
2551
2552                         /* Verb Phrase */
2553                         spoil_out("ËâË¡¤ò»È¤¦¤³¤È¤¬¤Ç¤­¡¢");
2554 #else
2555                         spoil_out(" magical, casting spells");
2556                         if (flags2 & (RF2_SMART)) spoil_out(" intelligently");
2557 #endif
2558
2559
2560                         for (i = 0; i < vn; i++)
2561                         {
2562 #ifdef JP
2563                         if ( i != 0 ) spoil_out("¼öʸ¡¢");
2564 #else
2565                                 if (!i) spoil_out(" which ");
2566                                 else if (i < vn-1) spoil_out(", ");
2567                                 else spoil_out(" or ");
2568 #endif
2569
2570                                 spoil_out(vp[i]);
2571                         }
2572 #ifdef JP
2573                         spoil_out("¼öʸ¤ò¾§¤¨¤ë¤³¤È¤¬¤¢");
2574 #endif
2575                 }
2576
2577                 if (breath || magic)
2578                 {
2579 #ifdef JP
2580                         sprintf(buf, "¤ë(³ÎΨ:Ìó1/%d)¡£",
2581                                 200 / (r_ptr->freq_inate + r_ptr->freq_spell));
2582                         spoil_out(buf);
2583 #else
2584                         sprintf(buf, "; 1 time in %d.  ",
2585                                 200 / (r_ptr->freq_inate + r_ptr->freq_spell));
2586                         spoil_out(buf);
2587 #endif
2588
2589                 }
2590
2591                 /* Collect special abilities. */
2592                 vn = 0;
2593 #ifdef JP
2594 if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2))  vp[vn++] = "¥À¥ó¥¸¥ç¥ó¤ò¾È¤é¤¹";
2595 if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) vp[vn++] = "¸÷¤Ã¤Æ¤¤¤ë";
2596 if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "¥É¥¢¤ò³«¤±¤ë";
2597 if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "¥É¥¢¤òÂǤÁÇˤë";
2598 if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "Êɤò¤¹¤êÈ´¤±¤ë";
2599 if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "Êɤò·¡¤ê¿Ê¤à";
2600 if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "¼å¤¤¥â¥ó¥¹¥¿¡¼¤ò²¡¤·¤Î¤±¤ë";
2601 if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "¼å¤¤¥â¥ó¥¹¥¿¡¼¤òÅݤ¹";
2602 if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦";
2603 if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "¥¢¥¤¥Æ¥à¤ò²õ¤¹";
2604 #else
2605                 if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2))  vp[vn++] = "illuminate the dungeon";
2606                 if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) vp[vn++] = "illuminate the dungeon";
2607                 if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors";
2608                 if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors";
2609                 if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls";
2610                 if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls";
2611                 if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters";
2612                 if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters";
2613                 if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects";
2614                 if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects";
2615 #endif
2616
2617
2618                 if (vn)
2619                 {
2620                         spoil_out(wd_che[msex]);
2621                         for (i = 0; i < vn; i++)
2622                         {
2623 #ifdef JP
2624                         if(i!=vn-1){
2625                           jverb1(vp[i],jverb_buf);
2626                           spoil_out(jverb_buf);
2627                           spoil_out("¡¢");
2628                         }
2629                         else  spoil_out(vp[i]);
2630 #else
2631                                 if (!i) spoil_out(" can ");
2632                                 else if (i < vn-1) spoil_out(", ");
2633                                 else spoil_out(" and ");
2634                                 spoil_out(vp[i]);
2635 #endif
2636
2637                         }
2638                         spoil_out(".  ");
2639                 }
2640
2641                 if (flags2 & (RF2_INVISIBLE))
2642                 {
2643                         spoil_out(wd_che[msex]);
2644 #ifdef JP
2645 spoil_out("¤ÏÆ©ÌÀ¤ÇÌܤ˸«¤¨¤Ê¤¤¡£");
2646 #else
2647                         spoil_out(" is invisible.  ");
2648 #endif
2649
2650                 }
2651                 if (flags2 & (RF2_COLD_BLOOD))
2652                 {
2653                         spoil_out(wd_che[msex]);
2654 #ifdef JP
2655 spoil_out("¤ÏÎä·ìưʪ¤Ç¤¢¤ë¡£");
2656 #else
2657                         spoil_out(" is cold blooded.  ");
2658 #endif
2659
2660                 }
2661                 if (flags2 & (RF2_EMPTY_MIND))
2662                 {
2663                         spoil_out(wd_che[msex]);
2664 #ifdef JP
2665 spoil_out("¤Ï¥Æ¥ì¥Ñ¥·¡¼¤Ç¤Ï´¶ÃΤǤ­¤Ê¤¤¡£");
2666 #else
2667                         spoil_out(" is not detected by telepathy.  ");
2668 #endif
2669
2670                 }
2671                 if (flags2 & (RF2_WEIRD_MIND))
2672                 {
2673                         spoil_out(wd_che[msex]);
2674 #ifdef JP
2675 spoil_out("¤Ï¤Þ¤ì¤Ë¥Æ¥ì¥Ñ¥·¡¼¤Ç´¶ÃΤǤ­¤ë¡£");
2676 #else
2677                         spoil_out(" is rarely detected by telepathy.  ");
2678 #endif
2679
2680                 }
2681                 if (flags2 & (RF2_MULTIPLY))
2682                 {
2683                         spoil_out(wd_che[msex]);
2684 #ifdef JP
2685 spoil_out("¤ÏÇúȯŪ¤ËÁý¿£¤¹¤ë¡£");
2686 #else
2687                         spoil_out(" breeds explosively.  ");
2688 #endif
2689
2690                 }
2691                 if (flags2 & (RF2_REGENERATE))
2692                 {
2693                         spoil_out(wd_che[msex]);
2694 #ifdef JP
2695 spoil_out("¤ÏÁÇÁ᤯ÂÎÎϤò²óÉü¤¹¤ë¡£");
2696 #else
2697                         spoil_out(" regenerates quickly.  ");
2698 #endif
2699
2700                 }
2701
2702                 /* Collect susceptibilities */
2703                 vn = 0;
2704 #ifdef JP
2705 if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "´ä¤ò½üµî¤¹¤ë¤â¤Î";
2706 if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "ÌÀ¤ë¤¤¸÷";
2707 if (flags3 & (RF3_HURT_FIRE)) vp[vn++] = "²Ð";
2708 if (flags3 & (RF3_HURT_COLD)) vp[vn++] = "Î䵤";
2709 #else
2710                 if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "rock remover";
2711                 if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "bright light";
2712                 if (flags3 & (RF3_HURT_FIRE)) vp[vn++] = "fire";
2713                 if (flags3 & (RF3_HURT_COLD)) vp[vn++] = "cold";
2714 #endif
2715
2716
2717                 if (vn)
2718                 {
2719                         spoil_out(wd_che[msex]);
2720                         for (i = 0; i < vn; i++)
2721                         {
2722                                 if (!i) spoil_out(" is hurt by ");
2723                                 else if (i < vn-1) spoil_out(", ");
2724                                 else spoil_out(" and ");
2725                                 spoil_out(vp[i]);
2726                         }
2727                         spoil_out(".  ");
2728                 }
2729
2730                 /* Collect immunities */
2731                 vn = 0;
2732 #ifdef JP
2733 if (flags3 & (RF3_IM_ACID)) vp[vn++] = "»À";
2734 if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "ÅÅ·â";
2735 if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "²Ð";
2736 if (flags3 & (RF3_IM_COLD)) vp[vn++] = "Î䵤";
2737 if (flags3 & (RF3_IM_POIS)) vp[vn++] = "ÆÇ";
2738 #else
2739                 if (flags3 & (RF3_IM_ACID)) vp[vn++] = "acid";
2740                 if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "lightning";
2741                 if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "fire";
2742                 if (flags3 & (RF3_IM_COLD)) vp[vn++] = "cold";
2743                 if (flags3 & (RF3_IM_POIS)) vp[vn++] = "poison";
2744 #endif
2745
2746
2747                 if (vn)
2748                 {
2749                         spoil_out(wd_che[msex]);
2750                         for (i = 0; i < vn; i++)
2751                         {
2752                                 if (!i) spoil_out(" resists ");
2753                                 else if (i < vn-1) spoil_out(", ");
2754                                 else spoil_out(" and ");
2755                                 spoil_out(vp[i]);
2756                         }
2757                         spoil_out(".  ");
2758                 }
2759
2760                 /* Collect resistances */
2761                 vn = 0;
2762 #ifdef JP
2763 if (flags3 & (RF3_RES_NETH)) vp[vn++] = "ÃϹö";
2764 if (flags3 & (RF3_RES_WATE)) vp[vn++] = "¿å";
2765 if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "¥×¥é¥º¥Þ";
2766 if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "°ø²Ìº®Íð";
2767 if (flags3 & (RF3_RES_DISE)) vp[vn++] = "Îô²½";
2768 if (flags3 & (RF3_RES_ALL )) vp[vn++] = "¤¢¤é¤æ¤ë¸ú²Ì";
2769 #else
2770                 if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether";
2771                 if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water";
2772                 if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma";
2773                 if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus";
2774                 if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment";
2775                 if (flags3 & (RF3_RES_ALL )) vp[vn++] = "all";
2776 #endif
2777
2778                 if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation";
2779 #ifdef JP
2780 if ((flags3 & RF3_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È";
2781 #else
2782                 if ((flags3 & RF3_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "teleportation";
2783 #endif
2784
2785
2786                 if (vn)
2787                 {
2788                         spoil_out(wd_che[msex]);
2789                         for (i = 0; i < vn; i++)
2790                         {
2791                                 if (!i) spoil_out(" resists ");
2792                                 else if (i < vn-1) spoil_out(", ");
2793                                 else spoil_out(" and ");
2794                                 spoil_out(vp[i]);
2795                         }
2796                         spoil_out(".  ");
2797                 }
2798
2799                 /* Collect non-effects */
2800                 vn = 0;
2801 #ifdef JP
2802 if (flags3 & (RF3_NO_STUN)) vp[vn++] = "Û¯Û°¤È¤·¤Ê¤¤";
2803 if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "¶²Éݤò´¶¤¸¤Ê¤¤";
2804 if (flags3 & (RF3_NO_CONF)) vp[vn++] = "º®Í𤷤ʤ¤";
2805 if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "̲¤é¤µ¤ì¤Ê¤¤";
2806 if ((flags3 & RF3_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Ê¤¤";
2807 #else
2808                 if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned";
2809                 if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened";
2810                 if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused";
2811                 if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept";
2812                 if ((flags3 & RF3_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "teleported";
2813 #endif
2814
2815
2816                 if (vn)
2817                 {
2818                         spoil_out(wd_che[msex]);
2819                         for (i = 0; i < vn; i++)
2820                         {
2821                                 if (!i) spoil_out(" cannot be ");
2822                                 else if (i < vn-1) spoil_out(", ");
2823                                 else spoil_out(" or ");
2824                                 spoil_out(vp[i]);
2825                         }
2826                         spoil_out(".  ");
2827                 }
2828
2829                 spoil_out(wd_che[msex]);
2830 #ifdef JP
2831 spoil_out("¤Ï¿¯Æþ¼Ô");
2832 if (r_ptr->sleep > 200)     spoil_out("¤ò̵»ë¤·¤¬¤Á¤Ç¤¢¤ë¤¬");
2833 else if (r_ptr->sleep > 95) spoil_out("¤ËÂФ·¤Æ¤Û¤È¤ó¤ÉÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬");
2834 else if (r_ptr->sleep > 75) spoil_out("¤ËÂФ·¤Æ¤¢¤Þ¤êÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬");
2835 else if (r_ptr->sleep > 45) spoil_out("¤ò¸«²á¤´¤·¤¬¤Á¤Ç¤¢¤ë¤¬");
2836 else if (r_ptr->sleep > 25) spoil_out("¤ò¤Û¤ó¤Î¾¯¤·¤Ï¸«¤Æ¤ª¤ê");
2837 else if (r_ptr->sleep > 10) spoil_out("¤ò¤·¤Ð¤é¤¯¤Ï¸«¤Æ¤ª¤ê");
2838 else if (r_ptr->sleep > 5)  spoil_out("¤ò´öʬÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê");
2839 else if (r_ptr->sleep > 3)  spoil_out("¤òÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê");
2840 else if (r_ptr->sleep > 1)  spoil_out("¤ò¤«¤Ê¤êÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê");
2841 else if (r_ptr->sleep > 0)  spoil_out("¤ò·Ù²ü¤·¤Æ¤ª¤ê");
2842 else spoil_out("¤ò¤«¤Ê¤ê·Ù²ü¤·¤Æ¤ª¤ê");
2843 spoil_out("¡¢");
2844 sprintf(buf, " %d ¥Õ¥£¡¼¥ÈÀ褫¤é¿¯Æþ¼Ô¤Ëµ¤ÉÕ¤¯¤³¤È¤¬¤¢¤ë¡£",
2845         10 * r_ptr->aaf);
2846         spoil_out(buf);
2847 #else
2848                 if (r_ptr->sleep > 200)     spoil_out(" prefers to ignore");
2849                 else if (r_ptr->sleep > 95) spoil_out(" pays very little attention to");
2850                 else if (r_ptr->sleep > 75) spoil_out(" pays little attention to");
2851                 else if (r_ptr->sleep > 45) spoil_out(" tends to overlook");
2852                 else if (r_ptr->sleep > 25) spoil_out(" takes quite a while to see");
2853                 else if (r_ptr->sleep > 10) spoil_out(" takes a while to see");
2854                 else if (r_ptr->sleep > 5)  spoil_out(" is fairly observant of");
2855                 else if (r_ptr->sleep > 3)  spoil_out(" is observant of");
2856                 else if (r_ptr->sleep > 1)  spoil_out(" is very observant of");
2857                 else if (r_ptr->sleep > 0)  spoil_out(" is vigilant for");
2858                 else spoil_out(" is ever vigilant for");
2859
2860                 sprintf(buf, " intruders, which %s may notice from %d feet.  ",
2861                         wd_lhe[msex], 10 * r_ptr->aaf);
2862                 spoil_out(buf);
2863 #endif
2864
2865
2866                 i = 0;
2867                 if (flags1 & (RF1_DROP_60)) i += 1;
2868                 if (flags1 & (RF1_DROP_90)) i += 2;
2869                 if (flags1 & (RF1_DROP_1D2)) i += 2;
2870                 if (flags1 & (RF1_DROP_2D2)) i += 4;
2871                 if (flags1 & (RF1_DROP_3D2)) i += 6;
2872                 if (flags1 & (RF1_DROP_4D2)) i += 8;
2873
2874                 /* Drops gold and/or items */
2875                 if (i)
2876                 {
2877                         sin = FALSE;
2878                         spoil_out(wd_che[msex]);
2879                         spoil_out(" will carry");
2880
2881                         if (i == 1)
2882                         {
2883                                 spoil_out(" a"); sin = TRUE;
2884                         }
2885                         else if (i == 2)
2886                         {
2887                                 spoil_out(" one or two");
2888                                 sin = TRUE;
2889                         }
2890                         else
2891                         {
2892                                 sprintf(buf, " up to %u", i);
2893                                 spoil_out(buf);
2894                         }
2895
2896                         if (flags1 & (RF1_DROP_GREAT))
2897                         {
2898                                 if (sin) spoil_out("n");
2899                                 spoil_out(" exceptional object");
2900                         }
2901                         else if (flags1 & (RF1_DROP_GOOD))
2902                         {
2903                                 spoil_out(" good object");
2904                         }
2905                         else if (flags1 & (RF1_DROP_USEFUL))
2906                         {
2907                                 spoil_out(" useful object");
2908                         }
2909                         else if (flags1 & (RF1_ONLY_ITEM))
2910                         {
2911                                 spoil_out(" object");
2912                         }
2913                         else if (flags1 & (RF1_ONLY_GOLD))
2914                         {
2915                                 spoil_out(" treasure");
2916                         }
2917                         else
2918                         {
2919                                 spoil_out(" object");
2920                                 if (i > 1) spoil_out("s");
2921                                 spoil_out(" or treasure");
2922                         }
2923                         if (i > 1) spoil_out("s");
2924
2925                         if (flags1 & (RF1_DROP_CHOSEN))
2926                         {
2927                                 spoil_out(", in addition to chosen objects");
2928                         }
2929
2930                         spoil_out(".  ");
2931                 }
2932
2933                 /* Count the actual attacks */
2934                 for (i = 0, j = 0; j < 4; j++)
2935                 {
2936                         if (r_ptr->blow[j].method) i++;
2937                 }
2938
2939                 /* Examine the actual attacks */
2940                 for (k = 0, j = 0; j < 4; j++)
2941                 {
2942                         if (!r_ptr->blow[j].method) continue;
2943
2944                         /* No method yet */
2945                         p = "???";
2946
2947                         /* Acquire the method */
2948                         switch (r_ptr->blow[j].method)
2949                         {
2950 #ifdef JP
2951 case RBM_HIT:           p = "²¥¤ë"; break;
2952 case RBM_TOUCH:         p = "¿¨¤ë"; break;
2953 case RBM_PUNCH:         p = "¥Ñ¥ó¥Á¤¹¤ë"; break;
2954 case RBM_KICK:          p = "½³¤ë"; break;
2955 case RBM_CLAW:          p = "¤Ò¤Ã¤«¤¯"; break;
2956 case RBM_BITE:          p = "³ú¤à"; break;
2957 case RBM_STING:         p = "»É¤¹"; break;
2958 case RBM_SLASH:         p = "»Â¤ë"; break;
2959 #else
2960                                 case RBM_HIT:    p = "hit"; break;
2961                                 case RBM_TOUCH:  p = "touch"; break;
2962                                 case RBM_PUNCH:  p = "punch"; break;
2963                                 case RBM_KICK:   p = "kick"; break;
2964                                 case RBM_CLAW:   p = "claw"; break;
2965                                 case RBM_BITE:   p = "bite"; break;
2966                                 case RBM_STING:  p = "sting"; break;
2967                                 case RBM_SLASH:  p = "slash"; break;
2968 #endif
2969 #ifdef JP
2970 case RBM_BUTT:          p = "³Ñ¤ÇÆͤ¯"; break;
2971 case RBM_CRUSH:         p = "ÂÎÅö¤¿¤ê¤¹¤ë"; break;
2972 case RBM_ENGULF:        p = "°û¤ß¹þ¤à"; break;
2973 case RBM_CHARGE:        p = "ÀÁµá½ñ¤ò¤è¤³¤¹"; break;
2974 case RBM_CRAWL:         p = "ÂΤξå¤òÇ礤²ó¤ë"; break;
2975 case RBM_DROOL:         p = "¤è¤À¤ì¤ò¤¿¤é¤¹"; break;
2976 case RBM_SPIT:          p = "¤Ä¤Ð¤òÅǤ¯"; break;
2977 case RBM_EXPLODE:       p = "Çúȯ¤¹¤ë"; break;
2978 case RBM_GAZE:          p = "¤Ë¤é¤à"; break;
2979 case RBM_WAIL:          p = "µã¤­¶«¤Ö"; break;
2980 case RBM_SPORE:         p = "˦»Ò¤òÈô¤Ð¤¹"; break;
2981 #else
2982                                 case RBM_BUTT:   p = "butt"; break;
2983                                 case RBM_CRUSH:  p = "crush"; break;
2984                                 case RBM_ENGULF: p = "engulf"; break;
2985                                 case RBM_CHARGE: p = "charge";  break;
2986                                 case RBM_CRAWL:  p = "crawl on you"; break;
2987                                 case RBM_DROOL:  p = "drool on you"; break;
2988                                 case RBM_SPIT:   p = "spit"; break;
2989                                 case RBM_EXPLODE: p = "explode";  break;
2990                                 case RBM_GAZE:   p = "gaze"; break;
2991                                 case RBM_WAIL:   p = "wail"; break;
2992                                 case RBM_SPORE:  p = "release spores"; break;
2993 #endif
2994
2995                                 case RBM_XXX4:   break;
2996 #ifdef JP
2997 case RBM_BEG:           p = "¶â¤ò¤»¤¬¤à"; break;
2998 case RBM_INSULT:        p = "Éî¿«¤¹¤ë"; break;
2999 case RBM_MOAN:          p = "¤¦¤á¤¯"; break;
3000 case RBM_SHOW:          p = "²Î¤¦"; break;
3001 #else
3002                                 case RBM_BEG:    p = "beg"; break;
3003                                 case RBM_INSULT: p = "insult"; break;
3004                                 case RBM_MOAN:   p = "moan"; break;
3005                                 case RBM_SHOW:   p = "sing"; break;
3006 #endif
3007
3008                         }
3009
3010
3011                         /* Default effect */
3012                         q = "???";
3013
3014                         /* Acquire the effect */
3015                         switch (r_ptr->blow[j].effect)
3016                         {
3017 #ifdef JP
3018 case RBE_SUPERHURT:
3019 case RBE_HURT:          q = "¹¶·â¤¹¤ë"; break;
3020 case RBE_POISON:        q = "ÆǤò¤¯¤é¤ï¤¹"; break;
3021 case RBE_UN_BONUS:      q = "Îô²½¤µ¤»¤ë"; break;
3022 case RBE_UN_POWER:      q = "ËâÎϤòµÛ¤¤¼è¤ë"; break;
3023 case RBE_EAT_GOLD:      q = "¶â¤òÅð¤à"; break;
3024 case RBE_EAT_ITEM:      q = "¥¢¥¤¥Æ¥à¤òÅð¤à"; break;
3025 case RBE_EAT_FOOD:      q = "¤¢¤Ê¤¿¤Î¿©ÎÁ¤ò¿©¤Ù¤ë"; break;
3026 case RBE_EAT_LITE:      q = "ÌÀ¤«¤ê¤òµÛ¼ý¤¹¤ë"; break;
3027 case RBE_ACID:          q = "»À¤òÈô¤Ð¤¹"; break;
3028 case RBE_ELEC:          q = "´¶ÅŤµ¤»¤ë"; break;
3029 #else
3030                                 case RBE_SUPERHURT:
3031                                 case RBE_HURT:          q = "attack"; break;
3032                                 case RBE_POISON:        q = "poison"; break;
3033                                 case RBE_UN_BONUS:      q = "disenchant"; break;
3034                                 case RBE_UN_POWER:      q = "drain charges"; break;
3035                                 case RBE_EAT_GOLD:      q = "steal gold"; break;
3036                                 case RBE_EAT_ITEM:      q = "steal items"; break;
3037                                 case RBE_EAT_FOOD:      q = "eat your food"; break;
3038                                 case RBE_EAT_LITE:      q = "absorb light"; break;
3039                                 case RBE_ACID:          q = "shoot acid"; break;
3040                                 case RBE_ELEC:          q = "electrocute"; break;
3041 #endif
3042
3043 #ifdef JP
3044 case RBE_FIRE:          q = "dz¤ä¤¹"; break;
3045 case RBE_COLD:          q = "Åà¤é¤»¤ë"; break;
3046 case RBE_BLIND:         q = "ÌÕÌܤˤ¹¤ë"; break;
3047 case RBE_CONFUSE:       q = "º®Í𤵤»¤ë"; break;
3048 case RBE_TERRIFY:       q = "¶²Éݤµ¤»¤ë"; break;
3049 case RBE_PARALYZE:      q = "Ëãá㤵¤»¤ë"; break;
3050 case RBE_LOSE_STR:      q = "ÏÓÎϤò¸º¾¯¤µ¤»¤ë"; break;
3051 case RBE_LOSE_INT:      q = "ÃÎǽ¤ò¸º¾¯¤µ¤»¤ë"; break;
3052 case RBE_LOSE_WIS:      q = "¸­¤µ¤ò¸º¾¯¤µ¤»¤ë"; break;
3053 case RBE_LOSE_DEX:      q = "´ïÍѤµ¤ò¸º¾¯¤µ¤»¤ë"; break;
3054 case RBE_LOSE_CON:      q = "Âѵ×ÎϤò¸º¾¯¤µ¤»¤ë"; break;
3055 case RBE_LOSE_CHR:      q = "Ì¥ÎϤò¸º¾¯¤µ¤»¤ë"; break;
3056 case RBE_LOSE_ALL:      q = "Á´¥¹¥Æ¡¼¥¿¥¹¤ò¸º¾¯¤µ¤»¤ë"; break;
3057 case RBE_SHATTER:       q = "Ê´ºÕ¤¹¤ë"; break;
3058 case RBE_EXP_10:        q = "·Ð¸³Ãͤò¸º¾¯(10d6+)¤µ¤»¤ë"; break;
3059 case RBE_EXP_20:        q = "·Ð¸³Ãͤò¸º¾¯(20d6+)¤µ¤»¤ë"; break;
3060 case RBE_EXP_40:        q = "·Ð¸³Ãͤò¸º¾¯(40d6+)¤µ¤»¤ë"; break;
3061 case RBE_EXP_80:        q = "·Ð¸³Ãͤò¸º¾¯(80d6+)¤µ¤»¤ë"; break;
3062 case RBE_DISEASE:       q = "ɵ¤¤Ë¤¹¤ë"; break;
3063 case RBE_TIME:          q = "»þ´ÖµÕž"; break;
3064 case RBE_EXP_VAMP:      q = "À¸Ì¿ÎϤòµÛ¼ý¤¹¤ë"; break;
3065 case RBE_DR_MANA:       q = "ËâÎϤòÃ¥¤¦"; break;
3066 #else
3067                                 case RBE_FIRE:          q = "burn"; break;
3068                                 case RBE_COLD:          q = "freeze"; break;
3069                                 case RBE_BLIND:         q = "blind"; break;
3070                                 case RBE_CONFUSE:       q = "confuse"; break;
3071                                 case RBE_TERRIFY:       q = "terrify"; break;
3072                                 case RBE_PARALYZE:      q = "paralyze"; break;
3073                                 case RBE_LOSE_STR:      q = "reduce strength"; break;
3074                                 case RBE_LOSE_INT:      q = "reduce intelligence"; break;
3075                                 case RBE_LOSE_WIS:      q = "reduce wisdom"; break;
3076                                 case RBE_LOSE_DEX:      q = "reduce dexterity"; break;
3077                                 case RBE_LOSE_CON:      q = "reduce constitution"; break;
3078                                 case RBE_LOSE_CHR:      q = "reduce charisma"; break;
3079                                 case RBE_LOSE_ALL:      q = "reduce all stats"; break;
3080                                 case RBE_SHATTER:       q = "shatter"; break;
3081                                 case RBE_EXP_10:        q = "lower experience (by 10d6+)"; break;
3082                                 case RBE_EXP_20:        q = "lower experience (by 20d6+)"; break;
3083                                 case RBE_EXP_40:        q = "lower experience (by 40d6+)"; break;
3084                                 case RBE_EXP_80:        q = "lower experience (by 80d6+)"; break;
3085                                 case RBE_DISEASE:       q = "disease"; break;
3086                                 case RBE_TIME:          q = "time"; break;
3087                                 case RBE_EXP_VAMP:      q = "drain life force"; break;
3088                                 case RBE_DR_MANA:       q = "drain mana force"; break;
3089 #endif
3090                         }
3091
3092
3093                         if (!k)
3094                         {
3095                                 spoil_out(wd_che[msex]);
3096                                 spoil_out(" can ");
3097                         }
3098                         else if (k < i-1)
3099                         {
3100                                 spoil_out(", ");
3101                         }
3102                         else
3103                         {
3104                                 spoil_out(", and ");
3105                         }
3106
3107                         /* Describe the method */
3108                         spoil_out(p);
3109
3110                         /* Describe the effect, if any */
3111                         if (r_ptr->blow[j].effect)
3112                         {
3113                                 spoil_out(" to ");
3114                                 spoil_out(q);
3115                                 if (r_ptr->blow[j].d_dice && r_ptr->blow[j].d_side)
3116                                 {
3117                                         spoil_out(" with damage");
3118                                         if (r_ptr->blow[j].d_side == 1)
3119                                                 sprintf(buf, " %d", r_ptr->blow[j].d_dice);
3120                                         else
3121                                                 sprintf(buf, " %dd%d",
3122                                                 r_ptr->blow[j].d_dice, r_ptr->blow[j].d_side);
3123                                         spoil_out(buf);
3124                                 }
3125                         }
3126
3127                         k++;
3128                 }
3129
3130                 if (k)
3131                 {
3132                         spoil_out(".  ");
3133                 }
3134                 else if (flags1 & (RF1_NEVER_BLOW))
3135                 {
3136                         sprintf(buf, "%s has no physical attacks.  ", wd_che[msex]);
3137                         spoil_out(buf);
3138                 }
3139
3140                 spoil_out(NULL);
3141         }
3142
3143         /* Check for errors */
3144         if (ferror(fff) || my_fclose(fff))
3145         {
3146                 msg_print("Cannot close spoiler file.");
3147                 return;
3148         }
3149
3150         msg_print("Successfully created a spoiler file.");
3151 }
3152
3153
3154
3155
3156
3157
3158 /*
3159  * Forward declare
3160  */
3161 extern void do_cmd_spoilers(void);
3162
3163 /*
3164  * Create Spoiler files -BEN-
3165  */
3166 void do_cmd_spoilers(void)
3167 {
3168         int i;
3169
3170
3171         /* Save the screen */
3172         screen_save();
3173
3174
3175         /* Drop priv's */
3176         safe_setuid_drop();
3177
3178
3179         /* Interact */
3180         while (1)
3181         {
3182                 /* Clear screen */
3183                 Term_clear();
3184
3185                 /* Info */
3186                 prt("Create a spoiler file.", 2, 0);
3187
3188                 /* Prompt for a file */
3189                 prt("(1) Brief Object Info (obj-desc.spo)", 5, 5);
3190                 prt("(2) Brief Artifact Info (artifact.spo)", 6, 5);
3191                 prt("(3) Brief Monster Info (mon-desc.spo)", 7, 5);
3192                 prt("(4) Full Monster Info (mon-info.spo)", 8, 5);
3193
3194                 /* Prompt */
3195 #ifdef JP
3196 prt("¥³¥Þ¥ó¥É:", 18, 0);
3197 #else
3198                 prt("Command: ", 12, 0);
3199 #endif
3200
3201
3202                 /* Get a choice */
3203                 i = inkey();
3204
3205                 /* Escape */
3206                 if (i == ESCAPE)
3207                 {
3208                         break;
3209                 }
3210
3211                 /* Option (1) */
3212                 else if (i == '1')
3213                 {
3214                         spoil_obj_desc("obj-desc.spo");
3215                 }
3216
3217                 /* Option (2) */
3218                 else if (i == '2')
3219                 {
3220                         spoil_artifact("artifact.spo");
3221                 }
3222
3223                 /* Option (3) */
3224                 else if (i == '3')
3225                 {
3226                         spoil_mon_desc("mon-desc.spo");
3227                 }
3228
3229                 /* Option (4) */
3230                 else if (i == '4')
3231                 {
3232                         spoil_mon_info("mon-info.spo");
3233                 }
3234
3235                 /* Oops */
3236                 else
3237                 {
3238                         bell();
3239                 }
3240
3241                 /* Flush messages */
3242                 msg_print(NULL);
3243         }
3244
3245
3246         /* Grab priv's */
3247         safe_setuid_grab();
3248
3249
3250         /* Restore the screen */
3251         screen_load();
3252 }
3253
3254 /*
3255  * Fill in an object description structure for a given object
3256  */
3257 static void random_artifact_analyze(object_type *o_ptr, obj_desc_list *desc_ptr)
3258 {
3259         analyze_general(o_ptr, desc_ptr->description);
3260         analyze_pval(o_ptr, &desc_ptr->pval_info);
3261         analyze_brand(o_ptr, desc_ptr->brands);
3262         analyze_slay(o_ptr, desc_ptr->slays);
3263         analyze_immune(o_ptr, desc_ptr->immunities);
3264         analyze_resist(o_ptr, desc_ptr->resistances);
3265         analyze_sustains(o_ptr, desc_ptr->sustains);
3266         analyze_misc_magic(o_ptr, desc_ptr->misc_magic);
3267         desc_ptr->activation = item_activation(o_ptr);
3268 #ifdef JP
3269         sprintf(desc_ptr->misc_desc, "½Å¤µ %d.%d kg",
3270                 lbtokg1(o_ptr->weight), lbtokg2(o_ptr->weight));
3271 #else
3272         sprintf(desc_ptr->misc_desc, "Weight %d.%d lbs",
3273                 o_ptr->weight / 10, o_ptr->weight % 10);
3274 #endif
3275 }
3276
3277 /* Create a spoiler file entry for an artifact */
3278
3279 static void spoiler_print_randart(object_type *o_ptr, obj_desc_list *art_ptr)
3280 {
3281         pval_info_type *pval_ptr = &art_ptr->pval_info;
3282
3283         char buf[80];
3284
3285         /* Don't indent the first line */
3286         fprintf(fff, "%s\n", art_ptr->description);
3287         
3288         /* unidentified */
3289         if (!(o_ptr->ident & (IDENT_MENTAL)))
3290         {
3291 #ifdef JP
3292                 fprintf(fff, "%sÉÔÌÀ\n",INDENT1);
3293 #else
3294                 fprintf(fff, "%sUnknown\n",INDENT1);
3295 #endif
3296         }
3297         else {
3298                 /* An "empty" pval description indicates that the pval affects nothing */
3299                 if (pval_ptr->pval_desc[0])
3300                 {
3301                         /* Mention the effects of pval */
3302 #ifdef JP
3303                         sprintf(buf, "%s¤Î½¤Àµ:", pval_ptr->pval_desc);
3304 #else
3305                         sprintf(buf, "%s to", pval_ptr->pval_desc);
3306 #endif
3307                         spoiler_outlist(buf, pval_ptr->pval_affects, ITEM_SEP);
3308                 }
3309           
3310                 /* Now deal with the description lists */
3311
3312 #ifdef JP
3313                 spoiler_outlist("ÂÐ:", art_ptr->slays, ITEM_SEP);
3314                 spoiler_outlist("Éð´ï°À­:", art_ptr->brands, LIST_SEP);
3315                 spoiler_outlist("ÌȱÖ:", art_ptr->immunities, ITEM_SEP);
3316                 spoiler_outlist("ÂÑÀ­:", art_ptr->resistances, ITEM_SEP);
3317                 spoiler_outlist("°Ý»ý:", art_ptr->sustains, ITEM_SEP);
3318 #else
3319                 spoiler_outlist("Slay", art_ptr->slays, ITEM_SEP);
3320                 spoiler_outlist("", art_ptr->brands, LIST_SEP);
3321                 spoiler_outlist("Immunity to", art_ptr->immunities, ITEM_SEP);
3322                 spoiler_outlist("Resist", art_ptr->resistances, ITEM_SEP);
3323                 spoiler_outlist("Sustain", art_ptr->sustains, ITEM_SEP);
3324 #endif
3325                 spoiler_outlist("", art_ptr->misc_magic, LIST_SEP);
3326
3327                 /* Write out the possible activation at the primary indention level */
3328                 if (art_ptr->activation)
3329                 {
3330 #ifdef JP
3331                         fprintf(fff, "%sȯư: %s\n", INDENT1, art_ptr->activation);
3332 #else
3333                         fprintf(fff, "%sActivates for %s\n", INDENT1, art_ptr->activation);
3334 #endif
3335                 }
3336         }
3337         /* End with the miscellaneous facts */
3338         fprintf(fff, "%s%s\n\n", INDENT1, art_ptr->misc_desc);
3339 }
3340
3341 /* Create a part of file for random artifacts */
3342
3343 static void spoil_random_artifact_aux(object_type *o_ptr, int i)
3344 {
3345         obj_desc_list artifact;
3346
3347         if (!object_known_p(o_ptr) || !o_ptr->art_name
3348                 || o_ptr->tval != group_artifact[i].tval)
3349                 return;
3350
3351         /* Analyze the artifact */
3352         random_artifact_analyze(o_ptr, &artifact);
3353
3354         /* Write out the artifact description to the spoiler file */
3355         spoiler_print_randart(o_ptr, &artifact);
3356 }
3357
3358 /*
3359  * Create a list file for random artifacts
3360  */
3361 void spoil_random_artifact(cptr fname)
3362 {
3363         int i,j;
3364
3365         store_type  *st_ptr;
3366         object_type *q_ptr;
3367
3368         char buf[1024];
3369
3370
3371         /* Build the filename */
3372         path_build(buf, 1024, ANGBAND_DIR_USER, fname);
3373
3374         /* File type is "TEXT" */
3375         FILE_TYPE(FILE_TYPE_TEXT);
3376
3377         /* Open the file */
3378         fff = my_fopen(buf, "w");
3379
3380         /* Oops */
3381         if (!fff)
3382         {
3383                 msg_print("Cannot create list file.");
3384                 return;
3385         }
3386
3387         /* Dump the header */
3388         sprintf(buf, "Random artifacts list.\r");
3389         spoiler_underline(buf);
3390
3391         /* List the artifacts by tval */
3392         for (j = 0; group_artifact[j].tval; j++)
3393         {
3394                 /* random artifacts wielding */
3395                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3396                 {
3397                         q_ptr = &inventory[i];
3398                         spoil_random_artifact_aux(q_ptr, j);
3399                 }
3400
3401                 /* random artifacts in inventory */
3402                 for (i = 0; i < INVEN_PACK; i++)
3403                 {
3404                         q_ptr = &inventory[i];
3405                         spoil_random_artifact_aux(q_ptr, j);
3406                 }
3407
3408                 /* random artifacts in home */
3409                 st_ptr = &town[1].store[STORE_HOME];
3410                 for (i = 0; i < st_ptr->stock_num; i++)
3411                 {
3412                         q_ptr = &st_ptr->stock[i];
3413                         spoil_random_artifact_aux(q_ptr, j);
3414                 }
3415
3416                 /* random artifacts in museum */
3417                 st_ptr = &town[1].store[STORE_MUSEUM];
3418                 for (i = 0; i < st_ptr->stock_num; i++)
3419                 {
3420                         q_ptr = &st_ptr->stock[i];
3421                         spoil_random_artifact_aux(q_ptr, j);
3422                 }
3423         }
3424
3425         /* Check for errors */
3426         if (ferror(fff) || my_fclose(fff))
3427         {
3428                 msg_print("Cannot close list file.");
3429                 return;
3430         }
3431
3432         /* Message */
3433         msg_print("Successfully created a list file.");
3434 }
3435
3436 #else
3437
3438 #ifdef MACINTOSH
3439 static int i = 0;
3440 #endif /* MACINTOSH */
3441
3442 #endif