OSDN Git Service

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