OSDN Git Service

42dc3cd506a502416071b81be910450caed0b488
[hengband/hengband.git] / src / flavor.c
1 /* Purpose: Object flavor code */
2
3 /*
4  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research,
7  * and not for profit purposes provided that this copyright and statement
8  * are included in all such copies.  Other copyrights may also apply.
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    30       /* 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", "Emerald", "Sapphire", "Garnet", "Diamond"
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, TERM_GREEN, TERM_BLUE, TERM_RED, TERM_WHITE
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 /*
498  * Prepare the "variable" part of the "k_info" array.
499  *
500  * The "color"/"metal"/"type" of an item is its "flavor".
501  * For the most part, flavors are assigned randomly each game.
502  *
503  * Initialize descriptions for the "colored" objects, including:
504  * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.
505  *
506  * The first 4 entries for potions are fixed (Water, Apple Juice,
507  * Slime Mold Juice, Unused Potion).
508  *
509  * Scroll titles are always between 6 and 14 letters long.  This is
510  * ensured because every title is composed of whole words, where every
511  * word is from 1 to 8 letters long (one or two syllables of 1 to 4
512  * letters each), and that no scroll is finished until it attempts to
513  * grow beyond 15 letters.  The first time this can happen is when the
514  * current title has 6 letters and the new word has 8 letters, which
515  * would result in a 6 letter scroll title.
516  *
517  * Duplicate titles are avoided by requiring that no two scrolls share
518  * the same first four letters (not the most efficient method, and not
519  * the least efficient method, but it will always work).
520  *
521  * Hack -- make sure everything stays the same for each saved game
522  * This is accomplished by the use of a saved "random seed", as in
523  * "town_gen()".  Since no other functions are called while the special
524  * seed is in effect, so this function is pretty "safe".
525  *
526  * Note that the "hacked seed" may provide an RNG with alternating parity!
527  */
528 void flavor_init(void)
529 {
530         int     i, j;
531
532         byte    temp_col;
533
534         cptr    temp_adj;
535
536
537         /* Hack -- Use the "simple" RNG */
538         Rand_quick = TRUE;
539
540         /* Hack -- Induce consistant flavors */
541         Rand_value = seed_flavor;
542
543
544         /* Efficiency -- Rods/Wands share initial array */
545         for (i = 0; i < MAX_METALS; i++)
546         {
547                 rod_adj[i] = wand_adj[i];
548                 rod_col[i] = wand_col[i];
549         }
550
551
552         /* Rings have "ring colors" */
553         for (i = 0; i < MAX_ROCKS; i++)
554         {
555                 j = randint0(MAX_ROCKS);
556                 temp_adj = ring_adj[i];
557                 ring_adj[i] = ring_adj[j];
558                 ring_adj[j] = temp_adj;
559
560                 temp_col = ring_col[i];
561                 ring_col[i] = ring_col[j];
562                 ring_col[j] = temp_col;
563         }
564
565         /* Hack -- The One Ring */
566 #ifdef JP
567         ring_adj[SV_RING_POWER] = "¶â̵¹¤¤Î";
568         ring_adj[SV_RING_AHO] = "¶âÍ­¹¤¤Î";
569 #else
570         ring_adj[SV_RING_POWER] = "Plain Gold";
571         ring_adj[SV_RING_AHO] = "Plain Goldarn";
572 #endif
573
574         if (!use_graphics)
575         {
576                 ring_col[SV_RING_POWER] = TERM_YELLOW;
577                 ring_col[SV_RING_AHO] = TERM_YELLOW;
578         }
579
580         /* Amulets have "amulet colors" */
581         for (i = 0; i < MAX_AMULETS; i++)
582         {
583                 j = randint0(MAX_AMULETS);
584                 temp_adj = amulet_adj[i];
585                 amulet_adj[i] = amulet_adj[j];
586                 amulet_adj[j] = temp_adj;
587
588                 temp_col = amulet_col[i];
589                 amulet_col[i] = amulet_col[j];
590                 amulet_col[j] = temp_col;
591         }
592
593         /* Staffs */
594         for (i = 0; i < MAX_WOODS; i++)
595         {
596                 j = randint0(MAX_WOODS);
597                 temp_adj = staff_adj[i];
598                 staff_adj[i] = staff_adj[j];
599                 staff_adj[j] = temp_adj;
600
601                 temp_col = staff_col[i];
602                 staff_col[i] = staff_col[j];
603                 staff_col[j] = temp_col;
604         }
605
606         /* Wands */
607         for (i = 0; i < MAX_METALS; i++)
608         {
609                 j = randint0(MAX_METALS);
610                 temp_adj = wand_adj[i];
611                 wand_adj[i] = wand_adj[j];
612                 wand_adj[j] = temp_adj;
613
614                 temp_col = wand_col[i];
615                 wand_col[i] = wand_col[j];
616                 wand_col[j] = temp_col;
617         }
618
619         /* Rods */
620         for (i = 0; i < MAX_METALS; i++)
621         {
622                 j = randint0(MAX_METALS);
623                 temp_adj = rod_adj[i];
624                 rod_adj[i] = rod_adj[j];
625                 rod_adj[j] = temp_adj;
626
627                 temp_col = rod_col[i];
628                 rod_col[i] = rod_col[j];
629                 rod_col[j] = temp_col;
630         }
631
632         /* Foods (Mushrooms) */
633         for (i = 0; i < MAX_SHROOM; i++)
634         {
635                 j = randint0(MAX_SHROOM);
636                 temp_adj = food_adj[i];
637                 food_adj[i] = food_adj[j];
638                 food_adj[j] = temp_adj;
639
640                 temp_col = food_col[i];
641                 food_col[i] = food_col[j];
642                 food_col[j] = temp_col;
643         }
644
645         /* Potions */
646         for (i = 4; i < MAX_COLORS; i++)
647         {
648                 j = randint0(MAX_COLORS - 4) + 4;
649                 temp_adj = potion_adj[i];
650                 potion_adj[i] = potion_adj[j];
651                 potion_adj[j] = temp_adj;
652
653                 temp_col = potion_col[i];
654                 potion_col[i] = potion_col[j];
655                 potion_col[j] = temp_col;
656         }
657
658         /* Scrolls (random titles, always white) */
659         for (i = 0; i < MAX_TITLES; i++)
660         {
661                 /* Get a new title */
662                 while (TRUE)
663                 {
664                         char buf[80];
665
666                         bool okay;
667
668                         /* Start a new title */
669                         buf[0] = '\0';
670
671                         /* Collect words until done */
672                         while (1)
673                         {
674                                 int q, s;
675
676                                 char tmp[80];
677
678                                 /* Start a new word */
679                                 tmp[0] = '\0';
680
681                                 /* Choose one or two syllables */
682                                 s = ((randint0(100) < 30) ? 1 : 2);
683
684                                 /* Add a one or two syllable word */
685                                 for (q = 0; q < s; q++)
686                                 {
687                                         /* Add the syllable */
688                                         strcat(tmp, syllables[randint0(MAX_SYLLABLES)]);
689                                 }
690
691                                 /* Stop before getting too long */
692                                 if (strlen(buf) + 1 + strlen(tmp) > 15) break;
693
694                                 /* Add a space */
695                                 strcat(buf, " ");
696
697                                 /* Add the word */
698                                 strcat(buf, tmp);
699                         }
700
701                         /* Save the title */
702                         strcpy(scroll_adj[i], buf+1);
703
704                         /* Assume okay */
705                         okay = TRUE;
706
707                         /* Check for "duplicate" scroll titles */
708                         for (j = 0; j < i; j++)
709                         {
710                                 cptr hack1 = scroll_adj[j];
711                                 cptr hack2 = scroll_adj[i];
712
713                                 /* Compare first four characters */
714                                 if (*hack1++ != *hack2++) continue;
715                                 if (*hack1++ != *hack2++) continue;
716                                 if (*hack1++ != *hack2++) continue;
717                                 if (*hack1++ != *hack2++) continue;
718
719                                 /* Not okay */
720                                 okay = FALSE;
721
722                                 /* Stop looking */
723                                 break;
724                         }
725
726                         /* Break when done */
727                         if (okay) break;
728                 }
729
730                 /* All scrolls are white */
731                 scroll_col[i] = TERM_WHITE;
732         }
733
734
735         /* Hack -- Use the "complex" RNG */
736         Rand_quick = FALSE;
737
738         /* Analyze every object */
739         for (i = 1; i < max_k_idx; i++)
740         {
741                 object_kind *k_ptr = &k_info[i];
742
743                 /* Skip "empty" objects */
744                 if (!k_ptr->name) continue;
745
746                 /* Extract "flavor" (if any) */
747                 k_ptr->flavor = object_flavor(i);
748
749                 /* No flavor yields aware */
750                 if (!k_ptr->flavor) k_ptr->aware = TRUE;
751
752                 /* Check for "easily known" */
753                 k_ptr->easy_know = object_easy_know(i);
754         }
755 }
756
757
758 /*
759  * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
760  * and return a pointer to the terminator (t + 1).
761  */
762 static char *object_desc_chr(char *t, char c)
763 {
764         /* Copy the char */
765         *t++ = c;
766
767         /* Terminate */
768         *t = '\0';
769
770         /* Result */
771         return (t);
772 }
773
774
775 /*
776  * Print a string "s" into a string "t", as if by strcpy(t, s),
777  * and return a pointer to the terminator.
778  */
779 static char *object_desc_str(char *t, cptr s)
780 {
781         /* Copy the string */
782         while (*s) *t++ = *s++;
783
784         /* Terminate */
785         *t = '\0';
786
787         /* Result */
788         return (t);
789 }
790
791
792
793 /*
794  * Print an unsigned number "n" into a string "t", as if by
795  * sprintf(t, "%u", n), and return a pointer to the terminator.
796  */
797 static char *object_desc_num(char *t, uint n)
798 {
799         uint p;
800
801         /* Find "size" of "n" */
802         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
803
804         /* Dump each digit */
805         while (p >= 1)
806         {
807                 /* Dump the digit */
808                 *t++ = '0' + n / p;
809
810                 /* Remove the digit */
811                 n = n % p;
812
813                 /* Process next digit */
814                 p = p / 10;
815         }
816
817         /* Terminate */
818         *t = '\0';
819
820         /* Result */
821         return (t);
822 }
823
824
825
826
827 #ifdef JP
828 /*
829  * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó
830  *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë
831  */
832
833 char *object_desc_kosuu(char *t, object_type *o_ptr)
834 {
835     t = object_desc_num(t, o_ptr->number);
836
837     switch (o_ptr->tval)
838     {
839       case TV_BOLT:
840       case TV_ARROW:
841       case TV_POLEARM:
842       case TV_STAFF:
843       case TV_WAND:
844       case TV_ROD:
845       case TV_DIGGING:
846       {
847           t = object_desc_str(t, "ËÜ");
848           break;
849       }
850       case TV_SCROLL:
851       {
852           t = object_desc_str(t, "´¬");
853           break;
854       }
855       case TV_POTION:
856       {
857           t = object_desc_str(t, "Éþ");
858           break;
859       }
860       case  TV_LIFE_BOOK:
861       case  TV_SORCERY_BOOK:
862       case  TV_NATURE_BOOK:
863       case  TV_CHAOS_BOOK:
864       case  TV_DEATH_BOOK:
865       case  TV_TRUMP_BOOK:
866       case  TV_ARCANE_BOOK:
867       case  TV_ENCHANT_BOOK:
868       case  TV_DAEMON_BOOK:
869       case  TV_CRUSADE_BOOK:
870       case  TV_MUSIC_BOOK:
871       case  TV_HISSATSU_BOOK:
872       {
873           t = object_desc_str(t, "ºý");
874           break;
875       }
876       case TV_SOFT_ARMOR:
877       case TV_HARD_ARMOR:
878       case TV_DRAG_ARMOR:
879       case TV_CLOAK:
880       {
881           t = object_desc_str(t, "Ãå");
882           break;
883       }
884       case TV_SWORD:
885       case TV_HAFTED:
886       case TV_BOW:
887       {
888           t = object_desc_str(t, "¿¶");
889           break;
890       }
891       case TV_BOOTS:
892       {
893           t = object_desc_str(t, "­");
894           break;
895       }
896       case TV_CARD:
897       {
898           t = object_desc_str(t, "Ëç");
899           break;
900       }
901             /* ¿©¤Ù¤â¤Î by ita */
902       case TV_FOOD:
903       {
904           if(o_ptr->sval == SV_FOOD_JERKY)
905           {
906               t = object_desc_str(t, "ÀÚ¤ì");
907               break;
908           }
909       }
910       default:
911       {
912           if (o_ptr->number < 10)
913           {
914               t = object_desc_str(t, "¤Ä");
915           }
916           else
917           {
918               t = object_desc_str(t, "¸Ä");
919           }
920           break;
921       }
922   }
923   return (t);                  
924 }
925 #endif
926
927 /*
928  * Print an signed number "v" into a string "t", as if by
929  * sprintf(t, "%+d", n), and return a pointer to the terminator.
930  * Note that we always print a sign, either "+" or "-".
931  */
932 static char *object_desc_int(char *t, sint v)
933 {
934         uint p, n;
935
936         /* Negative */
937         if (v < 0)
938         {
939                 /* Take the absolute value */
940                 n = 0 - v;
941
942                 /* Use a "minus" sign */
943                 *t++ = '-';
944         }
945
946         /* Positive (or zero) */
947         else
948         {
949                 /* Use the actual number */
950                 n = v;
951
952                 /* Use a "plus" sign */
953                 *t++ = '+';
954         }
955
956         /* Find "size" of "n" */
957         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
958
959         /* Dump each digit */
960         while (p >= 1)
961         {
962                 /* Dump the digit */
963                 *t++ = '0' + n / p;
964
965                 /* Remove the digit */
966                 n = n % p;
967
968                 /* Process next digit */
969                 p = p / 10;
970         }
971
972         /* Terminate */
973         *t = '\0';
974
975         /* Result */
976         return (t);
977 }
978
979
980 /*
981  * Structs and tables for Auto Inscription for flags
982  */
983
984 typedef struct flag_insc_table
985 {
986 #ifdef JP
987         cptr japanese;
988 #endif
989         cptr english;
990         int flag;
991         int except_flag;
992 } flag_insc_table;
993
994 #ifdef JP
995 static flag_insc_table flag_insc_plus[] =
996 {
997         { "¹¶", "At", TR_BLOWS, -1 },
998         { "®", "Sp", TR_SPEED, -1 },
999         { "ÏÓ", "St", TR_STR, -1 },
1000         { "ÃÎ", "In", TR_INT, -1 },
1001         { "¸­", "Wi", TR_WIS, -1 },
1002         { "´ï", "Dx", TR_DEX, -1 },
1003         { "ÂÑ", "Cn", TR_CON, -1 },
1004         { "̥", "Ch", TR_CHR, -1 },
1005         { "ƻ", "Md", TR_MAGIC_MASTERY, -1 },
1006         { "±£", "Sl", TR_STEALTH, -1 },
1007         { "õ", "Sr", TR_SEARCH, -1 },
1008         { "ÀÖ", "If", TR_INFRA, -1 },
1009         { "·¡", "Dg", TR_TUNNEL, -1 },
1010         { NULL, NULL, 0, -1 }
1011 };
1012
1013 static flag_insc_table flag_insc_immune[] =
1014 {
1015         { "»À", "Ac", TR_IM_ACID, -1 },
1016         { "ÅÅ", "El", TR_IM_ELEC, -1 },
1017         { "²Ð", "Fi", TR_IM_FIRE, -1 },
1018         { "Îä", "Co", TR_IM_COLD, -1 },
1019         { NULL, NULL, 0, -1 }
1020 };
1021
1022 static flag_insc_table flag_insc_resistance[] =
1023 {
1024         { "»À", "Ac", TR_RES_ACID, TR_IM_ACID },
1025         { "ÅÅ", "El", TR_RES_ELEC, TR_IM_ELEC },
1026         { "²Ð", "Fi", TR_RES_FIRE, TR_IM_FIRE },
1027         { "Îä", "Co", TR_RES_COLD, TR_IM_COLD },
1028         { "ÆÇ", "Po", TR_RES_POIS, -1 },
1029         { "Á®", "Li", TR_RES_LITE, -1 },
1030         { "°Å", "Dk", TR_RES_DARK, -1 },
1031         { "ÇË", "Sh", TR_RES_SHARDS, -1 },
1032         { "ÌÕ", "Bl", TR_RES_BLIND, -1 },
1033         { "Íð", "Cf", TR_RES_CONF, -1 },
1034         { "¹ì", "So", TR_RES_SOUND, -1 },
1035         { "¹ö", "Nt", TR_RES_NETHER, -1 },
1036         { "°ø", "Nx", TR_RES_NEXUS, -1 },
1037         { "ÆÙ", "Ca", TR_RES_CHAOS, -1 },
1038         { "Îô", "Di", TR_RES_DISEN, -1 },
1039         { "¶²", "Fe", TR_RES_FEAR, -1 },
1040         { NULL, NULL, 0, -1 }
1041 };
1042
1043 static flag_insc_table flag_insc_misc[] =
1044 {
1045         { "ËâÎÏ", "Ma", TR_DEC_MANA, -1 },
1046         { "Åê", "Th", TR_THROW, -1 },
1047         { "ȿ", "Rf", TR_REFLECT, -1 },
1048         { "Ëã", "Fa", TR_FREE_ACT, -1 },
1049         { "»ë", "Si", TR_SEE_INVIS, -1 },
1050         { "·Ð", "Hl", TR_HOLD_LIFE, -1 },
1051         { "ÃÙ", "Sd", TR_SLOW_DIGEST, -1 },
1052         { "³è", "Rg", TR_REGEN, -1 },
1053         { "Éâ", "Lv", TR_LEVITATION, -1 },
1054         { "ÌÀ", "Lu", TR_LITE, -1 },
1055         { "·Ù", "Wr", TR_WARNING, -1 },
1056         { "ÇÜ", "Xm", TR_XTRA_MIGHT, -1 },
1057         { "¼Í", "Xs", TR_XTRA_SHOTS, -1 },
1058         { "½Ö", "Te", TR_TELEPORT, -1 },
1059         { "ÅÜ", "Ag", TR_AGGRAVATE, -1 },
1060         { "½Ë", "Bs", TR_BLESSED, -1 },
1061         { "´÷", "Ty", TR_TY_CURSE, -1 },
1062         { NULL, NULL, 0, -1 }
1063 };
1064
1065 static flag_insc_table flag_insc_aura[] =
1066 {
1067         { "±ê", "F", TR_SH_FIRE, -1 },
1068         { "ÅÅ", "E", TR_SH_ELEC, -1 },
1069         { "Îä", "C", TR_SH_COLD, -1 },
1070         { "Ëâ", "M", TR_NO_MAGIC, -1 },
1071         { "½Ö", "T", TR_NO_TELE, -1 },
1072         { NULL, NULL, 0, -1 }
1073 };
1074
1075 static flag_insc_table flag_insc_brand[] =
1076 {
1077         { "»À", "A", TR_BRAND_ACID, -1 },
1078         { "ÅÅ", "E", TR_BRAND_ELEC, -1 },
1079         { "¾Æ", "F", TR_BRAND_FIRE, -1 },
1080         { "Åà", "Co", TR_BRAND_COLD, -1 },
1081         { "ÆÇ", "P", TR_BRAND_POIS, -1 },
1082         { "ÆÙ", "Ca", TR_CHAOTIC, -1 },
1083         { "µÛ", "V", TR_VAMPIRIC, -1 },
1084         { "¿Ì", "Q", TR_IMPACT, -1 },
1085         { "ÀÚ", "S", TR_VORPAL, -1 },
1086         { "Íý", "M", TR_FORCE_WEAPON, -1 },
1087         { NULL, NULL, 0, -1 }
1088 };
1089
1090 static flag_insc_table flag_insc_kill[] =
1091 {
1092         { "¼Ù", "*", TR_KILL_EVIL, -1 },
1093         { "¿Í", "p", TR_KILL_HUMAN, -1 },
1094         { "ζ", "D", TR_KILL_DRAGON, -1 },
1095         { "¥ª", "o", TR_KILL_ORC, -1 },
1096         { "¥È", "T", TR_KILL_TROLL, -1 },
1097         { "µð", "P", TR_KILL_GIANT, -1 },
1098         { "¥Ç", "U", TR_KILL_DEMON, -1 },
1099         { "»à", "L", TR_KILL_UNDEAD, -1 },
1100         { "ư", "Z", TR_KILL_ANIMAL, -1 },
1101         { NULL, NULL, 0, -1 }
1102 };
1103
1104 static flag_insc_table flag_insc_slay[] =
1105 {
1106         { "¼Ù", "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1107         { "¿Í", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1108         { "ε", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1109         { "¥ª", "o", TR_SLAY_ORC, TR_KILL_ORC },
1110         { "¥È", "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1111         { "µð", "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1112         { "¥Ç", "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1113         { "»à", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1114         { "ư", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1115         { NULL, NULL, 0, -1 }
1116 };
1117
1118 static flag_insc_table flag_insc_esp1[] =
1119 {
1120         { "´¶", "Tele", TR_TELEPATHY, -1 },
1121         { "¼Ù", "Evil", TR_ESP_EVIL, -1 },
1122         { "Á±", "Good", TR_ESP_GOOD, -1 },
1123         { "̵", "Nolv", TR_ESP_NONLIVING, -1 },
1124         { "¸Ä", "Uniq", TR_ESP_UNIQUE, -1 },
1125         { NULL, NULL, 0, -1 }
1126 };
1127
1128 static flag_insc_table flag_insc_esp2[] =
1129 {
1130         { "¿Í", "p", TR_ESP_HUMAN, -1 },
1131         { "ε", "D", TR_ESP_DRAGON, -1 },
1132         { "¥ª", "o", TR_ESP_ORC, -1 },
1133         { "¥È", "T", TR_ESP_TROLL, -1 },
1134         { "µð", "P", TR_ESP_GIANT, -1 },
1135         { "¥Ç", "U", TR_ESP_DEMON, -1 },
1136         { "»à", "L", TR_ESP_UNDEAD, -1 },
1137         { "ư", "Z", TR_ESP_ANIMAL, -1 },
1138         { NULL, NULL, 0, -1 }
1139 };
1140
1141 static flag_insc_table flag_insc_sust[] =
1142 {
1143         { "ÏÓ", "St", TR_SUST_STR, -1 },
1144         { "ÃÎ", "In", TR_SUST_INT, -1 },
1145         { "¸­", "Wi", TR_SUST_WIS, -1 },
1146         { "´ï", "Dx", TR_SUST_DEX, -1 },
1147         { "ÂÑ", "Cn", TR_SUST_CON, -1 },
1148         { "̥", "Ch", TR_SUST_CHR, -1 },
1149         { NULL, NULL, 0, -1 }
1150 };
1151
1152 #else
1153 static flag_insc_table flag_insc_plus[] =
1154 {
1155         { "At", TR_BLOWS, -1 },
1156         { "Sp", TR_SPEED, -1 },
1157         { "St", TR_STR, -1 },
1158         { "In", TR_INT, -1 },
1159         { "Wi", TR_WIS, -1 },
1160         { "Dx", TR_DEX, -1 },
1161         { "Cn", TR_CON, -1 },
1162         { "Ch", TR_CHR, -1 },
1163         { "Md", TR_MAGIC_MASTERY, -1 },
1164         { "Sl", TR_STEALTH, -1 },
1165         { "Sr", TR_SEARCH, -1 },
1166         { "If", TR_INFRA, -1 },
1167         { "Dg", TR_TUNNEL, -1 },
1168         { NULL, 0, -1 }
1169 };
1170
1171 static flag_insc_table flag_insc_immune[] =
1172 {
1173         { "Ac", TR_IM_ACID, -1 },
1174         { "El", TR_IM_ELEC, -1 },
1175         { "Fi", TR_IM_FIRE, -1 },
1176         { "Co", TR_IM_COLD, -1 },
1177         { NULL, 0, -1 }
1178 };
1179
1180 static flag_insc_table flag_insc_resistance[] =
1181 {
1182         { "Ac", TR_RES_ACID, TR_IM_ACID },
1183         { "El", TR_RES_ELEC, TR_IM_ELEC },
1184         { "Fi", TR_RES_FIRE, TR_IM_FIRE },
1185         { "Co", TR_RES_COLD, TR_IM_COLD },
1186         { "Po", TR_RES_POIS, -1 },
1187         { "Li", TR_RES_LITE, -1 },
1188         { "Dk", TR_RES_DARK, -1 },
1189         { "Sh", TR_RES_SHARDS, -1 },
1190         { "Bl", TR_RES_BLIND, -1 },
1191         { "Cf", TR_RES_CONF, -1 },
1192         { "So", TR_RES_SOUND, -1 },
1193         { "Nt", TR_RES_NETHER, -1 },
1194         { "Nx", TR_RES_NEXUS, -1 },
1195         { "Ca", TR_RES_CHAOS, -1 },
1196         { "Di", TR_RES_DISEN, -1 },
1197         { "Fe", TR_RES_FEAR, -1 },
1198         { NULL, 0, -1 }
1199 };
1200
1201 static flag_insc_table flag_insc_misc[] =
1202 {
1203         { "Ma", TR_DEC_MANA, -1 },
1204         { "Th", TR_THROW, -1 },
1205         { "Rf", TR_REFLECT, -1 },
1206         { "Fa", TR_FREE_ACT, -1 },
1207         { "Si", TR_SEE_INVIS, -1 },
1208         { "Hl", TR_HOLD_LIFE, -1 },
1209         { "Sd", TR_SLOW_DIGEST, -1 },
1210         { "Rg", TR_REGEN, -1 },
1211         { "Lv", TR_LEVITATION, -1 },
1212         { "Lu", TR_LITE, -1 },
1213         { "Wr", TR_WARNING, -1 },
1214         { "Xm", TR_XTRA_MIGHT, -1 },
1215         { "Xs", TR_XTRA_SHOTS, -1 },
1216         { "Te", TR_TELEPORT, -1 },
1217         { "Ag", TR_AGGRAVATE, -1 },
1218         { "Bs", TR_BLESSED, -1 },
1219         { "Ty", TR_TY_CURSE, -1 },
1220         { NULL, 0, -1 }
1221 };
1222
1223 static flag_insc_table flag_insc_aura[] =
1224 {
1225         { "F", TR_SH_FIRE, -1 },
1226         { "E", TR_SH_ELEC, -1 },
1227         { "C", TR_SH_COLD, -1 },
1228         { "M", TR_NO_MAGIC, -1 },
1229         { "T", TR_NO_TELE, -1 },
1230         { NULL, 0, -1 }
1231 };
1232
1233 static flag_insc_table flag_insc_brand[] =
1234 {
1235         { "A", TR_BRAND_ACID, -1 },
1236         { "E", TR_BRAND_ELEC, -1 },
1237         { "F", TR_BRAND_FIRE, -1 },
1238         { "Co", TR_BRAND_COLD, -1 },
1239         { "P", TR_BRAND_POIS, -1 },
1240         { "Ca", TR_CHAOTIC, -1 },
1241         { "V", TR_VAMPIRIC, -1 },
1242         { "Q", TR_IMPACT, -1 },
1243         { "S", TR_VORPAL, -1 },
1244         { "M", TR_FORCE_WEAPON, -1 },
1245         { NULL, 0, -1 }
1246 };
1247
1248 static flag_insc_table flag_insc_kill[] =
1249 {
1250         { "*", TR_KILL_EVIL, -1 },
1251         { "p", TR_KILL_HUMAN, -1 },
1252         { "D", TR_KILL_DRAGON, -1 },
1253         { "o", TR_KILL_ORC, -1 },
1254         { "T", TR_KILL_TROLL, -1 },
1255         { "P", TR_KILL_GIANT, -1 },
1256         { "U", TR_KILL_DEMON, -1 },
1257         { "L", TR_KILL_UNDEAD, -1 },
1258         { "Z", TR_KILL_ANIMAL, -1 },
1259         { NULL, 0, -1 }
1260 };
1261
1262 static flag_insc_table flag_insc_slay[] =
1263 {
1264         { "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1265         { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1266         { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1267         { "o", TR_SLAY_ORC, TR_KILL_ORC },
1268         { "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1269         { "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1270         { "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1271         { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1272         { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1273         { NULL, 0, -1 }
1274 };
1275
1276 static flag_insc_table flag_insc_esp1[] =
1277 {
1278         { "Tele", TR_TELEPATHY, -1 },
1279         { "Evil", TR_ESP_EVIL, -1 },
1280         { "Good", TR_ESP_GOOD, -1 },
1281         { "Nolv", TR_ESP_NONLIVING, -1 },
1282         { "Uniq", TR_ESP_UNIQUE, -1 },
1283         { NULL, 0, -1 }
1284 };
1285
1286 static flag_insc_table flag_insc_esp2[] =
1287 {
1288         { "p", TR_ESP_HUMAN, -1 },
1289         { "D", TR_ESP_DRAGON, -1 },
1290         { "o", TR_ESP_ORC, -1 },
1291         { "T", TR_ESP_TROLL, -1 },
1292         { "P", TR_ESP_GIANT, -1 },
1293         { "U", TR_ESP_DEMON, -1 },
1294         { "L", TR_ESP_UNDEAD, -1 },
1295         { "Z", TR_ESP_ANIMAL, -1 },
1296         { NULL, 0, -1 }
1297 };
1298
1299 static flag_insc_table flag_insc_sust[] =
1300 {
1301         { "St", TR_SUST_STR, -1 },
1302         { "In", TR_SUST_INT, -1 },
1303         { "Wi", TR_SUST_WIS, -1 },
1304         { "Dx", TR_SUST_DEX, -1 },
1305         { "Cn", TR_SUST_CON, -1 },
1306         { "Ch", TR_SUST_CHR, -1 },
1307         { NULL, 0, -1 }
1308 };
1309 #endif
1310
1311 /* Simple macro for get_inscription() */
1312 #define ADD_INSC(STR) (void)(ptr = object_desc_str(ptr, (STR)))
1313
1314 /*
1315  *  Helper function for get_inscription()
1316  */
1317 static char *inscribe_flags_aux(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE], bool kanji, char *ptr)
1318 {
1319 #ifndef JP
1320         (void)kanji;
1321 #endif
1322
1323         while (fi_ptr->english)
1324         {
1325                 if (have_flag(flgs, fi_ptr->flag) &&
1326                     (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1327 #ifdef JP
1328                         ADD_INSC(kanji ? fi_ptr->japanese : fi_ptr->english);
1329 #else
1330                         ADD_INSC(fi_ptr->english);
1331 #endif
1332                 fi_ptr++;
1333         }
1334
1335         return ptr;
1336 }
1337
1338
1339 /*
1340  *  Special variation of have_flag for auto-inscription
1341  */
1342 static bool have_flag_of(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE])
1343 {
1344         while (fi_ptr->english)
1345         {
1346                 if (have_flag(flgs, fi_ptr->flag) &&
1347                    (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1348                         return (TRUE);
1349                 fi_ptr++;
1350         }
1351
1352         return (FALSE);
1353 }
1354
1355 static char *get_ability_abbreviation(char *ptr, object_type *o_ptr, bool kanji, bool all)
1356 {
1357         char *prev_ptr = ptr;
1358         u32b flgs[TR_FLAG_SIZE];
1359
1360         /* Extract the flags */
1361         object_flags(o_ptr, flgs);
1362
1363
1364         /* Remove obvious flags */
1365         if (!all)
1366         {
1367                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1368                 int j;
1369                                 
1370                 /* Base object */
1371                 for (j = 0; j < TR_FLAG_SIZE; j++)
1372                         flgs[j] &= ~k_ptr->flags[j];
1373
1374                 if (object_is_fixed_artifact(o_ptr))
1375                 {
1376                         artifact_type *a_ptr = &a_info[o_ptr->name1];
1377                                         
1378                         for (j = 0; j < TR_FLAG_SIZE; j++)
1379                                 flgs[j] &= ~a_ptr->flags[j];
1380                 }
1381
1382                 if (object_is_ego(o_ptr))
1383                 {
1384                         ego_item_type *e_ptr = &e_info[o_ptr->name2];
1385                                         
1386                         for (j = 0; j < TR_FLAG_SIZE; j++)
1387                                 flgs[j] &= ~e_ptr->flags[j];
1388                 }
1389         }
1390
1391
1392         /* Plusses */
1393         if (have_flag_of(flag_insc_plus, flgs))
1394         {
1395                 if (kanji)
1396                         ADD_INSC("+");
1397         }
1398         ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr);
1399
1400         /* Immunity */
1401         if (have_flag_of(flag_insc_immune, flgs))
1402         {
1403                 if (!kanji && ptr != prev_ptr)
1404                 {
1405                         ADD_INSC(";");
1406                         prev_ptr = ptr;
1407                 }
1408                 ADD_INSC("*");
1409         }
1410         ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr);
1411
1412         /* Resistance */
1413         if (have_flag_of(flag_insc_resistance, flgs))
1414         {
1415                 if (kanji)
1416                         ADD_INSC("r");
1417                 else if (ptr != prev_ptr)
1418                 {
1419                         ADD_INSC(";");
1420                         prev_ptr = ptr;
1421                 }
1422         }
1423         ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr);
1424
1425         /* Misc Ability */
1426         if (have_flag_of(flag_insc_misc, flgs))
1427         {
1428                 if (ptr != prev_ptr)
1429                 {
1430                         ADD_INSC(";");
1431                         prev_ptr = ptr;
1432                 }
1433         }
1434         ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr);
1435
1436         /* Aura */
1437         if (have_flag_of(flag_insc_aura, flgs))
1438         {
1439                 ADD_INSC("[");
1440         }
1441         ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr);
1442
1443         /* Brand Weapon */
1444         if (have_flag_of(flag_insc_brand, flgs))
1445                 ADD_INSC("|");
1446         ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr);
1447
1448         /* Kill Weapon */
1449         if (have_flag_of(flag_insc_kill, flgs))
1450                 ADD_INSC("/X");
1451         ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr);
1452
1453         /* Slay Weapon */
1454         if (have_flag_of(flag_insc_slay, flgs))
1455                 ADD_INSC("/");
1456         ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr);
1457
1458         /* Esp */
1459         if (kanji)
1460         {
1461                 if (have_flag_of(flag_insc_esp1, flgs) ||
1462                     have_flag_of(flag_insc_esp2, flgs))
1463                         ADD_INSC("~");
1464                 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1465                 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1466         }
1467         else
1468         {
1469                 if (have_flag_of(flag_insc_esp1, flgs))
1470                         ADD_INSC("~");
1471                 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1472                 if (have_flag_of(flag_insc_esp2, flgs))
1473                         ADD_INSC("~");
1474                 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1475         }
1476
1477         /* sustain */
1478         if (have_flag_of(flag_insc_sust, flgs))
1479         {
1480                 ADD_INSC("(");
1481         }
1482         ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr);
1483
1484         *ptr = '\0';
1485
1486         return ptr;
1487 }
1488
1489
1490 /*
1491  *  Get object inscription with auto inscription of object flags.
1492  */
1493 static void get_inscription(char *buff, object_type *o_ptr)
1494 {
1495         cptr insc = quark_str(o_ptr->inscription);
1496         char *ptr = buff;
1497
1498         /* Not fully identified */
1499         if (!(o_ptr->ident & IDENT_MENTAL))
1500         {
1501                 /* Copy until end of line or '#' */
1502                 while (*insc)
1503                 {
1504                         if (*insc == '#') break;
1505 #ifdef JP
1506                         if (iskanji(*insc)) *buff++ = *insc++;
1507 #endif
1508                         *buff++ = *insc++;
1509                 }
1510
1511                 *buff = '\0';
1512                 return;
1513         }
1514
1515         *buff = '\0';
1516         for (; *insc; insc++)
1517         {
1518                 /* Ignore fake artifact inscription */
1519                 if (*insc == '#') break;
1520
1521                 /* {%} will be automatically converted */
1522                 else if ('%' == *insc)
1523                 {
1524                         bool kanji = FALSE;
1525                         bool all;
1526                         cptr start = ptr;
1527
1528                         /* check for too long inscription */
1529                         if (ptr >= buff + MAX_NLEN) continue;
1530
1531 #ifdef JP
1532                         if ('%' == insc[1])
1533                         {
1534                                 insc++;
1535                                 kanji = FALSE;
1536                         }
1537                         else
1538                         {
1539                                 kanji = TRUE;
1540                         }
1541 #endif
1542                         if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3])
1543                         {
1544                                 all = TRUE;
1545                                 insc += 3;
1546                         }
1547                         else
1548                         {
1549                                 all = FALSE;
1550                         }
1551
1552                         ptr = get_ability_abbreviation(ptr, o_ptr, kanji, all);
1553
1554                         if (ptr == start)
1555                                 ADD_INSC(" ");
1556                 }
1557                 else
1558                 {
1559                         *ptr++ = *insc;
1560                 }
1561         }
1562         *ptr = '\0';
1563 }
1564
1565
1566 /*
1567  * Creates a description of the item "o_ptr", and stores it in "out_val".
1568  *
1569  * One can choose the "verbosity" of the description, including whether
1570  * or not the "number" of items should be described, and how much detail
1571  * should be used when describing the item.
1572  *
1573  * The given "buf" must be MAX_NLEN chars long to hold the longest possible
1574  * description, which can get pretty long, including incriptions, such as:
1575  * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".
1576  * Note that the inscription will be clipped to keep the total description
1577  * under MAX_NLEN-1 chars (plus a terminator).
1578  *
1579  * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,
1580  * portable, versions of some common "sprintf()" commands.
1581  *
1582  * Note that all ego-items (when known) append an "Ego-Item Name", unless
1583  * the item is also an artifact, which should NEVER happen.
1584  *
1585  * Note that all artifacts (when known) append an "Artifact Name", so we
1586  * have special processing for "Specials" (artifact Lites, Rings, Amulets).
1587  * The "Specials" never use "modifiers" if they are "known", since they
1588  * have special "descriptions", such as "The Necklace of the Dwarves".
1589  *
1590  * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),
1591  * plus the artifact name, just like any other artifact, if known.
1592  *
1593  * Special Ring's and Amulet's, if not "aware", use the same code as normal
1594  * rings and amulets, and if "aware", use the "k_info" base-name (Ring or
1595  * Amulet or Necklace).  They will NEVER "append" the "k_info" name.  But,
1596  * they will append the artifact name, just like any artifact, if known.
1597  *
1598  * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.
1599  *
1600  * Mode:
1601  *   OD_NAME_ONLY        : The Cloak of Death
1602  *   OD_NAME_AND_ENCHANT : The Cloak of Death [1,+3]
1603  *   OD_OMIT_INSCRIPTION : The Cloak of Death [1,+3] (+2 to Stealth)
1604  *   0                   : The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
1605  *
1606  *   OD_OMIT_PREFIX      : Forbidden numeric prefix
1607  *   OD_NO_PLURAL        : Forbidden use of plural 
1608  *   OD_STORE            : Assume to be aware and known
1609  *   OD_NO_FLAVOR        : Allow to hidden flavor
1610  */
1611 void object_desc(char *buf, object_type *o_ptr, u32b mode)
1612 {
1613         /* Extract object kind name */
1614         cptr            kindname = k_name + k_info[o_ptr->k_idx].name;
1615
1616         /* Extract default "base" string */
1617         cptr            basenm = kindname;
1618
1619         /* Assume no "modifier" string */
1620         cptr            modstr = "";
1621
1622         /* Hack -- Extract the sub-type "indexx" */
1623         int             indexx = o_ptr->sval;
1624
1625         int             power;
1626
1627         bool            aware = FALSE;
1628         bool            known = FALSE;
1629         bool            flavor = TRUE;
1630
1631         bool            show_weapon = FALSE;
1632         bool            show_armour = FALSE;
1633
1634         cptr            s;
1635         char            *t;
1636
1637         char            p1 = '(', p2 = ')';
1638         char            b1 = '[', b2 = ']';
1639         char            c1 = '{', c2 = '}';
1640
1641         char            tmp_val[MAX_NLEN+160];
1642         char            tmp_val2[MAX_NLEN+10];
1643         char            fake_insc_buf[30];
1644
1645         u32b flgs[TR_FLAG_SIZE];
1646
1647         object_type *bow_ptr;
1648
1649         object_kind *k_ptr = &k_info[o_ptr->k_idx];
1650
1651         /* Extract some flags */
1652         object_flags(o_ptr, flgs);
1653
1654         /* See if the object is "aware" */
1655         if (object_is_aware(o_ptr)) aware = TRUE;
1656
1657         /* See if the object is "known" */
1658         if (object_is_known(o_ptr)) known = TRUE;
1659
1660         /* Allow flavors to be hidden when aware */
1661         if (aware && ((mode & OD_NO_FLAVOR) || plain_descriptions)) flavor = FALSE;
1662
1663         /* Object is in the inventory of a store or spoiler */
1664         if ((mode & OD_STORE) || (o_ptr->ident & IDENT_STORE))
1665         {
1666                 /* Don't show flavors */
1667                 flavor = FALSE;
1668
1669                 /* Pretend known and aware */
1670                 aware = TRUE;
1671                 known = TRUE;
1672         }
1673
1674         /* Analyze the object */
1675         switch (o_ptr->tval)
1676         {
1677                 /* Some objects are easy to describe */
1678                 case TV_SKELETON:
1679                 case TV_BOTTLE:
1680                 case TV_JUNK:
1681                 case TV_SPIKE:
1682                 case TV_FLASK:
1683                 case TV_CHEST:
1684                 case TV_WHISTLE:
1685                 {
1686                         break;
1687                 }
1688
1689                 case TV_CAPTURE:
1690                 {
1691                         monster_race *r_ptr = &r_info[o_ptr->pval];
1692
1693                         if (known)
1694                         {
1695                                 if (!o_ptr->pval)
1696                                 {
1697 #ifdef JP
1698                                         modstr = " (¶õ)";
1699 #else
1700                                         modstr = " (empty)";
1701 #endif
1702                                 }
1703                                 else
1704                                 {
1705 #ifdef JP
1706                                         sprintf(tmp_val2, " (%s)",r_name + r_ptr->name);
1707                                         modstr = tmp_val2;
1708 #else
1709                                         cptr t = r_name + r_ptr->name;
1710
1711                                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1712                                         {
1713                                                 sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t);
1714
1715                                                 modstr = tmp_val2;
1716                                         }
1717                                         else
1718                                         {
1719                                                 sprintf(tmp_val2, "(%s)", t);
1720
1721                                                 modstr = t;
1722                                         }
1723 #endif
1724                                 }
1725                         }
1726                         break;
1727                 }
1728
1729                 /* Figurines/Statues */
1730                 case TV_FIGURINE:
1731                 case TV_STATUE:
1732                 {
1733                         monster_race *r_ptr = &r_info[o_ptr->pval];
1734
1735 #ifdef JP
1736                         modstr = r_name + r_ptr->name;
1737 #else
1738                         cptr t = r_name + r_ptr->name;
1739
1740                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1741                         {
1742                                 sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t);
1743
1744                                 modstr = tmp_val2;
1745                         }
1746                         else
1747                         {
1748                                 modstr = t;
1749                         }
1750 #endif
1751
1752
1753                         break;
1754                 }
1755
1756                 /* Corpses */
1757                 case TV_CORPSE:
1758                 {
1759                         monster_race *r_ptr = &r_info[o_ptr->pval];
1760
1761                         modstr = r_name + r_ptr->name;
1762
1763 #ifdef JP
1764                         basenm = "#%";
1765 #else
1766                         if (r_ptr->flags1 & RF1_UNIQUE)
1767                                 basenm = "& % of #";
1768                         else
1769                                 basenm = "& # %";
1770 #endif
1771
1772                         break;
1773                 }
1774
1775                 /* Missiles/ Bows/ Weapons */
1776                 case TV_SHOT:
1777                 case TV_BOLT:
1778                 case TV_ARROW:
1779                 case TV_BOW:
1780                 case TV_HAFTED:
1781                 case TV_POLEARM:
1782                 case TV_SWORD:
1783                 case TV_DIGGING:
1784                 {
1785                         show_weapon = TRUE;
1786                         break;
1787                 }
1788
1789
1790                 /* Armour */
1791                 case TV_BOOTS:
1792                 case TV_GLOVES:
1793                 case TV_CLOAK:
1794                 case TV_CROWN:
1795                 case TV_HELM:
1796                 case TV_SHIELD:
1797                 case TV_SOFT_ARMOR:
1798                 case TV_HARD_ARMOR:
1799                 case TV_DRAG_ARMOR:
1800                 {
1801                         show_armour = TRUE;
1802                         break;
1803                 }
1804
1805
1806                 /* Lites (including a few "Specials") */
1807                 case TV_LITE:
1808                 {
1809                         break;
1810                 }
1811
1812                 /* Amulets (including a few "Specials") */
1813                 case TV_AMULET:
1814                 {
1815                         /* Known artifacts */
1816                         if (aware)
1817                         {
1818                                 if (object_is_fixed_artifact(o_ptr)) break;
1819                                 if (k_ptr->gen_flags & TRG_INSTA_ART) break;
1820                         }
1821
1822                         /* Color the object */
1823                         modstr = amulet_adj[indexx];
1824
1825 #ifdef JP
1826                         if (!flavor)    basenm = "%¤Î¥¢¥ß¥å¥ì¥Ã¥È";
1827                         else if (aware) basenm = "%¤Î#¥¢¥ß¥å¥ì¥Ã¥È";
1828                         else            basenm = "#¥¢¥ß¥å¥ì¥Ã¥È";
1829 #else
1830                         if (!flavor)    basenm = "& Amulet~ of %";
1831                         else if (aware) basenm = "& # Amulet~ of %";
1832                         else            basenm = "& # Amulet~";
1833 #endif
1834
1835                         break;
1836                 }
1837
1838                 /* Rings (including a few "Specials") */
1839                 case TV_RING:
1840                 {
1841                         /* Known artifacts */
1842                         if (aware)
1843                         {
1844                                 if (object_is_fixed_artifact(o_ptr)) break;
1845                                 if (k_ptr->gen_flags & TRG_INSTA_ART) break;
1846                         }
1847
1848                         /* Color the object */
1849                         modstr = ring_adj[indexx];
1850
1851 #ifdef JP
1852                         if (!flavor)    basenm = "%¤Î»ØÎØ";
1853                         else if (aware) basenm = "%¤Î#»ØÎØ";
1854                         else            basenm = "#»ØÎØ";
1855 #else
1856                         if (!flavor)    basenm = "& Ring~ of %";
1857                         else if (aware) basenm = "& # Ring~ of %";
1858                         else            basenm = "& # Ring~";
1859 #endif
1860
1861                         if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE;
1862
1863                         break;
1864                 }
1865
1866                 case TV_CARD:
1867                 {
1868                         break;
1869                 }
1870
1871                 case TV_STAFF:
1872                 {
1873                         /* Color the object */
1874                         modstr = staff_adj[indexx];
1875
1876 #ifdef JP
1877                         if (!flavor)    basenm = "%¤Î¾ó";
1878                         else if (aware) basenm = "%¤Î#¾ó";
1879                         else            basenm = "#¾ó";
1880 #else
1881                         if (!flavor)    basenm = "& Staff~ of %";
1882                         else if (aware) basenm = "& # Staff~ of %";
1883                         else            basenm = "& # Staff~";
1884 #endif
1885
1886                         break;
1887                 }
1888
1889                 case TV_WAND:
1890                 {
1891                         /* Color the object */
1892                         modstr = wand_adj[indexx];
1893
1894 #ifdef JP
1895                         if (!flavor)    basenm = "%¤ÎËâË¡ËÀ";
1896                         else if (aware) basenm = "%¤Î#ËâË¡ËÀ";
1897                         else            basenm = "#ËâË¡ËÀ";
1898 #else
1899                         if (!flavor)    basenm = "& Wand~ of %";
1900                         else if (aware) basenm = "& # Wand~ of %";
1901                         else            basenm = "& # Wand~";
1902 #endif
1903
1904                         break;
1905                 }
1906
1907                 case TV_ROD:
1908                 {
1909                         /* Color the object */
1910                         modstr = rod_adj[indexx];
1911
1912 #ifdef JP
1913                         if (!flavor)    basenm = "%¤Î¥í¥Ã¥É";
1914                         else if (aware) basenm = "%¤Î#¥í¥Ã¥É";
1915                         else            basenm = "#¥í¥Ã¥É";
1916 #else
1917                         if (!flavor)    basenm = "& Rod~ of %";
1918                         else if (aware) basenm = "& # Rod~ of %";
1919                         else            basenm = "& # Rod~";
1920 #endif
1921
1922                         break;
1923                 }
1924
1925                 case TV_SCROLL:
1926                 {
1927                         /* Color the object */
1928                         modstr = scroll_adj[indexx];
1929
1930 #ifdef JP
1931                         if (!flavor)    basenm = "%¤Î´¬Êª";
1932                         else if (aware) basenm = "¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª";
1933                         else            basenm = "¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª";
1934 #else
1935                         if (!flavor)    basenm = "& Scroll~ of %";
1936                         else if (aware) basenm = "& Scroll~ titled \"#\" of %";
1937                         else            basenm = "& Scroll~ titled \"#\"";
1938 #endif
1939
1940                         break;
1941                 }
1942
1943                 case TV_POTION:
1944                 {
1945                         /* Color the object */
1946                         modstr = potion_adj[indexx];
1947
1948 #ifdef JP
1949                         if (!flavor)    basenm = "%¤ÎÌô";
1950                         else if (aware) basenm = "%¤Î#Ìô";
1951                         else            basenm = "#Ìô";
1952 #else
1953                         if (!flavor)    basenm = "& Potion~ of %";
1954                         else if (aware) basenm = "& # Potion~ of %";
1955                         else            basenm = "& # Potion~";
1956 #endif
1957
1958                         break;
1959                 }
1960
1961                 case TV_FOOD:
1962                 {
1963                         /* Ordinary food is "boring" */
1964                         if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break;
1965
1966                         /* Color the object */
1967                         modstr = food_adj[indexx];
1968
1969 #ifdef JP
1970                         if (!flavor)    basenm = "%¤Î¥­¥Î¥³";
1971                         else if (aware) basenm = "%¤Î#¥­¥Î¥³";
1972                         else            basenm = "#¥­¥Î¥³";
1973 #else
1974                         if (!flavor)    basenm = "& Mushroom~ of %";
1975                         else if (aware) basenm = "& # Mushroom~ of %";
1976                         else            basenm = "& # Mushroom~";
1977 #endif
1978
1979                         break;
1980                 }
1981
1982                 case TV_PARCHMENT:
1983                 {
1984 #ifdef JP
1985                         basenm = "ÍÓÈé»æ - %";
1986 #else
1987                         basenm = "& Parchment~ - %";
1988 #endif
1989                         break;
1990                 }
1991
1992                 /* Magic Books */
1993                 case TV_LIFE_BOOK:
1994                 {
1995 #ifdef JP
1996                         basenm = "À¸Ì¿¤ÎËâË¡½ñ%";
1997 #else
1998                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1999                                 basenm = "& Book~ of Life Magic %";
2000                         else
2001                                 basenm = "& Life Spellbook~ %";
2002 #endif
2003
2004                         break;
2005                 }
2006
2007                 case TV_SORCERY_BOOK:
2008                 {
2009 #ifdef JP
2010                         basenm = "Àç½Ñ¤ÎËâË¡½ñ%";
2011 #else
2012                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2013                                 basenm = "& Book~ of Sorcery %";
2014                         else
2015                                 basenm = "& Sorcery Spellbook~ %";
2016 #endif
2017
2018                         break;
2019                 }
2020
2021                 case TV_NATURE_BOOK:
2022                 {
2023 #ifdef JP
2024                         basenm = "¼«Á³¤ÎËâË¡½ñ%";
2025 #else
2026                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2027                                 basenm = "& Book~ of Nature Magic %";
2028                         else
2029                                 basenm = "& Nature Spellbook~ %";
2030 #endif
2031
2032                         break;
2033                 }
2034
2035                 case TV_CHAOS_BOOK:
2036                 {
2037 #ifdef JP
2038                         basenm = "¥«¥ª¥¹¤ÎËâË¡½ñ%";
2039 #else
2040                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2041                                 basenm = "& Book~ of Chaos Magic %";
2042                         else
2043                                 basenm = "& Chaos Spellbook~ %";
2044 #endif
2045
2046                         break;
2047                 }
2048
2049                 case TV_DEATH_BOOK:
2050                 {
2051 #ifdef JP
2052                         basenm = "°Å¹õ¤ÎËâË¡½ñ%";
2053 #else
2054                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2055                                 basenm = "& Book~ of Death Magic %";
2056                         else
2057                                 basenm = "& Death Spellbook~ %";
2058 #endif
2059
2060                         break;
2061                 }
2062
2063                 case TV_TRUMP_BOOK:
2064                 {
2065 #ifdef JP
2066                         basenm = "¥È¥é¥ó¥×¤ÎËâË¡½ñ%";
2067 #else
2068                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2069                                 basenm = "& Book~ of Trump Magic %";
2070                         else
2071                                 basenm = "& Trump Spellbook~ %";
2072 #endif
2073
2074                         break;
2075                 }
2076
2077                 case TV_ARCANE_BOOK:
2078                 {
2079 #ifdef JP
2080                         basenm = "Èë½Ñ¤ÎËâË¡½ñ%";
2081 #else
2082                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2083                                 basenm = "& Book~ of Arcane Magic %";
2084                         else
2085                                 basenm = "& Arcane Spellbook~ %";
2086 #endif
2087
2088                         break;
2089                 }
2090
2091                 case TV_ENCHANT_BOOK:
2092                 {
2093 #ifdef JP
2094                         basenm = "¾¢¤ÎËâË¡½ñ%";
2095 #else
2096                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2097                                 basenm = "& Book~ of Craft Magic %";
2098                         else
2099                                 basenm = "& Craft Spellbook~ %";
2100 #endif
2101
2102                         break;
2103                 }
2104
2105                 case TV_DAEMON_BOOK:
2106                 {
2107 #ifdef JP
2108                         basenm = "°­Ëâ¤ÎËâË¡½ñ%";
2109 #else
2110                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2111                                 basenm = "& Book~ of Daemon Magic %";
2112                         else
2113                                 basenm = "& Daemon Spellbook~ %";
2114 #endif
2115
2116                         break;
2117                 }
2118
2119                 case TV_CRUSADE_BOOK:
2120                 {
2121 #ifdef JP
2122                         basenm = "Ç˼٤ÎËâË¡½ñ%";
2123 #else
2124                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
2125                                 basenm = "& Book~ of Crusade Magic %";
2126                         else
2127                                 basenm = "& Crusade Spellbook~ %";
2128 #endif
2129
2130                         break;
2131                 }
2132
2133                 case TV_MUSIC_BOOK:
2134                 {
2135 #ifdef JP
2136                         basenm = "²Î½¸%";
2137 #else
2138                         basenm = "& Song Book~ %";
2139 #endif
2140
2141                         break;
2142                 }
2143
2144                 case TV_HISSATSU_BOOK:
2145                 {
2146 #ifdef JP
2147                         basenm = "& Éð·Ý¤Î½ñ%";
2148 #else
2149                         basenm = "Book~ of Kendo %";
2150 #endif
2151
2152                         break;
2153                 }
2154
2155                 /* Hack -- Gold/Gems */
2156                 case TV_GOLD:
2157                 {
2158                         strcpy(buf, basenm);
2159                         return;
2160                 }
2161
2162                 /* Used in the "inventory" routine */
2163                 default:
2164                 {
2165 #ifdef JP
2166                         strcpy(buf, "(¤Ê¤·)");
2167 #else
2168                         strcpy(buf, "(nothing)");
2169 #endif
2170
2171                         return;
2172                 }
2173         }
2174
2175         /* Use full name from k_info or a_info */
2176         if (aware && have_flag(flgs, TR_FULL_NAME))
2177         {
2178                 if (known && o_ptr->name1) basenm = a_name + a_info[o_ptr->name1].name;
2179                 else basenm = kindname;
2180         }
2181
2182         /* Start dumping the result */
2183         t = tmp_val;
2184
2185 #ifdef JP
2186         if (basenm[0] == '&')
2187                 s = basenm + 2;
2188         else
2189                 s = basenm;
2190
2191         /* No prefix */
2192         if (mode & OD_OMIT_PREFIX)
2193         {
2194                 /* Nothing */
2195         }
2196         else if (o_ptr->number > 1)
2197         {
2198                 t = object_desc_kosuu(t, o_ptr);
2199                 t = object_desc_str(t, "¤Î ");
2200         }
2201
2202         /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬
2203          * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë 
2204          */
2205         if (known)
2206         {
2207                 if (object_is_fixed_artifact(o_ptr)) t = object_desc_str(t, "¡ú");
2208                 else if (o_ptr->art_name) t = object_desc_str(t, "¡ù");
2209         }
2210
2211 #else
2212
2213         /* The object "expects" a "number" */
2214         if (basenm[0] == '&')
2215         {
2216                 /* Skip the ampersand (and space) */
2217                 s = basenm + 2;
2218
2219                 /* No prefix */
2220                 if (mode & OD_OMIT_PREFIX)
2221                 {
2222                         /* Nothing */
2223                 }
2224
2225                 /* Hack -- None left */
2226                 else if (o_ptr->number <= 0)
2227                 {
2228                         t = object_desc_str(t, "no more ");
2229                 }
2230
2231                 /* Extract the number */
2232                 else if (o_ptr->number > 1)
2233                 {
2234                         t = object_desc_num(t, o_ptr->number);
2235                         t = object_desc_chr(t, ' ');
2236                 }
2237
2238                 /* Hack -- The only one of its kind */
2239                 else if (known && object_is_artifact(o_ptr))
2240                 {
2241                         t = object_desc_str(t, "The ");
2242                 }
2243
2244                 /* Unique corpses are unique */
2245                 else if (o_ptr->tval == TV_CORPSE)
2246                 {
2247                         monster_race *r_ptr = &r_info[o_ptr->pval];
2248
2249                         if (r_ptr->flags1 & RF1_UNIQUE)
2250                         {
2251                                 t = object_desc_str(t, "The ");
2252                         }
2253                 }
2254
2255                 /* A single one */
2256                 else
2257                 {
2258                         bool vowel;
2259
2260                         switch (*s)
2261                         {
2262                         case '#': vowel = is_a_vowel(modstr[0]); break;
2263                         case '%': vowel = is_a_vowel(*kindname); break;
2264                         default:  vowel = is_a_vowel(*s); break;
2265                         }
2266
2267                         if (vowel)
2268                         {
2269                                 /* A single one, with a vowel */
2270                                 t = object_desc_str(t, "an ");
2271                         }
2272                         else
2273                         {
2274                                 /* A single one, without a vowel */
2275                                 t = object_desc_str(t, "a ");
2276                         }
2277                 }
2278         }
2279
2280         /* Hack -- objects that "never" take an article */
2281         else
2282         {
2283                 /* No ampersand */
2284                 s = basenm;
2285
2286                 /* No pref */
2287                 if (mode & OD_OMIT_PREFIX)
2288                 {
2289                         /* Nothing */
2290                 }
2291
2292                 /* Hack -- all gone */
2293                 else if (o_ptr->number <= 0)
2294                 {
2295                         t = object_desc_str(t, "no more ");
2296                 }
2297
2298                 /* Prefix a number if required */
2299                 else if (o_ptr->number > 1)
2300                 {
2301                         t = object_desc_num(t, o_ptr->number);
2302                         t = object_desc_chr(t, ' ');
2303                 }
2304
2305                 /* Hack -- The only one of its kind */
2306                 else if (known && object_is_artifact(o_ptr))
2307                 {
2308                         t = object_desc_str(t, "The ");
2309                 }
2310
2311                 /* Hack -- single items get no prefix */
2312                 else
2313                 {
2314                         /* Nothing */
2315                 }
2316         }
2317 #endif
2318
2319         /* Paranoia -- skip illegal tildes */
2320         /* while (*s == '~') s++; */
2321
2322 #ifdef JP
2323         if (object_is_smith(o_ptr))
2324         {
2325                 t = object_desc_str(t, format("ÃÃÌê»Õ%s¤Î", player_name));
2326         }
2327
2328         /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */
2329         if (known)
2330         {
2331                 /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */
2332                 if (o_ptr->art_name)
2333                 {
2334                         cptr temp = quark_str(o_ptr->art_name);
2335
2336                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2337                         /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */
2338                         if (strncmp(temp, "of ", 3) == 0)
2339                         {
2340                                 t = object_desc_str(t, &temp[3]);
2341                                 t = object_desc_str(t, "¤Î");
2342                         }
2343                         else if ((strncmp(temp, "¡Ø", 2) != 0) &&
2344                                  (strncmp(temp, "¡Ô", 2) != 0) &&
2345                                  (temp[0] != '\''))
2346                                 t = object_desc_str(t, temp);
2347                 }
2348                 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */
2349                 else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME))
2350                 {
2351                         artifact_type *a_ptr = &a_info[o_ptr->name1];
2352                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2353                         if (strncmp(a_name + a_ptr->name, "¡Ø", 2) != 0)
2354                         {
2355                                 t = object_desc_str(t, a_name + a_ptr->name);
2356                         }
2357                 }
2358                 /* Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */
2359                 else if (object_is_ego(o_ptr))
2360                 {
2361                         ego_item_type *e_ptr = &e_info[o_ptr->name2];
2362                         t = object_desc_str(t, e_name + e_ptr->name);
2363                 }
2364         }
2365 #endif
2366
2367         /* Copy the string */
2368         for (; *s; s++)
2369         {
2370                 /* Insert the modifier (flavor) */
2371                 if (*s == '#')
2372                 {
2373                         t = object_desc_str(t, modstr);
2374
2375                         /* Paranoia -- Never append multiple modstr's */
2376                         modstr = "";
2377                 }
2378
2379                 /* Append kind name */
2380                 else if (*s == '%')
2381                 {
2382                         t = object_desc_str(t, kindname);
2383
2384                         /* Paranoia -- Never append multiple kindname's */
2385                         kindname = "";
2386                 }
2387
2388 #ifndef JP
2389                 /* Pluralizer */
2390                 else if (*s == '~')
2391                 {
2392                         /* Add a plural if needed */
2393                         if (!(mode & OD_NO_PLURAL) && (o_ptr->number != 1))
2394                         {
2395                                 char k = t[-1];
2396
2397                                 /* XXX XXX XXX Mega-Hack */
2398
2399                                 /* Hack -- "Cutlass-es" and "Torch-es" */
2400                                 if ((k == 's') || (k == 'h')) *t++ = 'e';
2401
2402                                 /* Add an 's' */
2403                                 *t++ = 's';
2404                         }
2405                 }
2406 #endif
2407
2408                 /* Normal */
2409                 else
2410                 {
2411                         /* Copy */
2412                         *t++ = *s;
2413                 }
2414         }
2415
2416         /* Terminate */
2417         *t = '\0';
2418
2419
2420 #ifdef JP
2421         /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */
2422         if (known)
2423         {
2424                 /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿
2425                    ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */
2426                 if (o_ptr->art_name)
2427                 {
2428                         char temp[256];
2429                         int itemp;
2430                         strcpy(temp, quark_str(o_ptr->art_name));
2431                         /* MEGA HACK by ita */
2432                         if (strncmp(temp, "¡Ø", 2) == 0 ||
2433                             strncmp(temp, "¡Ô", 2) == 0)
2434                                 t = object_desc_str(t, temp);
2435                         else if (temp[0] == '\'')
2436                         {
2437                                 itemp = strlen(temp);
2438                                 temp[itemp - 1] = 0;
2439                                 t = object_desc_str(t, "¡Ø");
2440                                 t = object_desc_str(t, &temp[1]);
2441                                 t = object_desc_str(t, "¡Ù");
2442                         }
2443                 }
2444                 else if (object_is_fixed_artifact(o_ptr))
2445                 {
2446                         artifact_type *a_ptr = &a_info[o_ptr->name1];
2447                         if (strncmp(a_name + a_ptr->name, "¡Ø", 2) == 0)
2448                         {
2449                                 t = object_desc_str(t, a_name + a_ptr->name);
2450                         }
2451                 }
2452                 else if (o_ptr->inscription)
2453                 {
2454                         cptr str = quark_str(o_ptr->inscription);
2455
2456                         while(*str)
2457                         {
2458                                 if (iskanji(*str))
2459                                 {
2460                                         str += 2;
2461                                         continue;
2462                                 }
2463                                 if (*str == '#') break;
2464                                 str++;
2465                         }
2466                         if (*str)
2467                         {
2468                                 /* Find the '#' */
2469                                 cptr str = my_strchr(quark_str(o_ptr->inscription), '#');
2470
2471                                 /* Add the false name */
2472                                 t = object_desc_str(t,"¡Ø");
2473                                 t = object_desc_str(t, &str[1]);
2474                                 t = object_desc_str(t,"¡Ù");
2475                         }
2476                 }
2477         }
2478 #else
2479         if (object_is_smith(o_ptr))
2480         {
2481                 t = object_desc_str(t,format(" of %s the Smith",player_name));
2482         }
2483
2484         /* Hack -- Append "Artifact" or "Special" names */
2485         if (known && !have_flag(flgs, TR_FULL_NAME))
2486         {
2487                 /* Is it a new random artifact ? */
2488                 if (o_ptr->art_name)
2489                 {
2490                         t = object_desc_chr(t, ' ');
2491                         t = object_desc_str(t, quark_str(o_ptr->art_name));
2492                 }
2493
2494                 /* Grab any artifact name */
2495                 else if (object_is_fixed_artifact(o_ptr))
2496                 {
2497                         artifact_type *a_ptr = &a_info[o_ptr->name1];
2498
2499                         t = object_desc_chr(t, ' ');
2500                         t = object_desc_str(t, a_name + a_ptr->name);
2501                 }
2502
2503                 /* Grab any ego-item name */
2504                 else
2505                 {
2506                         if (object_is_ego(o_ptr))
2507                         {
2508                                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2509
2510                                 t = object_desc_chr(t, ' ');
2511                                 t = object_desc_str(t, e_name + e_ptr->name);
2512                         }
2513
2514                         if (o_ptr->inscription && my_strchr(quark_str(o_ptr->inscription), '#'))
2515                         {
2516                                 /* Find the '#' */
2517                                 cptr str = my_strchr(quark_str(o_ptr->inscription), '#');
2518
2519                                 /* Add the false name */
2520                                 t = object_desc_chr(t, ' ');
2521                                 t = object_desc_str(t, &str[1]);
2522                         }
2523                 }
2524         }
2525 #endif
2526
2527
2528         /* No more details wanted */
2529         if (mode & OD_NAME_ONLY) goto object_desc_done;
2530
2531         /* Hack -- Chests must be described in detail */
2532         if (o_ptr->tval == TV_CHEST)
2533         {
2534                 /* Not searched yet */
2535                 if (!known)
2536                 {
2537                         /* Nothing */
2538                 }
2539
2540                 /* May be "empty" */
2541                 else if (!o_ptr->pval)
2542                 {
2543 #ifdef JP
2544                         t = object_desc_str(t, "(¶õ)");
2545 #else
2546                         t = object_desc_str(t, " (empty)");
2547 #endif
2548                 }
2549
2550                 /* May be "disarmed" */
2551                 else if (o_ptr->pval < 0)
2552                 {
2553                         if (chest_traps[0 - o_ptr->pval])
2554                         {
2555 #ifdef JP
2556                                 t = object_desc_str(t, "(²ò½üºÑ)");
2557 #else
2558                                 t = object_desc_str(t, " (disarmed)");
2559 #endif
2560                         }
2561                         else
2562                         {
2563 #ifdef JP
2564                                 t = object_desc_str(t, "(Èó»Ü¾û)");
2565 #else
2566                                 t = object_desc_str(t, " (unlocked)");
2567 #endif
2568                         }
2569                 }
2570
2571                 /* Describe the traps, if any */
2572                 else
2573                 {
2574                         /* Describe the traps */
2575                         switch (chest_traps[o_ptr->pval])
2576                         {
2577                                 case 0:
2578                                 {
2579 #ifdef JP
2580                                         t = object_desc_str(t, "(»Ü¾û)");
2581 #else
2582                                         t = object_desc_str(t, " (Locked)");
2583 #endif
2584                                         break;
2585                                 }
2586                                 case CHEST_LOSE_STR:
2587                                 {
2588 #ifdef JP
2589                                         t = object_desc_str(t, "(ÆÇ¿Ë)");
2590 #else
2591                                         t = object_desc_str(t, " (Poison Needle)");
2592 #endif
2593                                         break;
2594                                 }
2595                                 case CHEST_LOSE_CON:
2596                                 {
2597 #ifdef JP
2598                                         t = object_desc_str(t, "(ÆÇ¿Ë)");
2599 #else
2600                                         t = object_desc_str(t, " (Poison Needle)");
2601 #endif
2602                                         break;
2603                                 }
2604                                 case CHEST_POISON:
2605                                 {
2606 #ifdef JP
2607                                         t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2608 #else
2609                                         t = object_desc_str(t, " (Gas Trap)");
2610 #endif
2611                                         break;
2612                                 }
2613                                 case CHEST_PARALYZE:
2614                                 {
2615 #ifdef JP
2616                                         t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2617 #else
2618                                         t = object_desc_str(t, " (Gas Trap)");
2619 #endif
2620                                         break;
2621                                 }
2622                                 case CHEST_EXPLODE:
2623                                 {
2624 #ifdef JP
2625                                         t = object_desc_str(t, "(ÇúȯÁõÃÖ)");
2626 #else
2627                                         t = object_desc_str(t, " (Explosion Device)");
2628 #endif
2629                                         break;
2630                                 }
2631                                 case CHEST_SUMMON:
2632                                 case CHEST_BIRD_STORM:
2633                                 case CHEST_E_SUMMON:
2634                                 case CHEST_H_SUMMON:
2635                                 {
2636 #ifdef JP
2637                                         t = object_desc_str(t, "(¾¤´­¤Î¥ë¡¼¥ó)");
2638 #else
2639                                         t = object_desc_str(t, " (Summoning Runes)");
2640 #endif
2641                                         break;
2642                                 }
2643                                 case CHEST_RUNES_OF_EVIL:
2644                                 {
2645 #ifdef JP
2646                                         t = object_desc_str(t, "(¼Ù°­¤Ê¥ë¡¼¥ó)");
2647 #else
2648                                         t = object_desc_str(t, " (Gleaming Black Runes)");
2649 #endif
2650                                         break;
2651                                 }
2652                                 case CHEST_ALARM:
2653                                 {
2654 #ifdef JP
2655                                         t = object_desc_str(t, "(·ÙÊóÁõÃÖ)");
2656 #else
2657                                         t = object_desc_str(t, " (Alarm)");
2658 #endif
2659                                         break;
2660                                 }
2661                                 default:
2662                                 {
2663 #ifdef JP
2664                                         t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)");
2665 #else
2666                                         t = object_desc_str(t, " (Multiple Traps)");
2667 #endif
2668                                         break;
2669                                 }
2670                         }
2671                 }
2672         }
2673
2674
2675         /* Display the item like a weapon */
2676         if (have_flag(flgs, TR_SHOW_MODS)) show_weapon = TRUE;
2677
2678         /* Display the item like a weapon */
2679         if (object_is_smith(o_ptr) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE))
2680                 show_weapon = TRUE;
2681
2682         /* Display the item like a weapon */
2683         if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
2684
2685         /* Display the item like armour */
2686         if (o_ptr->ac) show_armour = TRUE;
2687
2688
2689         /* Dump base weapon info */
2690         switch (o_ptr->tval)
2691         {
2692                 /* Missiles and Weapons */
2693                 case TV_SHOT:
2694                 case TV_BOLT:
2695                 case TV_ARROW:
2696                 case TV_HAFTED:
2697                 case TV_POLEARM:
2698                 case TV_SWORD:
2699                 case TV_DIGGING:
2700
2701                 /* Append a "damage" string */
2702                 t = object_desc_chr(t, ' ');
2703                 t = object_desc_chr(t, p1);
2704                 t = object_desc_num(t, o_ptr->dd);
2705                 t = object_desc_chr(t, 'd');
2706                 t = object_desc_num(t, o_ptr->ds);
2707                 t = object_desc_chr(t, p2);
2708
2709                 /* All done */
2710                 break;
2711
2712
2713                 /* Bows get a special "damage string" */
2714                 case TV_BOW:
2715
2716                 /* Mega-Hack -- Extract the "base power" */
2717                 power = bow_tmul(o_ptr->sval);
2718
2719                 /* Apply the "Extra Might" flag */
2720                 if (have_flag(flgs, TR_XTRA_MIGHT)) power++;
2721
2722                 /* Append a special "damage" string */
2723                 t = object_desc_chr(t, ' ');
2724                 t = object_desc_chr(t, p1);
2725                 t = object_desc_chr(t, 'x');
2726                 t = object_desc_num(t, power);
2727                 t = object_desc_chr(t, p2);
2728
2729                 /* All done */
2730                 break;
2731         }
2732
2733
2734         /* Add the weapon bonuses */
2735         if (known)
2736         {
2737                 /* Show the tohit/todam on request */
2738                 if (show_weapon)
2739                 {
2740                         t = object_desc_chr(t, ' ');
2741                         t = object_desc_chr(t, p1);
2742                         t = object_desc_int(t, o_ptr->to_h);
2743                         t = object_desc_chr(t, ',');
2744                         t = object_desc_int(t, o_ptr->to_d);
2745                         t = object_desc_chr(t, p2);
2746                 }
2747
2748                 /* Show the tohit if needed */
2749                 else if (o_ptr->to_h)
2750                 {
2751                         t = object_desc_chr(t, ' ');
2752                         t = object_desc_chr(t, p1);
2753                         t = object_desc_int(t, o_ptr->to_h);
2754                         t = object_desc_chr(t, p2);
2755                 }
2756
2757                 /* Show the todam if needed */
2758                 else if (o_ptr->to_d)
2759                 {
2760                         t = object_desc_chr(t, ' ');
2761                         t = object_desc_chr(t, p1);
2762                         t = object_desc_int(t, o_ptr->to_d);
2763                         t = object_desc_chr(t, p2);
2764                 }
2765         }
2766
2767         bow_ptr = &inventory[INVEN_BOW];
2768
2769         /* If have a firing weapon + ammo matches bow */
2770         if (bow_ptr->k_idx && (o_ptr->tval == p_ptr->tval_ammo))
2771         {
2772                 int avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2;
2773                 int tmul = bow_tmul(bow_ptr->sval);
2774                 s16b energy_fire = bow_energy(bow_ptr->sval);
2775
2776                 /* See if the bow is "known" - then set damage bonus */
2777                 if (object_is_known(bow_ptr)) avgdam += (bow_ptr->to_d * 10);
2778
2779                 /* Effect of ammo */
2780                 if (known) avgdam += (o_ptr->to_d * 10);
2781
2782                 /* Get extra "power" from "extra might" */
2783                 if (p_ptr->xtra_might) tmul++;
2784
2785                 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2786
2787                 /* Launcher multiplier */
2788                 avgdam *= tmul;
2789                 avgdam /= (100 * 10);
2790                 if (avgdam < 0) avgdam = 0;
2791
2792                 /* Display (shot damage/ avg damage) */
2793                 t = object_desc_chr(t, ' ');
2794                 t = object_desc_chr(t, p1);
2795                 t = object_desc_num(t, avgdam);
2796                 t = object_desc_chr(t, '/');
2797
2798                 if (p_ptr->num_fire == 0)
2799                 {
2800                         t = object_desc_chr(t, '0');
2801                 }
2802                 else
2803                 {
2804                         /* Calc effects of energy */
2805                         avgdam *= (p_ptr->num_fire * 100);
2806                         avgdam /= energy_fire;
2807                         t = object_desc_num(t, avgdam);
2808                 }
2809
2810                 t = object_desc_chr(t, p2);
2811         }
2812         else if ((p_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE))
2813         {
2814                 int avgdam = p_ptr->mighty_throw ? (1 + 3) : 1;
2815                 s16b energy_fire = 100 - p_ptr->lev;
2816
2817                 avgdam += ((p_ptr->lev + 30) * (p_ptr->lev + 30) - 900) / 55;
2818
2819                 /* Display (shot damage/ avg damage) */
2820                 t = object_desc_chr(t, ' ');
2821                 t = object_desc_chr(t, p1);
2822                 t = object_desc_num(t, avgdam);
2823                 t = object_desc_chr(t, '/');
2824
2825                 /* Calc effects of energy */
2826                 avgdam = 100 * avgdam / energy_fire;
2827
2828                 t = object_desc_num(t, avgdam);
2829                 t = object_desc_chr(t, p2);
2830         }
2831
2832         /* Add the armor bonuses */
2833         if (known)
2834         {
2835                 /* Show the armor class info */
2836                 if (show_armour)
2837                 {
2838                         t = object_desc_chr(t, ' ');
2839                         t = object_desc_chr(t, b1);
2840                         t = object_desc_num(t, o_ptr->ac);
2841                         t = object_desc_chr(t, ',');
2842                         t = object_desc_int(t, o_ptr->to_a);
2843                         t = object_desc_chr(t, b2);
2844                 }
2845
2846                 /* No base armor, but does increase armor */
2847                 else if (o_ptr->to_a)
2848                 {
2849                         t = object_desc_chr(t, ' ');
2850                         t = object_desc_chr(t, b1);
2851                         t = object_desc_int(t, o_ptr->to_a);
2852                         t = object_desc_chr(t, b2);
2853                 }
2854         }
2855
2856         /* Hack -- always show base armor */
2857         else if (show_armour)
2858         {
2859                 t = object_desc_chr(t, ' ');
2860                 t = object_desc_chr(t, b1);
2861                 t = object_desc_num(t, o_ptr->ac);
2862                 t = object_desc_chr(t, b2);
2863         }
2864
2865
2866         /* No more details wanted */
2867         if (mode & OD_NAME_AND_ENCHANT) goto object_desc_done;
2868
2869
2870         if (known) /* Known item only */
2871         {
2872                 /*
2873                  * Hack -- Wands and Staffs have charges.  Make certain how many charges
2874                  * a stack of staffs really has is clear. -LM-
2875                  */
2876                 if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND)))
2877                 {
2878                         /* Dump " (N charges)" */
2879                         t = object_desc_chr(t, ' ');
2880                         t = object_desc_chr(t, p1);
2881
2882                         /* Clear explaination for staffs. */
2883                         if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1))
2884                         {
2885                                 t = object_desc_num(t, o_ptr->number);
2886                                 t = object_desc_str(t, "x ");
2887                         }
2888                         t = object_desc_num(t, o_ptr->pval);
2889 #ifdef JP
2890                         t = object_desc_str(t, "²óʬ");
2891 #else
2892                         t = object_desc_str(t, " charge");
2893                         if (o_ptr->pval != 1) t = object_desc_chr(t, 's');
2894 #endif
2895
2896                         t = object_desc_chr(t, p2);
2897                 }
2898                 /* Hack -- Rods have a "charging" indicator.  Now that stacks of rods may
2899                  * be in any state of charge or discharge, this now includes a number. -LM-
2900                  */
2901                 else if (o_ptr->tval == TV_ROD)
2902                 {
2903                         /* Hack -- Dump " (# charging)" if relevant */
2904                         if (o_ptr->timeout)
2905                         {
2906                                 /* Stacks of rods display an exact count of charging rods. */
2907                                 if (o_ptr->number > 1)
2908                                 {
2909                                         /* Paranoia. */
2910                                         if (k_ptr->pval == 0) k_ptr->pval = 1;
2911
2912                                         /* Find out how many rods are charging, by dividing
2913                                          * current timeout by each rod's maximum timeout.
2914                                          * Ensure that any remainder is rounded up.  Display
2915                                          * very discharged stacks as merely fully discharged.
2916                                          */
2917                                         power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2918                                         if (power > o_ptr->number) power = o_ptr->number;
2919
2920                                         /* Display prettily. */
2921                                         t = object_desc_str(t, " (");
2922                                         t = object_desc_num(t, power);
2923 #ifdef JP
2924                                         t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)");
2925 #else
2926                                         t = object_desc_str(t, " charging)");
2927 #endif
2928                                 }
2929
2930                                 /* "one Rod of Perception (1 charging)" would look tacky. */
2931                                 else
2932                                 {
2933 #ifdef JP
2934                                         t = object_desc_str(t, "(½¼Å¶Ãæ)");
2935 #else
2936                                         t = object_desc_str(t, " (charging)");
2937 #endif
2938                                 }
2939                         }
2940                 }
2941
2942                 /* Dump "pval" flags for wearable items */
2943                 if (have_pval_flags(flgs))
2944                 {
2945                         /* Start the display */
2946                         t = object_desc_chr(t, ' ');
2947                         t = object_desc_chr(t, p1);
2948
2949                         /* Dump the "pval" itself */
2950                         t = object_desc_int(t, o_ptr->pval);
2951
2952                         /* Do not display the "pval" flags */
2953                         if (have_flag(flgs, TR_HIDE_TYPE))
2954                         {
2955                                 /* Nothing */
2956                         }
2957
2958                         /* Speed */
2959                         else if (have_flag(flgs, TR_SPEED))
2960                         {
2961                                 /* Dump " to speed" */
2962 #ifdef JP
2963                                 t = object_desc_str(t, "²Ã®");
2964 #else
2965                                 t = object_desc_str(t, " to speed");
2966 #endif
2967                         }
2968
2969                         /* Attack speed */
2970                         else if (have_flag(flgs, TR_BLOWS))
2971                         {
2972                                 /* Add " attack" */
2973 #ifdef JP
2974                                 t = object_desc_str(t, "¹¶·â");
2975 #else
2976                                 t = object_desc_str(t, " attack");
2977
2978                                 /* Add "attacks" */
2979                                 if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
2980 #endif
2981                         }
2982
2983                         /* Stealth */
2984                         else if (have_flag(flgs, TR_STEALTH))
2985                         {
2986                                 /* Dump " to stealth" */
2987 #ifdef JP
2988                                 t = object_desc_str(t, "±£Ì©");
2989 #else
2990                                 t = object_desc_str(t, " to stealth");
2991 #endif
2992                         }
2993
2994                         /* Search */
2995                         else if (have_flag(flgs, TR_SEARCH))
2996                         {
2997                                 /* Dump " to searching" */
2998 #ifdef JP
2999                                 t = object_desc_str(t, "õº÷");
3000 #else
3001                                 t = object_desc_str(t, " to searching");
3002 #endif
3003                         }
3004
3005                         /* Infravision */
3006                         else if (have_flag(flgs, TR_INFRA))
3007                         {
3008                                 /* Dump " to infravision" */
3009 #ifdef JP
3010                                 t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ");
3011 #else
3012                                 t = object_desc_str(t, " to infravision");
3013 #endif
3014                         }
3015
3016                         /* Finish the display */
3017                         t = object_desc_chr(t, p2);
3018                 }
3019
3020                 /* Hack -- Process Lanterns/Torches */
3021                 if ((o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR))))
3022                 {
3023                         /* Hack -- Turns of light for normal lites */
3024 #ifdef JP
3025                         t = object_desc_chr(t, '(');
3026 #else
3027                         t = object_desc_str(t, " (with ");
3028 #endif
3029
3030                         if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4 * 2);
3031                         else t = object_desc_num(t, o_ptr->xtra4);
3032 #ifdef JP
3033                         t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)");
3034 #else
3035                         t = object_desc_str(t, " turns of light)");
3036 #endif
3037                 }
3038
3039                 /* Indicate charging objects, but not rods. */
3040                 if (o_ptr->timeout && (o_ptr->tval != TV_ROD))
3041                 {
3042                         /* Hack -- Dump " (charging)" if relevant */
3043 #ifdef JP
3044                         t = object_desc_str(t, "(½¼Å¶Ãæ)");
3045 #else
3046                         t = object_desc_str(t, " (charging)");
3047 #endif
3048                 }
3049         }
3050
3051
3052         /* No more details wanted */
3053         if (mode & OD_OMIT_INSCRIPTION) goto object_desc_done;
3054
3055
3056         /* Prepare real inscriptions in a buffer */
3057         tmp_val2[0] = '\0';
3058
3059         /* Auto abbreviation inscribe */
3060         if ((abbrev_extra || abbrev_all) && (o_ptr->ident & IDENT_MENTAL))
3061         {
3062                 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '%'))
3063                 {
3064                         bool kanji, all;
3065
3066 #ifdef JP
3067                         kanji = TRUE;
3068 #else
3069                         kanji = FALSE;
3070 #endif
3071                         all = abbrev_all;
3072
3073                         get_ability_abbreviation(tmp_val2, o_ptr, kanji, all);
3074                 }
3075         }
3076
3077         /* Use the standard inscription if available */
3078         if (o_ptr->inscription)
3079         {
3080                 char buff[1024];
3081
3082                 if (tmp_val2[0]) strcat(tmp_val2, ", ");
3083
3084                 /* Get inscription and convert {%} */
3085                 get_inscription(buff, o_ptr);
3086
3087                 /* strcat with correct treating of kanji */
3088                 my_strcat(tmp_val2, buff, sizeof(tmp_val2));
3089         }
3090
3091
3092         /* No fake inscription yet */
3093         fake_insc_buf[0] = '\0';
3094
3095         /* Use the game-generated "feeling" otherwise, if available */
3096         if (o_ptr->feeling)
3097         {
3098                 strcpy(fake_insc_buf, game_inscriptions[o_ptr->feeling]);
3099         }
3100
3101         /* Note "cursed" if the item is known to be cursed */
3102         else if (object_is_cursed(o_ptr) && (known || (o_ptr->ident & IDENT_SENSE)))
3103         {
3104 #ifdef JP
3105                 strcpy(fake_insc_buf, "¼ö¤ï¤ì¤Æ¤¤¤ë");
3106 #else
3107                 strcpy(fake_insc_buf, "cursed");
3108 #endif
3109         }
3110
3111         /* Note "unidentified" if the item is unidentified */
3112         else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)
3113                    || (o_ptr->tval == TV_LITE) || (o_ptr->tval == TV_FIGURINE))
3114                  && aware && !known
3115                  && !(o_ptr->ident & IDENT_SENSE))
3116         {
3117 #ifdef JP
3118                 strcpy(fake_insc_buf, "̤´ÕÄê");
3119 #else
3120                 strcpy(fake_insc_buf, "unidentified");
3121 #endif
3122         }
3123
3124         /* Mega-Hack -- note empty wands/staffs */
3125         else if (!known && (o_ptr->ident & IDENT_EMPTY))
3126         {
3127 #ifdef JP
3128                 strcpy(fake_insc_buf, "¶õ");
3129 #else
3130                 strcpy(fake_insc_buf, "empty");
3131 #endif
3132         }
3133
3134         /* Note "tried" if the object has been tested unsuccessfully */
3135         else if (!aware && object_is_tried(o_ptr))
3136         {
3137 #ifdef JP
3138                 strcpy(fake_insc_buf, "̤ȽÌÀ");
3139 #else
3140                 strcpy(fake_insc_buf, "tried");
3141 #endif
3142         }
3143
3144         /* Note the discount, if any */
3145         if (o_ptr->discount)
3146         {
3147                 /* Hidden by real inscription unless in a store */
3148                 if (!tmp_val2[0] || (o_ptr->ident & IDENT_STORE))
3149                 {
3150                         /* Append to other fake inscriptions if any */
3151                         if (fake_insc_buf[0]) strcat(fake_insc_buf, ", ");
3152
3153                         (void)object_desc_num(fake_insc_buf, o_ptr->discount);
3154 #ifdef JP
3155                         strcat(fake_insc_buf, "%°ú¤­");
3156 #else
3157                         strcat(fake_insc_buf, "% off");
3158 #endif
3159                 }
3160         }
3161
3162
3163         /* Append the inscription, if any */
3164         if (fake_insc_buf[0] || tmp_val2[0])
3165         {
3166                 /* Append the inscription */
3167                 t = object_desc_chr(t, ' ');
3168                 t = object_desc_chr(t, c1);
3169
3170                 /* Append fake inscriptions */
3171                 if (fake_insc_buf[0])
3172                 {
3173                         t = object_desc_str(t, fake_insc_buf);
3174                 }
3175
3176                 /* Append a separater */
3177                 if (fake_insc_buf[0] && tmp_val2[0])
3178                 {
3179                         t = object_desc_chr(t, ',');
3180                         t = object_desc_chr(t, ' ');
3181                 }
3182
3183                 /* Append real inscriptions */
3184                 if (tmp_val2[0])
3185                 {
3186                         t = object_desc_str(t, tmp_val2);
3187                 }
3188
3189                 t = object_desc_chr(t, c2);
3190         }
3191
3192 object_desc_done:
3193         my_strcpy(buf, tmp_val, MAX_NLEN);
3194 }
3195
3196