OSDN Git Service

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