OSDN Git Service

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