OSDN Git Service

get_check_strict() を作った。modeの指定によってESCを受けつけないようにしたり、
[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                         if ((k_ptr->sval == SV_RING_POWER) || (k_ptr->sval == SV_RING_AHO)) return (0x90 + TERM_YELLOW);
457                         else return (0x90 + ring_col[k_ptr->sval]);
458                 }
459
460                 case TV_STAFF:
461                 {
462                         return (0xA0 + staff_col[k_ptr->sval]);
463                 }
464
465                 case TV_WAND:
466                 {
467                         return (0xB0 + wand_col[k_ptr->sval]);
468                 }
469
470                 case TV_ROD:
471                 {
472                         return (0xC0 + rod_col[k_ptr->sval]);
473                 }
474
475                 case TV_SCROLL:
476                 {
477                         return (0xD0 + scroll_col[k_ptr->sval]);
478                 }
479
480                 case TV_POTION:
481                 {
482                         return (0xE0 + potion_col[k_ptr->sval]);
483                 }
484
485                 case TV_FOOD:
486                 {
487                         if (k_ptr->sval < SV_FOOD_MIN_FOOD)
488                         {
489                                 return (0xF0 + food_col[k_ptr->sval]);
490                         }
491
492                         break;
493                 }
494         }
495
496         /* No flavor */
497         return (0);
498 }
499
500
501 void get_table_name(char *out_string)
502 {
503 #ifdef JP
504         char Syllable[80];
505         strcpy(out_string, "¡Ø");
506         get_rnd_line("aname_j.txt", 1, Syllable);
507         strcat(out_string, Syllable);
508         get_rnd_line("aname_j.txt", 2, Syllable);
509         strcat(out_string, Syllable);
510         strcat(out_string, "¡Ù");
511 #else
512         int testcounter = randint(3) + 1;
513
514         strcpy(out_string, "'");
515
516         if (randint(3) == 2)
517         {
518                 while (testcounter--)
519                         strcat(out_string, syllables[rand_int(MAX_SYLLABLES)]);
520         }
521         else
522         {
523                 char Syllable[80];
524                 testcounter = randint(2) + 1;
525                 while (testcounter--)
526                 {
527                         (void)get_rnd_line("elvish.txt", 0, Syllable);
528                         strcat(out_string, Syllable);
529                 }
530         }
531
532         out_string[1] = toupper(out_string[1]);
533
534         strcat(out_string, "'");
535 #endif
536
537
538         out_string[18] = '\0';
539
540         return;
541 }
542
543
544 /*
545  * Prepare the "variable" part of the "k_info" array.
546  *
547  * The "color"/"metal"/"type" of an item is its "flavor".
548  * For the most part, flavors are assigned randomly each game.
549  *
550  * Initialize descriptions for the "colored" objects, including:
551  * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.
552  *
553  * The first 4 entries for potions are fixed (Water, Apple Juice,
554  * Slime Mold Juice, Unused Potion).
555  *
556  * Scroll titles are always between 6 and 14 letters long.  This is
557  * ensured because every title is composed of whole words, where every
558  * word is from 1 to 8 letters long (one or two syllables of 1 to 4
559  * letters each), and that no scroll is finished until it attempts to
560  * grow beyond 15 letters.  The first time this can happen is when the
561  * current title has 6 letters and the new word has 8 letters, which
562  * would result in a 6 letter scroll title.
563  *
564  * Duplicate titles are avoided by requiring that no two scrolls share
565  * the same first four letters (not the most efficient method, and not
566  * the least efficient method, but it will always work).
567  *
568  * Hack -- make sure everything stays the same for each saved game
569  * This is accomplished by the use of a saved "random seed", as in
570  * "town_gen()".  Since no other functions are called while the special
571  * seed is in effect, so this function is pretty "safe".
572  *
573  * Note that the "hacked seed" may provide an RNG with alternating parity!
574  */
575 void flavor_init(void)
576 {
577         int     i, j;
578
579         byte    temp_col;
580
581         cptr    temp_adj;
582
583
584         /* Hack -- Use the "simple" RNG */
585         Rand_quick = TRUE;
586
587         /* Hack -- Induce consistant flavors */
588         Rand_value = seed_flavor;
589
590
591         /* Efficiency -- Rods/Wands share initial array */
592         for (i = 0; i < MAX_METALS; i++)
593         {
594                 rod_adj[i] = wand_adj[i];
595 #ifdef JP
596                 J_rod_adj[i] = J_wand_adj[i];
597 #endif
598                 rod_col[i] = wand_col[i];
599         }
600
601
602         /* Rings have "ring colors" */
603         for (i = 0; i < MAX_ROCKS; i++)
604         {
605                 j = rand_int(MAX_ROCKS);
606                 temp_adj = ring_adj[i];
607                 ring_adj[i] = ring_adj[j];
608                 ring_adj[j] = temp_adj;
609 #ifdef JP
610                 temp_adj = J_ring_adj[i];
611                 J_ring_adj[i] = J_ring_adj[j];
612                 J_ring_adj[j] = temp_adj;
613 #endif
614                 temp_col = ring_col[i];
615                 ring_col[i] = ring_col[j];
616                 ring_col[j] = temp_col;
617         }
618
619         /* Amulets have "amulet colors" */
620         for (i = 0; i < MAX_AMULETS; i++)
621         {
622                 j = rand_int(MAX_AMULETS);
623                 temp_adj = amulet_adj[i];
624                 amulet_adj[i] = amulet_adj[j];
625                 amulet_adj[j] = temp_adj;
626 #ifdef JP
627                 temp_adj = J_amulet_adj[i];
628                 J_amulet_adj[i] = J_amulet_adj[j];
629                 J_amulet_adj[j] = temp_adj;
630 #endif
631                 temp_col = amulet_col[i];
632                 amulet_col[i] = amulet_col[j];
633                 amulet_col[j] = temp_col;
634         }
635
636         /* Staffs */
637         for (i = 0; i < MAX_WOODS; i++)
638         {
639                 j = rand_int(MAX_WOODS);
640                 temp_adj = staff_adj[i];
641                 staff_adj[i] = staff_adj[j];
642                 staff_adj[j] = temp_adj;
643 #ifdef JP
644                 temp_adj = J_staff_adj[i];
645                 J_staff_adj[i] = J_staff_adj[j];
646                 J_staff_adj[j] = temp_adj;
647 #endif
648                 temp_col = staff_col[i];
649                 staff_col[i] = staff_col[j];
650                 staff_col[j] = temp_col;
651         }
652
653         /* Wands */
654         for (i = 0; i < MAX_METALS; i++)
655         {
656                 j = rand_int(MAX_METALS);
657                 temp_adj = wand_adj[i];
658                 wand_adj[i] = wand_adj[j];
659                 wand_adj[j] = temp_adj;
660 #ifdef JP
661                 temp_adj = J_wand_adj[i];
662                 J_wand_adj[i] = J_wand_adj[j];
663                 J_wand_adj[j] = temp_adj;
664 #endif
665                 temp_col = wand_col[i];
666                 wand_col[i] = wand_col[j];
667                 wand_col[j] = temp_col;
668         }
669
670         /* Rods */
671         for (i = 0; i < MAX_METALS; i++)
672         {
673                 j = rand_int(MAX_METALS);
674                 temp_adj = rod_adj[i];
675                 rod_adj[i] = rod_adj[j];
676                 rod_adj[j] = temp_adj;
677 #ifdef JP
678                 temp_adj = J_rod_adj[i];
679                 J_rod_adj[i] = J_rod_adj[j];
680                 J_rod_adj[j] = temp_adj;
681 #endif
682                 temp_col = rod_col[i];
683                 rod_col[i] = rod_col[j];
684                 rod_col[j] = temp_col;
685         }
686
687         /* Foods (Mushrooms) */
688         for (i = 0; i < MAX_SHROOM; i++)
689         {
690                 j = rand_int(MAX_SHROOM);
691                 temp_adj = food_adj[i];
692                 food_adj[i] = food_adj[j];
693                 food_adj[j] = temp_adj;
694 #ifdef JP
695                 temp_adj = J_food_adj[i];
696                 J_food_adj[i] = J_food_adj[j];
697                 J_food_adj[j] = temp_adj;
698 #endif
699                 temp_col = food_col[i];
700                 food_col[i] = food_col[j];
701                 food_col[j] = temp_col;
702         }
703
704         /* Potions */
705         for (i = 4; i < MAX_COLORS; i++)
706         {
707                 j = rand_int(MAX_COLORS - 4) + 4;
708                 temp_adj = potion_adj[i];
709                 potion_adj[i] = potion_adj[j];
710                 potion_adj[j] = temp_adj;
711 #ifdef JP
712                 temp_adj = J_potion_adj[i];
713                 J_potion_adj[i] = J_potion_adj[j];
714                 J_potion_adj[j] = temp_adj;
715 #endif
716                 temp_col = potion_col[i];
717                 potion_col[i] = potion_col[j];
718                 potion_col[j] = temp_col;
719         }
720
721         /* Scrolls (random titles, always white) */
722         for (i = 0; i < MAX_TITLES; i++)
723         {
724                 /* Get a new title */
725                 while (TRUE)
726                 {
727                         char buf[80];
728
729                         bool okay;
730
731                         /* Start a new title */
732                         buf[0] = '\0';
733
734                         /* Collect words until done */
735                         while (1)
736                         {
737                                 int q, s;
738
739                                 char tmp[80];
740
741                                 /* Start a new word */
742                                 tmp[0] = '\0';
743
744                                 /* Choose one or two syllables */
745                                 s = ((rand_int(100) < 30) ? 1 : 2);
746
747                                 /* Add a one or two syllable word */
748                                 for (q = 0; q < s; q++)
749                                 {
750                                         /* Add the syllable */
751 #ifdef JP
752                                         strcat(tmp, J_syllables[rand_int(MAX_SYLLABLES)]);
753 #else
754                                         strcat(tmp, syllables[rand_int(MAX_SYLLABLES)]);
755 #endif
756                                 }
757
758                                 /* Stop before getting too long */
759                                 if (strlen(buf) + 1 + strlen(tmp) > 15) break;
760
761                                 /* Add a space */
762                                 strcat(buf, " ");
763
764                                 /* Add the word */
765                                 strcat(buf, tmp);
766                         }
767
768                         /* Save the title */
769                         strcpy(scroll_adj[i], buf+1);
770
771                         /* Assume okay */
772                         okay = TRUE;
773
774                         /* Check for "duplicate" scroll titles */
775                         for (j = 0; j < i; j++)
776                         {
777                                 cptr hack1 = scroll_adj[j];
778                                 cptr hack2 = scroll_adj[i];
779
780                                 /* Compare first four characters */
781                                 if (*hack1++ != *hack2++) continue;
782                                 if (*hack1++ != *hack2++) continue;
783                                 if (*hack1++ != *hack2++) continue;
784                                 if (*hack1++ != *hack2++) continue;
785
786                                 /* Not okay */
787                                 okay = FALSE;
788
789                                 /* Stop looking */
790                                 break;
791                         }
792
793                         /* Break when done */
794                         if (okay) break;
795                 }
796
797                 /* All scrolls are white */
798                 scroll_col[i] = TERM_WHITE;
799         }
800
801
802         /* Hack -- Use the "complex" RNG */
803         Rand_quick = FALSE;
804
805         /* Analyze every object */
806         for (i = 1; i < max_k_idx; i++)
807         {
808                 object_kind *k_ptr = &k_info[i];
809
810                 /* Skip "empty" objects */
811                 if (!k_ptr->name) continue;
812
813                 /* Extract "flavor" (if any) */
814                 k_ptr->flavor = object_flavor(i);
815
816                 /* No flavor yields aware */
817                 if (!k_ptr->flavor) k_ptr->aware = TRUE;
818
819                 /* Check for "easily known" */
820                 k_ptr->easy_know = object_easy_know(i);
821         }
822 }
823
824
825 /*
826  * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
827  * and return a pointer to the terminator (t + 1).
828  */
829 static char *object_desc_chr(char *t, char c)
830 {
831         /* Copy the char */
832         *t++ = c;
833
834         /* Terminate */
835         *t = '\0';
836
837         /* Result */
838         return (t);
839 }
840
841
842 /*
843  * Print a string "s" into a string "t", as if by strcpy(t, s),
844  * and return a pointer to the terminator.
845  */
846 static char *object_desc_str(char *t, cptr s)
847 {
848         /* Copy the string */
849         while (*s) *t++ = *s++;
850
851         /* Terminate */
852         *t = '\0';
853
854         /* Result */
855         return (t);
856 }
857
858
859
860 /*
861  * Print an unsigned number "n" into a string "t", as if by
862  * sprintf(t, "%u", n), and return a pointer to the terminator.
863  */
864 static char *object_desc_num(char *t, uint n)
865 {
866         uint p;
867
868         /* Find "size" of "n" */
869         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
870
871         /* Dump each digit */
872         while (p >= 1)
873         {
874                 /* Dump the digit */
875                 *t++ = '0' + n / p;
876
877                 /* Remove the digit */
878                 n = n % p;
879
880                 /* Process next digit */
881                 p = p / 10;
882         }
883
884         /* Terminate */
885         *t = '\0';
886
887         /* Result */
888         return (t);
889 }
890
891
892
893
894 #ifdef JP
895 /*
896  * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó
897  *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë
898  */
899
900 extern char *object_desc_kosuu(char *t, object_type *o_ptr)
901 {
902     t = object_desc_num(t, o_ptr->number);
903
904     switch (o_ptr->tval)
905     {
906       case TV_BOLT:
907       case TV_ARROW:
908       case TV_POLEARM:
909       case TV_STAFF:
910       case TV_WAND:
911       case TV_ROD:
912       case TV_DIGGING:
913       {
914           t = object_desc_str(t, "ËÜ");
915           break;
916       }
917       case TV_SCROLL:
918       {
919           t = object_desc_str(t, "´¬");
920           break;
921       }
922       case TV_POTION:
923       {
924           t = object_desc_str(t, "Éþ");
925           break;
926       }
927       case  TV_LIFE_BOOK:
928       case  TV_SORCERY_BOOK:
929       case  TV_NATURE_BOOK:
930       case  TV_CHAOS_BOOK:
931       case  TV_DEATH_BOOK:
932       case  TV_TRUMP_BOOK:
933       case  TV_ARCANE_BOOK:
934       case  TV_ENCHANT_BOOK:
935       case  TV_DAEMON_BOOK:
936       case  TV_MUSIC_BOOK:
937       case  TV_HISSATSU_BOOK:
938       {
939           t = object_desc_str(t, "ºý");
940           break;
941       }
942       case TV_SOFT_ARMOR:
943       case TV_HARD_ARMOR:
944       case TV_DRAG_ARMOR:
945       case TV_CLOAK:
946       {
947           t = object_desc_str(t, "Ãå");
948           break;
949       }
950       case TV_SWORD:
951       case TV_HAFTED:
952       case TV_BOW:
953       {
954           t = object_desc_str(t, "¿¶");
955           break;
956       }
957       case TV_BOOTS:
958       {
959           t = object_desc_str(t, "­");
960           break;
961       }
962       case TV_CARD:
963       {
964           t = object_desc_str(t, "Ëç");
965           break;
966       }
967             /* ¿©¤Ù¤â¤Î by ita */
968       case TV_FOOD:
969       {
970           if(o_ptr->sval == SV_FOOD_JERKY)
971           {
972               t = object_desc_str(t, "ÀÚ¤ì");
973               break;
974           }
975       }
976       default:
977       {
978           if (o_ptr->number < 10)
979           {
980               t = object_desc_str(t, "¤Ä");
981           }
982           else
983           {
984               t = object_desc_str(t, "¸Ä");
985           }
986           break;
987       }
988   }
989   return (t);                  
990 }
991 #endif
992
993 /*
994  * Print an signed number "v" into a string "t", as if by
995  * sprintf(t, "%+d", n), and return a pointer to the terminator.
996  * Note that we always print a sign, either "+" or "-".
997  */
998 static char *object_desc_int(char *t, sint v)
999 {
1000         uint p, n;
1001
1002         /* Negative */
1003         if (v < 0)
1004         {
1005                 /* Take the absolute value */
1006                 n = 0 - v;
1007
1008                 /* Use a "minus" sign */
1009                 *t++ = '-';
1010         }
1011
1012         /* Positive (or zero) */
1013         else
1014         {
1015                 /* Use the actual number */
1016                 n = v;
1017
1018                 /* Use a "plus" sign */
1019                 *t++ = '+';
1020         }
1021
1022         /* Find "size" of "n" */
1023         for (p = 1; n >= p * 10; p = p * 10) /* loop */;
1024
1025         /* Dump each digit */
1026         while (p >= 1)
1027         {
1028                 /* Dump the digit */
1029                 *t++ = '0' + n / p;
1030
1031                 /* Remove the digit */
1032                 n = n % p;
1033
1034                 /* Process next digit */
1035                 p = p / 10;
1036         }
1037
1038         /* Terminate */
1039         *t = '\0';
1040
1041         /* Result */
1042         return (t);
1043 }
1044
1045
1046 /*
1047  * Creates a description of the item "o_ptr", and stores it in "out_val".
1048  *
1049  * One can choose the "verbosity" of the description, including whether
1050  * or not the "number" of items should be described, and how much detail
1051  * should be used when describing the item.
1052  *
1053  * The given "buf" must be MAX_NLEN chars long to hold the longest possible
1054  * description, which can get pretty long, including incriptions, such as:
1055  * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".
1056  * Note that the inscription will be clipped to keep the total description
1057  * under MAX_NLEN-1 chars (plus a terminator).
1058  *
1059  * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,
1060  * portable, versions of some common "sprintf()" commands.
1061  *
1062  * Note that all ego-items (when known) append an "Ego-Item Name", unless
1063  * the item is also an artifact, which should NEVER happen.
1064  *
1065  * Note that all artifacts (when known) append an "Artifact Name", so we
1066  * have special processing for "Specials" (artifact Lites, Rings, Amulets).
1067  * The "Specials" never use "modifiers" if they are "known", since they
1068  * have special "descriptions", such as "The Necklace of the Dwarves".
1069  *
1070  * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),
1071  * plus the artifact name, just like any other artifact, if known.
1072  *
1073  * Special Ring's and Amulet's, if not "aware", use the same code as normal
1074  * rings and amulets, and if "aware", use the "k_info" base-name (Ring or
1075  * Amulet or Necklace).  They will NEVER "append" the "k_info" name.  But,
1076  * they will append the artifact name, just like any artifact, if known.
1077  *
1078  * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.
1079  *
1080  * If "pref" then a "numeric" prefix will be pre-pended.
1081  *
1082  * Mode:
1083  *   0 -- The Cloak of Death
1084  *   1 -- The Cloak of Death [1,+3]
1085  *   2 -- The Cloak of Death [1,+3] (+2 to Stealth)
1086  *   3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
1087  */
1088 void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
1089 {
1090         cptr            basenm, modstr;
1091         int             power, indexx, i;
1092
1093         bool            aware = FALSE;
1094         bool            known = FALSE;
1095
1096         bool            append_name = FALSE;
1097
1098         bool            show_weapon = FALSE;
1099         bool            show_armour = FALSE;
1100
1101         cptr            s, u;
1102         char            *t;
1103
1104         char            p1 = '(', p2 = ')';
1105         char            b1 = '[', b2 = ']';
1106         char            c1 = '{', c2 = '}';
1107
1108         char            tmp_val[MAX_NLEN+160];
1109         char            tmp_val2[MAX_NLEN+10];
1110
1111         u32b            f1, f2, f3;
1112
1113         object_type     *bow_ptr;
1114
1115
1116         object_kind *k_ptr = &k_info[o_ptr->k_idx];
1117
1118         monster_race *r_ptr = &r_info[o_ptr->pval];
1119
1120         /* Extract some flags */
1121         object_flags(o_ptr, &f1, &f2, &f3);
1122
1123         /* See if the object is "aware" */
1124         if (object_aware_p(o_ptr) || (o_ptr->ident & IDENT_MENTAL)) aware = TRUE;
1125
1126         /* See if the object is "known" */
1127         if (object_known_p(o_ptr)) known = TRUE;
1128
1129         /* Hack -- Extract the sub-type "indexx" */
1130         indexx = o_ptr->sval;
1131
1132         /* Extract default "base" string */
1133         basenm = get_object_name(o_ptr);
1134
1135         /* Assume no "modifier" string */
1136         modstr = "";
1137
1138
1139         /* Analyze the object */
1140         switch (o_ptr->tval)
1141         {
1142                 /* Some objects are easy to describe */
1143                 case TV_SKELETON:
1144                 case TV_BOTTLE:
1145                 case TV_JUNK:
1146                 case TV_SPIKE:
1147                 case TV_FLASK:
1148                 case TV_CHEST:
1149                 case TV_WHISTLE:
1150                 {
1151                         break;
1152                 }
1153
1154                 case TV_CAPTURE:
1155                 {
1156                         if (known)
1157                         {
1158                                 if (!o_ptr->pval)
1159                                 {
1160 #ifdef JP
1161                                         modstr = "¡Ê¶õ¡Ë";
1162 #else
1163                                         modstr = " (empty)";
1164 #endif
1165                                 }
1166                                 else
1167                                 {
1168 #ifdef JP
1169                                         sprintf(tmp_val2, "¡Ê%s¡Ë",r_name + r_ptr->name);
1170                                         modstr = tmp_val2;
1171 #else
1172                                         cptr t = r_name + r_ptr->name;
1173
1174                                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1175                                         {
1176                                                 sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t);
1177
1178                                                 modstr = tmp_val2;
1179                                         }
1180                                         else
1181                                         {
1182                                                 sprintf(tmp_val2, "(%s)", t);
1183
1184                                                 modstr = t;
1185                                         }
1186 #endif
1187                                 }
1188                         }
1189                         break;
1190                 }
1191
1192                 /* Figurines/Statues */
1193                 case TV_FIGURINE:
1194                 case TV_STATUE:
1195                 {
1196 #ifdef JP
1197                         modstr = r_name + r_ptr->name;
1198 #else
1199                         cptr t = r_name + r_ptr->name;
1200
1201                         if (!(r_ptr->flags1 & RF1_UNIQUE))
1202                         {
1203                                 sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t);
1204
1205                                 modstr = tmp_val2;
1206                         }
1207                         else
1208                         {
1209                                 modstr = t;
1210                         }
1211 #endif
1212
1213
1214                         break;
1215                 }
1216
1217                 /* Corpses */
1218                 case TV_CORPSE:
1219                 {
1220                         modstr = r_name + r_ptr->name;
1221
1222
1223 #ifdef JP
1224                         sprintf(tmp_val2, "& #%s", basenm + 2);
1225 #else
1226                         if (r_ptr->flags1 & RF1_UNIQUE)
1227                         {
1228                                 sprintf(tmp_val2, "%s %s", basenm, "of #");
1229                         }
1230                         else
1231                         {
1232                                 sprintf(tmp_val2, "& # %s", basenm + 2);
1233                         }
1234 #endif
1235
1236
1237                         basenm = tmp_val2;
1238                         break;
1239                 }
1240
1241                 /* Missiles/ Bows/ Weapons */
1242                 case TV_SHOT:
1243                 case TV_BOLT:
1244                 case TV_ARROW:
1245                 case TV_BOW:
1246                 case TV_HAFTED:
1247                 case TV_POLEARM:
1248                 case TV_SWORD:
1249                 case TV_DIGGING:
1250                 {
1251                         show_weapon = TRUE;
1252                         break;
1253                 }
1254
1255
1256                 /* Armour */
1257                 case TV_BOOTS:
1258                 case TV_GLOVES:
1259                 case TV_CLOAK:
1260                 case TV_CROWN:
1261                 case TV_HELM:
1262                 case TV_SHIELD:
1263                 case TV_SOFT_ARMOR:
1264                 case TV_HARD_ARMOR:
1265                 case TV_DRAG_ARMOR:
1266                 {
1267                         show_armour = TRUE;
1268                         break;
1269                 }
1270
1271
1272                 /* Lites (including a few "Specials") */
1273                 case TV_LITE:
1274                 {
1275                         break;
1276                 }
1277
1278                 /* Amulets (including a few "Specials") */
1279                 case TV_AMULET:
1280                 {
1281                         /* Known artifacts */
1282                         if (artifact_p(o_ptr) && aware) break;
1283
1284                         if ((k_ptr->flags3 & TR3_INSTA_ART) && aware) break;
1285
1286                         /* Color the object */
1287 #ifdef JP
1288                         modstr = J_amulet_adj[indexx];
1289 #else
1290                         modstr = amulet_adj[indexx];
1291 #endif
1292
1293                         if (aware) append_name = TRUE;
1294
1295                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1296 #ifdef JP
1297                                 basenm = aware ? "& %¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& ¥¢¥ß¥å¥ì¥Ã¥È";
1298                         else
1299                                 basenm = aware ? "& #%¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& #¥¢¥ß¥å¥ì¥Ã¥È";
1300 #else
1301                                 basenm = "& Amulet~";
1302                         else
1303                                 basenm = aware ? "& # Amulet~" : "& # Amulet~";
1304 #endif
1305
1306                         break;
1307                 }
1308
1309                 /* Rings (including a few "Specials") */
1310                 case TV_RING:
1311                 {
1312                         /* Known artifacts */
1313                         if (artifact_p(o_ptr) && aware) break;
1314
1315                         if ((k_ptr->flags3 & TR3_INSTA_ART) && aware) break;
1316
1317                         /* Color the object */
1318 #ifdef JP
1319                         modstr = J_ring_adj[indexx];
1320 #else
1321                         modstr = ring_adj[indexx];
1322 #endif
1323
1324                         if (aware) append_name = TRUE;
1325
1326                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1327 #ifdef JP
1328                                 basenm = aware ? "& %¤Î»ØÎØ" : "& »ØÎØ";
1329                         else
1330                                 basenm = aware ? "& #%¤Î»ØÎØ" : "& #»ØÎØ";
1331 #else
1332                                 basenm = "& Ring~";
1333                         else
1334                                 basenm = aware ? "& # Ring~" : "& # Ring~";
1335 #endif
1336
1337
1338                         /* Hack -- The One Ring */
1339 #ifdef JP
1340                         if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "¶â̵¹¤¤Î";
1341                         if (!aware && (o_ptr->sval == SV_RING_AHO)) modstr = "¶âÍ­¹¤¤Î";
1342 #else
1343                         if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "Plain Gold";
1344                         if (!aware && (o_ptr->sval == SV_RING_AHO)) modstr = "Plain Goldarn";
1345 #endif
1346                         if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE;
1347
1348                         break;
1349                 }
1350
1351                 case TV_CARD:
1352                 {
1353                         break;
1354                 }
1355
1356                 case TV_STAFF:
1357                 {
1358                         /* Color the object */
1359 #ifdef JP
1360                         modstr = J_staff_adj[indexx];
1361 #else
1362                         modstr = staff_adj[indexx];
1363 #endif
1364
1365                         if (aware) append_name = TRUE;
1366                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1367 #ifdef JP
1368                                 basenm = aware ? "& %¤Î¾ó" : "& ¾ó";
1369                         else
1370                                 basenm = aware ? "& #%¤Î¾ó" : "& #¾ó";
1371 #else
1372                                 basenm = "& Staff~";
1373                         else
1374                                 basenm = aware ? "& # Staff~" : "& # Staff~";
1375 #endif
1376
1377                         break;
1378                 }
1379
1380                 case TV_WAND:
1381                 {
1382                         /* Color the object */
1383 #ifdef JP
1384                         modstr = J_wand_adj[indexx];
1385 #else
1386                         modstr = wand_adj[indexx];
1387 #endif
1388
1389                         if (aware) append_name = TRUE;
1390                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1391 #ifdef JP
1392                                 basenm = aware? "& %¤ÎËâË¡ËÀ":"& ËâË¡ËÀ";
1393                         else
1394                                 basenm = aware ? "& #%¤ÎËâË¡ËÀ" : "& #ËâË¡ËÀ";
1395 #else
1396                                 basenm = "& Wand~";
1397                         else
1398                                 basenm = aware ? "& # Wand~" : "& # Wand~";
1399 #endif
1400
1401                         break;
1402                 }
1403
1404                 case TV_ROD:
1405                 {
1406                         /* Color the object */
1407 #ifdef JP
1408                         modstr = J_rod_adj[indexx];
1409 #else
1410                         modstr = rod_adj[indexx];
1411 #endif
1412
1413                         if (aware) append_name = TRUE;
1414                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1415 #ifdef JP
1416                                 basenm = aware? "& %¤Î¥í¥Ã¥É":"& ¥í¥Ã¥É";
1417                         else
1418                                 basenm = aware ? "& #%¤Î¥í¥Ã¥É" : "& #¥í¥Ã¥É";
1419 #else
1420                                 basenm = "& Rod~";
1421                         else
1422                                 basenm = aware ? "& # Rod~" : "& # Rod~";
1423 #endif
1424
1425                         break;
1426                 }
1427
1428                 case TV_SCROLL:
1429                 {
1430                         /* Color the object */
1431                         modstr = scroll_adj[indexx];
1432                         if (aware) append_name = TRUE;
1433                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1434 #ifdef JP
1435                                 basenm = aware ? "& %¤Î´¬Êª" : "& ´¬Êª";
1436                         else
1437                                 basenm = aware ? "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª" : "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª";
1438 #else
1439                                 basenm = "& Scroll~";
1440                         else
1441                                 basenm = aware ? "& Scroll~ titled \"#\"" : "& Scroll~ titled \"#\"";
1442 #endif
1443
1444                         break;
1445                 }
1446
1447                 case TV_POTION:
1448                 {
1449                         /* Color the object */
1450 #ifdef JP
1451                         modstr = J_potion_adj[indexx];
1452 #else
1453                         modstr = potion_adj[indexx];
1454 #endif
1455
1456                         if (aware) append_name = TRUE;
1457                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1458 #ifdef JP
1459                                 basenm = aware ? "& %¤ÎÌô" : "& Ìô";
1460                         else
1461                                 basenm = aware ? "& #%¤ÎÌô" : "& #Ìô";
1462 #else
1463                                 basenm = "& Potion~";
1464                         else
1465                                 basenm = aware ? "& # Potion~" : "& # Potion~";
1466 #endif
1467
1468                         break;
1469                 }
1470
1471                 case TV_FOOD:
1472                 {
1473                         /* Ordinary food is "boring" */
1474                         if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break;
1475
1476                         /* Color the object */
1477 #ifdef JP
1478                         modstr = J_food_adj[indexx];
1479 #else
1480                         modstr = food_adj[indexx];
1481 #endif
1482
1483                         if (aware) append_name = TRUE;
1484                         if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1485 #ifdef JP
1486                                 basenm = aware ? "& %¤Î¥­¥Î¥³" : "& ¥­¥Î¥³";
1487                         else
1488                                 basenm = aware ? "& #%¤Î¥­¥Î¥³" : "& #¥­¥Î¥³";
1489 #else
1490                                 basenm = "& Mushroom~";
1491                         else
1492                                 basenm = aware ? "& # Mushroom~" : "& # Mushroom~";
1493 #endif
1494
1495                         break;
1496                 }
1497
1498                 case TV_PARCHEMENT:
1499                 {
1500                         modstr = basenm;
1501 #ifdef JP
1502                         basenm = "& ÍÓÈé»æ - #";
1503 #else
1504                         basenm = "& Parchement~ - #";
1505 #endif
1506                         break;
1507                 }
1508
1509                 /* Magic Books */
1510                 case TV_LIFE_BOOK:
1511                 {
1512                         modstr = basenm;
1513 #ifdef JP
1514                                 basenm = "& À¸Ì¿¤ÎËâË¡½ñ#";
1515 #else
1516                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1517                                 basenm = "& Book~ of Life Magic #";
1518                         else
1519                                 basenm = "& Life Spellbook~ #";
1520 #endif
1521
1522                         break;
1523                 }
1524
1525                 case TV_SORCERY_BOOK:
1526                 {
1527                         modstr = basenm;
1528 #ifdef JP
1529                                 basenm = "& Àç½Ñ¤ÎËâË¡½ñ#";
1530 #else
1531                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1532                                 basenm = "& Book~ of Sorcery #";
1533                         else
1534                                 basenm = "& Sorcery Spellbook~ #";
1535 #endif
1536
1537                         break;
1538                 }
1539
1540                 case TV_NATURE_BOOK:
1541                 {
1542                         modstr = basenm;
1543 #ifdef JP
1544                                 basenm = "& ¼«Á³¤ÎËâË¡½ñ#";
1545 #else
1546                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1547                                 basenm = "& Book~ of Nature Magic #";
1548                         else
1549                                 basenm = "& Nature Spellbook~ #";
1550 #endif
1551
1552                         break;
1553                 }
1554
1555                 case TV_CHAOS_BOOK:
1556                 {
1557                         modstr = basenm;
1558 #ifdef JP
1559                                 basenm = "& ¥«¥ª¥¹¤ÎËâË¡½ñ#";
1560 #else
1561                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1562                                 basenm = "& Book~ of Chaos Magic #";
1563                         else
1564                                 basenm = "& Chaos Spellbook~ #";
1565 #endif
1566
1567                         break;
1568                 }
1569
1570                 case TV_DEATH_BOOK:
1571                 {
1572                         modstr = basenm;
1573 #ifdef JP
1574                                 basenm = "& °Å¹õ¤ÎËâË¡½ñ#";
1575 #else
1576                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1577                                 basenm = "& Book~ of Death Magic #";
1578                         else
1579                                 basenm = "& Death Spellbook~ #";
1580 #endif
1581
1582                         break;
1583                 }
1584
1585                 case TV_TRUMP_BOOK:
1586                 {
1587                         modstr = basenm;
1588 #ifdef JP
1589                                 basenm = "& ¥È¥é¥ó¥×¤ÎËâË¡½ñ#";
1590 #else
1591                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1592                                 basenm = "& Book~ of Trump Magic #";
1593                         else
1594                                 basenm = "& Trump Spellbook~ #";
1595 #endif
1596
1597                         break;
1598                 }
1599
1600                 case TV_ARCANE_BOOK:
1601                 {
1602                         modstr = basenm;
1603 #ifdef JP
1604                                 basenm = "& Èë½Ñ¤ÎËâË¡½ñ#";
1605 #else
1606                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1607                                 basenm = "& Book~ of Arcane Magic #";
1608                         else
1609                                 basenm = "& Arcane Spellbook~ #";
1610 #endif
1611
1612                         break;
1613                 }
1614                 case TV_ENCHANT_BOOK:
1615                 {
1616                         modstr = basenm;
1617 #ifdef JP
1618                                 basenm = "& ¾¢¤ÎËâË¡½ñ#";
1619 #else
1620                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1621                                 basenm = "& Book~ of Craft Magic #";
1622                         else
1623                                 basenm = "& Craft Spellbook~ #";
1624 #endif
1625
1626                         break;
1627                 }
1628                 case TV_DAEMON_BOOK:
1629                 {
1630                         modstr = basenm;
1631 #ifdef JP
1632                                 basenm = "& °­Ëâ¤ÎËâË¡½ñ#";
1633 #else
1634                         if (mp_ptr->spell_book == TV_LIFE_BOOK)
1635                                 basenm = "& Book~ of Daemon Magic #";
1636                         else
1637                                 basenm = "& Daemon Spellbook~ #";
1638 #endif
1639
1640                         break;
1641                 }
1642                 case TV_MUSIC_BOOK:
1643                 {
1644                         modstr = basenm;
1645 #ifdef JP
1646                                 basenm = "& ²Î½¸#";
1647 #else
1648                                 basenm = "& Song Book~ #";
1649 #endif
1650
1651                         break;
1652                 }
1653                 case TV_HISSATSU_BOOK:
1654                 {
1655                         modstr = basenm;
1656 #ifdef JP
1657                                 basenm = "& Éð·Ý¤Î½ñ#";
1658 #else
1659                                 basenm = "& Book~ of Kendo #";
1660 #endif
1661
1662                         break;
1663                 }
1664
1665
1666
1667                 /* Hack -- Gold/Gems */
1668                 case TV_GOLD:
1669                 {
1670                         strcpy(buf, basenm);
1671                         return;
1672                 }
1673
1674                 /* Used in the "inventory" routine */
1675                 default:
1676                 {
1677 #ifdef JP
1678                         strcpy(buf, "(¤Ê¤·)");
1679 #else
1680                         strcpy(buf, "(nothing)");
1681 #endif
1682
1683                         return;
1684                 }
1685         }
1686
1687
1688         /* Start dumping the result */
1689         t = tmp_val;
1690
1691 #ifdef JP
1692         if (basenm[0] == '&')
1693                 s = basenm + 2;
1694         else
1695                 s = basenm;
1696
1697         /* No prefix */
1698         if (!pref)
1699         {
1700                 /* Nothing */
1701         }
1702         else if (o_ptr->number > 1)
1703         {
1704                 if ( old_way_of_kaz == FALSE ){
1705                         t = object_desc_num(t, o_ptr->number);
1706                         if (o_ptr->number > 9)
1707                                 t = object_desc_str(t, "¸Ä¤Î ");
1708                         else
1709                                 t = object_desc_str(t, "¤Ä¤Î ");
1710                 }
1711                 else
1712                 {
1713                         t = object_desc_kosuu(t,o_ptr);
1714                         t = object_desc_str(t, "¤Î ");
1715                 }
1716         }
1717
1718         /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬
1719          * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë 
1720          */
1721         if (known && artifact_p(o_ptr)) t = object_desc_str(t, "¡ú");
1722         else if (known && o_ptr->art_name) t = object_desc_str(t, "¡ù");
1723
1724 #else
1725
1726         /* The object "expects" a "number" */
1727         if (basenm[0] == '&')
1728         {
1729                 /* Skip the ampersand (and space) */
1730                 s = basenm + 2;
1731
1732                 /* No prefix */
1733                 if (!pref)
1734                 {
1735                         /* Nothing */
1736                 }
1737
1738                 /* Hack -- None left */
1739                 else if (o_ptr->number <= 0)
1740                 {
1741                         t = object_desc_str(t, "no more ");
1742                 }
1743
1744                 /* Extract the number */
1745                 else if (o_ptr->number > 1)
1746                 {
1747                         t = object_desc_num(t, o_ptr->number);
1748                         t = object_desc_chr(t, ' ');
1749                 }
1750
1751                 /* Hack -- The only one of its kind */
1752                 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
1753                 {
1754                         t = object_desc_str(t, "The ");
1755                 }
1756
1757                 /* Unique corpses are unique */
1758                 else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE))
1759                 {
1760                         t = object_desc_str(t, "The ");
1761                 }
1762
1763                 /* A single one, with a vowel in the modifier */
1764                 else if ((*s == '#') && (is_a_vowel(modstr[0])))
1765                 {
1766                         t = object_desc_str(t, "an ");
1767                 }
1768
1769                 /* A single one, with a vowel */
1770                 else if (is_a_vowel(*s))
1771                 {
1772                         t = object_desc_str(t, "an ");
1773                 }
1774
1775                 /* A single one, without a vowel */
1776                 else
1777                 {
1778                         t = object_desc_str(t, "a ");
1779                 }
1780         }
1781
1782         /* Hack -- objects that "never" take an article */
1783         else
1784         {
1785                 /* No ampersand */
1786                 s = basenm;
1787
1788                 /* No pref */
1789                 if (!pref)
1790                 {
1791                         /* Nothing */
1792                 }
1793
1794                 /* Hack -- all gone */
1795                 else if (o_ptr->number <= 0)
1796                 {
1797                         t = object_desc_str(t, "no more ");
1798                 }
1799
1800                 /* Prefix a number if required */
1801                 else if (o_ptr->number > 1)
1802                 {
1803                         t = object_desc_num(t, o_ptr->number);
1804                         t = object_desc_chr(t, ' ');
1805                 }
1806
1807                 /* Hack -- The only one of its kind */
1808                 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
1809                 {
1810                         t = object_desc_str(t, "The ");
1811                 }
1812
1813                 /* Hack -- single items get no prefix */
1814                 else
1815                 {
1816                         /* Nothing */
1817                 }
1818         }
1819 #endif
1820
1821         /* Paranoia -- skip illegal tildes */
1822         /* while (*s == '~') s++; */
1823
1824 #ifdef JP
1825         if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
1826         {
1827                 t = object_desc_str(t,format("ÃÃÌê»Õ%s¤Î",player_name));
1828         }
1829
1830         /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */
1831         if (known) {
1832                 /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */
1833                 if (o_ptr->art_name)
1834                 {       char temp[256];
1835                         strcpy(temp, quark_str(o_ptr->art_name));
1836                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
1837                         /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */
1838                         if ( strncmp( temp , "of ",3)==0 ) {t=object_desc_str(t,&temp[3]);t=object_desc_str(t,"¤Î");}
1839                         else 
1840                         if ( strncmp( temp , "¡Ø" , 2 ) != 0 && temp[0]!='\'')
1841                                 t=object_desc_str(t,  temp);
1842                 }
1843                 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */
1844                 else if (o_ptr->name1) {
1845                         artifact_type *a_ptr = &a_info[o_ptr->name1];
1846                         /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
1847                         if ( strncmp( (a_name + a_ptr->name), "¡Ø" , 2) != 0){
1848                                 t=object_desc_str(t, (a_name + a_ptr->name));
1849                         }
1850                 }
1851                 /* Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */
1852                 else if (o_ptr->name2) {
1853                         ego_item_type *e_ptr = &e_info[o_ptr->name2];
1854                         t=object_desc_str(t, (e_name + e_ptr->name));
1855                 }
1856         }
1857 #endif
1858         /* Copy the string */
1859         for (; *s; s++)
1860         {
1861                 /* Pluralizer */
1862 #ifdef JP
1863                 if (*s == '#')
1864 #else
1865                 if (*s == '~')
1866                 {
1867                         /* Add a plural if needed */
1868                         if (pref && o_ptr->number != 1)
1869                         {
1870                                 char k = t[-1];
1871
1872                                 /* XXX XXX XXX Mega-Hack */
1873
1874                                 /* Hack -- "Cutlass-es" and "Torch-es" */
1875                                 if ((k == 's') || (k == 'h')) *t++ = 'e';
1876
1877                                 /* Add an 's' */
1878                                 *t++ = 's';
1879                         }
1880                 }
1881
1882                 /* Modifier */
1883                 else if (*s == '#')
1884 #endif
1885
1886                 {
1887                         /* Insert the modifier */
1888                         for (u = modstr; *u; u++) *t++ = *u;
1889                 }
1890
1891 #ifdef JP
1892                 else if (*s == '%')
1893                   /* saigo ¤ÎÂå¤ï¤ê¡£¸úǽ¤òÉÕ²½¤¹¤ë by ita*/
1894                 {
1895                   modstr=get_object_name(o_ptr);
1896                   for (u = modstr; *u; u++) *t++ = *u;
1897                 }
1898 #endif
1899                 /* Normal */
1900                 else
1901                 {
1902                         /* Copy */
1903                         *t++ = *s;
1904                 }
1905         }
1906
1907         /* Terminate */
1908         *t = '\0';
1909
1910
1911         /* Append the "kind name" to the "base name" */
1912 #ifndef JP
1913         if (append_name)
1914         {
1915                 t = object_desc_str(t, " of ");
1916                 t = object_desc_str(t, get_object_name(o_ptr));
1917         }
1918 #endif
1919
1920
1921 #ifdef JP
1922         /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */
1923         if (known) {
1924                 /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿
1925                    ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */
1926                 if (o_ptr->art_name)
1927                 {       char temp[256];int itemp;
1928                         strcpy(temp, quark_str(o_ptr->art_name));
1929                         /* MEGA HACK by ita*/
1930                                 if ( strncmp( temp , "¡Ø" , 2 ) == 0 ) t=object_desc_str(t,  temp);else
1931                          if( temp[0]=='\'' ) { itemp=strlen(temp);temp[itemp-1]=0; 
1932                          t=object_desc_str(t,"¡Ø");
1933                          t=object_desc_str(t,&temp[1]);
1934                          t=object_desc_str(t,"¡Ù");}
1935                                 
1936                 }
1937                 else if (o_ptr->name1) {
1938                                 artifact_type *a_ptr = &a_info[o_ptr->name1];
1939                                 if ( strncmp( (a_name + a_ptr->name) , "¡Ø" , 2 ) == 0 ){
1940                                         t=object_desc_str(t, (a_name + a_ptr->name));
1941                                 }
1942                 }
1943                 else if (o_ptr->inscription)
1944                 {
1945                         cptr str = quark_str(o_ptr->inscription);
1946
1947                         while(*str)
1948                         {
1949                                 if (iskanji(*str))
1950                                 {
1951                                         str += 2;
1952                                         continue;
1953                                 }
1954                                 if (*str == '#') break;
1955                                 str++;
1956                         }
1957                         if (*str)
1958                         {
1959                                 /* Find the '#' */
1960                                 cptr str = strchr(quark_str(o_ptr->inscription), '#');
1961
1962                                 /* Add the false name */
1963                                 t=object_desc_str(t,"¡Ø");
1964                                 t = object_desc_str(t, &str[1]);
1965                                 t=object_desc_str(t,"¡Ù");
1966                         }
1967                 }
1968         }
1969 #else
1970         if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
1971         {
1972                 t = object_desc_str(t,format(" of %s the smith",player_name));
1973         }
1974
1975         /* Hack -- Append "Artifact" or "Special" names */
1976         if (known)
1977         {
1978                 /* Is it a new random artifact ? */
1979                 if (o_ptr->art_name)
1980                 {
1981                         t = object_desc_chr(t, ' ');
1982
1983                         t = object_desc_str(t, quark_str(o_ptr->art_name));
1984                 }
1985
1986                 /* Grab any artifact name */
1987                 else if (o_ptr->name1)
1988                 {
1989                         artifact_type *a_ptr = &a_info[o_ptr->name1];
1990
1991                         t = object_desc_chr(t, ' ');
1992                         t = object_desc_str(t, (a_name + a_ptr->name));
1993                 }
1994
1995                 /* Grab any ego-item name */
1996                 else
1997                 {
1998                         if (o_ptr->name2)
1999                         {
2000                                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2001
2002                                 t = object_desc_chr(t, ' ');
2003                                 t = object_desc_str(t, (e_name + e_ptr->name));
2004                         }
2005
2006                         if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#'))
2007                         {
2008                                 /* Find the '#' */
2009                                 cptr str = strchr(quark_str(o_ptr->inscription), '#');
2010
2011                                 /* Add the false name */
2012                                 t = object_desc_chr(t, ' ');
2013                                 t = object_desc_str(t, &str[1]);
2014                         }
2015                 }
2016         }
2017 #endif
2018
2019
2020
2021         /* No more details wanted */
2022         if (mode < 1) goto copyback;
2023
2024         /* Hack -- Chests must be described in detail */
2025         if (o_ptr->tval == TV_CHEST)
2026         {
2027                 /* Not searched yet */
2028                 if (!known)
2029                 {
2030                         /* Nothing */
2031                 }
2032
2033                 /* May be "empty" */
2034                 else if (!o_ptr->pval)
2035                 {
2036 #ifdef JP
2037 t = object_desc_str(t, "(¶õ)");
2038 #else
2039                         t = object_desc_str(t, " (empty)");
2040 #endif
2041
2042                 }
2043
2044                 /* May be "disarmed" */
2045                 else if (o_ptr->pval < 0)
2046                 {
2047                         if (chest_traps[0 - o_ptr->pval])
2048                         {
2049 #ifdef JP
2050 t = object_desc_str(t, "(²ò½üºÑ)");
2051 #else
2052                                 t = object_desc_str(t, " (disarmed)");
2053 #endif
2054
2055                         }
2056                         else
2057                         {
2058 #ifdef JP
2059 t = object_desc_str(t, "(Èó»Ü¾û)");
2060 #else
2061                                 t = object_desc_str(t, " (unlocked)");
2062 #endif
2063
2064                         }
2065                 }
2066
2067                 /* Describe the traps, if any */
2068                 else
2069                 {
2070                         /* Describe the traps */
2071                         switch (chest_traps[o_ptr->pval])
2072                         {
2073                                 case 0:
2074                                 {
2075 #ifdef JP
2076 t = object_desc_str(t, "(»Ü¾û)");
2077 #else
2078                                         t = object_desc_str(t, " (Locked)");
2079 #endif
2080
2081                                         break;
2082                                 }
2083                                 case CHEST_LOSE_STR:
2084                                 {
2085 #ifdef JP
2086 t = object_desc_str(t, "(ÆÇ¿Ë)");
2087 #else
2088                                         t = object_desc_str(t, " (Poison Needle)");
2089 #endif
2090
2091                                         break;
2092                                 }
2093                                 case CHEST_LOSE_CON:
2094                                 {
2095 #ifdef JP
2096 t = object_desc_str(t, "(ÆÇ¿Ë)");
2097 #else
2098                                         t = object_desc_str(t, " (Poison Needle)");
2099 #endif
2100
2101                                         break;
2102                                 }
2103                                 case CHEST_POISON:
2104                                 {
2105 #ifdef JP
2106 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2107 #else
2108                                         t = object_desc_str(t, " (Gas Trap)");
2109 #endif
2110
2111                                         break;
2112                                 }
2113                                 case CHEST_PARALYZE:
2114                                 {
2115 #ifdef JP
2116 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2117 #else
2118                                         t = object_desc_str(t, " (Gas Trap)");
2119 #endif
2120
2121                                         break;
2122                                 }
2123                                 case CHEST_EXPLODE:
2124                                 {
2125 #ifdef JP
2126 t = object_desc_str(t, "(ÇúȯÁõÃÖ)");
2127 #else
2128                                         t = object_desc_str(t, " (Explosion Device)");
2129 #endif
2130
2131                                         break;
2132                                 }
2133                                 case CHEST_SUMMON:
2134                                 case CHEST_BIRD_STORM:
2135                                 case CHEST_E_SUMMON:
2136                                 case CHEST_H_SUMMON:
2137                                 {
2138 #ifdef JP
2139 t = object_desc_str(t, "(¾¤´­¤Î¥ë¡¼¥ó)");
2140 #else
2141                                         t = object_desc_str(t, " (Summoning Runes)");
2142 #endif
2143
2144                                         break;
2145                                 }
2146                                 case CHEST_RUNES_OF_EVIL:
2147                                 {
2148 #ifdef JP
2149 t = object_desc_str(t, "(¼Ù°­¤Ê¥ë¡¼¥ó)");
2150 #else
2151                                         t = object_desc_str(t, " (Gleaming Black Runes)");
2152 #endif
2153
2154                                         break;
2155                                 }
2156                                 default:
2157                                 {
2158 #ifdef JP
2159 t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)");
2160 #else
2161                                         t = object_desc_str(t, " (Multiple Traps)");
2162 #endif
2163
2164                                         break;
2165                                 }
2166                         }
2167                 }
2168         }
2169
2170
2171         /* Display the item like a weapon */
2172         if (f3 & (TR3_SHOW_MODS)) show_weapon = TRUE;
2173
2174         /* Display the item like a weapon */
2175         if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
2176
2177         /* Display the item like armour */
2178         if (o_ptr->ac) show_armour = TRUE;
2179
2180
2181         /* Dump base weapon info */
2182         switch (o_ptr->tval)
2183         {
2184                 /* Missiles and Weapons */
2185                 case TV_SHOT:
2186                 case TV_BOLT:
2187                 case TV_ARROW:
2188                 case TV_HAFTED:
2189                 case TV_POLEARM:
2190                 case TV_SWORD:
2191                 case TV_DIGGING:
2192
2193                 /* Append a "damage" string */
2194                 t = object_desc_chr(t, ' ');
2195                 t = object_desc_chr(t, p1);
2196                 t = object_desc_num(t, o_ptr->dd);
2197                 t = object_desc_chr(t, 'd');
2198                 t = object_desc_num(t, o_ptr->ds);
2199                 t = object_desc_chr(t, p2);
2200
2201                 /* All done */
2202                 break;
2203
2204
2205                 /* Bows get a special "damage string" */
2206                 case TV_BOW:
2207
2208                 /* Mega-Hack -- Extract the "base power" */
2209                 power = (o_ptr->sval % 10);
2210
2211                 /* Apply the "Extra Might" flag */
2212                 if (f3 & (TR3_XTRA_MIGHT)) power++;
2213
2214                 /* Append a special "damage" string */
2215                 t = object_desc_chr(t, ' ');
2216                 t = object_desc_chr(t, p1);
2217                 t = object_desc_chr(t, 'x');
2218                 t = object_desc_num(t, power);
2219                 t = object_desc_chr(t, p2);
2220
2221                 /* All done */
2222                 break;
2223         }
2224
2225
2226         /* Add the weapon bonuses */
2227         if (known)
2228         {
2229                 /* Show the tohit/todam on request */
2230                 if (show_weapon)
2231                 {
2232                         t = object_desc_chr(t, ' ');
2233                         t = object_desc_chr(t, p1);
2234                         t = object_desc_int(t, o_ptr->to_h);
2235                         t = object_desc_chr(t, ',');
2236                         t = object_desc_int(t, o_ptr->to_d);
2237                         t = object_desc_chr(t, p2);
2238                 }
2239
2240                 /* Show the tohit if needed */
2241                 else if (o_ptr->to_h)
2242                 {
2243                         t = object_desc_chr(t, ' ');
2244                         t = object_desc_chr(t, p1);
2245                         t = object_desc_int(t, o_ptr->to_h);
2246                         t = object_desc_chr(t, p2);
2247                 }
2248
2249                 /* Show the todam if needed */
2250                 else if (o_ptr->to_d)
2251                 {
2252                         t = object_desc_chr(t, ' ');
2253                         t = object_desc_chr(t, p1);
2254                         t = object_desc_int(t, o_ptr->to_d);
2255                         t = object_desc_chr(t, p2);
2256                 }
2257         }
2258
2259         bow_ptr = &inventory[INVEN_BOW];
2260
2261         /* if have a firing weapon + ammo matches bow*/
2262         if (bow_ptr->k_idx &&
2263             (((bow_ptr->sval == SV_SLING) && (o_ptr->tval == TV_SHOT)) ||
2264              (((bow_ptr->sval == SV_SHORT_BOW) ||
2265                (bow_ptr->sval == SV_LONG_BOW) ||
2266                (bow_ptr->sval == SV_NAMAKE_BOW)) && (o_ptr->tval == TV_ARROW)) ||
2267              (((bow_ptr->sval == SV_LIGHT_XBOW) ||
2268                (bow_ptr->sval == SV_HEAVY_XBOW)) && (o_ptr->tval == TV_BOLT))))
2269         {
2270                 int avgdam = 10;
2271                 int tmul;
2272                 s16b energy_fire;
2273
2274                 avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2;
2275
2276                 /* See if the bow is "known" - then set damage bonus*/
2277                 if (object_known_p(bow_ptr))
2278                 {
2279                         avgdam += (bow_ptr->to_d * 10);
2280                 }
2281
2282                 /* effect of ammo */
2283                 if (known) avgdam += (o_ptr->to_d * 10);
2284
2285                 energy_fire = bow_energy(bow_ptr->sval);
2286                 tmul = bow_tmul(bow_ptr->sval);
2287
2288                 /* Get extra "power" from "extra might" */
2289                 if (p_ptr->xtra_might) tmul++;
2290
2291                 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2292
2293                 /* launcher multiplier */
2294                 avgdam *= tmul;
2295                 avgdam /= (100 * 10);
2296                 if (avgdam < 0) avgdam = 0;
2297
2298                 /* display (shot damage/ avg damage) */
2299                 t = object_desc_chr(t, ' ');
2300                 t = object_desc_chr(t, p1);
2301                 t = object_desc_num(t, avgdam);
2302                 t = object_desc_chr(t, '/');
2303
2304                 if (p_ptr->num_fire == 0)
2305                 {
2306                         t = object_desc_chr(t, '0');
2307                 }
2308                 else
2309                 {
2310                         /* calc effects of energy */
2311                         avgdam *= (p_ptr->num_fire * 100);
2312
2313                         avgdam /= energy_fire;
2314
2315                         t = object_desc_num(t, avgdam);
2316                 }
2317
2318                 t = object_desc_chr(t, p2);
2319         }
2320
2321
2322         /* Add the armor bonuses */
2323         if (known)
2324         {
2325                 /* Show the armor class info */
2326                 if (show_armour)
2327                 {
2328                         t = object_desc_chr(t, ' ');
2329                         t = object_desc_chr(t, b1);
2330                         t = object_desc_num(t, o_ptr->ac);
2331                         t = object_desc_chr(t, ',');
2332                         t = object_desc_int(t, o_ptr->to_a);
2333                         t = object_desc_chr(t, b2);
2334                 }
2335
2336                 /* No base armor, but does increase armor */
2337                 else if (o_ptr->to_a)
2338                 {
2339                         t = object_desc_chr(t, ' ');
2340                         t = object_desc_chr(t, b1);
2341                         t = object_desc_int(t, o_ptr->to_a);
2342                         t = object_desc_chr(t, b2);
2343                 }
2344         }
2345
2346         /* Hack -- always show base armor */
2347         else if (show_armour)
2348         {
2349                 t = object_desc_chr(t, ' ');
2350                 t = object_desc_chr(t, b1);
2351                 t = object_desc_num(t, o_ptr->ac);
2352                 t = object_desc_chr(t, b2);
2353         }
2354
2355
2356         /* No more details wanted */
2357         if (mode < 2) goto copyback;
2358
2359
2360         /*
2361          * Hack -- Wands and Staffs have charges.  Make certain how many charges
2362          * a stack of staffs really has is clear. -LM-
2363          */
2364         if (known &&
2365             ((o_ptr->tval == TV_STAFF) ||
2366              (o_ptr->tval == TV_WAND)))
2367         {
2368                 /* Dump " (N charges)" */
2369                 t = object_desc_chr(t, ' ');
2370                 t = object_desc_chr(t, p1);
2371
2372                 /* Clear explaination for staffs. */
2373                 if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1))
2374                 {
2375                         t = object_desc_num(t, o_ptr->number);
2376                         t = object_desc_str(t, "x ");
2377                 }
2378                 t = object_desc_num(t, o_ptr->pval);
2379 #ifdef JP
2380                 t = object_desc_str(t, "²óʬ");
2381 #else
2382                 t = object_desc_str(t, " charge");
2383
2384                 if (o_ptr->pval != 1)
2385                 {
2386                         t = object_desc_chr(t, 's');
2387                 }
2388 #endif
2389
2390
2391                 t = object_desc_chr(t, p2);
2392         }
2393         /* Hack -- Rods have a "charging" indicator.  Now that stacks of rods may
2394          * be in any state of charge or discharge, this now includes a number. -LM-
2395          */
2396         else if (known && (o_ptr->tval == TV_ROD))
2397         {
2398                 /* Hack -- Dump " (# charging)" if relevant */
2399                 if (o_ptr->timeout)
2400                 {
2401                         /* Stacks of rods display an exact count of charging rods. */
2402                         if (o_ptr->number > 1)
2403                         {
2404                                 /* Paranoia. */
2405                                 if (k_ptr->pval == 0) k_ptr->pval = 1;
2406
2407                                 /* Find out how many rods are charging, by dividing
2408                                  * current timeout by each rod's maximum timeout.
2409                                  * Ensure that any remainder is rounded up.  Display
2410                                  * very discharged stacks as merely fully discharged.
2411                                  */
2412                                 power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2413                                 if (power > o_ptr->number) power = o_ptr->number;
2414
2415                                 /* Display prettily. */
2416                                 t = object_desc_str(t, " (");
2417                                 t = object_desc_num(t, power);
2418 #ifdef JP
2419                                 t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)");
2420 #else
2421                                 t = object_desc_str(t, " charging)");
2422 #endif
2423
2424                         }
2425
2426                         /* "one Rod of Perception (1 charging)" would look tacky. */
2427                         else
2428                         {
2429 #ifdef JP
2430 t = object_desc_str(t, "(½¼Å¶Ãæ)");
2431 #else
2432                                 t = object_desc_str(t, " (charging)");
2433 #endif
2434
2435                         }
2436                 }
2437         }
2438
2439         /* Dump "pval" flags for wearable items */
2440         if (known && (f1 & (TR1_PVAL_MASK)))
2441         {
2442                 /* Start the display */
2443                 t = object_desc_chr(t, ' ');
2444                 t = object_desc_chr(t, p1);
2445
2446                 /* Dump the "pval" itself */
2447                 t = object_desc_int(t, o_ptr->pval);
2448
2449                 /* Do not display the "pval" flags */
2450                 if (f3 & (TR3_HIDE_TYPE))
2451                 {
2452                         /* Nothing */
2453                 }
2454
2455                 /* Speed */
2456                 else if (f1 & (TR1_SPEED))
2457                 {
2458                         /* Dump " to speed" */
2459 #ifdef JP
2460 t = object_desc_str(t, "²Ã®");
2461 #else
2462                         t = object_desc_str(t, " to speed");
2463 #endif
2464
2465                 }
2466
2467                 /* Attack speed */
2468                 else if (f1 & (TR1_BLOWS))
2469                 {
2470                         /* Add " attack" */
2471 #ifdef JP
2472 t = object_desc_str(t, "¹¶·â");
2473 #else
2474                         t = object_desc_str(t, " attack");
2475
2476                         /* Add "attacks" */
2477                         if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
2478 #endif
2479
2480                 }
2481
2482                 /* Stealth */
2483                 else if (f1 & (TR1_STEALTH))
2484                 {
2485                         /* Dump " to stealth" */
2486 #ifdef JP
2487 t = object_desc_str(t, "±£Ì©");
2488 #else
2489                         t = object_desc_str(t, " to stealth");
2490 #endif
2491
2492                 }
2493
2494                 /* Search */
2495                 else if (f1 & (TR1_SEARCH))
2496                 {
2497                         /* Dump " to searching" */
2498 #ifdef JP
2499 t = object_desc_str(t, "õº÷");
2500 #else
2501                         t = object_desc_str(t, " to searching");
2502 #endif
2503
2504                 }
2505
2506                 /* Infravision */
2507                 else if (f1 & (TR1_INFRA))
2508                 {
2509                         /* Dump " to infravision" */
2510 #ifdef JP
2511 t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ");
2512 #else
2513                         t = object_desc_str(t, " to infravision");
2514 #endif
2515
2516                 }
2517
2518                 /* Tunneling */
2519                 else if (f1 & (TR1_TUNNEL))
2520                 {
2521                         /* Nothing */
2522                 }
2523
2524                 /* Finish the display */
2525                 t = object_desc_chr(t, p2);
2526         }
2527
2528         /* Hack -- Process Lanterns/Torches */
2529         if (known && (o_ptr->tval == TV_LITE) && (!(artifact_p(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR))))
2530         {
2531                 /* Hack -- Turns of light for normal lites */
2532 #ifdef JP
2533 t = object_desc_str(t, "(");
2534 #else
2535                 t = object_desc_str(t, " (with ");
2536 #endif
2537
2538                 if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4*2);
2539                 else t = object_desc_num(t, o_ptr->xtra4);
2540 #ifdef JP
2541 t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)");
2542 #else
2543                 t = object_desc_str(t, " turns of light)");
2544 #endif
2545
2546         }
2547
2548
2549         /* Indicate charging objects, but not rods. */
2550         if (known && o_ptr->timeout && o_ptr->tval != TV_ROD)
2551         {
2552                 /* Hack -- Dump " (charging)" if relevant */
2553 #ifdef JP
2554 t = object_desc_str(t, "(½¼Å¶Ãæ)");
2555 #else
2556                 t = object_desc_str(t, " (charging)");
2557 #endif
2558
2559         }
2560
2561
2562         /* No more details wanted */
2563         if (mode < 3) goto copyback;
2564
2565
2566         /* No inscription yet */
2567         tmp_val2[0] = '\0';
2568
2569         /* Use the standard inscription if available */
2570         if (o_ptr->inscription)
2571         {
2572                 char *u = tmp_val2;
2573
2574                 strcpy(tmp_val2, quark_str(o_ptr->inscription));
2575
2576                 for (; *u && (*u != '#'); u++);
2577
2578                 *u = '\0';
2579         }
2580
2581         /* Use the game-generated "feeling" otherwise, if available */
2582         else if (o_ptr->feeling)
2583         {
2584                 strcpy(tmp_val2, game_inscriptions[o_ptr->feeling]);
2585         }
2586
2587         /* Note "cursed" if the item is known to be cursed */
2588         else if (cursed_p(o_ptr) && (known || (o_ptr->ident & (IDENT_SENSE))))
2589         {
2590 #ifdef JP
2591 strcpy(tmp_val2, "¼ö¤ï¤ì¤Æ¤¤¤ë");
2592 #else
2593                 strcpy(tmp_val2, "cursed");
2594 #endif
2595
2596         }
2597  
2598         /* Note "unidentified" if the item is unidentified */
2599         else if ((o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET
2600                   || o_ptr->tval == TV_LITE || o_ptr->tval == TV_FIGURINE)
2601                  && object_aware_p(o_ptr) && !object_known_p(o_ptr)
2602                  && !((o_ptr->ident)&IDENT_SENSE))
2603         {
2604 #ifdef JP
2605 strcpy(tmp_val2, "̤´ÕÄê");
2606 #else
2607                 strcpy(tmp_val2, "unidentified");
2608 #endif
2609         }
2610
2611         /* Mega-Hack -- note empty wands/staffs */
2612         else if (!known && (o_ptr->ident & (IDENT_EMPTY)))
2613         {
2614 #ifdef JP
2615 strcpy(tmp_val2, "¶õ");
2616 #else
2617                 strcpy(tmp_val2, "empty");
2618 #endif
2619
2620         }
2621
2622         /* Note "tried" if the object has been tested unsuccessfully */
2623         else if (!aware && object_tried_p(o_ptr))
2624         {
2625 #ifdef JP
2626 strcpy(tmp_val2, "̤ȽÌÀ");
2627 #else
2628                 strcpy(tmp_val2, "tried");
2629 #endif
2630
2631         }
2632
2633         /* Note the discount, if any */
2634         else if (o_ptr->discount)
2635         {
2636                 (void)object_desc_num(tmp_val2, o_ptr->discount);
2637 #ifdef JP
2638 strcat(tmp_val2, "%°ú¤­");
2639 #else
2640                 strcat(tmp_val2, "% off");
2641 #endif
2642
2643         }
2644
2645         /* Append the inscription, if any */
2646         if (tmp_val2[0])
2647         {
2648                 /* Append the inscription */
2649                 t = object_desc_chr(t, ' ');
2650                 t = object_desc_chr(t, c1);
2651                 t = object_desc_str(t, tmp_val2);
2652                 t = object_desc_chr(t, c2);
2653         }
2654
2655 copyback:
2656         t = tmp_val;
2657         for (i = 0; i < MAX_NLEN-2; i++)
2658         {
2659 #ifdef JP
2660                 if (iskanji(*(t+i)))
2661                 {
2662                         *(buf+i) = *(t+i);
2663                         i++;
2664                 }
2665 #endif
2666                 *(buf+i) = *(t+i);
2667         }
2668         if (i == MAX_NLEN-2)
2669         {
2670 #ifdef JP
2671                 if (iskanji(*(t+i)))
2672                         *(buf+i) = '\0';
2673                 else
2674 #endif
2675                         *(buf+i) = *(t+i);
2676         }
2677         *(buf+MAX_NLEN-1) = '\0';
2678 }
2679