OSDN Git Service

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