OSDN Git Service

65b72ab4e5ac0af83fecb1ed1f7def45c6614098
[hengband/hengband.git] / src / flavor.c
1 /* Purpose: Object flavor code */
2
3 /*
4  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research, and
7  * not for profit purposes provided that this copyright and statement are
8  * included in all such copies.
9  */
10
11 #include "angband.h"
12
13
14 /*
15  * Hack -- note that "TERM_MULTI" is now just "TERM_VIOLET".
16  * We will have to find a cleaner method for "MULTI_HUED" later.
17  * There were only two multi-hued "flavors" (one potion, one food).
18  * Plus five multi-hued "base-objects" (3 dragon scales, one blade
19  * of chaos, and one something else).  See the SHIMMER_OBJECTS code
20  * in "dungeon.c" and the object color extractor in "cave.c".
21  */
22 #define TERM_MULTI      TERM_VIOLET
23
24
25 /*
26  * Max sizes of the following arrays
27  */
28 #define MAX_ROCKS      59       /* Used with rings (min 38) */
29 #define MAX_AMULETS    26       /* Used with amulets (min 14) */
30 #define MAX_WOODS      34       /* Used with staffs (min 30) */
31 #define MAX_METALS     40       /* Used with wands/rods (min 29/29) */
32 #define MAX_COLORS     70       /* Used with potions (min 60) */
33 #define MAX_SHROOM     20       /* Used with mushrooms (min 20) */
34 #define MAX_TITLES     55       /* Used with scrolls (min 48) */
35 #define MAX_SYLLABLES 164       /* Used with scrolls (see below) */
36
37
38 /*
39  * Rings (adjectives and colors)
40  */
41
42 static cptr ring_adj[MAX_ROCKS]
43 #ifndef JP
44 = {
45         "Alexandrite", "Amethyst", "Aquamarine", "Azurite", "Beryl",
46         "Bloodstone", "Calcite", "Carnelian", "Corundum", "Diamond",
47         "Emerald", "Fluorite", "Garnet", "Granite", "Jade",
48         "Jasper", "Lapis Lazuli", "Malachite", "Marble", "Moonstone",
49         "Onyx", "Opal", "Pearl", "Quartz", "Quartzite",
50         "Rhodonite", "Ruby", "Sapphire", "Tiger Eye", "Topaz",
51         "Turquoise", "Zircon", "Platinum", "Bronze", "Gold",
52         "Obsidian", "Silver", "Tortoise Shell", "Mithril", "Jet",
53         "Engagement", "Adamantite",
54         "Wire", "Dilithium", "Bone", "Wooden",
55         "Spikard", "Serpent",   "Wedding", "Double",
56         "Plain", "Brass",  "Scarab","Shining",
57         "Rusty","Transparent", "Steel", "Tanzanite",
58         "Nephrite",
59 };
60 #else
61 = {
62     "¶âÎÐÀФÎ","¥¢¥á¥¸¥¹¥È¤Î","¥¢¥¯¥¢¥Þ¥ê¥ó¤Î","¤á¤Î¤¦¤Î","ÎÐÃìÀФÎ",
63     "·ì¶Ì¿ï¤Î","Êý²òÀФÎ","ÀÖ¤á¤Î¤¦¤Î","¹Ë¶Ì¤Î","¥À¥¤¥¢¥â¥ó¥É¤Î",
64     "¥¨¥á¥é¥ë¥É¤Î","¥Û¥¿¥ëÀФÎ","¥¬¡¼¥Í¥Ã¥È¤Î","¸æ±ÆÀФÎ","¤Ò¤¹¤¤¤Î",
65     "¥¸¥ã¥¹¥Ñ¡¼¤Î","ÀÄÎÜÍþ¤Î","¥¯¥¸¥ã¥¯ÀФÎ","ÂçÍýÀФÎ","¥à¡¼¥ó¥¹¥È¡¼¥ó¤Î",
66     "¼Ê¤á¤Î¤¦¤Î","¥ª¥Ñ¡¼¥ë¤Î","¿¿¼î¤Î","¿å¾½¤Î","ÀбѴä¤Î",
67     "¥¶¥¯¥íÀФÎ","¥ë¥Ó¡¼¤Î","¥µ¥Õ¥¡¥¤¥¢¤Î","¥¿¥¤¥¬¡¼¥¢¥¤¤Î","¥È¥Ñ¡¼¥º¤Î",
68     "¥È¥ë¥³ÀФÎ","¥¸¥ë¥³¥ó¤Î","¥×¥é¥Á¥Ê¤Î","¥Ö¥í¥ó¥º¤Î","¶â¤Î",
69     "¹õÍËÀФÎ","¶ä¤Î","¤Ù¤Ã¹Ã¤Î","¥ß¥¹¥ê¥ë¤Î","¹õ¶Ì¤Î",
70     "º§Ìó","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î",
71     "¿Ë¶â¤Î","¥Ç¥£¥ê¥·¥¦¥à¤Î","¹ü¤Î","ÌÚ¤Î",
72     "¥¹¥Ô¥«¤Î" /*nuke me*/ ,"¼Ø¤Î","·ëº§","Æó½Å¤Î",
73     "¾þ¤ê¤Î¤Ê¤¤","ÀÄƼ¤Î","¥¹¥«¥é¥Ù¤Î" ,"µ±¤¯",
74     "»¬¤Ó¤¿","Æ©ÌÀ¤Ê","¹ÝÅ´¤Î","¥¿¥ó¥¶¥Ê¥¤¥È¤Î",
75     "Æð¶Ì¤Î",
76 };
77 #endif
78
79 static byte ring_col[MAX_ROCKS] =
80 {
81         TERM_GREEN, TERM_VIOLET, TERM_L_BLUE, TERM_L_BLUE, TERM_L_GREEN,
82         TERM_RED, TERM_WHITE, TERM_RED, TERM_SLATE, TERM_WHITE,
83         TERM_GREEN, TERM_L_GREEN, TERM_RED, TERM_L_DARK, TERM_L_GREEN,
84         TERM_UMBER, TERM_BLUE, TERM_GREEN, TERM_WHITE, TERM_L_WHITE,
85         TERM_L_RED, TERM_L_WHITE, TERM_WHITE, TERM_L_WHITE, TERM_L_WHITE,
86         TERM_L_RED, TERM_RED, TERM_BLUE, TERM_YELLOW, TERM_YELLOW,
87         TERM_L_BLUE, TERM_L_UMBER, TERM_WHITE, TERM_L_UMBER, TERM_YELLOW,
88         TERM_L_DARK, TERM_L_WHITE, TERM_GREEN, TERM_L_BLUE, TERM_L_DARK,
89         TERM_YELLOW, TERM_VIOLET,
90         TERM_UMBER, TERM_L_WHITE, TERM_WHITE, TERM_UMBER,
91         TERM_BLUE, TERM_GREEN, TERM_YELLOW, TERM_ORANGE,
92         TERM_YELLOW, TERM_ORANGE, TERM_L_GREEN, TERM_YELLOW,
93         TERM_RED, TERM_WHITE, TERM_WHITE, TERM_YELLOW,
94         TERM_GREEN,
95 };
96
97
98 /*
99  * Amulets (adjectives and colors)
100  */
101 static cptr amulet_adj[MAX_AMULETS]
102 #ifndef JP
103 = {
104         "Amber", "Driftwood", "Coral", "Agate", "Ivory",
105         "Obsidian", "Bone", "Brass", "Bronze", "Pewter",
106         "Tortoise Shell", "Golden", "Azure", "Crystal", "Silver",
107         "Copper", "Swastika", "Platinum","Runed", "Rusty",
108         "Curved", "Dragon's claw", "Rosary", "Jade", "Mithril",
109         "Ruby"
110 };
111 #else
112 = {
113     "àèàá¤Î","ήÌÚ¤Î","¥µ¥ó¥´¤Î","¤á¤Î¤¦¤Î","¾Ý²ç¤Î",
114     "¹õÍËÀФÎ","¹ü¤Î","¿¿ï«¤Î","ÀÄƼ¤Î","¤·¤í¤á¤Î",
115     "¤Ù¤Ã¹Ã¤Î","¶â¤Î","ÎÜÍþ¤Î","¿å¾½¤Î","¶ä¤Î",
116     "Ƽ¤Î","ÒĤÎ", "¥×¥é¥Á¥Ê¤Î", "¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","»¬¤Ó¤¿",
117     "¶Ê¤¬¤Ã¤¿", "¥É¥é¥´¥ó¤ÎÄÞ¤Î", "¿ô¼î¤Î", "¤Ò¤¹¤¤¤Î", "¥ß¥¹¥ê¥ë¤Î",
118     "¥ë¥Ó¡¼¤Î"
119 };
120 #endif
121
122 static byte amulet_col[MAX_AMULETS] =
123 {
124         TERM_YELLOW, TERM_L_UMBER, TERM_WHITE, TERM_L_WHITE, TERM_WHITE,
125         TERM_L_DARK, TERM_WHITE, TERM_L_UMBER, TERM_L_UMBER, TERM_SLATE,
126         TERM_GREEN, TERM_YELLOW, TERM_L_BLUE, TERM_L_BLUE, TERM_L_WHITE,
127         TERM_L_UMBER, TERM_VIOLET, TERM_WHITE, TERM_UMBER, TERM_RED, 
128         TERM_GREEN, TERM_L_GREEN, TERM_L_GREEN, TERM_GREEN, TERM_L_BLUE, 
129         TERM_RED
130 };
131
132
133 /*
134  * Staffs (adjectives and colors)
135  */
136 static cptr staff_adj[MAX_WOODS]
137 #ifndef JP
138 = {
139         "Aspen", "Balsa", "Banyan", "Birch", "Cedar",
140         "Cottonwood", "Cypress", "Dogwood", "Elm", "Eucalyptus",
141         "Hemlock", "Hickory", "Ironwood", "Locust", "Mahogany",
142         "Maple", "Mulberry", "Oak", "Pine", "Redwood",
143         "Rosewood", "Spruce", "Sycamore", "Teak", "Walnut",
144         "Mistletoe", "Hawthorn", "Bamboo", "Silver", "Runed",
145         "Golden", "Ashen", "Ivory","Gnarled"/*,"Willow"*/
146 };
147 #else
148 = {
149     "¥Ý¥×¥é¤Î","¥Ð¥ë¥µ¤Î","¥Ð¥ó¥ä¥ó¤Î","¥«¥Ð¤Î","À¾ÍÎ¥¹¥®¤Î",
150     "ÛؤÎ","¥¤¥È¥¹¥®¤Î","¥ß¥º¥­¤Î","¥Ë¥ì¤Î","¥æ¡¼¥«¥ê¤Î",
151     "¥Ä¥¬¤Î","¥Ö¥Ê¤Î","¹õÃɤÎ","¥¢¥«¥·¥¢¤Î","¥Þ¥Û¥¬¥Ë¡¼¤Î",
152     "¥«¥¨¥Ç¤Î","¥¯¥ï¤Î","¥«¥·¤Î","¾¾¤Î","¿ù¤Î",
153     "»çÃɤÎ","¥¨¥¾¥Þ¥Ä¤Î","¥¤¥Á¥¸¥¯¤Î","¥Á¡¼¥¯¤Î","¥¯¥ë¥ß¤Î",
154     "¥ä¥É¥ê¥®¤Î","¥µ¥ó¥¶¥·¤Î","ÃݤÎ","¶ä¤Î","¥ë¡¼¥ó¤Î",
155     "¶â¤Î","¥È¥Í¥ê¥³¤Î", "¾Ý²ç¤Î", "·î·Ë¼ù¤Î"
156 };
157 #endif
158
159 static byte staff_col[MAX_WOODS] =
160 {
161         TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER,
162         TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER,
163         TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER, TERM_L_UMBER, TERM_UMBER,
164         TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_RED,
165         TERM_RED, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER,
166         TERM_GREEN, TERM_L_UMBER, TERM_L_UMBER, TERM_L_WHITE, TERM_UMBER,
167         TERM_YELLOW, TERM_SLATE, TERM_WHITE, TERM_SLATE
168 };
169
170
171 /*
172  * Wands (adjectives and colors)
173  */
174 static cptr wand_adj[MAX_METALS]
175 #ifndef JP
176 = {
177         "Aluminum", "Cast Iron", "Chromium", "Copper", "Gold",
178         "Iron", "Magnesium", "Molybdenum", "Nickel", "Rusty",
179         "Silver", "Steel", "Tin", "Titanium", "Tungsten",
180         "Zirconium", "Zinc", "Aluminum-Plated", "Copper-Plated", "Gold-Plated",
181         "Nickel-Plated", "Silver-Plated", "Steel-Plated", "Tin-Plated", "Zinc-Plated",
182         "Mithril-Plated", "Mithril", "Runed", "Bronze", "Brass",
183         "Platinum", "Lead","Lead-Plated", "Ivory" , "Adamantite",
184         "Uridium", "Long", "Short", "Hexagonal", "Carbonized"
185 };
186 #else
187 = {
188     "¥¢¥ë¥ß¤Î","ÃòÅ´¤Î","¥¯¥í¥à¤Î","Ƽ¤Î","¶â¤Î",
189     "Å´¤Î","¥Þ¥°¥Í¥·¥¦¥à¤Î","¥â¥ê¥Ö¥Ç¥ó¤Î","¥Ë¥Ã¥±¥ë¤Î","»¬¤Ó¤¿",
190     "¶ä¤Î","¹ÝÅ´¤Î","¥Ö¥ê¥­¤Î","¥Á¥¿¥ó¤Î","¥¿¥ó¥°¥¹¥Æ¥ó¤Î",
191     "¥¸¥ë¥³¥ó¤Î","°¡±ô¤Î","¥¢¥ë¥ß¥á¥Ã¥­¤Î","Ƽ¥á¥Ã¥­¤Î","¶â¥á¥Ã¥­¤Î",
192     "ÇòƼ¥á¥Ã¥­¤Î","¶ä¥á¥Ã¥­¤Î","Å´¥á¥Ã¥­¤Î","¥¹¥º¥á¥Ã¥­¤Î","°¡±ô¥á¥Ã¥­¤Î",
193     "¥ß¥¹¥ê¥ë¥á¥Ã¥­¤Î","¥ß¥¹¥ê¥ë¤Î","¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","ÀÄƼ¤Î","¿¿ï«¤Î",
194     "¥×¥é¥Á¥Ê¤Î","±ô¤Î","±ô¥á¥Ã¥­¤Î","¾Ý²ç¤Î","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î",
195     "¥¤¥ê¥Â¥¦¥à¤Î","Ť¤","û¤¤","Ï»³Ñ·Á¤Î", "úÁǤÎ"
196 };
197 #endif
198
199 static byte wand_col[MAX_METALS] =
200 {
201         TERM_L_BLUE, TERM_L_DARK, TERM_WHITE, TERM_L_UMBER, TERM_YELLOW,
202         TERM_SLATE, TERM_L_WHITE, TERM_L_WHITE, TERM_L_UMBER, TERM_RED,
203         TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE, TERM_WHITE, TERM_WHITE,
204         TERM_L_WHITE, TERM_L_WHITE, TERM_L_BLUE, TERM_L_UMBER, TERM_YELLOW,
205         TERM_L_UMBER, TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE,
206         TERM_L_BLUE, TERM_L_BLUE, TERM_UMBER, TERM_L_UMBER, TERM_L_UMBER,
207         TERM_WHITE, TERM_SLATE, TERM_SLATE, TERM_WHITE, TERM_VIOLET,
208         TERM_L_RED, TERM_L_BLUE, TERM_BLUE, TERM_RED, TERM_L_DARK
209 };
210
211
212 /*
213  * Rods (adjectives and colors).
214  * Efficiency -- copied from wand arrays
215  */
216
217 static cptr rod_adj[MAX_METALS];
218
219 static byte rod_col[MAX_METALS];
220
221
222 /*
223  * Mushrooms (adjectives and colors)
224  */
225
226 static cptr food_adj[MAX_SHROOM]
227 #ifndef JP
228 = {
229         "Blue", "Black", "Black Spotted", "Brown", "Dark Blue",
230         "Dark Green", "Dark Red", "Yellow", "Furry", "Green",
231         "Grey", "Light Blue", "Light Green", "Violet", "Red",
232         "Slimy", "Tan", "White", "White Spotted", "Wrinkled",
233 };
234 #else
235 = {
236     "ÀĤ¤","¹õ¤¤","¹õÈäÎ","Ã㿧¤Î","·²ÀĤÎ",
237     "¿¼ÎФÎ","¹È¿§¤Î","²«¿§¤¤","Âݤष¤¿","ÎФÎ",
238     "¥°¥ì¡¼¤Î","¶õ¿§¤Î","²«ÎФÎ","¥¹¥ß¥ì¿§¤Î","ÀÖ¤¤",
239     "¤Í¤Ð¤Í¤Ð¤·¤¿","²«³ì¿§¤Î","Çò¤¤","ÇòÈäÎ","¤·¤ï¤·¤ï¤Î",
240 };
241 #endif
242
243 static byte food_col[MAX_SHROOM] =
244 {
245         TERM_BLUE, TERM_L_DARK, TERM_L_DARK, TERM_UMBER, TERM_BLUE,
246         TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_L_WHITE, TERM_GREEN,
247         TERM_SLATE, TERM_L_BLUE, TERM_L_GREEN, TERM_VIOLET, TERM_RED,
248         TERM_SLATE, TERM_L_UMBER, TERM_WHITE, TERM_WHITE, TERM_UMBER
249 };
250
251
252 /*
253  * Color adjectives and colors, for potions.
254  * Hack -- The first four entries are hard-coded.
255  * (water, apple juice, slime mold juice, something)
256  */
257
258 static cptr potion_adj[MAX_COLORS]
259 #ifndef JP
260 = {
261         "Clear", "Light Brown", "Icky Green", "xxx",
262         "Azure", "Blue", "Blue Speckled", "Black", "Brown", "Brown Speckled",
263         "Bubbling", "Chartreuse", "Cloudy", "Copper Speckled", "Crimson", "Cyan",
264         "Dark Blue", "Dark Green", "Dark Red", "Gold Speckled", "Green",
265         "Green Speckled", "Grey", "Grey Speckled", "Hazy", "Indigo",
266         "Light Blue", "Light Green", "Magenta", "Metallic Blue", "Metallic Red",
267         "Metallic Green", "Metallic Purple", "Misty", "Orange", "Orange Speckled",
268         "Pink", "Pink Speckled", "Puce", "Purple", "Purple Speckled",
269         "Red", "Red Speckled", "Silver Speckled", "Smoky", "Tangerine",
270         "Violet", "Vermilion", "White", "Yellow", "Violet Speckled",
271         "Pungent", "Clotted Red", "Viscous Pink", "Oily Yellow", "Gloopy Green",
272         "Shimmering", "Coagulated Crimson", "Yellow Speckled", "Gold",
273         "Manly", "Stinking", "Oily Black", "Ichor", "Ivory White", "Sky Blue",
274         "Gray", "Silver", "Bronze", "Flashing",
275 };
276 #else
277 = {
278     "Æ©ÌÀ¤Ê","ÇöÃ㿧¤Î","¤è¤É¤ó¤ÀÎФÎ","¼¿¹õ¤Î",
279     "º°ÊˤÎ","ÀĤ¤","ÀÄÈäÎ","¹õ¤¤","Ã㿧¤Î","ÃãÈäÎ",
280     "Ë¢¤À¤Ã¤¿","Çö²«Î理Î","Âù¤Ã¤¿","ƼÈäÎ","¹È¿§¤Î","¥·¥¢¥ó¿§¤Î",
281     "·²ÀÄ¿§¤Î","¿¼¤¤ÎФÎ","¿¼¤¤ÀÖ¿§¤Î","¶âÈäÎ","Î理Î",
282     "ÎÐÈäÎ","³¥¿§¤Î","³¥ÈäÎ","¤Ü¤ä¤±¤¿¿§¤Î","Íõ¿§¤Î",
283     "Çö¤¤ÀÄ¿§¤Î","Çö¤¤Î理Î","¥Þ¥¼¥ó¥¿¿§¤Î","ÀĤ¯µ±¤¯","ÀÖ¤¯µ±¤¯",
284     "ÎФ˵±¤¯","»ç¤Ëµ±¤¯","̸¾õ¤Î","¥ª¥ì¥ó¥¸¿§¤Î","¥ª¥ì¥ó¥¸ÈäÎ",
285     "¥Ô¥ó¥¯¿§¤Î","¥Ô¥ó¥¯ÈäÎ","¹õ³ì¿§¤Î","»ç¿§¤Î","¤¦¤¹¤¤»çÈäÎ",
286     "ÀÖ¤¤","ÀÖÈäÎ","¶äÈäÎ","±ì¤Ã¤¿","Üô¿§¤Î",
287     "¥¹¥ß¥ì¿§¤Î","¼ë¿§¤Î","Çò¤¤","²«¿§¤¤", "»çÈäÎ",
288     "»É·ã½­¤Î¤¹¤ë","¤è¤É¤ó¤ÀÀÖ¤Î","¥É¥í¥É¥í¤Î","¤Í¤Ð¤Ã¤¿²«¿§¤Î","°ÅÎ理Î",
289     "µ±¤¯","¤Í¤Ð¤Ã¤¿¿¼¹È¤Î","²«ÈäÎ","¶â¿§¤Î",
290     "Ã˽­¤¤" /*nuke me*/,"°­½­¤Î¤¹¤ë","¹õÌý¿§¤Î","ǾÞù¤Î",
291     "¾Ý²ç¿§¤Î","¶õ¿§¤Î", "¤Í¤º¤ß¿§¤Î", "¶ä¿§¤Î", "ÀÖƼ¿§¤Î",
292     "¥­¥é¥­¥é¸÷¤ë"
293 };
294 #endif
295
296 static byte potion_col[MAX_COLORS] =
297 {
298         TERM_WHITE, TERM_L_UMBER, TERM_GREEN, 0,
299         TERM_L_BLUE, TERM_BLUE, TERM_BLUE, TERM_L_DARK, TERM_UMBER, TERM_UMBER,
300         TERM_L_WHITE, TERM_L_GREEN, TERM_WHITE, TERM_L_UMBER, TERM_RED, TERM_L_BLUE,
301         TERM_BLUE, TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_GREEN,
302         TERM_GREEN, TERM_SLATE, TERM_SLATE, TERM_L_WHITE, TERM_VIOLET,
303         TERM_L_BLUE, TERM_L_GREEN, TERM_RED, TERM_BLUE, TERM_RED,
304         TERM_GREEN, TERM_VIOLET, TERM_L_WHITE, TERM_ORANGE, TERM_ORANGE,
305         TERM_L_RED, TERM_L_RED, TERM_VIOLET, TERM_VIOLET, TERM_VIOLET,
306         TERM_RED, TERM_RED, TERM_L_WHITE, TERM_L_DARK, TERM_ORANGE,
307         TERM_VIOLET, TERM_RED, TERM_WHITE, TERM_YELLOW, TERM_VIOLET,
308         TERM_L_RED, TERM_RED, TERM_L_RED, TERM_YELLOW, TERM_GREEN,
309         TERM_MULTI, TERM_RED, TERM_YELLOW, TERM_YELLOW,
310         TERM_L_UMBER, TERM_UMBER, TERM_L_DARK, TERM_RED,
311         TERM_WHITE, TERM_L_BLUE, TERM_L_WHITE, TERM_WHITE, TERM_RED,
312         TERM_YELLOW
313 };
314
315
316 /*
317  * Syllables for scrolls (must be 1-4 letters each)
318  */
319
320 static cptr syllables[MAX_SYLLABLES]
321 #ifdef JP
322 = {
323         "Å·", "ÃÏ", "̵", "ÍÑ", "°ì", "Åá", "ξ", "ÃÇ",
324         "°á", "Ë¥", "Æü", "Àé", "½©", "Ëþ", "¿È", "ÁÏ",
325         "áØ", "¼·", "ž", "Ȭ", "ÅÝ", "²é", "¿Å",
326         "¾¨", "ÃÀ", "µ¯", "»à", "²ó", "À¸", "ʸ",
327         "Éð", "Æ»", "ε", "Ƭ", "¼Ø", "Èø", "ñ", "Åá", "ľ", "Æþ",
328         "¿Ê", "Âà", "¸Þ", "¡", "Ï»", "ç¥", "Âç", "»³", "ÌÄ",
329         "Æ°", "É÷", "ÎÓ", "²Ð", "Àä", "ÂÎ", "Ì¿", "»Í",
330         "ÌÌ", "Á¿", "²Î", "´°", "Á´", "·ç", "Ä·", "ÎÂ",
331         "ìí", "î½", "òµ", "Ì¥", "ò³", "ò´", "½Ä",
332         "²£", "¿Ô", "¿À", "½Ð", "µ´", "Ë×", "²¹", "¸Î", "ÃÎ",
333         "¿·", "½Õ", "²Æ", "Åß", "½ã", "¿¿", "¹¤", "¶½",
334         "Ì£", "ÄÅ", "³Î", "Èæ", "¶ì", "¿´", "»´", "߸",
335         "Ç°", "ȯ", "Á°", "Âå", "̤", "ʹ", "¶õ", "¸å",
336         "Ú¼", "¶â", "¿¹", "Íå", "Ëü", "¾Ý", "ÊÑ", "²½",
337         "½½", "Ãæ", "Ȭ", "¶å", "¿Í", "¿§", "»î", "¹Ô",
338         "ºø", "¸í", "»ö", "¼Â", "º¬", "µÛ", "¼ý", "¹ç",
339         "Ê»", "Á´", "¹ñ", "À©", "ÇÆ", "¾Æ", "Æù", "Äê",
340         "¿©", "¹ü", "²ç", "Ìø", "Èô", "æÆ", "Éõ", "°õ",
341         "¼À", "Íð", "Éð", "¾­", "·Ú", "Ǧ", "·õ", "ǽ",
342         "À»", "¼Ù", "¼ö", "¼±", "¸¸", "´¶", "ÆÇ", "°Ç",
343         "Íî", "±¢", "ÍÛ"
344 };
345 #else
346 = {
347         "a", "ab", "ag", "aks", "ala", "an", "ankh", "app",
348         "arg", "arze", "ash", "aus", "ban", "bar", "bat", "bek",
349         "bie", "bin", "bit", "bjor", "blu", "bot", "bu",
350         "byt", "comp", "con", "cos", "cre", "dalf", "dan",
351         "den", "der", "doe", "dok", "eep", "el", "eng", "er", "ere", "erk",
352         "esh", "evs", "fa", "fid", "flit", "for", "fri", "fu", "gan",
353         "gar", "glen", "gop", "gre", "ha", "he", "hyd", "i",
354         "ing", "ion", "ip", "ish", "it", "ite", "iv", "jo",
355         "kho", "kli", "klis", "la", "lech", "man", "mar",
356         "me", "mi", "mic", "mik", "mon", "mung", "mur", "nag", "nej",
357         "nelg", "nep", "ner", "nes", "nis", "nih", "nin", "o",
358         "od", "ood", "org", "orn", "ox", "oxy", "pay", "pet",
359         "ple", "plu", "po", "pot", "prok", "re", "rea", "rhov",
360         "ri", "ro", "rog", "rok", "rol", "sa", "san", "sat",
361         "see", "sef", "seh", "shu", "ski", "sna", "sne", "snik",
362         "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab",
363         "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
364         "ulk", "um", "un", "uni", "ur", "val", "viv", "vly",
365         "vom", "wah", "wed", "werg", "wex", "whon", "wun", "x",
366         "yerg", "yp", "zun", "tri", "blaa", "jah", "bul", "on",
367         "foo", "ju", "xuxu"
368 };
369 #endif
370
371
372 /*
373  * Hold the titles of scrolls, 6 to 14 characters each
374  * Also keep an array of scroll colors (always WHITE for now)
375  */
376 static char scroll_adj[MAX_TITLES][16];
377
378 static byte scroll_col[MAX_TITLES];
379
380
381 /*
382  * Certain items, if aware, are known instantly
383  * This function is used only by "flavor_init()"
384  */
385 static bool object_easy_know(int i)
386 {
387         object_kind *k_ptr = &k_info[i];
388
389         /* Analyze the "tval" */
390         switch (k_ptr->tval)
391         {
392                 /* Spellbooks */
393                 case TV_LIFE_BOOK:
394                 case TV_SORCERY_BOOK:
395                 case TV_NATURE_BOOK:
396                 case TV_CHAOS_BOOK:
397                 case TV_DEATH_BOOK:
398                 case TV_TRUMP_BOOK:
399                 case TV_ARCANE_BOOK:
400                 case TV_ENCHANT_BOOK:
401                 case TV_DAEMON_BOOK:
402                 case TV_CRUSADE_BOOK:
403                 case TV_MUSIC_BOOK:
404                 case TV_HISSATSU_BOOK:
405                 {
406                         return (TRUE);
407                 }
408
409                 /* Simple items */
410                 case TV_FLASK:
411                 case TV_JUNK:
412                 case TV_BOTTLE:
413                 case TV_SKELETON:
414                 case TV_SPIKE:
415                 case TV_WHISTLE:
416                 {
417                         return (TRUE);
418                 }
419
420                 /* All Food, Potions, Scrolls, Rods */
421                 case TV_FOOD:
422                 case TV_POTION:
423                 case TV_SCROLL:
424                 case TV_ROD:
425                 {
426                         return (TRUE);
427                 }
428         }
429
430         /* Nope */
431         return (FALSE);
432 }
433
434
435 /*
436  * Certain items have a flavor
437  * This function is used only by "flavor_init()"
438  */
439 static bool object_flavor(int k_idx)
440 {
441         object_kind *k_ptr = &k_info[k_idx];
442
443         /* Analyze the item */
444         switch (k_ptr->tval)
445         {
446                 case TV_AMULET:
447                 {
448                         return (0x80 + amulet_col[k_ptr->sval]);
449                 }
450
451                 case TV_RING:
452                 {
453                         return (0x90 + ring_col[k_ptr->sval]);
454                 }
455
456                 case TV_STAFF:
457                 {
458                         return (0xA0 + staff_col[k_ptr->sval]);
459                 }
460
461                 case TV_WAND:
462                 {
463                         return (0xB0 + wand_col[k_ptr->sval]);
464                 }
465
466                 case TV_ROD:
467                 {
468                         return (0xC0 + rod_col[k_ptr->sval]);
469                 }
470
471                 case TV_SCROLL:
472                 {
473                         return (0xD0 + scroll_col[k_ptr->sval]);
474                 }
475
476                 case TV_POTION:
477                 {
478                         return (0xE0 + potion_col[k_ptr->sval]);
479                 }
480
481                 case TV_FOOD:
482                 {
483                         if (k_ptr->sval < SV_FOOD_MIN_FOOD)
484                         {
485                                 return (0xF0 + food_col[k_ptr->sval]);
486                         }
487
488                         break;
489                 }
490         }
491
492         /* No flavor */
493         return (0);
494 }
495
496
497 void get_table_name(char *out_string)
498 {
499 #ifdef JP
500         char Syllable[80];
501         strcpy(out_string, "¡Ø");
502         get_rnd_line("aname_j.txt", 1, Syllable);
503         strcat(out_string, Syllable);
504         get_rnd_line("aname_j.txt", 2, Syllable);
505         strcat(out_string, Syllable);
506         strcat(out_string, "¡Ù");
507 #else
508         int testcounter = randint1(3) + 1;
509
510         strcpy(out_string, "'");
511
512         if (randint1(3) == 2)
513         {
514                 while (testcounter--)
515                         strcat(out_string, syllables[randint0(MAX_SYLLABLES)]);
516         }
517         else
518         {
519                 char Syllable[80];
520                 testcounter = randint1(2) + 1;
521                 while (testcounter--)
522                 {
523                         (void)get_rnd_line("elvish.txt", 0, Syllable);
524                         strcat(out_string, Syllable);
525                 }
526         }
527
528         out_string[1] = toupper(out_string[1]);
529
530         strcat(out_string, "'");
531 #endif
532
533
534         out_string[18] = '\0';
535
536         return;
537 }
538
539
540 /*
541  * Prepare the "variable" part of the "k_info" array.
542  *
543  * The "color"/"metal"/"type" of an item is its "flavor".
544  * For the most part, flavors are assigned randomly each game.
545  *
546  * Initialize descriptions for the "colored" objects, including:
547  * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.
548  *
549  * The first 4 entries for potions are fixed (Water, Apple Juice,
550  * Slime Mold Juice, Unused Potion).
551  *
552  * Scroll titles are always between 6 and 14 letters long.  This is
553  * ensured because every title is composed of whole words, where every
554  * word is from 1 to 8 letters long (one or two syllables of 1 to 4
555  * letters each), and that no scroll is finished until it attempts to
556  * grow beyond 15 letters.  The first time this can happen is when the
557  * current title has 6 letters and the new word has 8 letters, which
558  * would result in a 6 letter scroll title.
559  *
560  * Duplicate titles are avoided by requiring that no two scrolls share
561  * the same first four letters (not the most efficient method, and not
562  * the least efficient method, but it will always work).
563  *
564  * Hack -- make sure everything stays the same for each saved game
565  * This is accomplished by the use of a saved "random seed", as in
566  * "town_gen()".  Since no other functions are called while the special
567  * seed is in effect, so this function is pretty "safe".
568  *
569  * Note that the "hacked seed" may provide an RNG with alternating parity!
570  */
571 void flavor_init(void)
572 {
573         int     i, j;
574
575         byte    temp_col;
576
577         cptr    temp_adj;
578
579
580         /* Hack -- Use the "simple" RNG */
581         Rand_quick = TRUE;
582
583         /* Hack -- Induce consistant flavors */
584         Rand_value = seed_flavor;
585
586
587         /* Efficiency -- Rods/Wands share initial array */
588         for (i = 0; i < MAX_METALS; i++)
589         {
590                 rod_adj[i] = wand_adj[i];
591                 rod_col[i] = wand_col[i];
592         }
593
594
595         /* Rings have "ring colors" */
596         for (i = 0; i < MAX_ROCKS; i++)
597         {
598                 j = randint0(MAX_ROCKS);
599                 temp_adj = ring_adj[i];
600                 ring_adj[i] = ring_adj[j];
601                 ring_adj[j] = temp_adj;
602
603                 temp_col = ring_col[i];
604                 ring_col[i] = ring_col[j];
605                 ring_col[j] = temp_col;
606         }
607
608         /* Hack -- The One Ring */
609 #ifdef JP
610         ring_adj[SV_RING_POWER] = "¶â̵¹¤¤Î";
611         ring_adj[SV_RING_AHO] = "¶âÍ­¹¤¤Î";
612 #else
613         ring_adj[SV_RING_POWER] = "Plain Gold";
614         ring_adj[SV_RING_AHO] = "Plain Goldarn";
615 #endif
616
617         if (!use_graphics)
618         {
619                 ring_col[SV_RING_POWER] = TERM_YELLOW;
620                 ring_col[SV_RING_AHO] = TERM_YELLOW;
621         }
622
623         /* Amulets have "amulet colors" */
624         for (i = 0; i < MAX_AMULETS; i++)
625         {
626                 j = randint0(MAX_AMULETS);
627                 temp_adj = amulet_adj[i];
628                 amulet_adj[i] = amulet_adj[j];
629                 amulet_adj[j] = temp_adj;
630
631                 temp_col = amulet_col[i];
632                 amulet_col[i] = amulet_col[j];
633                 amulet_col[j] = temp_col;
634         }
635
636         /* Staffs */
637         for (i = 0; i < MAX_WOODS; i++)
638         {
639                 j = randint0(MAX_WOODS);
640                 temp_adj = staff_adj[i];
641                 staff_adj[i] = staff_adj[j];
642                 staff_adj[j] = temp_adj;
643
644                 temp_col = staff_col[i];
645                 staff_col[i] = staff_col[j];
646                 staff_col[j] = temp_col;
647         }
648
649         /* Wands */
650         for (i = 0; i < MAX_METALS; i++)
651         {
652                 j = randint0(MAX_METALS);
653                 temp_adj = wand_adj[i];
654                 wand_adj[i] = wand_adj[j];
655                 wand_adj[j] = temp_adj;
656
657                 temp_col = wand_col[i];
658                 wand_col[i] = wand_col[j];
659                 wand_col[j] = temp_col;
660         }
661
662         /* Rods */
663         for (i = 0; i < MAX_METALS; i++)
664         {
665                 j = randint0(MAX_METALS);
666                 temp_adj = rod_adj[i];
667                 rod_adj[i] = rod_adj[j];
668                 rod_adj[j] = temp_adj;
669
670                 temp_col = rod_col[i];
671                 rod_col[i] = rod_col[j];
672                 rod_col[j] = temp_col;
673         }
674
675         /* Foods (Mushrooms) */
676         for (i = 0; i < MAX_SHROOM; i++)
677         {
678                 j = randint0(MAX_SHROOM);
679                 temp_adj = food_adj[i];
680                 food_adj[i] = food_adj[j];
681                 food_adj[j] = temp_adj;
682
683                 temp_col = food_col[i];
684                 food_col[i] = food_col[j];
685                 food_col[j] = temp_col;
686         }
687
688         /* Potions */
689         for (i = 4; i < MAX_COLORS; i++)
690         {
691                 j = randint0(MAX_COLORS - 4) + 4;
692                 temp_adj = potion_adj[i];
693                 potion_adj[i] = potion_adj[j];
694                 potion_adj[j] = temp_adj;
695
696                 temp_col = potion_col[i];
697                 potion_col[i] = potion_col[j];
698                 potion_col[j] = temp_col;
699         }
700
701         /* Scrolls (random titles, always white) */
702         for (i = 0; i < MAX_TITLES; i++)
703         {
704                 /* Get a new title */
705                 while (TRUE)
706                 {
707                         char buf[80];
708
709                         bool okay;
710
711                         /* Start a new title */
712                         buf[0] = '\0';
713
714                         /* Collect words until done */
715                         while (1)
716                         {
717                                 int q, s;
718
719                                 char tmp[80];
720
721                                 /* Start a new word */
722                                 tmp[0] = '\0';
723
724                                 /* Choose one or two syllables */
725                                 s = ((randint0(100) < 30) ? 1 : 2);
726
727                                 /* Add a one or two syllable word */
728                                 for (q = 0; q < s; q++)
729                                 {
730                                         /* Add the syllable */
731                                         strcat(tmp, syllables[randint0(MAX_SYLLABLES)]);
732                                 }
733
734                                 /* Stop before getting too long */
735                                 if (strlen(buf) + 1 + strlen(tmp) > 15) break;
736
737                                 /* Add a space */
738                                 strcat(buf, " ");
739
740                                 /* Add the word */
741                                 strcat(buf, tmp);
742                         }
743
744                         /* Save the title */
745                         strcpy(scroll_adj[i], buf+1);
746
747                         /* Assume okay */
748                         okay = TRUE;
749
750                         /* Check for "duplicate" scroll titles */
751                         for (j = 0; j < i; j++)
752                         {
753                                 cptr hack1 = scroll_adj[j];
754                                 cptr hack2 = scroll_adj[i];
755
756                                 /* Compare first four characters */
757                                 if (*hack1++ != *hack2++) continue;
758                                 if (*hack1++ != *hack2++) continue;
759                                 if (*hack1++ != *hack2++) continue;
760                                 if (*hack1++ != *hack2++) continue;
761
762                                 /* Not okay */
763                                 okay = FALSE;
764
765                                 /* Stop looking */
766                                 break;
767                         }
768
769                         /* Break when done */
770                         if (okay) break;
771                 }
772
773                 /* All scrolls are white */
774                 scroll_col[i] = TERM_WHITE;
775         }
776
777
778         /* Hack -- Use the "complex" RNG */
779         Rand_quick = FALSE;
780
781         /* Analyze every object */
782         for (i = 1; i < max_k_idx; i++)
783         {
784                 object_kind *k_ptr = &k_info[i];
785
786                 /* Skip "empty" objects */
787                 if (!k_ptr->name) continue;
788
789                 /* Extract "flavor" (if any) */
790                 k_ptr->flavor = object_flavor(i);
791
792                 /* No flavor yields aware */
793                 if (!k_ptr->flavor) k_ptr->aware = TRUE;
794
795                 /* Check for "easily known" */
796                 k_ptr->easy_know = object_easy_know(i);
797         }
798 }
799
800
801 /*
802  * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
803  * and return a pointer to the terminator (t + 1).
804  */
805 static char *object_desc_chr(char *t, char c)
806 {
807         /* Copy the char */
808         *t++ = c;
809
810         /* Terminate */
811         *t = '\0';
812
813         /* Result */
814         return (t);
815 }
816
817
818 /*
819  * Print a string "s" into a string "t", as if by strcpy(t, s),
820  * and return a pointer to the terminator.
821  */
822 static char *object_desc_str(char *t, cptr s)
823 {
824         /* Copy the string */
825         while (*s) *t++ = *s++;
826
827         /* Terminate */
828         *t = '\0';
829
830         /* Result */
831         return (t);
832 }
833
834
835
836 /*
837  * Print an unsigned number "n" into a string "t", as if by
838  * sprintf(t, "%u", n), and return a pointer to the terminator.
839  */
840 static char *object_desc_num(char *t, uint n)
841 {
842         uint p;
843
844         /* Find "size" of "n" */
845         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
846
847         /* Dump each digit */
848         while (p >= 1)
849         {
850                 /* Dump the digit */
851                 *t++ = '0' + n / p;
852
853                 /* Remove the digit */
854                 n = n % p;
855
856                 /* Process next digit */
857                 p = p / 10;
858         }
859
860         /* Terminate */
861         *t = '\0';
862
863         /* Result */
864         return (t);
865 }
866
867
868
869
870 #ifdef JP
871 /*
872  * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó
873  *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë
874  */
875
876 char *object_desc_kosuu(char *t, object_type *o_ptr)
877 {
878     t = object_desc_num(t, o_ptr->number);
879
880     switch (o_ptr->tval)
881     {
882       case TV_BOLT:
883       case TV_ARROW:
884       case TV_POLEARM:
885       case TV_STAFF:
886       case TV_WAND:
887       case TV_ROD:
888       case TV_DIGGING:
889       {
890           t = object_desc_str(t, "ËÜ");
891           break;
892       }
893       case TV_SCROLL:
894       {
895           t = object_desc_str(t, "´¬");
896           break;
897       }
898       case TV_POTION:
899       {
900           t = object_desc_str(t, "Éþ");
901           break;
902       }
903       case  TV_LIFE_BOOK:
904       case  TV_SORCERY_BOOK:
905       case  TV_NATURE_BOOK:
906       case  TV_CHAOS_BOOK:
907       case  TV_DEATH_BOOK:
908       case  TV_TRUMP_BOOK:
909       case  TV_ARCANE_BOOK:
910       case  TV_ENCHANT_BOOK:
911       case  TV_DAEMON_BOOK:
912       case  TV_CRUSADE_BOOK:
913       case  TV_MUSIC_BOOK:
914       case  TV_HISSATSU_BOOK:
915       {
916           t = object_desc_str(t, "ºý");
917           break;
918       }
919       case TV_SOFT_ARMOR:
920       case TV_HARD_ARMOR:
921       case TV_DRAG_ARMOR:
922       case TV_CLOAK:
923       {
924           t = object_desc_str(t, "Ãå");
925           break;
926       }
927       case TV_SWORD:
928       case TV_HAFTED:
929       case TV_BOW:
930       {
931           t = object_desc_str(t, "¿¶");
932           break;
933       }
934       case TV_BOOTS:
935       {
936           t = object_desc_str(t, "­");
937           break;
938       }
939       case TV_CARD:
940       {
941           t = object_desc_str(t, "Ëç");
942           break;
943       }
944             /* ¿©¤Ù¤â¤Î by ita */
945       case TV_FOOD:
946       {
947           if(o_ptr->sval == SV_FOOD_JERKY)
948           {
949               t = object_desc_str(t, "ÀÚ¤ì");
950               break;
951           }
952       }
953       default:
954       {
955           if (o_ptr->number < 10)
956           {
957               t = object_desc_str(t, "¤Ä");
958           }
959           else
960           {
961               t = object_desc_str(t, "¸Ä");
962           }
963           break;
964       }
965   }
966   return (t);                  
967 }
968 #endif
969
970 /*
971  * Print an signed number "v" into a string "t", as if by
972  * sprintf(t, "%+d", n), and return a pointer to the terminator.
973  * Note that we always print a sign, either "+" or "-".
974  */
975 static char *object_desc_int(char *t, sint v)
976 {
977         uint p, n;
978
979         /* Negative */
980         if (v < 0)
981         {
982                 /* Take the absolute value */
983                 n = 0 - v;
984
985                 /* Use a "minus" sign */
986                 *t++ = '-';
987         }
988
989         /* Positive (or zero) */
990         else
991         {
992                 /* Use the actual number */
993                 n = v;
994
995                 /* Use a "plus" sign */
996                 *t++ = '+';
997         }
998
999         /* Find "size" of "n" */
1000         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
1001
1002         /* Dump each digit */
1003         while (p >= 1)
1004         {
1005                 /* Dump the digit */
1006                 *t++ = '0' + n / p;
1007
1008                 /* Remove the digit */
1009                 n = n % p;
1010
1011                 /* Process next digit */
1012                 p = p / 10;
1013         }
1014
1015         /* Terminate */
1016         *t = '\0';
1017
1018         /* Result */
1019         return (t);
1020 }
1021
1022
1023 /*
1024  * Structs and tables for Auto Inscription for flags
1025  */
1026
1027 typedef struct flag_insc_table
1028 {
1029 #ifdef JP
1030         cptr japanese;
1031 #endif
1032         cptr english;
1033         int flag;
1034         int except_flag;
1035 } flag_insc_table;
1036
1037 #ifdef JP
1038 static flag_insc_table flag_insc_plus[] =
1039 {
1040         { "¹¶", "At", TR_BLOWS, -1 },
1041         { "®", "Sp", TR_SPEED, -1 },
1042         { "ÏÓ", "St", TR_STR, -1 },
1043         { "ÃÎ", "In", TR_INT, -1 },
1044         { "¸­", "Wi", TR_WIS, -1 },
1045         { "´ï", "Dx", TR_DEX, -1 },
1046         { "ÂÑ", "Cn", TR_CON, -1 },
1047         { "̥", "Ch", TR_CHR, -1 },
1048         { "±£", "Sl", TR_STEALTH, -1 },
1049         { "õ", "Sr", TR_SEARCH, -1 },
1050         { "ÀÖ", "If", TR_INFRA, -1 },
1051         { "·¡", "Dg", TR_TUNNEL, -1 },
1052         { NULL, NULL, 0, -1 }
1053 };
1054
1055 static flag_insc_table flag_insc_immune[] =
1056 {
1057         { "»À", "Ac", TR_IM_ACID, -1 },
1058         { "ÅÅ", "El", TR_IM_ELEC, -1 },
1059         { "²Ð", "Fi", TR_IM_FIRE, -1 },
1060         { "Îä", "Co", TR_IM_COLD, -1 },
1061         { NULL, NULL, 0, -1 }
1062 };
1063
1064 static flag_insc_table flag_insc_resistance[] =
1065 {
1066         { "»À", "Ac", TR_RES_ACID, TR_IM_ACID },
1067         { "ÅÅ", "El", TR_RES_ELEC, TR_IM_ELEC },
1068         { "²Ð", "Fi", TR_RES_FIRE, TR_IM_FIRE },
1069         { "Îä", "Co", TR_RES_COLD, TR_IM_COLD },
1070         { "ÆÇ", "Po", TR_RES_POIS, -1 },
1071         { "Á®", "Li", TR_RES_LITE, -1 },
1072         { "°Å", "Dk", TR_RES_DARK, -1 },
1073         { "ÇË", "Sh", TR_RES_SHARDS, -1 },
1074         { "ÌÕ", "Bl", TR_RES_BLIND, -1 },
1075         { "Íð", "Cf", TR_RES_CONF, -1 },
1076         { "¹ì", "So", TR_RES_SOUND, -1 },
1077         { "¹ö", "Nt", TR_RES_NETHER, -1 },
1078         { "°ø", "Nx", TR_RES_NEXUS, -1 },
1079         { "ÆÙ", "Ca", TR_RES_CHAOS, -1 },
1080         { "Îô", "Di", TR_RES_DISEN, -1 },
1081         { "¶²", "Fe", TR_RES_FEAR, -1 },
1082         { NULL, NULL, 0, -1 }
1083 };
1084
1085 static flag_insc_table flag_insc_misc[] =
1086 {
1087         { "ËâÎÏ", "Ma", TR_DEC_MANA, -1 },
1088         { "Åê", "Th", TR_THROW, -1 },
1089         { "ȿ", "Rf", TR_REFLECT, -1 },
1090         { "Ëã", "Fa", TR_FREE_ACT, -1 },
1091         { "»ë", "Si", TR_SEE_INVIS, -1 },
1092         { "·Ð", "Hl", TR_HOLD_LIFE, -1 },
1093         { "ÃÙ", "Sd", TR_SLOW_DIGEST, -1 },
1094         { "³è", "Rg", TR_REGEN, -1 },
1095         { "Éâ", "Lv", TR_FEATHER, -1 },
1096         { "ÌÀ", "Lu", TR_LITE, -1 },
1097         { "·Ù", "Wr", TR_WARNING, -1 },
1098         { "ÇÜ", "Xm", TR_XTRA_MIGHT, -1 },
1099         { "¼Í", "Xs", TR_XTRA_SHOTS, -1 },
1100         { "ÅÜ", "Ag", TR_AGGRAVATE, -1 },
1101         { "½Ë", "Bs", TR_BLESSED, -1 },
1102         { "´÷", "Ty", TR_TY_CURSE, -1 },
1103         { NULL, NULL, 0, -1 }
1104 };
1105
1106 static flag_insc_table flag_insc_aura[] =
1107 {
1108         { "±ê", "F", TR_SH_FIRE, -1 },
1109         { "ÅÅ", "E", TR_SH_ELEC, -1 },
1110         { "Îä", "C", TR_SH_COLD, -1 },
1111         { "Ëâ", "M", TR_NO_MAGIC, -1 },
1112         { "½Ö", "T", TR_NO_TELE, -1 },
1113         { NULL, NULL, 0, -1 }
1114 };
1115
1116 static flag_insc_table flag_insc_brand[] =
1117 {
1118         { "»À", "A", TR_BRAND_ACID, -1 },
1119         { "ÅÅ", "E", TR_BRAND_ELEC, -1 },
1120         { "¾Æ", "F", TR_BRAND_FIRE, -1 },
1121         { "Åà", "Co", TR_BRAND_COLD, -1 },
1122         { "ÆÇ", "P", TR_BRAND_POIS, -1 },
1123         { "ÆÙ", "Ca", TR_CHAOTIC, -1 },
1124         { "µÛ", "V", TR_VAMPIRIC, -1 },
1125         { "¿Ì", "Q", TR_IMPACT, -1 },
1126         { "ÀÚ", "S", TR_VORPAL, -1 },
1127         { "Íý", "M", TR_FORCE_WEAPON, -1 },
1128         { NULL, NULL, 0, -1 }
1129 };
1130
1131 static flag_insc_table flag_insc_kill[] =
1132 {
1133         { "¼Ù", "*", TR_KILL_EVIL, -1 },
1134         { "¿Í", "p", TR_KILL_HUMAN, -1 },
1135         { "ζ", "D", TR_KILL_DRAGON, -1 },
1136         { "¥ª", "o", TR_KILL_ORC, -1 },
1137         { "¥È", "T", TR_KILL_TROLL, -1 },
1138         { "µð", "P", TR_KILL_GIANT, -1 },
1139         { "¥Ç", "U", TR_KILL_DEMON, -1 },
1140         { "»à", "L", TR_KILL_UNDEAD, -1 },
1141         { "ư", "Z", TR_KILL_ANIMAL, -1 },
1142         { NULL, NULL, 0, -1 }
1143 };
1144
1145 static flag_insc_table flag_insc_slay[] =
1146 {
1147         { "¼Ù", "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1148         { "¿Í", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1149         { "ε", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1150         { "¥ª", "o", TR_SLAY_ORC, TR_KILL_ORC },
1151         { "¥È", "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1152         { "µð", "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1153         { "¥Ç", "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1154         { "»à", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1155         { "ư", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1156         { NULL, NULL, 0, -1 }
1157 };
1158
1159 static flag_insc_table flag_insc_esp1[] =
1160 {
1161         { "´¶", "Tele", TR_TELEPATHY, -1 },
1162         { "¼Ù", "Evil", TR_ESP_EVIL, -1 },
1163         { "Á±", "Good", TR_ESP_GOOD, -1 },
1164         { "̵", "Nolv", TR_ESP_NONLIVING, -1 },
1165         { "¸Ä", "Uniq", TR_ESP_UNIQUE, -1 },
1166         { NULL, NULL, 0, -1 }
1167 };
1168
1169 static flag_insc_table flag_insc_esp2[] =
1170 {
1171         { "¿Í", "p", TR_ESP_HUMAN, -1 },
1172         { "ε", "D", TR_ESP_DRAGON, -1 },
1173         { "¥ª", "o", TR_ESP_ORC, -1 },
1174         { "¥È", "T", TR_ESP_TROLL, -1 },
1175         { "µð", "P", TR_ESP_GIANT, -1 },
1176         { "¥Ç", "U", TR_ESP_DEMON, -1 },
1177         { "»à", "L", TR_ESP_UNDEAD, -1 },
1178         { "ư", "Z", TR_ESP_ANIMAL, -1 },
1179         { NULL, NULL, 0, -1 }
1180 };
1181
1182 static flag_insc_table flag_insc_sust[] =
1183 {
1184         { "ÏÓ", "St", TR_SUST_STR, -1 },
1185         { "ÃÎ", "In", TR_SUST_INT, -1 },
1186         { "¸­", "Wi", TR_SUST_WIS, -1 },
1187         { "´ï", "Dx", TR_SUST_DEX, -1 },
1188         { "ÂÑ", "Cn", TR_SUST_CON, -1 },
1189         { "̥", "Ch", TR_SUST_CHR, -1 },
1190         { NULL, NULL, 0, -1 }
1191 };
1192
1193 #else
1194 static flag_insc_table flag_insc_plus[] =
1195 {
1196         { "At", TR_BLOWS, -1 },
1197         { "Sp", TR_SPEED, -1 },
1198         { "St", TR_STR, -1 },
1199         { "In", TR_INT, -1 },
1200         { "Wi", TR_WIS, -1 },
1201         { "Dx", TR_DEX, -1 },
1202         { "Cn", TR_CON, -1 },
1203         { "Ch", TR_CHR, -1 },
1204         { "Sl", TR_STEALTH, -1 },
1205         { "Sr", TR_SEARCH, -1 },
1206         { "If", TR_INFRA, -1 },
1207         { "Dg", TR_TUNNEL, -1 },
1208         { NULL, 0, -1 }
1209 };
1210
1211 static flag_insc_table flag_insc_immune[] =
1212 {
1213         { "Ac", TR_IM_ACID, -1 },
1214         { "El", TR_IM_ELEC, -1 },
1215         { "Fi", TR_IM_FIRE, -1 },
1216         { "Co", TR_IM_COLD, -1 },
1217         { NULL, 0, -1 }
1218 };
1219
1220 static flag_insc_table flag_insc_resistance[] =
1221 {
1222         { "Ac", TR_RES_ACID, TR_IM_ACID },
1223         { "El", TR_RES_ELEC, TR_IM_ELEC },
1224         { "Fi", TR_RES_FIRE, TR_IM_FIRE },
1225         { "Co", TR_RES_COLD, TR_IM_COLD },
1226         { "Po", TR_RES_POIS, -1 },
1227         { "Li", TR_RES_LITE, -1 },
1228         { "Dk", TR_RES_DARK, -1 },
1229         { "Sh", TR_RES_SHARDS, -1 },
1230         { "Bl", TR_RES_BLIND, -1 },
1231         { "Cf", TR_RES_CONF, -1 },
1232         { "So", TR_RES_SOUND, -1 },
1233         { "Nt", TR_RES_NETHER, -1 },
1234         { "Nx", TR_RES_NEXUS, -1 },
1235         { "Ca", TR_RES_CHAOS, -1 },
1236         { "Di", TR_RES_DISEN, -1 },
1237         { "Fe", TR_RES_FEAR, -1 },
1238         { NULL, 0, -1 }
1239 };
1240
1241 static flag_insc_table flag_insc_misc[] =
1242 {
1243         { "Ma", TR_DEC_MANA, -1 },
1244         { "Th", TR_THROW, -1 },
1245         { "Rf", TR_REFLECT, -1 },
1246         { "Fa", TR_FREE_ACT, -1 },
1247         { "Si", TR_SEE_INVIS, -1 },
1248         { "Hl", TR_HOLD_LIFE, -1 },
1249         { "Sd", TR_SLOW_DIGEST, -1 },
1250         { "Rg", TR_REGEN, -1 },
1251         { "Lv", TR_FEATHER, -1 },
1252         { "Lu", TR_LITE, -1 },
1253         { "Wr", TR_WARNING, -1 },
1254         { "Xm", TR_XTRA_MIGHT, -1 },
1255         { "Xs", TR_XTRA_SHOTS, -1 },
1256         { "Ag", TR_AGGRAVATE, -1 },
1257         { "Bs", TR_BLESSED, -1 },
1258         { "Ty", TR_TY_CURSE, -1 },
1259         { NULL, 0, -1 }
1260 };
1261
1262 static flag_insc_table flag_insc_aura[] =
1263 {
1264         { "F", TR_SH_FIRE, -1 },
1265         { "E", TR_SH_ELEC, -1 },
1266         { "C", TR_SH_COLD, -1 },
1267         { "M", TR_NO_MAGIC, -1 },
1268         { "T", TR_NO_TELE, -1 },
1269         { NULL, 0, -1 }
1270 };
1271
1272 static flag_insc_table flag_insc_brand[] =
1273 {
1274         { "A", TR_BRAND_ACID, -1 },
1275         { "E", TR_BRAND_ELEC, -1 },
1276         { "F", TR_BRAND_FIRE, -1 },
1277         { "Co", TR_BRAND_COLD, -1 },
1278         { "P", TR_BRAND_POIS, -1 },
1279         { "Ca", TR_CHAOTIC, -1 },
1280         { "V", TR_VAMPIRIC, -1 },
1281         { "Q", TR_IMPACT, -1 },
1282         { "S", TR_VORPAL, -1 },
1283         { "M", TR_FORCE_WEAPON, -1 },
1284         { NULL, 0, -1 }
1285 };
1286
1287 static flag_insc_table flag_insc_kill[] =
1288 {
1289         { "*", TR_KILL_EVIL, -1 },
1290         { "p", TR_KILL_HUMAN, -1 },
1291         { "D", TR_KILL_DRAGON, -1 },
1292         { "o", TR_KILL_ORC, -1 },
1293         { "T", TR_KILL_TROLL, -1 },
1294         { "P", TR_KILL_GIANT, -1 },
1295         { "U", TR_KILL_DEMON, -1 },
1296         { "L", TR_KILL_UNDEAD, -1 },
1297         { "Z", TR_KILL_ANIMAL, -1 },
1298         { NULL, 0, -1 }
1299 };
1300
1301 static flag_insc_table flag_insc_slay[] =
1302 {
1303         { "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1304         { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1305         { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1306         { "o", TR_SLAY_ORC, TR_KILL_ORC },
1307         { "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1308         { "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1309         { "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1310         { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1311         { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1312         { NULL, 0, -1 }
1313 };
1314
1315 static flag_insc_table flag_insc_esp1[] =
1316 {
1317         { "Tele", TR_TELEPATHY, -1 },
1318         { "Evil", TR_ESP_EVIL, -1 },
1319         { "Good", TR_ESP_GOOD, -1 },
1320         { "Nolv", TR_ESP_NONLIVING, -1 },
1321         { "Uniq", TR_ESP_UNIQUE, -1 },
1322         { NULL, 0, -1 }
1323 };
1324
1325 static flag_insc_table flag_insc_esp2[] =
1326 {
1327         { "p", TR_ESP_HUMAN, -1 },
1328         { "D", TR_ESP_DRAGON, -1 },
1329         { "o", TR_ESP_ORC, -1 },
1330         { "T", TR_ESP_TROLL, -1 },
1331         { "P", TR_ESP_GIANT, -1 },
1332         { "U", TR_ESP_DEMON, -1 },
1333         { "L", TR_ESP_UNDEAD, -1 },
1334         { "Z", TR_ESP_ANIMAL, -1 },
1335         { NULL, 0, -1 }
1336 };
1337
1338 static flag_insc_table flag_insc_sust[] =
1339 {
1340         { "St", TR_SUST_STR, -1 },
1341         { "In", TR_SUST_INT, -1 },
1342         { "Wi", TR_SUST_WIS, -1 },
1343         { "Dx", TR_SUST_DEX, -1 },
1344         { "Cn", TR_SUST_CON, -1 },
1345         { "Ch", TR_SUST_CHR, -1 },
1346         { NULL, 0, -1 }
1347 };
1348 #endif
1349
1350 /* Simple macro for get_inscription() */
1351 #define ADD_INSC(STR) (void)(ptr = object_desc_str(ptr, (STR)))
1352
1353 /*
1354  *  Helper function for get_inscription()
1355  */
1356 static char *inscribe_flags_aux(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE], bool kanji, char *ptr)
1357 {
1358         while (fi_ptr->english)
1359         {
1360                 if (have_flag(flgs, fi_ptr->flag) &&
1361                     (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1362 #ifdef JP
1363                         ADD_INSC(kanji ? fi_ptr->japanese : fi_ptr->english);
1364 #else
1365                         ADD_INSC(fi_ptr->english);
1366 #endif
1367                 fi_ptr++;
1368         }
1369
1370         return ptr;
1371 }
1372
1373
1374 /*
1375  *  Special variation of have_flag for auto-inscription
1376  */
1377 static bool have_flag_of(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE])
1378 {
1379         while (fi_ptr->english)
1380         {
1381                 if (have_flag(flgs, fi_ptr->flag) &&
1382                    (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1383                         return (TRUE);
1384                 fi_ptr++;
1385         }
1386
1387         return (FALSE);
1388 }
1389
1390
1391 /*
1392  *  Get object inscription with auto inscription of object flags.
1393  */
1394 static void get_inscription(char *buff, object_type *o_ptr)
1395 {
1396         cptr insc = quark_str(o_ptr->inscription);
1397         char *ptr = buff;
1398         char *prev_ptr = buff;
1399
1400         u32b flgs[TR_FLAG_SIZE];
1401
1402         /* Not fully identified */
1403         if (!(o_ptr->ident & IDENT_MENTAL))
1404         {
1405                 /* Copy until end of line or '#' */
1406                 while (*insc)
1407                 {
1408                         if (*insc == '#') break;
1409 #ifdef JP
1410                         if (iskanji(*insc)) *buff++ = *insc++;
1411 #endif
1412                         *buff++ = *insc++;
1413                 }
1414
1415                 *buff = '\0';
1416                 return;
1417         }
1418
1419         /* Extract the flags */
1420         object_flags(o_ptr, flgs);
1421
1422
1423         *buff = '\0';
1424         for (; *insc; insc++)
1425         {
1426                 bool kanji = FALSE;
1427                 bool all;
1428
1429                 /* Ignore fake artifact inscription */
1430                 if (*insc == '#') break;
1431
1432                 /* {%} will be automatically converted */
1433                 else if ('%' == *insc)
1434                 {
1435                         cptr start_percent = ptr;
1436 #ifdef JP
1437                         if ('%' == insc[1])
1438                         {
1439                                 insc++;
1440                                 kanji = FALSE;
1441                         }
1442                         else
1443                         {
1444                                 kanji = TRUE;
1445                         }
1446 #endif
1447                         if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3])
1448                         {
1449                                 all = TRUE;
1450                                 insc += 3;
1451                         }
1452                         else
1453                         {
1454                                 all = FALSE;
1455                         }
1456
1457                         /* check for too long inscription */
1458                         if (ptr >= buff + MAX_NLEN) continue;
1459
1460                         /* Remove obvious flags */
1461                         if (!all)
1462                         {
1463                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1464                                 int j;
1465                                 
1466                                 /* Base object */
1467                                 for (j = 0; j < TR_FLAG_SIZE; j++)
1468                                         flgs[j] &= ~k_ptr->flags[j];
1469
1470                                 if (o_ptr->name1)
1471                                 {
1472                                         artifact_type *a_ptr = &a_info[o_ptr->name1];
1473                                         
1474                                         for (j = 0; j < TR_FLAG_SIZE; j++)
1475                                                 flgs[j] &= ~a_ptr->flags[j];
1476                                 }
1477
1478                                 if (o_ptr->name2)
1479                                 {
1480                                         bool teleport = have_flag(flgs, TR_TELEPORT);
1481                                         ego_item_type *e_ptr = &e_info[o_ptr->name2];
1482                                         
1483                                         for (j = 0; j < TR_FLAG_SIZE; j++)
1484                                                 flgs[j] &= ~e_ptr->flags[j];
1485
1486                                         /* Always inscribe {.} for random teleport */
1487                                         if (teleport) add_flag(flgs, TR_TELEPORT);
1488                                 }
1489                         }
1490
1491
1492                         /* Plusses */
1493                         if (have_flag_of(flag_insc_plus, flgs))
1494                         {
1495                                 if (kanji)
1496                                         ADD_INSC("+");
1497                         }
1498                         ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr);
1499
1500                         /* Immunity */
1501                         if (have_flag_of(flag_insc_immune, flgs))
1502                         {
1503                                 if (!kanji && ptr != prev_ptr)
1504                                 {
1505                                         ADD_INSC(";");
1506                                         prev_ptr = ptr;
1507                                 }
1508                                 ADD_INSC("*");
1509                         }
1510                         ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr);
1511
1512                         /* Resistance */
1513                         if (have_flag_of(flag_insc_resistance, flgs))
1514                         {
1515                                 if (kanji)
1516                                         ADD_INSC("r");
1517                                 else if (ptr != prev_ptr)
1518                                 {
1519                                         ADD_INSC(";");
1520                                         prev_ptr = ptr;
1521                                 }
1522                         }
1523                         ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr);
1524
1525                         /* Misc Ability */
1526                         if (have_flag_of(flag_insc_misc, flgs))
1527                         {
1528                                 if (ptr != prev_ptr)
1529                                 {
1530                                         ADD_INSC(";");
1531                                         prev_ptr = ptr;
1532                                 }
1533                         }
1534                         ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr);
1535
1536                         /* Aura */
1537                         if (have_flag_of(flag_insc_aura, flgs))
1538                         {
1539                                 ADD_INSC("[");
1540                         }
1541                         ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr);
1542
1543                         /* Brand Weapon */
1544                         if (have_flag_of(flag_insc_brand, flgs))
1545                                 ADD_INSC("|");
1546                         ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr);
1547
1548                         /* Kill Weapon */
1549                         if (have_flag_of(flag_insc_kill, flgs))
1550                                 ADD_INSC("/X");
1551                         ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr);
1552
1553                         /* Slay Weapon */
1554                         if (have_flag_of(flag_insc_slay, flgs))
1555                                 ADD_INSC("/");
1556                         ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr);
1557
1558                         /* Esp */
1559                         if (kanji)
1560                         {
1561                                 if (have_flag_of(flag_insc_esp1, flgs) ||
1562                                     have_flag_of(flag_insc_esp2, flgs))
1563                                         ADD_INSC("~");
1564                                 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1565                                 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1566                         }
1567                         else
1568                         {
1569                                 if (have_flag_of(flag_insc_esp1, flgs))
1570                                         ADD_INSC("~");
1571                                 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1572                                 if (have_flag_of(flag_insc_esp2, flgs))
1573                                         ADD_INSC("~");
1574                                 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1575                         }
1576
1577                         /* Random Teleport */
1578                         if (have_flag(flgs, TR_TELEPORT))
1579                         {
1580                                 ADD_INSC(".");
1581                         }
1582
1583                         /* sustain */
1584                         if (have_flag_of(flag_insc_sust, flgs))
1585                         {
1586                                 ADD_INSC("(");
1587                         }
1588                         ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr);
1589
1590                         if (ptr == start_percent)
1591                                 ADD_INSC(" ");
1592                 }
1593                 else
1594                 {
1595                         *ptr++ = *insc;
1596                 }
1597         }
1598         *ptr = '\0';
1599 }
1600
1601
1602
1603 /*
1604  * Creates a description of the item "o_ptr", and stores it in "out_val".
1605  *
1606  * One can choose the "verbosity" of the description, including whether
1607  * or not the "number" of items should be described, and how much detail
1608  * should be used when describing the item.
1609  *
1610  * The given "buf" must be MAX_NLEN chars long to hold the longest possible
1611  * description, which can get pretty long, including incriptions, such as:
1612  * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".
1613  * Note that the inscription will be clipped to keep the total description
1614  * under MAX_NLEN-1 chars (plus a terminator).
1615  *
1616  * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,
1617  * portable, versions of some common "sprintf()" commands.
1618  *
1619  * Note that all ego-items (when known) append an "Ego-Item Name", unless
1620  * the item is also an artifact, which should NEVER happen.
1621  *
1622  * Note that all artifacts (when known) append an "Artifact Name", so we
1623  * have special processing for "Specials" (artifact Lites, Rings, Amulets).
1624  * The "Specials" never use "modifiers" if they are "known", since they
1625  * have special "descriptions", such as "The Necklace of the Dwarves".
1626  *
1627  * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),
1628  * plus the artifact name, just like any other artifact, if known.
1629  *
1630  * Special Ring's and Amulet's, if not "aware", use the same code as normal
1631  * rings and amulets, and if "aware", use the "k_info" base-name (Ring or
1632  * Amulet or Necklace).  They will NEVER "append" the "k_info" name.  But,
1633  * they will append the artifact name, just like any artifact, if known.
1634  *
1635  * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.
1636  *
1637  * If "pref" then a "numeric" prefix will be pre-pended.
1638  *
1639  * Mode:
1640  *   0 -- The Cloak of Death
1641  *   1 -- The Cloak of Death [1,+3]
1642  *   2 -- The Cloak of Death [1,+3] (+2 to Stealth)
1643  *   3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
1644  */
1645 void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
1646 {
1647         cptr            basenm, modstr;
1648         int             power, indexx, i;
1649
1650         bool            aware = FALSE;
1651         bool            known = FALSE;
1652
1653         bool            append_name = FALSE;
1654
1655         bool            show_weapon = FALSE;
1656         bool            show_armour = FALSE;
1657
1658         cptr            s, u;
1659         char            *t;
1660
1661         char            p1 = '(', p2 = ')';
1662         char            b1 = '[', b2 = ']';
1663         char            c1 = '{', c2 = '}';
1664
1665         char            tmp_val[MAX_NLEN+160];
1666         char            tmp_val2[MAX_NLEN+10];
1667
1668         u32b flgs[TR_FLAG_SIZE];
1669
1670         object_type     *bow_ptr;
1671
1672
1673         object_kind *k_ptr = &k_info[o_ptr->k_idx];
1674
1675         /* Extract some flags */
1676         object_flags(o_ptr, flgs);
1677
1678         /* See if the object is "aware" */
1679         if (object_aware_p(o_ptr) || (o_ptr->ident & IDENT_MENTAL)) aware = TRUE;
1680
1681         /* See if the object is "known" */
1682         if (object_known_p(o_ptr)) known = TRUE;
1683
1684         /* Hack -- Extract the sub-type "indexx" */
1685         indexx = o_ptr->sval;
1686
1687         /* Extract default "base" string */
1688         basenm = get_object_name(o_ptr);
1689
1690         /* Assume no "modifier" string */
1691         modstr = "";
1692
1693
1694         /* Analyze the object */
1695         switch (o_ptr->tval)
1696         {
1697                 /* Some objects are easy to describe */
1698                 case TV_SKELETON:
1699                 case TV_BOTTLE:
1700                 case TV_JUNK:
1701                 case TV_SPIKE:
1702                 case TV_FLASK:
1703                 case TV_CHEST:
1704                 case TV_WHISTLE:
1705                 {
1706                         break;
1707                 }
1708
1709                 case TV_CAPTURE:
1710                 {
1711                         monster_race *r_ptr = &r_info[o_ptr->pval];
1712
1713                         if (known)
1714                         {
1715                                 if (!o_ptr->pval)
1716                                 {
1717 #ifdef JP
1718                                         modstr = "¡Ê¶õ¡Ë";
1719 #else
1720                                         modstr = " (empty)";
1721 #endif
1722                                 }
1723                                 else
1724                                 {
1725 #ifdef JP
1726                                         sprintf(tmp_val2, "¡Ê%s¡Ë",r_name + r_ptr->name);
1727                                         modstr = tmp_val2;
1728 #else
1729                                         cptr t = r_name + r_ptr->name;
1730
1731                                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1732                                         {
1733                                                 sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t);
1734
1735                                                 modstr = tmp_val2;
1736                                         }
1737                                         else
1738                                         {
1739                                                 sprintf(tmp_val2, "(%s)", t);
1740
1741                                                 modstr = t;
1742                                         }
1743 #endif
1744                                 }
1745                         }
1746                         break;
1747                 }
1748
1749                 /* Figurines/Statues */
1750                 case TV_FIGURINE:
1751                 case TV_STATUE:
1752                 {
1753                         monster_race *r_ptr = &r_info[o_ptr->pval];
1754
1755 #ifdef JP
1756                         modstr = r_name + r_ptr->name;
1757 #else
1758                         cptr t = r_name + r_ptr->name;
1759
1760                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1761                         {
1762                                 sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t);
1763
1764                                 modstr = tmp_val2;
1765                         }
1766                         else
1767                         {
1768                                 modstr = t;
1769                         }
1770 #endif
1771
1772
1773                         break;
1774                 }
1775
1776                 /* Corpses */
1777                 case TV_CORPSE:
1778                 {
1779                         monster_race *r_ptr = &r_info[o_ptr->pval];
1780
1781                         modstr = r_name + r_ptr->name;
1782
1783
1784 #ifdef JP
1785                         sprintf(tmp_val2, "& #%s", basenm + 2);
1786 #else
1787                         if (r_ptr->flags1 & RF1_UNIQUE)
1788                         {
1789                                 sprintf(tmp_val2, "%s %s", basenm, "of #");
1790                         }
1791                         else
1792                         {
1793                                 sprintf(tmp_val2, "& # %s", basenm + 2);
1794                         }
1795 #endif
1796
1797
1798                         basenm = tmp_val2;
1799                         break;
1800                 }
1801
1802                 /* Missiles/ Bows/ Weapons */
1803                 case TV_SHOT:
1804                 case TV_BOLT:
1805                 case TV_ARROW:
1806                 case TV_BOW:
1807                 case TV_HAFTED:
1808                 case TV_POLEARM:
1809                 case TV_SWORD:
1810                 case TV_DIGGING:
1811                 {
1812                         show_weapon = TRUE;
1813                         break;
1814                 }
1815
1816
1817                 /* Armour */
1818                 case TV_BOOTS:
1819                 case TV_GLOVES:
1820                 case TV_CLOAK:
1821                 case TV_CROWN:
1822                 case TV_HELM:
1823                 case TV_SHIELD:
1824                 case TV_SOFT_ARMOR:
1825                 case TV_HARD_ARMOR:
1826                 case TV_DRAG_ARMOR:
1827                 {
1828                         show_armour = TRUE;
1829                         break;
1830                 }
1831
1832
1833                 /* Lites (including a few "Specials") */
1834                 case TV_LITE:
1835                 {
1836                         break;
1837                 }
1838
1839                 /* Amulets (including a few "Specials") */
1840                 case TV_AMULET:
1841                 {
1842                         /* Known artifacts */
1843                         if (artifact_p(o_ptr) && aware) break;
1844
1845                         if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break;
1846
1847                         /* Color the object */
1848                         modstr = amulet_adj[indexx];
1849
1850                         if (aware) append_name = TRUE;
1851
1852                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1853 #ifdef JP
1854                                 basenm = aware ? "& %¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& ¥¢¥ß¥å¥ì¥Ã¥È";
1855                         else
1856                                 basenm = aware ? "& #%¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& #¥¢¥ß¥å¥ì¥Ã¥È";
1857 #else
1858                                 basenm = "& Amulet~";
1859                         else
1860                                 basenm = aware ? "& # Amulet~" : "& # Amulet~";
1861 #endif
1862
1863                         break;
1864                 }
1865
1866                 /* Rings (including a few "Specials") */
1867                 case TV_RING:
1868                 {
1869                         /* Known artifacts */
1870                         if (artifact_p(o_ptr) && aware) break;
1871
1872                         if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break;
1873
1874                         /* Color the object */
1875                         modstr = ring_adj[indexx];
1876
1877                         if (aware) append_name = TRUE;
1878
1879                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1880 #ifdef JP
1881                                 basenm = aware ? "& %¤Î»ØÎØ" : "& »ØÎØ";
1882                         else
1883                                 basenm = aware ? "& #%¤Î»ØÎØ" : "& #»ØÎØ";
1884 #else
1885                                 basenm = "& Ring~";
1886                         else
1887                                 basenm = aware ? "& # Ring~" : "& # Ring~";
1888 #endif
1889
1890                         if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE;
1891
1892                         break;
1893                 }
1894
1895                 case TV_CARD:
1896                 {
1897                         break;
1898                 }
1899
1900                 case TV_STAFF:
1901                 {
1902                         /* Color the object */
1903                         modstr = staff_adj[indexx];
1904
1905                         if (aware) append_name = TRUE;
1906                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1907 #ifdef JP
1908                                 basenm = aware ? "& %¤Î¾ó" : "& ¾ó";
1909                         else
1910                                 basenm = aware ? "& #%¤Î¾ó" : "& #¾ó";
1911 #else
1912                                 basenm = "& Staff~";
1913                         else
1914                                 basenm = aware ? "& # Staff~" : "& # Staff~";
1915 #endif
1916
1917                         break;
1918                 }
1919
1920                 case TV_WAND:
1921                 {
1922                         /* Color the object */
1923                         modstr = wand_adj[indexx];
1924
1925                         if (aware) append_name = TRUE;
1926                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1927 #ifdef JP
1928                                 basenm = aware? "& %¤ÎËâË¡ËÀ":"& ËâË¡ËÀ";
1929                         else
1930                                 basenm = aware ? "& #%¤ÎËâË¡ËÀ" : "& #ËâË¡ËÀ";
1931 #else
1932                                 basenm = "& Wand~";
1933                         else
1934                                 basenm = aware ? "& # Wand~" : "& # Wand~";
1935 #endif
1936
1937                         break;
1938                 }
1939
1940                 case TV_ROD:
1941                 {
1942                         /* Color the object */
1943                         modstr = rod_adj[indexx];
1944
1945                         if (aware) append_name = TRUE;
1946                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1947 #ifdef JP
1948                                 basenm = aware? "& %¤Î¥í¥Ã¥É":"& ¥í¥Ã¥É";
1949                         else
1950                                 basenm = aware ? "& #%¤Î¥í¥Ã¥É" : "& #¥í¥Ã¥É";
1951 #else
1952                                 basenm = "& Rod~";
1953                         else
1954                                 basenm = aware ? "& # Rod~" : "& # Rod~";
1955 #endif
1956
1957                         break;
1958                 }
1959
1960                 case TV_SCROLL:
1961                 {
1962                         /* Color the object */
1963                         modstr = scroll_adj[indexx];
1964                         if (aware) append_name = TRUE;
1965                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1966 #ifdef JP
1967                                 basenm = aware ? "& %¤Î´¬Êª" : "& ´¬Êª";
1968                         else
1969                                 basenm = aware ? "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª" : "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª";
1970 #else
1971                                 basenm = "& Scroll~";
1972                         else
1973                                 basenm = aware ? "& Scroll~ titled \"#\"" : "& Scroll~ titled \"#\"";
1974 #endif
1975
1976                         break;
1977                 }
1978
1979                 case TV_POTION:
1980                 {
1981                         /* Color the object */
1982                         modstr = potion_adj[indexx];
1983
1984                         if (aware) append_name = TRUE;
1985                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1986 #ifdef JP
1987                                 basenm = aware ? "& %¤ÎÌô" : "& Ìô";
1988                         else
1989                                 basenm = aware ? "& #%¤ÎÌô" : "& #Ìô";
1990 #else
1991                                 basenm = "& Potion~";
1992                         else
1993                                 basenm = aware ? "& # Potion~" : "& # Potion~";
1994 #endif
1995
1996                         break;
1997                 }
1998
1999                 case TV_FOOD:
2000                 {
2001                         /* Ordinary food is "boring" */
2002                         if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break;
2003
2004                         /* Color the object */
2005                         modstr = food_adj[indexx];
2006
2007                         if (aware) append_name = TRUE;
2008                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
2009 #ifdef JP
2010                                 basenm = aware ? "& %¤Î¥­¥Î¥³" : "& ¥­¥Î¥³";
2011                         else
2012                                 basenm = aware ? "& #%¤Î¥­¥Î¥³" : "& #¥­¥Î¥³";
2013 #else
2014                                 basenm = "& Mushroom~";
2015                         else
2016                                 basenm = aware ? "& # Mushroom~" : "& # Mushroom~";
2017 #endif
2018
2019                         break;
2020                 }
2021
2022                 case TV_PARCHEMENT:
2023                 {
2024                         modstr = basenm;
2025 #ifdef JP
2026                         basenm = "& ÍÓÈé»æ - #";
2027 #else
2028                         basenm = "& Parchement~ - #";
2029 #endif
2030                         break;
2031                 }
2032
2033                 /* Magic Books */
2034                 case TV_LIFE_BOOK:
2035                 {
2036                         modstr = basenm;
2037 #ifdef JP
2038                                 basenm = "& À¸Ì¿¤ÎËâË¡½ñ#";
2039 #else
2040                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2041                                 basenm = "& Book~ of Life Magic #";
2042                         else
2043                                 basenm = "& Life Spellbook~ #";
2044 #endif
2045
2046                         break;
2047                 }
2048
2049                 case TV_SORCERY_BOOK:
2050                 {
2051                         modstr = basenm;
2052 #ifdef JP
2053                                 basenm = "& Àç½Ñ¤ÎËâË¡½ñ#";
2054 #else
2055                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2056                                 basenm = "& Book~ of Sorcery #";
2057                         else
2058                                 basenm = "& Sorcery Spellbook~ #";
2059 #endif
2060
2061                         break;
2062                 }
2063
2064                 case TV_NATURE_BOOK:
2065                 {
2066                         modstr = basenm;
2067 #ifdef JP
2068                                 basenm = "& ¼«Á³¤ÎËâË¡½ñ#";
2069 #else
2070                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2071                                 basenm = "& Book~ of Nature Magic #";
2072                         else
2073                                 basenm = "& Nature Spellbook~ #";
2074 #endif
2075
2076                         break;
2077                 }
2078
2079                 case TV_CHAOS_BOOK:
2080                 {
2081                         modstr = basenm;
2082 #ifdef JP
2083                                 basenm = "& ¥«¥ª¥¹¤ÎËâË¡½ñ#";
2084 #else
2085                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2086                                 basenm = "& Book~ of Chaos Magic #";
2087                         else
2088                                 basenm = "& Chaos Spellbook~ #";
2089 #endif
2090
2091                         break;
2092                 }
2093
2094                 case TV_DEATH_BOOK:
2095                 {
2096                         modstr = basenm;
2097 #ifdef JP
2098                                 basenm = "& °Å¹õ¤ÎËâË¡½ñ#";
2099 #else
2100                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2101                                 basenm = "& Book~ of Death Magic #";
2102                         else
2103                                 basenm = "& Death Spellbook~ #";
2104 #endif
2105
2106                         break;
2107                 }
2108
2109                 case TV_TRUMP_BOOK:
2110                 {
2111                         modstr = basenm;
2112 #ifdef JP
2113                                 basenm = "& ¥È¥é¥ó¥×¤ÎËâË¡½ñ#";
2114 #else
2115                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2116                                 basenm = "& Book~ of Trump Magic #";
2117                         else
2118                                 basenm = "& Trump Spellbook~ #";
2119 #endif
2120
2121                         break;
2122                 }
2123
2124                 case TV_ARCANE_BOOK:
2125                 {
2126                         modstr = basenm;
2127 #ifdef JP
2128                                 basenm = "& Èë½Ñ¤ÎËâË¡½ñ#";
2129 #else
2130                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2131                                 basenm = "& Book~ of Arcane Magic #";
2132                         else
2133                                 basenm = "& Arcane Spellbook~ #";
2134 #endif
2135
2136                         break;
2137                 }
2138                 case TV_ENCHANT_BOOK:
2139                 {
2140                         modstr = basenm;
2141 #ifdef JP
2142                                 basenm = "& ¾¢¤ÎËâË¡½ñ#";
2143 #else
2144                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2145                                 basenm = "& Book~ of Craft Magic #";
2146                         else
2147                                 basenm = "& Craft Spellbook~ #";
2148 #endif
2149
2150                         break;
2151                 }
2152                 case TV_DAEMON_BOOK:
2153                 {
2154                         modstr = basenm;
2155 #ifdef JP
2156                                 basenm = "& °­Ëâ¤ÎËâË¡½ñ#";
2157 #else
2158                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2159                                 basenm = "& Book~ of Daemon Magic #";
2160                         else
2161                                 basenm = "& Daemon Spellbook~ #";
2162 #endif
2163
2164                         break;
2165                 }
2166                 case TV_CRUSADE_BOOK:
2167                 {
2168                         modstr = basenm;
2169 #ifdef JP
2170                                 basenm = "& Ç˼٤ÎËâË¡½ñ#";
2171 #else
2172                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2173                                 basenm = "& Book~ of Crusade Magic #";
2174                         else
2175                                 basenm = "& Crusade Spellbook~ #";
2176 #endif
2177
2178                         break;
2179                 }
2180                 case TV_MUSIC_BOOK:
2181                 {
2182                         modstr = basenm;
2183 #ifdef JP
2184                                 basenm = "& ²Î½¸#";
2185 #else
2186                                 basenm = "& Song Book~ #";
2187 #endif
2188
2189                         break;
2190                 }
2191                 case TV_HISSATSU_BOOK:
2192                 {
2193                         modstr = basenm;
2194 #ifdef JP
2195                                 basenm = "& Éð·Ý¤Î½ñ#";
2196 #else
2197                                 basenm = "& Book~ of Kendo #";
2198 #endif
2199
2200                         break;
2201                 }
2202
2203
2204
2205                 /* Hack -- Gold/Gems */
2206                 case TV_GOLD:
2207                 {
2208                         strcpy(buf, basenm);
2209                         return;
2210                 }
2211
2212                 /* Used in the "inventory" routine */
2213                 default:
2214                 {
2215 #ifdef JP
2216                         strcpy(buf, "(¤Ê¤·)");
2217 #else
2218                         strcpy(buf, "(nothing)");
2219 #endif
2220
2221                         return;
2222                 }
2223         }
2224
2225         /* Use full name from k_info or a_info */
2226         if (aware && have_flag(flgs, TR_FULL_NAME))
2227         {
2228                 if (known && o_ptr->name1) basenm = a_name + a_info[o_ptr->name1].name;
2229                 else basenm = get_object_name(o_ptr);
2230         }
2231
2232         /* Start dumping the result */
2233         t = tmp_val;
2234
2235 #ifdef JP
2236         if (basenm[0] == '&')
2237                 s = basenm + 2;
2238         else
2239                 s = basenm;
2240
2241         /* No prefix */
2242         if (!pref)
2243         {
2244                 /* Nothing */
2245         }
2246         else if (o_ptr->number > 1)
2247         {
2248                 if ( change_numeral == FALSE ){
2249                         t = object_desc_num(t, o_ptr->number);
2250                         if (o_ptr->number > 9)
2251                                 t = object_desc_str(t, "¸Ä¤Î ");
2252                         else
2253                                 t = object_desc_str(t, "¤Ä¤Î ");
2254                 }
2255                 else
2256                 {
2257                         t = object_desc_kosuu(t,o_ptr);
2258                         t = object_desc_str(t, "¤Î ");
2259                 }
2260         }
2261
2262         /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬
2263          * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë 
2264          */
2265         if (known && artifact_p(o_ptr)) t = object_desc_str(t, "¡ú");
2266         else if (known && o_ptr->art_name) t = object_desc_str(t, "¡ù");
2267
2268 #else
2269
2270         /* The object "expects" a "number" */
2271         if (basenm[0] == '&')
2272         {
2273                 /* Skip the ampersand (and space) */
2274                 s = basenm + 2;
2275
2276                 /* No prefix */
2277                 if (!pref)
2278                 {
2279                         /* Nothing */
2280                 }
2281
2282                 /* Hack -- None left */
2283                 else if (o_ptr->number <= 0)
2284                 {
2285                         t = object_desc_str(t, "no more ");
2286                 }
2287
2288                 /* Extract the number */
2289                 else if (o_ptr->number > 1)
2290                 {
2291                         t = object_desc_num(t, o_ptr->number);
2292                         t = object_desc_chr(t, ' ');
2293                 }
2294
2295                 /* Hack -- The only one of its kind */
2296                 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
2297                 {
2298                         t = object_desc_str(t, "The ");
2299                 }
2300
2301                 /* Unique corpses are unique */
2302                 else if (o_ptr->tval == TV_CORPSE)
2303                 {
2304                         monster_race *r_ptr = &r_info[o_ptr->pval];
2305
2306                         if (r_ptr->flags1 & RF1_UNIQUE)
2307                         {
2308                                 t = object_desc_str(t, "The ");
2309                         }
2310                 }
2311
2312                 /* A single one, with a vowel in the modifier */
2313                 else if ((*s == '#') && (is_a_vowel(modstr[0])))
2314                 {
2315                         t = object_desc_str(t, "an ");
2316                 }
2317
2318                 /* A single one, with a vowel */
2319                 else if (is_a_vowel(*s))
2320                 {
2321                         t = object_desc_str(t, "an ");
2322                 }
2323
2324                 /* A single one, without a vowel */
2325                 else
2326                 {
2327                         t = object_desc_str(t, "a ");
2328                 }
2329         }
2330
2331         /* Hack -- objects that "never" take an article */
2332         else
2333         {
2334                 /* No ampersand */
2335                 s = basenm;
2336
2337                 /* No pref */
2338                 if (!pref)
2339                 {
2340                         /* Nothing */
2341                 }
2342
2343                 /* Hack -- all gone */
2344                 else if (o_ptr->number <= 0)
2345                 {
2346                         t = object_desc_str(t, "no more ");
2347                 }
2348
2349                 /* Prefix a number if required */
2350                 else if (o_ptr->number > 1)
2351                 {
2352                         t = object_desc_num(t, o_ptr->number);
2353                         t = object_desc_chr(t, ' ');
2354                 }
2355
2356                 /* Hack -- The only one of its kind */
2357                 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
2358                 {
2359                         t = object_desc_str(t, "The ");
2360                 }
2361
2362                 /* Hack -- single items get no prefix */
2363                 else
2364                 {
2365                         /* Nothing */
2366                 }
2367         }
2368 #endif
2369
2370         /* Paranoia -- skip illegal tildes */
2371         /* while (*s == '~') s++; */
2372
2373 #ifdef JP
2374         if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
2375         {
2376                 t = object_desc_str(t,format("ÃÃÌê»Õ%s¤Î",player_name));
2377         }
2378
2379         /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */
2380         if (known) {
2381                 /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */
2382                 if (o_ptr->art_name)
2383                 {       char temp[256];
2384                         strcpy(temp, quark_str(o_ptr->art_name));
2385                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2386                         /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */
2387                         if ( strncmp( temp , "of ",3)==0 ) {t=object_desc_str(t,&temp[3]);t=object_desc_str(t,"¤Î");}
2388                         else 
2389                         if ( strncmp( temp , "¡Ø" , 2 ) != 0 && temp[0]!='\'')
2390                                 t=object_desc_str(t,  temp);
2391                 }
2392                 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */
2393                 else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME)) {
2394                         artifact_type *a_ptr = &a_info[o_ptr->name1];
2395                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2396                         if ( strncmp( (a_name + a_ptr->name), "¡Ø" , 2) != 0){
2397                                 t=object_desc_str(t, (a_name + a_ptr->name));
2398                         }
2399                 }
2400                 /* Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */
2401                 else if (o_ptr->name2) {
2402                         ego_item_type *e_ptr = &e_info[o_ptr->name2];
2403                         t=object_desc_str(t, (e_name + e_ptr->name));
2404                 }
2405         }
2406 #endif
2407         /* Copy the string */
2408         for (; *s; s++)
2409         {
2410                 /* Pluralizer */
2411 #ifdef JP
2412                 if (*s == '#')
2413 #else
2414                 if (*s == '~')
2415                 {
2416                         /* Add a plural if needed */
2417                         if (pref && o_ptr->number != 1)
2418                         {
2419                                 char k = t[-1];
2420
2421                                 /* XXX XXX XXX Mega-Hack */
2422
2423                                 /* Hack -- "Cutlass-es" and "Torch-es" */
2424                                 if ((k == 's') || (k == 'h')) *t++ = 'e';
2425
2426                                 /* Add an 's' */
2427                                 *t++ = 's';
2428                         }
2429                 }
2430
2431                 /* Modifier */
2432                 else if (*s == '#')
2433 #endif
2434
2435                 {
2436                         /* Insert the modifier */
2437                         for (u = modstr; *u; u++) *t++ = *u;
2438                 }
2439
2440 #ifdef JP
2441                 else if (*s == '%')
2442                   /* saigo ¤ÎÂå¤ï¤ê¡£¸úǽ¤òÉÕ²½¤¹¤ë by ita*/
2443                 {
2444                   modstr=get_object_name(o_ptr);
2445                   for (u = modstr; *u; u++) *t++ = *u;
2446                 }
2447 #endif
2448                 /* Normal */
2449                 else
2450                 {
2451                         /* Copy */
2452                         *t++ = *s;
2453                 }
2454         }
2455
2456         /* Terminate */
2457         *t = '\0';
2458
2459
2460         /* Append the "kind name" to the "base name" */
2461 #ifndef JP
2462         if (append_name)
2463         {
2464                 t = object_desc_str(t, " of ");
2465                 t = object_desc_str(t, get_object_name(o_ptr));
2466         }
2467 #endif
2468
2469
2470 #ifdef JP
2471         /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */
2472         if (known) {
2473                 /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿
2474                    ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */
2475                 if (o_ptr->art_name)
2476                 {       char temp[256];int itemp;
2477                         strcpy(temp, quark_str(o_ptr->art_name));
2478                         /* MEGA HACK by ita*/
2479                                 if ( strncmp( temp , "¡Ø" , 2 ) == 0 ) t=object_desc_str(t,  temp);else
2480                          if( temp[0]=='\'' ) { itemp=strlen(temp);temp[itemp-1]=0; 
2481                          t=object_desc_str(t,"¡Ø");
2482                          t=object_desc_str(t,&temp[1]);
2483                          t=object_desc_str(t,"¡Ù");}
2484                                 
2485                 }
2486                 else if (o_ptr->name1) {
2487                                 artifact_type *a_ptr = &a_info[o_ptr->name1];
2488                                 if ( strncmp( (a_name + a_ptr->name) , "¡Ø" , 2 ) == 0 ){
2489                                         t=object_desc_str(t, (a_name + a_ptr->name));
2490                                 }
2491                 }
2492                 else if (o_ptr->inscription)
2493                 {
2494                         cptr str = quark_str(o_ptr->inscription);
2495
2496                         while(*str)
2497                         {
2498                                 if (iskanji(*str))
2499                                 {
2500                                         str += 2;
2501                                         continue;
2502                                 }
2503                                 if (*str == '#') break;
2504                                 str++;
2505                         }
2506                         if (*str)
2507                         {
2508                                 /* Find the '#' */
2509                                 cptr str = strchr(quark_str(o_ptr->inscription), '#');
2510
2511                                 /* Add the false name */
2512                                 t=object_desc_str(t,"¡Ø");
2513                                 t = object_desc_str(t, &str[1]);
2514                                 t=object_desc_str(t,"¡Ù");
2515                         }
2516                 }
2517         }
2518 #else
2519         if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
2520         {
2521                 t = object_desc_str(t,format(" of %s the Smith",player_name));
2522         }
2523
2524         /* Hack -- Append "Artifact" or "Special" names */
2525         if (known && !have_flag(flgs, TR_FULL_NAME))
2526         {
2527                 /* Is it a new random artifact ? */
2528                 if (o_ptr->art_name)
2529                 {
2530                         t = object_desc_chr(t, ' ');
2531
2532                         t = object_desc_str(t, quark_str(o_ptr->art_name));
2533                 }
2534
2535                 /* Grab any artifact name */
2536                 else if (o_ptr->name1)
2537                 {
2538                         artifact_type *a_ptr = &a_info[o_ptr->name1];
2539
2540                         t = object_desc_chr(t, ' ');
2541                         t = object_desc_str(t, (a_name + a_ptr->name));
2542                 }
2543
2544                 /* Grab any ego-item name */
2545                 else
2546                 {
2547                         if (o_ptr->name2)
2548                         {
2549                                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2550
2551                                 t = object_desc_chr(t, ' ');
2552                                 t = object_desc_str(t, (e_name + e_ptr->name));
2553                         }
2554
2555                         if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#'))
2556                         {
2557                                 /* Find the '#' */
2558                                 cptr str = strchr(quark_str(o_ptr->inscription), '#');
2559
2560                                 /* Add the false name */
2561                                 t = object_desc_chr(t, ' ');
2562                                 t = object_desc_str(t, &str[1]);
2563                         }
2564                 }
2565         }
2566 #endif
2567
2568
2569
2570         /* No more details wanted */
2571         if (mode < 1) goto copyback;
2572
2573         /* Hack -- Chests must be described in detail */
2574         if (o_ptr->tval == TV_CHEST)
2575         {
2576                 /* Not searched yet */
2577                 if (!known)
2578                 {
2579                         /* Nothing */
2580                 }
2581
2582                 /* May be "empty" */
2583                 else if (!o_ptr->pval)
2584                 {
2585 #ifdef JP
2586 t = object_desc_str(t, "(¶õ)");
2587 #else
2588                         t = object_desc_str(t, " (empty)");
2589 #endif
2590
2591                 }
2592
2593                 /* May be "disarmed" */
2594                 else if (o_ptr->pval < 0)
2595                 {
2596                         if (chest_traps[0 - o_ptr->pval])
2597                         {
2598 #ifdef JP
2599 t = object_desc_str(t, "(²ò½üºÑ)");
2600 #else
2601                                 t = object_desc_str(t, " (disarmed)");
2602 #endif
2603
2604                         }
2605                         else
2606                         {
2607 #ifdef JP
2608 t = object_desc_str(t, "(Èó»Ü¾û)");
2609 #else
2610                                 t = object_desc_str(t, " (unlocked)");
2611 #endif
2612
2613                         }
2614                 }
2615
2616                 /* Describe the traps, if any */
2617                 else
2618                 {
2619                         /* Describe the traps */
2620                         switch (chest_traps[o_ptr->pval])
2621                         {
2622                                 case 0:
2623                                 {
2624 #ifdef JP
2625 t = object_desc_str(t, "(»Ü¾û)");
2626 #else
2627                                         t = object_desc_str(t, " (Locked)");
2628 #endif
2629
2630                                         break;
2631                                 }
2632                                 case CHEST_LOSE_STR:
2633                                 {
2634 #ifdef JP
2635 t = object_desc_str(t, "(ÆÇ¿Ë)");
2636 #else
2637                                         t = object_desc_str(t, " (Poison Needle)");
2638 #endif
2639
2640                                         break;
2641                                 }
2642                                 case CHEST_LOSE_CON:
2643                                 {
2644 #ifdef JP
2645 t = object_desc_str(t, "(ÆÇ¿Ë)");
2646 #else
2647                                         t = object_desc_str(t, " (Poison Needle)");
2648 #endif
2649
2650                                         break;
2651                                 }
2652                                 case CHEST_POISON:
2653                                 {
2654 #ifdef JP
2655 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2656 #else
2657                                         t = object_desc_str(t, " (Gas Trap)");
2658 #endif
2659
2660                                         break;
2661                                 }
2662                                 case CHEST_PARALYZE:
2663                                 {
2664 #ifdef JP
2665 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2666 #else
2667                                         t = object_desc_str(t, " (Gas Trap)");
2668 #endif
2669
2670                                         break;
2671                                 }
2672                                 case CHEST_EXPLODE:
2673                                 {
2674 #ifdef JP
2675 t = object_desc_str(t, "(ÇúȯÁõÃÖ)");
2676 #else
2677                                         t = object_desc_str(t, " (Explosion Device)");
2678 #endif
2679
2680                                         break;
2681                                 }
2682                                 case CHEST_SUMMON:
2683                                 case CHEST_BIRD_STORM:
2684                                 case CHEST_E_SUMMON:
2685                                 case CHEST_H_SUMMON:
2686                                 {
2687 #ifdef JP
2688 t = object_desc_str(t, "(¾¤´­¤Î¥ë¡¼¥ó)");
2689 #else
2690                                         t = object_desc_str(t, " (Summoning Runes)");
2691 #endif
2692
2693                                         break;
2694                                 }
2695                                 case CHEST_RUNES_OF_EVIL:
2696                                 {
2697 #ifdef JP
2698 t = object_desc_str(t, "(¼Ù°­¤Ê¥ë¡¼¥ó)");
2699 #else
2700                                         t = object_desc_str(t, " (Gleaming Black Runes)");
2701 #endif
2702
2703                                         break;
2704                                 }
2705                                 case CHEST_ALARM:
2706                                 {
2707 #ifdef JP
2708 t = object_desc_str(t, "(·ÙÊóÁõÃÖ)");
2709 #else
2710                                         t = object_desc_str(t, " (Alarm)");
2711 #endif
2712
2713                                         break;
2714                                 }
2715                                 default:
2716                                 {
2717 #ifdef JP
2718 t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)");
2719 #else
2720                                         t = object_desc_str(t, " (Multiple Traps)");
2721 #endif
2722
2723                                         break;
2724                                 }
2725                         }
2726                 }
2727         }
2728
2729
2730         /* Display the item like a weapon */
2731         if (have_flag(flgs, TR_SHOW_MODS)) show_weapon = TRUE;
2732
2733         /* Display the item like a weapon */
2734         if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
2735
2736         /* Display the item like armour */
2737         if (o_ptr->ac) show_armour = TRUE;
2738
2739
2740         /* Dump base weapon info */
2741         switch (o_ptr->tval)
2742         {
2743                 /* Missiles and Weapons */
2744                 case TV_SHOT:
2745                 case TV_BOLT:
2746                 case TV_ARROW:
2747                 case TV_HAFTED:
2748                 case TV_POLEARM:
2749                 case TV_SWORD:
2750                 case TV_DIGGING:
2751
2752                 /* Append a "damage" string */
2753                 t = object_desc_chr(t, ' ');
2754                 t = object_desc_chr(t, p1);
2755                 t = object_desc_num(t, o_ptr->dd);
2756                 t = object_desc_chr(t, 'd');
2757                 t = object_desc_num(t, o_ptr->ds);
2758                 t = object_desc_chr(t, p2);
2759
2760                 /* All done */
2761                 break;
2762
2763
2764                 /* Bows get a special "damage string" */
2765                 case TV_BOW:
2766
2767                 /* Mega-Hack -- Extract the "base power" */
2768                 power = (o_ptr->sval % 10);
2769
2770                 /* Apply the "Extra Might" flag */
2771                 if (have_flag(flgs, TR_XTRA_MIGHT)) power++;
2772
2773                 /* Append a special "damage" string */
2774                 t = object_desc_chr(t, ' ');
2775                 t = object_desc_chr(t, p1);
2776                 t = object_desc_chr(t, 'x');
2777                 t = object_desc_num(t, power);
2778                 t = object_desc_chr(t, p2);
2779
2780                 /* All done */
2781                 break;
2782         }
2783
2784
2785         /* Add the weapon bonuses */
2786         if (known)
2787         {
2788                 /* Show the tohit/todam on request */
2789                 if (show_weapon)
2790                 {
2791                         t = object_desc_chr(t, ' ');
2792                         t = object_desc_chr(t, p1);
2793                         t = object_desc_int(t, o_ptr->to_h);
2794                         t = object_desc_chr(t, ',');
2795                         t = object_desc_int(t, o_ptr->to_d);
2796                         t = object_desc_chr(t, p2);
2797                 }
2798
2799                 /* Show the tohit if needed */
2800                 else if (o_ptr->to_h)
2801                 {
2802                         t = object_desc_chr(t, ' ');
2803                         t = object_desc_chr(t, p1);
2804                         t = object_desc_int(t, o_ptr->to_h);
2805                         t = object_desc_chr(t, p2);
2806                 }
2807
2808                 /* Show the todam if needed */
2809                 else if (o_ptr->to_d)
2810                 {
2811                         t = object_desc_chr(t, ' ');
2812                         t = object_desc_chr(t, p1);
2813                         t = object_desc_int(t, o_ptr->to_d);
2814                         t = object_desc_chr(t, p2);
2815                 }
2816         }
2817
2818         bow_ptr = &inventory[INVEN_BOW];
2819
2820         /* if have a firing weapon + ammo matches bow*/
2821         if (bow_ptr->k_idx &&
2822             (((bow_ptr->sval == SV_SLING) && (o_ptr->tval == TV_SHOT)) ||
2823              (((bow_ptr->sval == SV_SHORT_BOW) ||
2824                (bow_ptr->sval == SV_LONG_BOW) ||
2825                (bow_ptr->sval == SV_NAMAKE_BOW)) && (o_ptr->tval == TV_ARROW)) ||
2826              (((bow_ptr->sval == SV_LIGHT_XBOW) ||
2827                (bow_ptr->sval == SV_HEAVY_XBOW)) && (o_ptr->tval == TV_BOLT))))
2828         {
2829                 int avgdam = 10;
2830                 int tmul;
2831                 s16b energy_fire;
2832
2833                 avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2;
2834
2835                 /* See if the bow is "known" - then set damage bonus*/
2836                 if (object_known_p(bow_ptr))
2837                 {
2838                         avgdam += (bow_ptr->to_d * 10);
2839                 }
2840
2841                 /* effect of ammo */
2842                 if (known) avgdam += (o_ptr->to_d * 10);
2843
2844                 energy_fire = bow_energy(bow_ptr->sval);
2845                 tmul = bow_tmul(bow_ptr->sval);
2846
2847                 /* Get extra "power" from "extra might" */
2848                 if (p_ptr->xtra_might) tmul++;
2849
2850                 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2851
2852                 /* launcher multiplier */
2853                 avgdam *= tmul;
2854                 avgdam /= (100 * 10);
2855                 if (avgdam < 0) avgdam = 0;
2856
2857                 /* display (shot damage/ avg damage) */
2858                 t = object_desc_chr(t, ' ');
2859                 t = object_desc_chr(t, p1);
2860                 t = object_desc_num(t, avgdam);
2861                 t = object_desc_chr(t, '/');
2862
2863                 if (p_ptr->num_fire == 0)
2864                 {
2865                         t = object_desc_chr(t, '0');
2866                 }
2867                 else
2868                 {
2869                         /* calc effects of energy */
2870                         avgdam *= (p_ptr->num_fire * 100);
2871
2872                         avgdam /= energy_fire;
2873
2874                         t = object_desc_num(t, avgdam);
2875                 }
2876
2877                 t = object_desc_chr(t, p2);
2878         }
2879         else if ((p_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE))
2880         {
2881                 int avgdam;
2882                 s16b energy_fire;
2883
2884                 if (p_ptr->mighty_throw)
2885                         avgdam =  1 + 3;
2886                 else
2887                         avgdam =  1;
2888                 avgdam += ((p_ptr->lev+30)*(p_ptr->lev+30)-900)/55;
2889
2890                 energy_fire = 100 - p_ptr->lev;
2891
2892                 /* display (shot damage/ avg damage) */
2893                 t = object_desc_chr(t, ' ');
2894                 t = object_desc_chr(t, p1);
2895                 t = object_desc_num(t, avgdam);
2896                 t = object_desc_chr(t, '/');
2897
2898                 /* calc effects of energy */
2899                 avgdam = 100 * avgdam / energy_fire;
2900
2901                 t = object_desc_num(t, avgdam);
2902
2903                 t = object_desc_chr(t, p2);
2904         }
2905                
2906
2907         /* Add the armor bonuses */
2908         if (known)
2909         {
2910                 /* Show the armor class info */
2911                 if (show_armour)
2912                 {
2913                         t = object_desc_chr(t, ' ');
2914                         t = object_desc_chr(t, b1);
2915                         t = object_desc_num(t, o_ptr->ac);
2916                         t = object_desc_chr(t, ',');
2917                         t = object_desc_int(t, o_ptr->to_a);
2918                         t = object_desc_chr(t, b2);
2919                 }
2920
2921                 /* No base armor, but does increase armor */
2922                 else if (o_ptr->to_a)
2923                 {
2924                         t = object_desc_chr(t, ' ');
2925                         t = object_desc_chr(t, b1);
2926                         t = object_desc_int(t, o_ptr->to_a);
2927                         t = object_desc_chr(t, b2);
2928                 }
2929         }
2930
2931         /* Hack -- always show base armor */
2932         else if (show_armour)
2933         {
2934                 t = object_desc_chr(t, ' ');
2935                 t = object_desc_chr(t, b1);
2936                 t = object_desc_num(t, o_ptr->ac);
2937                 t = object_desc_chr(t, b2);
2938         }
2939
2940
2941         /* No more details wanted */
2942         if (mode < 2) goto copyback;
2943
2944
2945         /*
2946          * Hack -- Wands and Staffs have charges.  Make certain how many charges
2947          * a stack of staffs really has is clear. -LM-
2948          */
2949         if (known &&
2950             ((o_ptr->tval == TV_STAFF) ||
2951              (o_ptr->tval == TV_WAND)))
2952         {
2953                 /* Dump " (N charges)" */
2954                 t = object_desc_chr(t, ' ');
2955                 t = object_desc_chr(t, p1);
2956
2957                 /* Clear explaination for staffs. */
2958                 if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1))
2959                 {
2960                         t = object_desc_num(t, o_ptr->number);
2961                         t = object_desc_str(t, "x ");
2962                 }
2963                 t = object_desc_num(t, o_ptr->pval);
2964 #ifdef JP
2965                 t = object_desc_str(t, "²óʬ");
2966 #else
2967                 t = object_desc_str(t, " charge");
2968
2969                 if (o_ptr->pval != 1)
2970                 {
2971                         t = object_desc_chr(t, 's');
2972                 }
2973 #endif
2974
2975
2976                 t = object_desc_chr(t, p2);
2977         }
2978         /* Hack -- Rods have a "charging" indicator.  Now that stacks of rods may
2979          * be in any state of charge or discharge, this now includes a number. -LM-
2980          */
2981         else if (known && (o_ptr->tval == TV_ROD))
2982         {
2983                 /* Hack -- Dump " (# charging)" if relevant */
2984                 if (o_ptr->timeout)
2985                 {
2986                         /* Stacks of rods display an exact count of charging rods. */
2987                         if (o_ptr->number > 1)
2988                         {
2989                                 /* Paranoia. */
2990                                 if (k_ptr->pval == 0) k_ptr->pval = 1;
2991
2992                                 /* Find out how many rods are charging, by dividing
2993                                  * current timeout by each rod's maximum timeout.
2994                                  * Ensure that any remainder is rounded up.  Display
2995                                  * very discharged stacks as merely fully discharged.
2996                                  */
2997                                 power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2998                                 if (power > o_ptr->number) power = o_ptr->number;
2999
3000                                 /* Display prettily. */
3001                                 t = object_desc_str(t, " (");
3002                                 t = object_desc_num(t, power);
3003 #ifdef JP
3004                                 t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)");
3005 #else
3006                                 t = object_desc_str(t, " charging)");
3007 #endif
3008
3009                         }
3010
3011                         /* "one Rod of Perception (1 charging)" would look tacky. */
3012                         else
3013                         {
3014 #ifdef JP
3015 t = object_desc_str(t, "(½¼Å¶Ãæ)");
3016 #else
3017                                 t = object_desc_str(t, " (charging)");
3018 #endif
3019
3020                         }
3021                 }
3022         }
3023
3024         /* Dump "pval" flags for wearable items */
3025         if (known && (have_pval_flags(flgs)))
3026         {
3027                 /* Start the display */
3028                 t = object_desc_chr(t, ' ');
3029                 t = object_desc_chr(t, p1);
3030
3031                 /* Dump the "pval" itself */
3032                 t = object_desc_int(t, o_ptr->pval);
3033
3034                 /* Do not display the "pval" flags */
3035                 if (have_flag(flgs, TR_HIDE_TYPE))
3036                 {
3037                         /* Nothing */
3038                 }
3039
3040                 /* Speed */
3041                 else if (have_flag(flgs, TR_SPEED))
3042                 {
3043                         /* Dump " to speed" */
3044 #ifdef JP
3045 t = object_desc_str(t, "²Ã®");
3046 #else
3047                         t = object_desc_str(t, " to speed");
3048 #endif
3049
3050                 }
3051
3052                 /* Attack speed */
3053                 else if (have_flag(flgs, TR_BLOWS))
3054                 {
3055                         /* Add " attack" */
3056 #ifdef JP
3057 t = object_desc_str(t, "¹¶·â");
3058 #else
3059                         t = object_desc_str(t, " attack");
3060
3061                         /* Add "attacks" */
3062                         if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
3063 #endif
3064
3065                 }
3066
3067                 /* Stealth */
3068                 else if (have_flag(flgs, TR_STEALTH))
3069                 {
3070                         /* Dump " to stealth" */
3071 #ifdef JP
3072 t = object_desc_str(t, "±£Ì©");
3073 #else
3074                         t = object_desc_str(t, " to stealth");
3075 #endif
3076
3077                 }
3078
3079                 /* Search */
3080                 else if (have_flag(flgs, TR_SEARCH))
3081                 {
3082                         /* Dump " to searching" */
3083 #ifdef JP
3084 t = object_desc_str(t, "õº÷");
3085 #else
3086                         t = object_desc_str(t, " to searching");
3087 #endif
3088
3089                 }
3090
3091                 /* Infravision */
3092                 else if (have_flag(flgs, TR_INFRA))
3093                 {
3094                         /* Dump " to infravision" */
3095 #ifdef JP
3096 t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ");
3097 #else
3098                         t = object_desc_str(t, " to infravision");
3099 #endif
3100
3101                 }
3102
3103                 /* Tunneling */
3104                 else if (have_flag(flgs, TR_TUNNEL))
3105                 {
3106                         /* Nothing */
3107                 }
3108
3109                 /* Finish the display */
3110                 t = object_desc_chr(t, p2);
3111         }
3112
3113         /* Hack -- Process Lanterns/Torches */
3114         if (known && (o_ptr->tval == TV_LITE) && (!(artifact_p(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR))))
3115         {
3116                 /* Hack -- Turns of light for normal lites */
3117 #ifdef JP
3118 t = object_desc_str(t, "(");
3119 #else
3120                 t = object_desc_str(t, " (with ");
3121 #endif
3122
3123                 if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4*2);
3124                 else t = object_desc_num(t, o_ptr->xtra4);
3125 #ifdef JP
3126 t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)");
3127 #else
3128                 t = object_desc_str(t, " turns of light)");
3129 #endif
3130
3131         }
3132
3133
3134         /* Indicate charging objects, but not rods. */
3135         if (known && o_ptr->timeout && o_ptr->tval != TV_ROD)
3136         {
3137                 /* Hack -- Dump " (charging)" if relevant */
3138 #ifdef JP
3139 t = object_desc_str(t, "(½¼Å¶Ãæ)");
3140 #else
3141                 t = object_desc_str(t, " (charging)");
3142 #endif
3143
3144         }
3145
3146
3147         /* No more details wanted */
3148         if (mode < 3) goto copyback;
3149
3150
3151         /* No inscription yet */
3152         tmp_val2[0] = '\0';
3153
3154         /* Use the game-generated "feeling" otherwise, if available */
3155         if (o_ptr->feeling)
3156         {
3157                 strcpy(tmp_val2, game_inscriptions[o_ptr->feeling]);
3158         }
3159
3160         /* Note "cursed" if the item is known to be cursed */
3161         else if (cursed_p(o_ptr) && (known || (o_ptr->ident & (IDENT_SENSE))))
3162         {
3163 #ifdef JP
3164 strcpy(tmp_val2, "¼ö¤ï¤ì¤Æ¤¤¤ë");
3165 #else
3166                 strcpy(tmp_val2, "cursed");
3167 #endif
3168
3169         }
3170  
3171         /* Note "unidentified" if the item is unidentified */
3172         else if ((o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET
3173                   || o_ptr->tval == TV_LITE || o_ptr->tval == TV_FIGURINE)
3174                  && object_aware_p(o_ptr) && !object_known_p(o_ptr)
3175                  && !((o_ptr->ident)&IDENT_SENSE))
3176         {
3177 #ifdef JP
3178 strcpy(tmp_val2, "̤´ÕÄê");
3179 #else
3180                 strcpy(tmp_val2, "unidentified");
3181 #endif
3182         }
3183
3184         /* Mega-Hack -- note empty wands/staffs */
3185         else if (!known && (o_ptr->ident & (IDENT_EMPTY)))
3186         {
3187 #ifdef JP
3188 strcpy(tmp_val2, "¶õ");
3189 #else
3190                 strcpy(tmp_val2, "empty");
3191 #endif
3192
3193         }
3194
3195         /* Note "tried" if the object has been tested unsuccessfully */
3196         else if (!aware && object_tried_p(o_ptr))
3197         {
3198 #ifdef JP
3199 strcpy(tmp_val2, "̤ȽÌÀ");
3200 #else
3201                 strcpy(tmp_val2, "tried");
3202 #endif
3203
3204         }
3205
3206         /* Use the standard inscription if available */
3207         if (o_ptr->inscription)
3208         {
3209                 char buff[1024];
3210
3211                 if (tmp_val2[0]) strcat(tmp_val2, ", ");
3212
3213                 /* Get inscription and convert {%} */
3214                 get_inscription(buff, o_ptr);
3215
3216                 /* strcat with correct treating of kanji */
3217                 my_strcat(tmp_val2, buff, sizeof(tmp_val2));
3218         }
3219
3220         /* Note the discount, if any */
3221         else if (o_ptr->discount && !(tmp_val2[0]))
3222         {
3223                 (void)object_desc_num(tmp_val2, o_ptr->discount);
3224 #ifdef JP
3225                 strcat(tmp_val2, "%°ú¤­");
3226 #else
3227                 strcat(tmp_val2, "% off");
3228 #endif
3229
3230         }
3231
3232         /* Append the inscription, if any */
3233         if (tmp_val2[0])
3234         {
3235                 /* Append the inscription */
3236                 t = object_desc_chr(t, ' ');
3237                 t = object_desc_chr(t, c1);
3238                 t = object_desc_str(t, tmp_val2);
3239                 t = object_desc_chr(t, c2);
3240         }
3241
3242 copyback:
3243         t = tmp_val;
3244         for (i = 0; i < MAX_NLEN-2; i++)
3245         {
3246 #ifdef JP
3247                 if (iskanji(*(t+i)))
3248                 {
3249                         *(buf+i) = *(t+i);
3250                         i++;
3251                 }
3252 #endif
3253                 *(buf+i) = *(t+i);
3254         }
3255         if (i == MAX_NLEN-2)
3256         {
3257 #ifdef JP
3258                 if (iskanji(*(t+i)))
3259                         *(buf+i) = '\0';
3260                 else
3261 #endif
3262                         *(buf+i) = *(t+i);
3263         }
3264         *(buf+MAX_NLEN-1) = '\0';
3265 }
3266