1 /* Purpose: Object flavor code */
4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
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".
22 #define TERM_MULTI TERM_VIOLET
26 * Max sizes of the following arrays
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) */
39 * Rings (adjectives and colors)
42 static cptr ring_adj[MAX_ROCKS]
45 "Alexandrite", "Amethyst", "Aquamarine", "Azurite", "Beryl",
46 "Bloodstone", "Calcite", "Carnelian", "Corundum", "Diamond",
47 "Emerald", "Fluorite", "Garnet", "Granite", "Jade",
48 "Jasper", "Lapis Lazuli", "Malachite", "Marble", "Moonstone",
49 "Onyx", "Opal", "Pearl", "Quartz", "Quartzite",
50 "Rhodonite", "Ruby", "Sapphire", "Tiger Eye", "Topaz",
51 "Turquoise", "Zircon", "Platinum", "Bronze", "Gold",
52 "Obsidian", "Silver", "Tortoise Shell", "Mithril", "Jet",
53 "Engagement", "Adamantite",
54 "Wire", "Dilithium", "Bone", "Wooden",
55 "Spikard", "Serpent", "Wedding", "Double",
56 "Plain", "Brass", "Scarab","Shining",
57 "Rusty","Transparent", "Steel", "Tanzanite",
62 "¶âÎÐÀФÎ","¥¢¥á¥¸¥¹¥È¤Î","¥¢¥¯¥¢¥Þ¥ê¥ó¤Î","¤á¤Î¤¦¤Î","ÎÐÃìÀФÎ",
63 "·ì¶Ì¿ï¤Î","Êý²òÀФÎ","ÀÖ¤á¤Î¤¦¤Î","¹Ë¶Ì¤Î","¥À¥¤¥¢¥â¥ó¥É¤Î",
64 "¥¨¥á¥é¥ë¥É¤Î","¥Û¥¿¥ëÀФÎ","¥¬¡¼¥Í¥Ã¥È¤Î","¸æ±ÆÀФÎ","¤Ò¤¹¤¤¤Î",
65 "¥¸¥ã¥¹¥Ñ¡¼¤Î","ÀÄÎÜÍþ¤Î","¥¯¥¸¥ã¥¯ÀФÎ","ÂçÍýÀФÎ","¥à¡¼¥ó¥¹¥È¡¼¥ó¤Î",
66 "¼Ê¤á¤Î¤¦¤Î","¥ª¥Ñ¡¼¥ë¤Î","¿¿¼î¤Î","¿å¾½¤Î","ÀбѴä¤Î",
67 "¥¶¥¯¥íÀФÎ","¥ë¥Ó¡¼¤Î","¥µ¥Õ¥¡¥¤¥¢¤Î","¥¿¥¤¥¬¡¼¥¢¥¤¤Î","¥È¥Ñ¡¼¥º¤Î",
68 "¥È¥ë¥³ÀФÎ","¥¸¥ë¥³¥ó¤Î","¥×¥é¥Á¥Ê¤Î","¥Ö¥í¥ó¥º¤Î","¶â¤Î",
69 "¹õÍËÀФÎ","¶ä¤Î","¤Ù¤Ã¹Ã¤Î","¥ß¥¹¥ê¥ë¤Î","¹õ¶Ì¤Î",
70 "º§Ìó","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î",
71 "¿Ë¶â¤Î","¥Ç¥£¥ê¥·¥¦¥à¤Î","¹ü¤Î","ÌÚ¤Î",
72 "¥¹¥Ô¥«¤Î" /*nuke me*/ ,"¼Ø¤Î","·ëº§","Æó½Å¤Î",
73 "¾þ¤ê¤Î¤Ê¤¤","ÀÄƼ¤Î","¥¹¥«¥é¥Ù¤Î" ,"µ±¤¯",
74 "»¬¤Ó¤¿","Æ©ÌÀ¤Ê","¹ÝÅ´¤Î","¥¿¥ó¥¶¥Ê¥¤¥È¤Î",
79 static byte ring_col[MAX_ROCKS] =
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,
99 * Amulets (adjectives and colors)
101 static cptr amulet_adj[MAX_AMULETS]
104 "Amber", "Driftwood", "Coral", "Agate", "Ivory",
105 "Obsidian", "Bone", "Brass", "Bronze", "Pewter",
106 "Tortoise Shell", "Golden", "Azure", "Crystal", "Silver",
107 "Copper", "Swastika", "Platinum","Runed", "Rusty",
108 "Curved", "Dragon's claw", "Rosary", "Jade", "Mithril",
113 "àèàá¤Î","ήÌÚ¤Î","¥µ¥ó¥´¤Î","¤á¤Î¤¦¤Î","¾Ý²ç¤Î",
114 "¹õÍËÀФÎ","¹ü¤Î","¿¿ï«¤Î","ÀÄƼ¤Î","¤·¤í¤á¤Î",
115 "¤Ù¤Ã¹Ã¤Î","¶â¤Î","ÎÜÍþ¤Î","¿å¾½¤Î","¶ä¤Î",
116 "Ƽ¤Î","ÒĤÎ", "¥×¥é¥Á¥Ê¤Î", "¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","»¬¤Ó¤¿",
117 "¶Ê¤¬¤Ã¤¿", "¥É¥é¥´¥ó¤ÎÄÞ¤Î", "¿ô¼î¤Î", "¤Ò¤¹¤¤¤Î", "¥ß¥¹¥ê¥ë¤Î",
122 static byte amulet_col[MAX_AMULETS] =
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,
134 * Staffs (adjectives and colors)
136 static cptr staff_adj[MAX_WOODS]
139 "Aspen", "Balsa", "Banyan", "Birch", "Cedar",
140 "Cottonwood", "Cypress", "Dogwood", "Elm", "Eucalyptus",
141 "Hemlock", "Hickory", "Ironwood", "Locust", "Mahogany",
142 "Maple", "Mulberry", "Oak", "Pine", "Redwood",
143 "Rosewood", "Spruce", "Sycamore", "Teak", "Walnut",
144 "Mistletoe", "Hawthorn", "Bamboo", "Silver", "Runed",
145 "Golden", "Ashen", "Ivory","Gnarled"/*,"Willow"*/
149 "¥Ý¥×¥é¤Î","¥Ð¥ë¥µ¤Î","¥Ð¥ó¥ä¥ó¤Î","¥«¥Ð¤Î","À¾ÍÎ¥¹¥®¤Î",
150 "ÛؤÎ","¥¤¥È¥¹¥®¤Î","¥ß¥º¥¤Î","¥Ë¥ì¤Î","¥æ¡¼¥«¥ê¤Î",
151 "¥Ä¥¬¤Î","¥Ö¥Ê¤Î","¹õÃɤÎ","¥¢¥«¥·¥¢¤Î","¥Þ¥Û¥¬¥Ë¡¼¤Î",
152 "¥«¥¨¥Ç¤Î","¥¯¥ï¤Î","¥«¥·¤Î","¾¾¤Î","¿ù¤Î",
153 "»çÃɤÎ","¥¨¥¾¥Þ¥Ä¤Î","¥¤¥Á¥¸¥¯¤Î","¥Á¡¼¥¯¤Î","¥¯¥ë¥ß¤Î",
154 "¥ä¥É¥ê¥®¤Î","¥µ¥ó¥¶¥·¤Î","ÃݤÎ","¶ä¤Î","¥ë¡¼¥ó¤Î",
155 "¶â¤Î","¥È¥Í¥ê¥³¤Î", "¾Ý²ç¤Î", "·î·Ë¼ù¤Î"
159 static byte staff_col[MAX_WOODS] =
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
172 * Wands (adjectives and colors)
174 static cptr wand_adj[MAX_METALS]
177 "Aluminum", "Cast Iron", "Chromium", "Copper", "Gold",
178 "Iron", "Magnesium", "Molybdenum", "Nickel", "Rusty",
179 "Silver", "Steel", "Tin", "Titanium", "Tungsten",
180 "Zirconium", "Zinc", "Aluminum-Plated", "Copper-Plated", "Gold-Plated",
181 "Nickel-Plated", "Silver-Plated", "Steel-Plated", "Tin-Plated", "Zinc-Plated",
182 "Mithril-Plated", "Mithril", "Runed", "Bronze", "Brass",
183 "Platinum", "Lead","Lead-Plated", "Ivory" , "Adamantite",
184 "Uridium", "Long", "Short", "Hexagonal", "Carbonized"
188 "¥¢¥ë¥ß¤Î","ÃòÅ´¤Î","¥¯¥í¥à¤Î","Ƽ¤Î","¶â¤Î",
189 "Å´¤Î","¥Þ¥°¥Í¥·¥¦¥à¤Î","¥â¥ê¥Ö¥Ç¥ó¤Î","¥Ë¥Ã¥±¥ë¤Î","»¬¤Ó¤¿",
190 "¶ä¤Î","¹ÝÅ´¤Î","¥Ö¥ê¥¤Î","¥Á¥¿¥ó¤Î","¥¿¥ó¥°¥¹¥Æ¥ó¤Î",
191 "¥¸¥ë¥³¥ó¤Î","°¡±ô¤Î","¥¢¥ë¥ß¥á¥Ã¥¤Î","Ƽ¥á¥Ã¥¤Î","¶â¥á¥Ã¥¤Î",
192 "ÇòƼ¥á¥Ã¥¤Î","¶ä¥á¥Ã¥¤Î","Å´¥á¥Ã¥¤Î","¥¹¥º¥á¥Ã¥¤Î","°¡±ô¥á¥Ã¥¤Î",
193 "¥ß¥¹¥ê¥ë¥á¥Ã¥¤Î","¥ß¥¹¥ê¥ë¤Î","¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","ÀÄƼ¤Î","¿¿ï«¤Î",
194 "¥×¥é¥Á¥Ê¤Î","±ô¤Î","±ô¥á¥Ã¥¤Î","¾Ý²ç¤Î","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î",
195 "¥¤¥ê¥Â¥¦¥à¤Î","Ť¤","û¤¤","Ï»³Ñ·Á¤Î", "úÁǤÎ"
199 static byte wand_col[MAX_METALS] =
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
213 * Rods (adjectives and colors).
214 * Efficiency -- copied from wand arrays
217 static cptr rod_adj[MAX_METALS];
219 static byte rod_col[MAX_METALS];
223 * Mushrooms (adjectives and colors)
226 static cptr food_adj[MAX_SHROOM]
229 "Blue", "Black", "Black Spotted", "Brown", "Dark Blue",
230 "Dark Green", "Dark Red", "Yellow", "Furry", "Green",
231 "Grey", "Light Blue", "Light Green", "Violet", "Red",
232 "Slimy", "Tan", "White", "White Spotted", "Wrinkled",
236 "ÀĤ¤","¹õ¤¤","¹õÈäÎ","Ã㿧¤Î","·²ÀĤÎ",
237 "¿¼ÎФÎ","¹È¿§¤Î","²«¿§¤¤","Âݤष¤¿","ÎФÎ",
238 "¥°¥ì¡¼¤Î","¶õ¿§¤Î","²«ÎФÎ","¥¹¥ß¥ì¿§¤Î","ÀÖ¤¤",
239 "¤Í¤Ð¤Í¤Ð¤·¤¿","²«³ì¿§¤Î","Çò¤¤","ÇòÈäÎ","¤·¤ï¤·¤ï¤Î",
243 static byte food_col[MAX_SHROOM] =
245 TERM_BLUE, TERM_L_DARK, TERM_L_DARK, TERM_UMBER, TERM_BLUE,
246 TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_L_WHITE, TERM_GREEN,
247 TERM_SLATE, TERM_L_BLUE, TERM_L_GREEN, TERM_VIOLET, TERM_RED,
248 TERM_SLATE, TERM_L_UMBER, TERM_WHITE, TERM_WHITE, TERM_UMBER
253 * Color adjectives and colors, for potions.
254 * Hack -- The first four entries are hard-coded.
255 * (water, apple juice, slime mold juice, something)
258 static cptr potion_adj[MAX_COLORS]
261 "Clear", "Light Brown", "Icky Green", "xxx",
262 "Azure", "Blue", "Blue Speckled", "Black", "Brown", "Brown Speckled",
263 "Bubbling", "Chartreuse", "Cloudy", "Copper Speckled", "Crimson", "Cyan",
264 "Dark Blue", "Dark Green", "Dark Red", "Gold Speckled", "Green",
265 "Green Speckled", "Grey", "Grey Speckled", "Hazy", "Indigo",
266 "Light Blue", "Light Green", "Magenta", "Metallic Blue", "Metallic Red",
267 "Metallic Green", "Metallic Purple", "Misty", "Orange", "Orange Speckled",
268 "Pink", "Pink Speckled", "Puce", "Purple", "Purple Speckled",
269 "Red", "Red Speckled", "Silver Speckled", "Smoky", "Tangerine",
270 "Violet", "Vermilion", "White", "Yellow", "Violet Speckled",
271 "Pungent", "Clotted Red", "Viscous Pink", "Oily Yellow", "Gloopy Green",
272 "Shimmering", "Coagulated Crimson", "Yellow Speckled", "Gold",
273 "Manly", "Stinking", "Oily Black", "Ichor", "Ivory White", "Sky Blue",
274 "Gray", "Silver", "Bronze", "Flashing",
278 "Æ©ÌÀ¤Ê","ÇöÃ㿧¤Î","¤è¤É¤ó¤ÀÎФÎ","¼¿¹õ¤Î",
279 "º°ÊˤÎ","ÀĤ¤","ÀÄÈäÎ","¹õ¤¤","Ã㿧¤Î","ÃãÈäÎ",
280 "Ë¢¤À¤Ã¤¿","Çö²«Î理Î","Âù¤Ã¤¿","ƼÈäÎ","¹È¿§¤Î","¥·¥¢¥ó¿§¤Î",
281 "·²ÀÄ¿§¤Î","¿¼¤¤ÎФÎ","¿¼¤¤ÀÖ¿§¤Î","¶âÈäÎ","Î理Î",
282 "ÎÐÈäÎ","³¥¿§¤Î","³¥ÈäÎ","¤Ü¤ä¤±¤¿¿§¤Î","Íõ¿§¤Î",
283 "Çö¤¤ÀÄ¿§¤Î","Çö¤¤Î理Î","¥Þ¥¼¥ó¥¿¿§¤Î","ÀĤ¯µ±¤¯","ÀÖ¤¯µ±¤¯",
284 "ÎФ˵±¤¯","»ç¤Ëµ±¤¯","̸¾õ¤Î","¥ª¥ì¥ó¥¸¿§¤Î","¥ª¥ì¥ó¥¸ÈäÎ",
285 "¥Ô¥ó¥¯¿§¤Î","¥Ô¥ó¥¯ÈäÎ","¹õ³ì¿§¤Î","»ç¿§¤Î","¤¦¤¹¤¤»çÈäÎ",
286 "ÀÖ¤¤","ÀÖÈäÎ","¶äÈäÎ","±ì¤Ã¤¿","Üô¿§¤Î",
287 "¥¹¥ß¥ì¿§¤Î","¼ë¿§¤Î","Çò¤¤","²«¿§¤¤", "»çÈäÎ",
288 "»É·ã½¤Î¤¹¤ë","¤è¤É¤ó¤ÀÀÖ¤Î","¥É¥í¥É¥í¤Î","¤Í¤Ð¤Ã¤¿²«¿§¤Î","°ÅÎ理Î",
289 "µ±¤¯","¤Í¤Ð¤Ã¤¿¿¼¹È¤Î","²«ÈäÎ","¶â¿§¤Î",
290 "Ã˽¤¤" /*nuke me*/,"°½¤Î¤¹¤ë","¹õÌý¿§¤Î","ǾÞù¤Î",
291 "¾Ý²ç¿§¤Î","¶õ¿§¤Î", "¤Í¤º¤ß¿§¤Î", "¶ä¿§¤Î", "ÀÖƼ¿§¤Î",
296 static byte potion_col[MAX_COLORS] =
298 TERM_WHITE, TERM_L_UMBER, TERM_GREEN, 0,
299 TERM_L_BLUE, TERM_BLUE, TERM_BLUE, TERM_L_DARK, TERM_UMBER, TERM_UMBER,
300 TERM_L_WHITE, TERM_L_GREEN, TERM_WHITE, TERM_L_UMBER, TERM_RED, TERM_L_BLUE,
301 TERM_BLUE, TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_GREEN,
302 TERM_GREEN, TERM_SLATE, TERM_SLATE, TERM_L_WHITE, TERM_VIOLET,
303 TERM_L_BLUE, TERM_L_GREEN, TERM_RED, TERM_BLUE, TERM_RED,
304 TERM_GREEN, TERM_VIOLET, TERM_L_WHITE, TERM_ORANGE, TERM_ORANGE,
305 TERM_L_RED, TERM_L_RED, TERM_VIOLET, TERM_VIOLET, TERM_VIOLET,
306 TERM_RED, TERM_RED, TERM_L_WHITE, TERM_L_DARK, TERM_ORANGE,
307 TERM_VIOLET, TERM_RED, TERM_WHITE, TERM_YELLOW, TERM_VIOLET,
308 TERM_L_RED, TERM_RED, TERM_L_RED, TERM_YELLOW, TERM_GREEN,
309 TERM_MULTI, TERM_RED, TERM_YELLOW, TERM_YELLOW,
310 TERM_L_UMBER, TERM_UMBER, TERM_L_DARK, TERM_RED,
311 TERM_WHITE, TERM_L_BLUE, TERM_L_WHITE, TERM_WHITE, TERM_RED,
317 * Syllables for scrolls (must be 1-4 letters each)
320 static cptr syllables[MAX_SYLLABLES]
323 "Å·", "ÃÏ", "̵", "ÍÑ", "°ì", "Åá", "ξ", "ÃÇ",
324 "°á", "Ë¥", "Æü", "Àé", "½©", "Ëþ", "¿È", "ÁÏ",
325 "áØ", "¼·", "ž", "Ȭ", "ÅÝ", "²é", "¿Å",
326 "¾¨", "ÃÀ", "µ¯", "»à", "²ó", "À¸", "ʸ",
327 "Éð", "Æ»", "ε", "Ƭ", "¼Ø", "Èø", "ñ", "Åá", "ľ", "Æþ",
328 "¿Ê", "Âà", "¸Þ", "¡", "Ï»", "ç¥", "Âç", "»³", "ÌÄ",
329 "Æ°", "É÷", "ÎÓ", "²Ð", "Àä", "ÂÎ", "Ì¿", "»Í",
330 "ÌÌ", "Á¿", "²Î", "´°", "Á´", "·ç", "Ä·", "ÎÂ",
331 "ìí", "î½", "òµ", "Ì¥", "ò³", "ò´", "½Ä",
332 "²£", "¿Ô", "¿À", "½Ð", "µ´", "Ë×", "²¹", "¸Î", "ÃÎ",
333 "¿·", "½Õ", "²Æ", "Åß", "½ã", "¿¿", "¹¤", "¶½",
334 "Ì£", "ÄÅ", "³Î", "Èæ", "¶ì", "¿´", "»´", "߸",
335 "Ç°", "ȯ", "Á°", "Âå", "̤", "ʹ", "¶õ", "¸å",
336 "Ú¼", "¶â", "¿¹", "Íå", "Ëü", "¾Ý", "ÊÑ", "²½",
337 "½½", "Ãæ", "Ȭ", "¶å", "¿Í", "¿§", "»î", "¹Ô",
338 "ºø", "¸í", "»ö", "¼Â", "º¬", "µÛ", "¼ý", "¹ç",
339 "Ê»", "Á´", "¹ñ", "À©", "ÇÆ", "¾Æ", "Æù", "Äê",
340 "¿©", "¹ü", "²ç", "Ìø", "Èô", "æÆ", "Éõ", "°õ",
341 "¼À", "Íð", "Éð", "¾", "·Ú", "Ǧ", "·õ", "ǽ",
342 "À»", "¼Ù", "¼ö", "¼±", "¸¸", "´¶", "ÆÇ", "°Ç",
347 "a", "ab", "ag", "aks", "ala", "an", "ankh", "app",
348 "arg", "arze", "ash", "aus", "ban", "bar", "bat", "bek",
349 "bie", "bin", "bit", "bjor", "blu", "bot", "bu",
350 "byt", "comp", "con", "cos", "cre", "dalf", "dan",
351 "den", "der", "doe", "dok", "eep", "el", "eng", "er", "ere", "erk",
352 "esh", "evs", "fa", "fid", "flit", "for", "fri", "fu", "gan",
353 "gar", "glen", "gop", "gre", "ha", "he", "hyd", "i",
354 "ing", "ion", "ip", "ish", "it", "ite", "iv", "jo",
355 "kho", "kli", "klis", "la", "lech", "man", "mar",
356 "me", "mi", "mic", "mik", "mon", "mung", "mur", "nag", "nej",
357 "nelg", "nep", "ner", "nes", "nis", "nih", "nin", "o",
358 "od", "ood", "org", "orn", "ox", "oxy", "pay", "pet",
359 "ple", "plu", "po", "pot", "prok", "re", "rea", "rhov",
360 "ri", "ro", "rog", "rok", "rol", "sa", "san", "sat",
361 "see", "sef", "seh", "shu", "ski", "sna", "sne", "snik",
362 "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab",
363 "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
364 "ulk", "um", "un", "uni", "ur", "val", "viv", "vly",
365 "vom", "wah", "wed", "werg", "wex", "whon", "wun", "x",
366 "yerg", "yp", "zun", "tri", "blaa", "jah", "bul", "on",
373 * Hold the titles of scrolls, 6 to 14 characters each
374 * Also keep an array of scroll colors (always WHITE for now)
376 static char scroll_adj[MAX_TITLES][16];
378 static byte scroll_col[MAX_TITLES];
382 * Certain items, if aware, are known instantly
383 * This function is used only by "flavor_init()"
385 static bool object_easy_know(int i)
387 object_kind *k_ptr = &k_info[i];
389 /* Analyze the "tval" */
394 case TV_SORCERY_BOOK:
400 case TV_ENCHANT_BOOK:
402 case TV_CRUSADE_BOOK:
404 case TV_HISSATSU_BOOK:
420 /* All Food, Potions, Scrolls, Rods */
436 * Certain items have a flavor
437 * This function is used only by "flavor_init()"
439 static bool object_flavor(int k_idx)
441 object_kind *k_ptr = &k_info[k_idx];
443 /* Analyze the item */
448 return (0x80 + amulet_col[k_ptr->sval]);
453 return (0x90 + ring_col[k_ptr->sval]);
458 return (0xA0 + staff_col[k_ptr->sval]);
463 return (0xB0 + wand_col[k_ptr->sval]);
468 return (0xC0 + rod_col[k_ptr->sval]);
473 return (0xD0 + scroll_col[k_ptr->sval]);
478 return (0xE0 + potion_col[k_ptr->sval]);
483 if (k_ptr->sval < SV_FOOD_MIN_FOOD)
485 return (0xF0 + food_col[k_ptr->sval]);
497 void get_table_name(char *out_string)
501 strcpy(out_string, "¡Ø");
502 get_rnd_line("aname_j.txt", 1, Syllable);
503 strcat(out_string, Syllable);
504 get_rnd_line("aname_j.txt", 2, Syllable);
505 strcat(out_string, Syllable);
506 strcat(out_string, "¡Ù");
508 int testcounter = randint1(3) + 1;
510 strcpy(out_string, "'");
512 if (randint1(3) == 2)
514 while (testcounter--)
515 strcat(out_string, syllables[randint0(MAX_SYLLABLES)]);
520 testcounter = randint1(2) + 1;
521 while (testcounter--)
523 (void)get_rnd_line("elvish.txt", 0, Syllable);
524 strcat(out_string, Syllable);
528 out_string[1] = toupper(out_string[1]);
530 strcat(out_string, "'");
534 out_string[18] = '\0';
541 * Prepare the "variable" part of the "k_info" array.
543 * The "color"/"metal"/"type" of an item is its "flavor".
544 * For the most part, flavors are assigned randomly each game.
546 * Initialize descriptions for the "colored" objects, including:
547 * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.
549 * The first 4 entries for potions are fixed (Water, Apple Juice,
550 * Slime Mold Juice, Unused Potion).
552 * Scroll titles are always between 6 and 14 letters long. This is
553 * ensured because every title is composed of whole words, where every
554 * word is from 1 to 8 letters long (one or two syllables of 1 to 4
555 * letters each), and that no scroll is finished until it attempts to
556 * grow beyond 15 letters. The first time this can happen is when the
557 * current title has 6 letters and the new word has 8 letters, which
558 * would result in a 6 letter scroll title.
560 * Duplicate titles are avoided by requiring that no two scrolls share
561 * the same first four letters (not the most efficient method, and not
562 * the least efficient method, but it will always work).
564 * Hack -- make sure everything stays the same for each saved game
565 * This is accomplished by the use of a saved "random seed", as in
566 * "town_gen()". Since no other functions are called while the special
567 * seed is in effect, so this function is pretty "safe".
569 * Note that the "hacked seed" may provide an RNG with alternating parity!
571 void flavor_init(void)
580 /* Hack -- Use the "simple" RNG */
583 /* Hack -- Induce consistant flavors */
584 Rand_value = seed_flavor;
587 /* Efficiency -- Rods/Wands share initial array */
588 for (i = 0; i < MAX_METALS; i++)
590 rod_adj[i] = wand_adj[i];
591 rod_col[i] = wand_col[i];
595 /* Rings have "ring colors" */
596 for (i = 0; i < MAX_ROCKS; i++)
598 j = randint0(MAX_ROCKS);
599 temp_adj = ring_adj[i];
600 ring_adj[i] = ring_adj[j];
601 ring_adj[j] = temp_adj;
603 temp_col = ring_col[i];
604 ring_col[i] = ring_col[j];
605 ring_col[j] = temp_col;
608 /* Hack -- The One Ring */
610 ring_adj[SV_RING_POWER] = "¶â̵¹¤¤Î";
611 ring_adj[SV_RING_AHO] = "¶â͹¤¤Î";
613 ring_adj[SV_RING_POWER] = "Plain Gold";
614 ring_adj[SV_RING_AHO] = "Plain Goldarn";
619 ring_col[SV_RING_POWER] = TERM_YELLOW;
620 ring_col[SV_RING_AHO] = TERM_YELLOW;
623 /* Amulets have "amulet colors" */
624 for (i = 0; i < MAX_AMULETS; i++)
626 j = randint0(MAX_AMULETS);
627 temp_adj = amulet_adj[i];
628 amulet_adj[i] = amulet_adj[j];
629 amulet_adj[j] = temp_adj;
631 temp_col = amulet_col[i];
632 amulet_col[i] = amulet_col[j];
633 amulet_col[j] = temp_col;
637 for (i = 0; i < MAX_WOODS; i++)
639 j = randint0(MAX_WOODS);
640 temp_adj = staff_adj[i];
641 staff_adj[i] = staff_adj[j];
642 staff_adj[j] = temp_adj;
644 temp_col = staff_col[i];
645 staff_col[i] = staff_col[j];
646 staff_col[j] = temp_col;
650 for (i = 0; i < MAX_METALS; i++)
652 j = randint0(MAX_METALS);
653 temp_adj = wand_adj[i];
654 wand_adj[i] = wand_adj[j];
655 wand_adj[j] = temp_adj;
657 temp_col = wand_col[i];
658 wand_col[i] = wand_col[j];
659 wand_col[j] = temp_col;
663 for (i = 0; i < MAX_METALS; i++)
665 j = randint0(MAX_METALS);
666 temp_adj = rod_adj[i];
667 rod_adj[i] = rod_adj[j];
668 rod_adj[j] = temp_adj;
670 temp_col = rod_col[i];
671 rod_col[i] = rod_col[j];
672 rod_col[j] = temp_col;
675 /* Foods (Mushrooms) */
676 for (i = 0; i < MAX_SHROOM; i++)
678 j = randint0(MAX_SHROOM);
679 temp_adj = food_adj[i];
680 food_adj[i] = food_adj[j];
681 food_adj[j] = temp_adj;
683 temp_col = food_col[i];
684 food_col[i] = food_col[j];
685 food_col[j] = temp_col;
689 for (i = 4; i < MAX_COLORS; i++)
691 j = randint0(MAX_COLORS - 4) + 4;
692 temp_adj = potion_adj[i];
693 potion_adj[i] = potion_adj[j];
694 potion_adj[j] = temp_adj;
696 temp_col = potion_col[i];
697 potion_col[i] = potion_col[j];
698 potion_col[j] = temp_col;
701 /* Scrolls (random titles, always white) */
702 for (i = 0; i < MAX_TITLES; i++)
704 /* Get a new title */
711 /* Start a new title */
714 /* Collect words until done */
721 /* Start a new word */
724 /* Choose one or two syllables */
725 s = ((randint0(100) < 30) ? 1 : 2);
727 /* Add a one or two syllable word */
728 for (q = 0; q < s; q++)
730 /* Add the syllable */
731 strcat(tmp, syllables[randint0(MAX_SYLLABLES)]);
734 /* Stop before getting too long */
735 if (strlen(buf) + 1 + strlen(tmp) > 15) break;
745 strcpy(scroll_adj[i], buf+1);
750 /* Check for "duplicate" scroll titles */
751 for (j = 0; j < i; j++)
753 cptr hack1 = scroll_adj[j];
754 cptr hack2 = scroll_adj[i];
756 /* Compare first four characters */
757 if (*hack1++ != *hack2++) continue;
758 if (*hack1++ != *hack2++) continue;
759 if (*hack1++ != *hack2++) continue;
760 if (*hack1++ != *hack2++) continue;
769 /* Break when done */
773 /* All scrolls are white */
774 scroll_col[i] = TERM_WHITE;
778 /* Hack -- Use the "complex" RNG */
781 /* Analyze every object */
782 for (i = 1; i < max_k_idx; i++)
784 object_kind *k_ptr = &k_info[i];
786 /* Skip "empty" objects */
787 if (!k_ptr->name) continue;
789 /* Extract "flavor" (if any) */
790 k_ptr->flavor = object_flavor(i);
792 /* No flavor yields aware */
793 if (!k_ptr->flavor) k_ptr->aware = TRUE;
795 /* Check for "easily known" */
796 k_ptr->easy_know = object_easy_know(i);
802 * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
803 * and return a pointer to the terminator (t + 1).
805 static char *object_desc_chr(char *t, char c)
819 * Print a string "s" into a string "t", as if by strcpy(t, s),
820 * and return a pointer to the terminator.
822 static char *object_desc_str(char *t, cptr s)
824 /* Copy the string */
825 while (*s) *t++ = *s++;
837 * Print an unsigned number "n" into a string "t", as if by
838 * sprintf(t, "%u", n), and return a pointer to the terminator.
840 static char *object_desc_num(char *t, uint n)
844 /* Find "size" of "n" */
845 for (p = 1; n >= p * 10; p = p * 10) /* loop */;
847 /* Dump each digit */
853 /* Remove the digit */
856 /* Process next digit */
872 * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó
873 *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë
876 char *object_desc_kosuu(char *t, object_type *o_ptr)
878 t = object_desc_num(t, o_ptr->number);
890 t = object_desc_str(t, "ËÜ");
895 t = object_desc_str(t, "´¬");
900 t = object_desc_str(t, "Éþ");
904 case TV_SORCERY_BOOK:
910 case TV_ENCHANT_BOOK:
912 case TV_CRUSADE_BOOK:
914 case TV_HISSATSU_BOOK:
916 t = object_desc_str(t, "ºý");
924 t = object_desc_str(t, "Ãå");
931 t = object_desc_str(t, "¿¶");
936 t = object_desc_str(t, "");
941 t = object_desc_str(t, "Ëç");
944 /* ¿©¤Ù¤â¤Î by ita */
947 if(o_ptr->sval == SV_FOOD_JERKY)
949 t = object_desc_str(t, "ÀÚ¤ì");
955 if (o_ptr->number < 10)
957 t = object_desc_str(t, "¤Ä");
961 t = object_desc_str(t, "¸Ä");
971 * Print an signed number "v" into a string "t", as if by
972 * sprintf(t, "%+d", n), and return a pointer to the terminator.
973 * Note that we always print a sign, either "+" or "-".
975 static char *object_desc_int(char *t, sint v)
982 /* Take the absolute value */
985 /* Use a "minus" sign */
989 /* Positive (or zero) */
992 /* Use the actual number */
995 /* Use a "plus" sign */
999 /* Find "size" of "n" */
1000 for (p = 1; n >= p * 10; p = p * 10) /* loop */;
1002 /* Dump each digit */
1005 /* Dump the digit */
1008 /* Remove the digit */
1011 /* Process next digit */
1024 * Structs and tables for Auto Inscription for flags
1027 typedef struct flag_insc_table
1038 static flag_insc_table flag_insc_plus[] =
1040 { "¹¶", "At", TR_BLOWS, -1 },
1041 { "®", "Sp", TR_SPEED, -1 },
1042 { "ÏÓ", "St", TR_STR, -1 },
1043 { "ÃÎ", "In", TR_INT, -1 },
1044 { "¸", "Wi", TR_WIS, -1 },
1045 { "´ï", "Dx", TR_DEX, -1 },
1046 { "ÂÑ", "Cn", TR_CON, -1 },
1047 { "̥", "Ch", TR_CHR, -1 },
1048 { "ƻ", "Md", TR_MAGIC_MASTERY, -1 },
1049 { "±£", "Sl", TR_STEALTH, -1 },
1050 { "õ", "Sr", TR_SEARCH, -1 },
1051 { "ÀÖ", "If", TR_INFRA, -1 },
1052 { "·¡", "Dg", TR_TUNNEL, -1 },
1053 { NULL, NULL, 0, -1 }
1056 static flag_insc_table flag_insc_immune[] =
1058 { "»À", "Ac", TR_IM_ACID, -1 },
1059 { "ÅÅ", "El", TR_IM_ELEC, -1 },
1060 { "²Ð", "Fi", TR_IM_FIRE, -1 },
1061 { "Îä", "Co", TR_IM_COLD, -1 },
1062 { NULL, NULL, 0, -1 }
1065 static flag_insc_table flag_insc_resistance[] =
1067 { "»À", "Ac", TR_RES_ACID, TR_IM_ACID },
1068 { "ÅÅ", "El", TR_RES_ELEC, TR_IM_ELEC },
1069 { "²Ð", "Fi", TR_RES_FIRE, TR_IM_FIRE },
1070 { "Îä", "Co", TR_RES_COLD, TR_IM_COLD },
1071 { "ÆÇ", "Po", TR_RES_POIS, -1 },
1072 { "Á®", "Li", TR_RES_LITE, -1 },
1073 { "°Å", "Dk", TR_RES_DARK, -1 },
1074 { "ÇË", "Sh", TR_RES_SHARDS, -1 },
1075 { "ÌÕ", "Bl", TR_RES_BLIND, -1 },
1076 { "Íð", "Cf", TR_RES_CONF, -1 },
1077 { "¹ì", "So", TR_RES_SOUND, -1 },
1078 { "¹ö", "Nt", TR_RES_NETHER, -1 },
1079 { "°ø", "Nx", TR_RES_NEXUS, -1 },
1080 { "ÆÙ", "Ca", TR_RES_CHAOS, -1 },
1081 { "Îô", "Di", TR_RES_DISEN, -1 },
1082 { "¶²", "Fe", TR_RES_FEAR, -1 },
1083 { NULL, NULL, 0, -1 }
1086 static flag_insc_table flag_insc_misc[] =
1088 { "ËâÎÏ", "Ma", TR_DEC_MANA, -1 },
1089 { "Åê", "Th", TR_THROW, -1 },
1090 { "ȿ", "Rf", TR_REFLECT, -1 },
1091 { "Ëã", "Fa", TR_FREE_ACT, -1 },
1092 { "ȑ", "Si", TR_SEE_INVIS, -1 },
1093 { "·Ð", "Hl", TR_HOLD_LIFE, -1 },
1094 { "ÃÙ", "Sd", TR_SLOW_DIGEST, -1 },
1095 { "³è", "Rg", TR_REGEN, -1 },
1096 { "Éâ", "Lv", TR_FEATHER, -1 },
1097 { "ÌÀ", "Lu", TR_LITE, -1 },
1098 { "·Ù", "Wr", TR_WARNING, -1 },
1099 { "ÇÜ", "Xm", TR_XTRA_MIGHT, -1 },
1100 { "¼Í", "Xs", TR_XTRA_SHOTS, -1 },
1101 { "ÅÜ", "Ag", TR_AGGRAVATE, -1 },
1102 { "½Ë", "Bs", TR_BLESSED, -1 },
1103 { "´÷", "Ty", TR_TY_CURSE, -1 },
1104 { NULL, NULL, 0, -1 }
1107 static flag_insc_table flag_insc_aura[] =
1109 { "±ê", "F", TR_SH_FIRE, -1 },
1110 { "ÅÅ", "E", TR_SH_ELEC, -1 },
1111 { "Îä", "C", TR_SH_COLD, -1 },
1112 { "Ëâ", "M", TR_NO_MAGIC, -1 },
1113 { "½Ö", "T", TR_NO_TELE, -1 },
1114 { NULL, NULL, 0, -1 }
1117 static flag_insc_table flag_insc_brand[] =
1119 { "»À", "A", TR_BRAND_ACID, -1 },
1120 { "ÅÅ", "E", TR_BRAND_ELEC, -1 },
1121 { "¾Æ", "F", TR_BRAND_FIRE, -1 },
1122 { "Åà", "Co", TR_BRAND_COLD, -1 },
1123 { "ÆÇ", "P", TR_BRAND_POIS, -1 },
1124 { "ÆÙ", "Ca", TR_CHAOTIC, -1 },
1125 { "µÛ", "V", TR_VAMPIRIC, -1 },
1126 { "¿Ì", "Q", TR_IMPACT, -1 },
1127 { "ÀÚ", "S", TR_VORPAL, -1 },
1128 { "Íý", "M", TR_FORCE_WEAPON, -1 },
1129 { NULL, NULL, 0, -1 }
1132 static flag_insc_table flag_insc_kill[] =
1134 { "¼Ù", "*", TR_KILL_EVIL, -1 },
1135 { "¿Í", "p", TR_KILL_HUMAN, -1 },
1136 { "ζ", "D", TR_KILL_DRAGON, -1 },
1137 { "¥ª", "o", TR_KILL_ORC, -1 },
1138 { "¥È", "T", TR_KILL_TROLL, -1 },
1139 { "µð", "P", TR_KILL_GIANT, -1 },
1140 { "¥Ç", "U", TR_KILL_DEMON, -1 },
1141 { "Ȉ", "L", TR_KILL_UNDEAD, -1 },
1142 { "ư", "Z", TR_KILL_ANIMAL, -1 },
1143 { NULL, NULL, 0, -1 }
1146 static flag_insc_table flag_insc_slay[] =
1148 { "¼Ù", "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1149 { "¿Í", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1150 { "ε", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1151 { "¥ª", "o", TR_SLAY_ORC, TR_KILL_ORC },
1152 { "¥È", "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1153 { "µð", "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1154 { "¥Ç", "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1155 { "Ȉ", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1156 { "ư", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1157 { NULL, NULL, 0, -1 }
1160 static flag_insc_table flag_insc_esp1[] =
1162 { "´¶", "Tele", TR_TELEPATHY, -1 },
1163 { "¼Ù", "Evil", TR_ESP_EVIL, -1 },
1164 { "Á±", "Good", TR_ESP_GOOD, -1 },
1165 { "̵", "Nolv", TR_ESP_NONLIVING, -1 },
1166 { "¸Ä", "Uniq", TR_ESP_UNIQUE, -1 },
1167 { NULL, NULL, 0, -1 }
1170 static flag_insc_table flag_insc_esp2[] =
1172 { "¿Í", "p", TR_ESP_HUMAN, -1 },
1173 { "ε", "D", TR_ESP_DRAGON, -1 },
1174 { "¥ª", "o", TR_ESP_ORC, -1 },
1175 { "¥È", "T", TR_ESP_TROLL, -1 },
1176 { "µð", "P", TR_ESP_GIANT, -1 },
1177 { "¥Ç", "U", TR_ESP_DEMON, -1 },
1178 { "Ȉ", "L", TR_ESP_UNDEAD, -1 },
1179 { "ư", "Z", TR_ESP_ANIMAL, -1 },
1180 { NULL, NULL, 0, -1 }
1183 static flag_insc_table flag_insc_sust[] =
1185 { "ÏÓ", "St", TR_SUST_STR, -1 },
1186 { "ÃÎ", "In", TR_SUST_INT, -1 },
1187 { "¸", "Wi", TR_SUST_WIS, -1 },
1188 { "´ï", "Dx", TR_SUST_DEX, -1 },
1189 { "ÂÑ", "Cn", TR_SUST_CON, -1 },
1190 { "̥", "Ch", TR_SUST_CHR, -1 },
1191 { NULL, NULL, 0, -1 }
1195 static flag_insc_table flag_insc_plus[] =
1197 { "At", TR_BLOWS, -1 },
1198 { "Sp", TR_SPEED, -1 },
1199 { "St", TR_STR, -1 },
1200 { "In", TR_INT, -1 },
1201 { "Wi", TR_WIS, -1 },
1202 { "Dx", TR_DEX, -1 },
1203 { "Cn", TR_CON, -1 },
1204 { "Ch", TR_CHR, -1 },
1205 { "Md", TR_MAGIC_MASTERY, -1 },
1206 { "Sl", TR_STEALTH, -1 },
1207 { "Sr", TR_SEARCH, -1 },
1208 { "If", TR_INFRA, -1 },
1209 { "Dg", TR_TUNNEL, -1 },
1213 static flag_insc_table flag_insc_immune[] =
1215 { "Ac", TR_IM_ACID, -1 },
1216 { "El", TR_IM_ELEC, -1 },
1217 { "Fi", TR_IM_FIRE, -1 },
1218 { "Co", TR_IM_COLD, -1 },
1222 static flag_insc_table flag_insc_resistance[] =
1224 { "Ac", TR_RES_ACID, TR_IM_ACID },
1225 { "El", TR_RES_ELEC, TR_IM_ELEC },
1226 { "Fi", TR_RES_FIRE, TR_IM_FIRE },
1227 { "Co", TR_RES_COLD, TR_IM_COLD },
1228 { "Po", TR_RES_POIS, -1 },
1229 { "Li", TR_RES_LITE, -1 },
1230 { "Dk", TR_RES_DARK, -1 },
1231 { "Sh", TR_RES_SHARDS, -1 },
1232 { "Bl", TR_RES_BLIND, -1 },
1233 { "Cf", TR_RES_CONF, -1 },
1234 { "So", TR_RES_SOUND, -1 },
1235 { "Nt", TR_RES_NETHER, -1 },
1236 { "Nx", TR_RES_NEXUS, -1 },
1237 { "Ca", TR_RES_CHAOS, -1 },
1238 { "Di", TR_RES_DISEN, -1 },
1239 { "Fe", TR_RES_FEAR, -1 },
1243 static flag_insc_table flag_insc_misc[] =
1245 { "Ma", TR_DEC_MANA, -1 },
1246 { "Th", TR_THROW, -1 },
1247 { "Rf", TR_REFLECT, -1 },
1248 { "Fa", TR_FREE_ACT, -1 },
1249 { "Si", TR_SEE_INVIS, -1 },
1250 { "Hl", TR_HOLD_LIFE, -1 },
1251 { "Sd", TR_SLOW_DIGEST, -1 },
1252 { "Rg", TR_REGEN, -1 },
1253 { "Lv", TR_FEATHER, -1 },
1254 { "Lu", TR_LITE, -1 },
1255 { "Wr", TR_WARNING, -1 },
1256 { "Xm", TR_XTRA_MIGHT, -1 },
1257 { "Xs", TR_XTRA_SHOTS, -1 },
1258 { "Ag", TR_AGGRAVATE, -1 },
1259 { "Bs", TR_BLESSED, -1 },
1260 { "Ty", TR_TY_CURSE, -1 },
1264 static flag_insc_table flag_insc_aura[] =
1266 { "F", TR_SH_FIRE, -1 },
1267 { "E", TR_SH_ELEC, -1 },
1268 { "C", TR_SH_COLD, -1 },
1269 { "M", TR_NO_MAGIC, -1 },
1270 { "T", TR_NO_TELE, -1 },
1274 static flag_insc_table flag_insc_brand[] =
1276 { "A", TR_BRAND_ACID, -1 },
1277 { "E", TR_BRAND_ELEC, -1 },
1278 { "F", TR_BRAND_FIRE, -1 },
1279 { "Co", TR_BRAND_COLD, -1 },
1280 { "P", TR_BRAND_POIS, -1 },
1281 { "Ca", TR_CHAOTIC, -1 },
1282 { "V", TR_VAMPIRIC, -1 },
1283 { "Q", TR_IMPACT, -1 },
1284 { "S", TR_VORPAL, -1 },
1285 { "M", TR_FORCE_WEAPON, -1 },
1289 static flag_insc_table flag_insc_kill[] =
1291 { "*", TR_KILL_EVIL, -1 },
1292 { "p", TR_KILL_HUMAN, -1 },
1293 { "D", TR_KILL_DRAGON, -1 },
1294 { "o", TR_KILL_ORC, -1 },
1295 { "T", TR_KILL_TROLL, -1 },
1296 { "P", TR_KILL_GIANT, -1 },
1297 { "U", TR_KILL_DEMON, -1 },
1298 { "L", TR_KILL_UNDEAD, -1 },
1299 { "Z", TR_KILL_ANIMAL, -1 },
1303 static flag_insc_table flag_insc_slay[] =
1305 { "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1306 { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1307 { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1308 { "o", TR_SLAY_ORC, TR_KILL_ORC },
1309 { "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1310 { "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1311 { "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1312 { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1313 { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1317 static flag_insc_table flag_insc_esp1[] =
1319 { "Tele", TR_TELEPATHY, -1 },
1320 { "Evil", TR_ESP_EVIL, -1 },
1321 { "Good", TR_ESP_GOOD, -1 },
1322 { "Nolv", TR_ESP_NONLIVING, -1 },
1323 { "Uniq", TR_ESP_UNIQUE, -1 },
1327 static flag_insc_table flag_insc_esp2[] =
1329 { "p", TR_ESP_HUMAN, -1 },
1330 { "D", TR_ESP_DRAGON, -1 },
1331 { "o", TR_ESP_ORC, -1 },
1332 { "T", TR_ESP_TROLL, -1 },
1333 { "P", TR_ESP_GIANT, -1 },
1334 { "U", TR_ESP_DEMON, -1 },
1335 { "L", TR_ESP_UNDEAD, -1 },
1336 { "Z", TR_ESP_ANIMAL, -1 },
1340 static flag_insc_table flag_insc_sust[] =
1342 { "St", TR_SUST_STR, -1 },
1343 { "In", TR_SUST_INT, -1 },
1344 { "Wi", TR_SUST_WIS, -1 },
1345 { "Dx", TR_SUST_DEX, -1 },
1346 { "Cn", TR_SUST_CON, -1 },
1347 { "Ch", TR_SUST_CHR, -1 },
1352 /* Simple macro for get_inscription() */
1353 #define ADD_INSC(STR) (void)(ptr = object_desc_str(ptr, (STR)))
1356 * Helper function for get_inscription()
1358 static char *inscribe_flags_aux(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE], bool kanji, char *ptr)
1360 while (fi_ptr->english)
1362 if (have_flag(flgs, fi_ptr->flag) &&
1363 (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1365 ADD_INSC(kanji ? fi_ptr->japanese : fi_ptr->english);
1367 ADD_INSC(fi_ptr->english);
1377 * Special variation of have_flag for auto-inscription
1379 static bool have_flag_of(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE])
1381 while (fi_ptr->english)
1383 if (have_flag(flgs, fi_ptr->flag) &&
1384 (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1394 * Get object inscription with auto inscription of object flags.
1396 static void get_inscription(char *buff, object_type *o_ptr)
1398 cptr insc = quark_str(o_ptr->inscription);
1400 char *prev_ptr = buff;
1402 u32b flgs[TR_FLAG_SIZE];
1404 /* Not fully identified */
1405 if (!(o_ptr->ident & IDENT_MENTAL))
1407 /* Copy until end of line or '#' */
1410 if (*insc == '#') break;
1412 if (iskanji(*insc)) *buff++ = *insc++;
1421 /* Extract the flags */
1422 object_flags(o_ptr, flgs);
1426 for (; *insc; insc++)
1431 /* Ignore fake artifact inscription */
1432 if (*insc == '#') break;
1434 /* {%} will be automatically converted */
1435 else if ('%' == *insc)
1437 cptr start_percent = ptr;
1449 if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3])
1459 /* check for too long inscription */
1460 if (ptr >= buff + MAX_NLEN) continue;
1462 /* Remove obvious flags */
1465 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1469 for (j = 0; j < TR_FLAG_SIZE; j++)
1470 flgs[j] &= ~k_ptr->flags[j];
1474 artifact_type *a_ptr = &a_info[o_ptr->name1];
1476 for (j = 0; j < TR_FLAG_SIZE; j++)
1477 flgs[j] &= ~a_ptr->flags[j];
1482 bool teleport = have_flag(flgs, TR_TELEPORT);
1483 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1485 for (j = 0; j < TR_FLAG_SIZE; j++)
1486 flgs[j] &= ~e_ptr->flags[j];
1488 /* Always inscribe {.} for random teleport */
1489 if (teleport) add_flag(flgs, TR_TELEPORT);
1495 if (have_flag_of(flag_insc_plus, flgs))
1500 ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr);
1503 if (have_flag_of(flag_insc_immune, flgs))
1505 if (!kanji && ptr != prev_ptr)
1512 ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr);
1515 if (have_flag_of(flag_insc_resistance, flgs))
1519 else if (ptr != prev_ptr)
1525 ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr);
1528 if (have_flag_of(flag_insc_misc, flgs))
1530 if (ptr != prev_ptr)
1536 ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr);
1539 if (have_flag_of(flag_insc_aura, flgs))
1543 ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr);
1546 if (have_flag_of(flag_insc_brand, flgs))
1548 ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr);
1551 if (have_flag_of(flag_insc_kill, flgs))
1553 ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr);
1556 if (have_flag_of(flag_insc_slay, flgs))
1558 ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr);
1563 if (have_flag_of(flag_insc_esp1, flgs) ||
1564 have_flag_of(flag_insc_esp2, flgs))
1566 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1567 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1571 if (have_flag_of(flag_insc_esp1, flgs))
1573 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1574 if (have_flag_of(flag_insc_esp2, flgs))
1576 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1579 /* Random Teleport */
1580 if (have_flag(flgs, TR_TELEPORT))
1586 if (have_flag_of(flag_insc_sust, flgs))
1590 ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr);
1592 if (ptr == start_percent)
1606 * Creates a description of the item "o_ptr", and stores it in "out_val".
1608 * One can choose the "verbosity" of the description, including whether
1609 * or not the "number" of items should be described, and how much detail
1610 * should be used when describing the item.
1612 * The given "buf" must be MAX_NLEN chars long to hold the longest possible
1613 * description, which can get pretty long, including incriptions, such as:
1614 * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".
1615 * Note that the inscription will be clipped to keep the total description
1616 * under MAX_NLEN-1 chars (plus a terminator).
1618 * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,
1619 * portable, versions of some common "sprintf()" commands.
1621 * Note that all ego-items (when known) append an "Ego-Item Name", unless
1622 * the item is also an artifact, which should NEVER happen.
1624 * Note that all artifacts (when known) append an "Artifact Name", so we
1625 * have special processing for "Specials" (artifact Lites, Rings, Amulets).
1626 * The "Specials" never use "modifiers" if they are "known", since they
1627 * have special "descriptions", such as "The Necklace of the Dwarves".
1629 * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),
1630 * plus the artifact name, just like any other artifact, if known.
1632 * Special Ring's and Amulet's, if not "aware", use the same code as normal
1633 * rings and amulets, and if "aware", use the "k_info" base-name (Ring or
1634 * Amulet or Necklace). They will NEVER "append" the "k_info" name. But,
1635 * they will append the artifact name, just like any artifact, if known.
1637 * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.
1639 * If "pref" then a "numeric" prefix will be pre-pended.
1642 * 0 -- The Cloak of Death
1643 * 1 -- The Cloak of Death [1,+3]
1644 * 2 -- The Cloak of Death [1,+3] (+2 to Stealth)
1645 * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
1647 void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
1649 cptr basenm, modstr;
1650 int power, indexx, i;
1656 bool append_name = FALSE;
1659 bool show_weapon = FALSE;
1660 bool show_armour = FALSE;
1665 char p1 = '(', p2 = ')';
1666 char b1 = '[', b2 = ']';
1667 char c1 = '{', c2 = '}';
1669 char tmp_val[MAX_NLEN+160];
1670 char tmp_val2[MAX_NLEN+10];
1672 u32b flgs[TR_FLAG_SIZE];
1674 object_type *bow_ptr;
1677 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1679 /* Extract some flags */
1680 object_flags(o_ptr, flgs);
1682 /* See if the object is "aware" */
1683 if (object_aware_p(o_ptr) || (o_ptr->ident & IDENT_MENTAL)) aware = TRUE;
1685 /* See if the object is "known" */
1686 if (object_known_p(o_ptr)) known = TRUE;
1688 /* Hack -- Extract the sub-type "indexx" */
1689 indexx = o_ptr->sval;
1691 /* Extract default "base" string */
1692 basenm = get_object_name(o_ptr);
1694 /* Assume no "modifier" string */
1698 /* Analyze the object */
1699 switch (o_ptr->tval)
1701 /* Some objects are easy to describe */
1715 monster_race *r_ptr = &r_info[o_ptr->pval];
1724 modstr = " (empty)";
1730 sprintf(tmp_val2, "¡Ê%s¡Ë",r_name + r_ptr->name);
1733 cptr t = r_name + r_ptr->name;
1735 if (!(r_ptr->flags1 & RF1_UNIQUE))
1737 sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t);
1743 sprintf(tmp_val2, "(%s)", t);
1753 /* Figurines/Statues */
1757 monster_race *r_ptr = &r_info[o_ptr->pval];
1760 modstr = r_name + r_ptr->name;
1762 cptr t = r_name + r_ptr->name;
1764 if (!(r_ptr->flags1 & RF1_UNIQUE))
1766 sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t);
1783 monster_race *r_ptr = &r_info[o_ptr->pval];
1785 modstr = r_name + r_ptr->name;
1789 sprintf(tmp_val2, "#%s", basenm);
1791 if (r_ptr->flags1 & RF1_UNIQUE)
1793 sprintf(tmp_val2, "& %s %s", basenm, "of #");
1797 sprintf(tmp_val2, "& # %s", basenm);
1806 /* Missiles/ Bows/ Weapons */
1837 /* Lites (including a few "Specials") */
1843 /* Amulets (including a few "Specials") */
1846 /* Known artifacts */
1847 if (artifact_p(o_ptr) && aware) break;
1849 if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break;
1851 /* Color the object */
1852 modstr = amulet_adj[indexx];
1854 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1856 basenm = aware ? "%¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "¥¢¥ß¥å¥ì¥Ã¥È";
1858 basenm = aware ? "#%¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "#¥¢¥ß¥å¥ì¥Ã¥È";
1860 basenm = "& Amulet~";
1862 basenm = aware ? "& # Amulet~" : "& # Amulet~";
1864 if (aware) append_name = TRUE;
1870 /* Rings (including a few "Specials") */
1873 /* Known artifacts */
1874 if (artifact_p(o_ptr) && aware) break;
1876 if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break;
1878 /* Color the object */
1879 modstr = ring_adj[indexx];
1881 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1883 basenm = aware ? "%¤Î»ØÎØ" : "»ØÎØ";
1885 basenm = aware ? "#%¤Î»ØÎØ" : "#»ØÎØ";
1889 basenm = aware ? "& # Ring~" : "& # Ring~";
1891 if (aware) append_name = TRUE;
1894 if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE;
1906 /* Color the object */
1907 modstr = staff_adj[indexx];
1909 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1911 basenm = aware ? "%¤Î¾ó" : "¾ó";
1913 basenm = aware ? "#%¤Î¾ó" : "#¾ó";
1915 basenm = "& Staff~";
1917 basenm = aware ? "& # Staff~" : "& # Staff~";
1919 if (aware) append_name = TRUE;
1927 /* Color the object */
1928 modstr = wand_adj[indexx];
1930 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1932 basenm = aware? "%¤ÎËâË¡ËÀ":"ËâË¡ËÀ";
1934 basenm = aware ? "#%¤ÎËâË¡ËÀ" : "#ËâË¡ËÀ";
1938 basenm = aware ? "& # Wand~" : "& # Wand~";
1940 if (aware) append_name = TRUE;
1948 /* Color the object */
1949 modstr = rod_adj[indexx];
1951 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1953 basenm = aware? "%¤Î¥í¥Ã¥É":"¥í¥Ã¥É";
1955 basenm = aware ? "#%¤Î¥í¥Ã¥É" : "#¥í¥Ã¥É";
1959 basenm = aware ? "& # Rod~" : "& # Rod~";
1961 if (aware) append_name = TRUE;
1969 /* Color the object */
1970 modstr = scroll_adj[indexx];
1972 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1974 basenm = aware ? "%¤Î´¬Êª" : "´¬Êª";
1976 basenm = aware ? "¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª" : "¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª";
1978 basenm = "& Scroll~";
1980 basenm = aware ? "& Scroll~ titled \"#\"" : "& Scroll~ titled \"#\"";
1982 if (aware) append_name = TRUE;
1990 /* Color the object */
1991 modstr = potion_adj[indexx];
1993 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
1995 basenm = aware ? "%¤ÎÌô" : "Ìô";
1997 basenm = aware ? "#%¤ÎÌô" : "#Ìô";
1999 basenm = "& Potion~";
2001 basenm = aware ? "& # Potion~" : "& # Potion~";
2003 if (aware) append_name = TRUE;
2011 /* Ordinary food is "boring" */
2012 if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break;
2014 /* Color the object */
2015 modstr = food_adj[indexx];
2017 if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB)
2019 basenm = aware ? "%¤Î¥¥Î¥³" : "¥¥Î¥³";
2021 basenm = aware ? "#%¤Î¥¥Î¥³" : "#¥¥Î¥³";
2023 basenm = "& Mushroom~";
2025 basenm = aware ? "& # Mushroom~" : "& # Mushroom~";
2027 if (aware) append_name = TRUE;
2037 basenm = "ÍÓÈé»æ - #";
2039 basenm = "& Parchement~ - #";
2049 basenm = "À¸Ì¿¤ÎËâË¡½ñ#";
2051 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2052 basenm = "& Book~ of Life Magic #";
2054 basenm = "& Life Spellbook~ #";
2060 case TV_SORCERY_BOOK:
2064 basenm = "Àç½Ñ¤ÎËâË¡½ñ#";
2066 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2067 basenm = "& Book~ of Sorcery #";
2069 basenm = "& Sorcery Spellbook~ #";
2075 case TV_NATURE_BOOK:
2079 basenm = "¼«Á³¤ÎËâË¡½ñ#";
2081 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2082 basenm = "& Book~ of Nature Magic #";
2084 basenm = "& Nature Spellbook~ #";
2094 basenm = "¥«¥ª¥¹¤ÎËâË¡½ñ#";
2096 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2097 basenm = "& Book~ of Chaos Magic #";
2099 basenm = "& Chaos Spellbook~ #";
2109 basenm = "°Å¹õ¤ÎËâË¡½ñ#";
2111 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2112 basenm = "& Book~ of Death Magic #";
2114 basenm = "& Death Spellbook~ #";
2124 basenm = "¥È¥é¥ó¥×¤ÎËâË¡½ñ#";
2126 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2127 basenm = "& Book~ of Trump Magic #";
2129 basenm = "& Trump Spellbook~ #";
2135 case TV_ARCANE_BOOK:
2139 basenm = "Èë½Ñ¤ÎËâË¡½ñ#";
2141 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2142 basenm = "& Book~ of Arcane Magic #";
2144 basenm = "& Arcane Spellbook~ #";
2149 case TV_ENCHANT_BOOK:
2153 basenm = "¾¢¤ÎËâË¡½ñ#";
2155 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2156 basenm = "& Book~ of Craft Magic #";
2158 basenm = "& Craft Spellbook~ #";
2163 case TV_DAEMON_BOOK:
2167 basenm = "°Ëâ¤ÎËâË¡½ñ#";
2169 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2170 basenm = "& Book~ of Daemon Magic #";
2172 basenm = "& Daemon Spellbook~ #";
2177 case TV_CRUSADE_BOOK:
2181 basenm = "Ç˼٤ÎËâË¡½ñ#";
2183 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2184 basenm = "& Book~ of Crusade Magic #";
2186 basenm = "& Crusade Spellbook~ #";
2197 basenm = "& Song Book~ #";
2202 case TV_HISSATSU_BOOK:
2206 basenm = "& Éð·Ý¤Î½ñ#";
2208 basenm = "Book~ of Kendo #";
2216 /* Hack -- Gold/Gems */
2219 strcpy(buf, basenm);
2223 /* Used in the "inventory" routine */
2227 strcpy(buf, "(¤Ê¤·)");
2229 strcpy(buf, "(nothing)");
2236 /* Use full name from k_info or a_info */
2237 if (aware && have_flag(flgs, TR_FULL_NAME))
2239 if (known && o_ptr->name1) basenm = a_name + a_info[o_ptr->name1].name;
2240 else basenm = get_object_name(o_ptr);
2242 append_name = FALSE;
2246 /* Start dumping the result */
2250 if (basenm[0] == '&')
2260 else if (o_ptr->number > 1)
2262 if ( change_numeral == FALSE ){
2263 t = object_desc_num(t, o_ptr->number);
2264 if (o_ptr->number > 9)
2265 t = object_desc_str(t, "¸Ä¤Î ");
2267 t = object_desc_str(t, "¤Ä¤Î ");
2271 t = object_desc_kosuu(t,o_ptr);
2272 t = object_desc_str(t, "¤Î ");
2276 /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬
2277 * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë
2279 if (known && artifact_p(o_ptr)) t = object_desc_str(t, "¡ú");
2280 else if (known && o_ptr->art_name) t = object_desc_str(t, "¡ù");
2284 /* The object "expects" a "number" */
2285 if (basenm[0] == '&')
2287 /* Skip the ampersand (and space) */
2296 /* Hack -- None left */
2297 else if (o_ptr->number <= 0)
2299 t = object_desc_str(t, "no more ");
2302 /* Extract the number */
2303 else if (o_ptr->number > 1)
2305 t = object_desc_num(t, o_ptr->number);
2306 t = object_desc_chr(t, ' ');
2309 /* Hack -- The only one of its kind */
2310 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
2312 t = object_desc_str(t, "The ");
2315 /* Unique corpses are unique */
2316 else if (o_ptr->tval == TV_CORPSE)
2318 monster_race *r_ptr = &r_info[o_ptr->pval];
2320 if (r_ptr->flags1 & RF1_UNIQUE)
2322 t = object_desc_str(t, "The ");
2326 /* A single one, with a vowel in the modifier */
2327 else if ((*s == '#') && (is_a_vowel(modstr[0])))
2329 t = object_desc_str(t, "an ");
2332 /* A single one, with a vowel */
2333 else if (is_a_vowel(*s))
2335 t = object_desc_str(t, "an ");
2338 /* A single one, without a vowel */
2341 t = object_desc_str(t, "a ");
2345 /* Hack -- objects that "never" take an article */
2357 /* Hack -- all gone */
2358 else if (o_ptr->number <= 0)
2360 t = object_desc_str(t, "no more ");
2363 /* Prefix a number if required */
2364 else if (o_ptr->number > 1)
2366 t = object_desc_num(t, o_ptr->number);
2367 t = object_desc_chr(t, ' ');
2370 /* Hack -- The only one of its kind */
2371 else if (known && (artifact_p(o_ptr) || o_ptr->art_name))
2373 t = object_desc_str(t, "The ");
2376 /* Hack -- single items get no prefix */
2384 /* Paranoia -- skip illegal tildes */
2385 /* while (*s == '~') s++; */
2388 if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
2390 t = object_desc_str(t,format("ÃÃÌê»Õ%s¤Î",player_name));
2393 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */
2395 /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */
2396 if (o_ptr->art_name)
2398 strcpy(temp, quark_str(o_ptr->art_name));
2399 /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2400 /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */
2401 if ( strncmp( temp , "of ",3)==0 ) {t=object_desc_str(t,&temp[3]);t=object_desc_str(t,"¤Î");}
2403 if ( strncmp( temp , "¡Ø" , 2 ) != 0 && temp[0]!='\'')
2404 t=object_desc_str(t, temp);
2406 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */
2407 else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME)) {
2408 artifact_type *a_ptr = &a_info[o_ptr->name1];
2409 /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2410 if ( strncmp( (a_name + a_ptr->name), "¡Ø" , 2) != 0){
2411 t=object_desc_str(t, (a_name + a_ptr->name));
2414 /* ̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */
2415 else if (o_ptr->name2) {
2416 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2417 t=object_desc_str(t, (e_name + e_ptr->name));
2421 /* Copy the string */
2430 /* Add a plural if needed */
2431 if (pref && o_ptr->number != 1)
2435 /* XXX XXX XXX Mega-Hack */
2437 /* Hack -- "Cutlass-es" and "Torch-es" */
2438 if ((k == 's') || (k == 'h')) *t++ = 'e';
2450 /* Insert the modifier */
2451 for (u = modstr; *u; u++) *t++ = *u;
2456 /* saigo ¤ÎÂå¤ï¤ê¡£¸úǽ¤òÉÕ²½¤¹¤ë by ita*/
2458 modstr=get_object_name(o_ptr);
2459 for (u = modstr; *u; u++) *t++ = *u;
2474 /* Append the "kind name" to the "base name" */
2478 t = object_desc_str(t, " of ");
2479 t = object_desc_str(t, get_object_name(o_ptr));
2485 /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */
2487 /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤ËµÏ¿
2488 ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */
2489 if (o_ptr->art_name)
2490 { char temp[256];int itemp;
2491 strcpy(temp, quark_str(o_ptr->art_name));
2492 /* MEGA HACK by ita*/
2493 if ( strncmp( temp , "¡Ø" , 2 ) == 0 ) t=object_desc_str(t, temp);else
2494 if( temp[0]=='\'' ) { itemp=strlen(temp);temp[itemp-1]=0;
2495 t=object_desc_str(t,"¡Ø");
2496 t=object_desc_str(t,&temp[1]);
2497 t=object_desc_str(t,"¡Ù");}
2500 else if (o_ptr->name1) {
2501 artifact_type *a_ptr = &a_info[o_ptr->name1];
2502 if ( strncmp( (a_name + a_ptr->name) , "¡Ø" , 2 ) == 0 ){
2503 t=object_desc_str(t, (a_name + a_ptr->name));
2506 else if (o_ptr->inscription)
2508 cptr str = quark_str(o_ptr->inscription);
2517 if (*str == '#') break;
2523 cptr str = strchr(quark_str(o_ptr->inscription), '#');
2525 /* Add the false name */
2526 t=object_desc_str(t,"¡Ø");
2527 t = object_desc_str(t, &str[1]);
2528 t=object_desc_str(t,"¡Ù");
2533 if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3)
2535 t = object_desc_str(t,format(" of %s the Smith",player_name));
2538 /* Hack -- Append "Artifact" or "Special" names */
2539 if (known && !have_flag(flgs, TR_FULL_NAME))
2541 /* Is it a new random artifact ? */
2542 if (o_ptr->art_name)
2544 t = object_desc_chr(t, ' ');
2546 t = object_desc_str(t, quark_str(o_ptr->art_name));
2549 /* Grab any artifact name */
2550 else if (o_ptr->name1)
2552 artifact_type *a_ptr = &a_info[o_ptr->name1];
2554 t = object_desc_chr(t, ' ');
2555 t = object_desc_str(t, (a_name + a_ptr->name));
2558 /* Grab any ego-item name */
2563 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2565 t = object_desc_chr(t, ' ');
2566 t = object_desc_str(t, (e_name + e_ptr->name));
2569 if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#'))
2572 cptr str = strchr(quark_str(o_ptr->inscription), '#');
2574 /* Add the false name */
2575 t = object_desc_chr(t, ' ');
2576 t = object_desc_str(t, &str[1]);
2584 /* No more details wanted */
2585 if (mode < 1) goto copyback;
2587 /* Hack -- Chests must be described in detail */
2588 if (o_ptr->tval == TV_CHEST)
2590 /* Not searched yet */
2596 /* May be "empty" */
2597 else if (!o_ptr->pval)
2600 t = object_desc_str(t, "(¶õ)");
2602 t = object_desc_str(t, " (empty)");
2607 /* May be "disarmed" */
2608 else if (o_ptr->pval < 0)
2610 if (chest_traps[0 - o_ptr->pval])
2613 t = object_desc_str(t, "(²ò½üºÑ)");
2615 t = object_desc_str(t, " (disarmed)");
2622 t = object_desc_str(t, "(Èó»Ü¾û)");
2624 t = object_desc_str(t, " (unlocked)");
2630 /* Describe the traps, if any */
2633 /* Describe the traps */
2634 switch (chest_traps[o_ptr->pval])
2639 t = object_desc_str(t, "(»Ü¾û)");
2641 t = object_desc_str(t, " (Locked)");
2646 case CHEST_LOSE_STR:
2649 t = object_desc_str(t, "(ÆÇ¿Ë)");
2651 t = object_desc_str(t, " (Poison Needle)");
2656 case CHEST_LOSE_CON:
2659 t = object_desc_str(t, "(ÆÇ¿Ë)");
2661 t = object_desc_str(t, " (Poison Needle)");
2669 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2671 t = object_desc_str(t, " (Gas Trap)");
2676 case CHEST_PARALYZE:
2679 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2681 t = object_desc_str(t, " (Gas Trap)");
2689 t = object_desc_str(t, "(ÇúȯÁõÃÖ)");
2691 t = object_desc_str(t, " (Explosion Device)");
2697 case CHEST_BIRD_STORM:
2698 case CHEST_E_SUMMON:
2699 case CHEST_H_SUMMON:
2702 t = object_desc_str(t, "(¾¤´¤Î¥ë¡¼¥ó)");
2704 t = object_desc_str(t, " (Summoning Runes)");
2709 case CHEST_RUNES_OF_EVIL:
2712 t = object_desc_str(t, "(¼Ù°¤Ê¥ë¡¼¥ó)");
2714 t = object_desc_str(t, " (Gleaming Black Runes)");
2722 t = object_desc_str(t, "(·ÙÊóÁõÃÖ)");
2724 t = object_desc_str(t, " (Alarm)");
2732 t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)");
2734 t = object_desc_str(t, " (Multiple Traps)");
2744 /* Display the item like a weapon */
2745 if (have_flag(flgs, TR_SHOW_MODS)) show_weapon = TRUE;
2747 /* Display the item like a weapon */
2748 if ((o_ptr->tval > TV_CAPTURE) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE))
2751 /* Display the item like a weapon */
2752 if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
2754 /* Display the item like armour */
2755 if (o_ptr->ac) show_armour = TRUE;
2758 /* Dump base weapon info */
2759 switch (o_ptr->tval)
2761 /* Missiles and Weapons */
2770 /* Append a "damage" string */
2771 t = object_desc_chr(t, ' ');
2772 t = object_desc_chr(t, p1);
2773 t = object_desc_num(t, o_ptr->dd);
2774 t = object_desc_chr(t, 'd');
2775 t = object_desc_num(t, o_ptr->ds);
2776 t = object_desc_chr(t, p2);
2782 /* Bows get a special "damage string" */
2785 /* Mega-Hack -- Extract the "base power" */
2786 power = bow_tmul(o_ptr->sval);
2788 /* Apply the "Extra Might" flag */
2789 if (have_flag(flgs, TR_XTRA_MIGHT)) power++;
2791 /* Append a special "damage" string */
2792 t = object_desc_chr(t, ' ');
2793 t = object_desc_chr(t, p1);
2794 t = object_desc_chr(t, 'x');
2795 t = object_desc_num(t, power);
2796 t = object_desc_chr(t, p2);
2803 /* Add the weapon bonuses */
2806 /* Show the tohit/todam on request */
2809 t = object_desc_chr(t, ' ');
2810 t = object_desc_chr(t, p1);
2811 t = object_desc_int(t, o_ptr->to_h);
2812 t = object_desc_chr(t, ',');
2813 t = object_desc_int(t, o_ptr->to_d);
2814 t = object_desc_chr(t, p2);
2817 /* Show the tohit if needed */
2818 else if (o_ptr->to_h)
2820 t = object_desc_chr(t, ' ');
2821 t = object_desc_chr(t, p1);
2822 t = object_desc_int(t, o_ptr->to_h);
2823 t = object_desc_chr(t, p2);
2826 /* Show the todam if needed */
2827 else if (o_ptr->to_d)
2829 t = object_desc_chr(t, ' ');
2830 t = object_desc_chr(t, p1);
2831 t = object_desc_int(t, o_ptr->to_d);
2832 t = object_desc_chr(t, p2);
2836 bow_ptr = &inventory[INVEN_BOW];
2838 /* if have a firing weapon + ammo matches bow*/
2839 if (bow_ptr->k_idx &&
2840 (((bow_ptr->sval == SV_SLING) && (o_ptr->tval == TV_SHOT)) ||
2841 (((bow_ptr->sval == SV_SHORT_BOW) ||
2842 (bow_ptr->sval == SV_LONG_BOW) ||
2843 (bow_ptr->sval == SV_NAMAKE_BOW)) && (o_ptr->tval == TV_ARROW)) ||
2844 (((bow_ptr->sval == SV_LIGHT_XBOW) ||
2845 (bow_ptr->sval == SV_HEAVY_XBOW)) && (o_ptr->tval == TV_BOLT))))
2851 avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2;
2853 /* See if the bow is "known" - then set damage bonus*/
2854 if (object_known_p(bow_ptr))
2856 avgdam += (bow_ptr->to_d * 10);
2859 /* effect of ammo */
2860 if (known) avgdam += (o_ptr->to_d * 10);
2862 energy_fire = bow_energy(bow_ptr->sval);
2863 tmul = bow_tmul(bow_ptr->sval);
2865 /* Get extra "power" from "extra might" */
2866 if (p_ptr->xtra_might) tmul++;
2868 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2870 /* launcher multiplier */
2872 avgdam /= (100 * 10);
2873 if (avgdam < 0) avgdam = 0;
2875 /* display (shot damage/ avg damage) */
2876 t = object_desc_chr(t, ' ');
2877 t = object_desc_chr(t, p1);
2878 t = object_desc_num(t, avgdam);
2879 t = object_desc_chr(t, '/');
2881 if (p_ptr->num_fire == 0)
2883 t = object_desc_chr(t, '0');
2887 /* calc effects of energy */
2888 avgdam *= (p_ptr->num_fire * 100);
2890 avgdam /= energy_fire;
2892 t = object_desc_num(t, avgdam);
2895 t = object_desc_chr(t, p2);
2897 else if ((p_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE))
2902 if (p_ptr->mighty_throw)
2906 avgdam += ((p_ptr->lev+30)*(p_ptr->lev+30)-900)/55;
2908 energy_fire = 100 - p_ptr->lev;
2910 /* display (shot damage/ avg damage) */
2911 t = object_desc_chr(t, ' ');
2912 t = object_desc_chr(t, p1);
2913 t = object_desc_num(t, avgdam);
2914 t = object_desc_chr(t, '/');
2916 /* calc effects of energy */
2917 avgdam = 100 * avgdam / energy_fire;
2919 t = object_desc_num(t, avgdam);
2921 t = object_desc_chr(t, p2);
2925 /* Add the armor bonuses */
2928 /* Show the armor class info */
2931 t = object_desc_chr(t, ' ');
2932 t = object_desc_chr(t, b1);
2933 t = object_desc_num(t, o_ptr->ac);
2934 t = object_desc_chr(t, ',');
2935 t = object_desc_int(t, o_ptr->to_a);
2936 t = object_desc_chr(t, b2);
2939 /* No base armor, but does increase armor */
2940 else if (o_ptr->to_a)
2942 t = object_desc_chr(t, ' ');
2943 t = object_desc_chr(t, b1);
2944 t = object_desc_int(t, o_ptr->to_a);
2945 t = object_desc_chr(t, b2);
2949 /* Hack -- always show base armor */
2950 else if (show_armour)
2952 t = object_desc_chr(t, ' ');
2953 t = object_desc_chr(t, b1);
2954 t = object_desc_num(t, o_ptr->ac);
2955 t = object_desc_chr(t, b2);
2959 /* No more details wanted */
2960 if (mode < 2) goto copyback;
2964 * Hack -- Wands and Staffs have charges. Make certain how many charges
2965 * a stack of staffs really has is clear. -LM-
2968 ((o_ptr->tval == TV_STAFF) ||
2969 (o_ptr->tval == TV_WAND)))
2971 /* Dump " (N charges)" */
2972 t = object_desc_chr(t, ' ');
2973 t = object_desc_chr(t, p1);
2975 /* Clear explaination for staffs. */
2976 if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1))
2978 t = object_desc_num(t, o_ptr->number);
2979 t = object_desc_str(t, "x ");
2981 t = object_desc_num(t, o_ptr->pval);
2983 t = object_desc_str(t, "²óʬ");
2985 t = object_desc_str(t, " charge");
2987 if (o_ptr->pval != 1)
2989 t = object_desc_chr(t, 's');
2994 t = object_desc_chr(t, p2);
2996 /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may
2997 * be in any state of charge or discharge, this now includes a number. -LM-
2999 else if (known && (o_ptr->tval == TV_ROD))
3001 /* Hack -- Dump " (# charging)" if relevant */
3004 /* Stacks of rods display an exact count of charging rods. */
3005 if (o_ptr->number > 1)
3008 if (k_ptr->pval == 0) k_ptr->pval = 1;
3010 /* Find out how many rods are charging, by dividing
3011 * current timeout by each rod's maximum timeout.
3012 * Ensure that any remainder is rounded up. Display
3013 * very discharged stacks as merely fully discharged.
3015 power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
3016 if (power > o_ptr->number) power = o_ptr->number;
3018 /* Display prettily. */
3019 t = object_desc_str(t, " (");
3020 t = object_desc_num(t, power);
3022 t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)");
3024 t = object_desc_str(t, " charging)");
3029 /* "one Rod of Perception (1 charging)" would look tacky. */
3033 t = object_desc_str(t, "(½¼Å¶Ãæ)");
3035 t = object_desc_str(t, " (charging)");
3042 /* Dump "pval" flags for wearable items */
3043 if (known && (have_pval_flags(flgs)))
3045 /* Start the display */
3046 t = object_desc_chr(t, ' ');
3047 t = object_desc_chr(t, p1);
3049 /* Dump the "pval" itself */
3050 t = object_desc_int(t, o_ptr->pval);
3052 /* Do not display the "pval" flags */
3053 if (have_flag(flgs, TR_HIDE_TYPE))
3059 else if (have_flag(flgs, TR_SPEED))
3061 /* Dump " to speed" */
3063 t = object_desc_str(t, "²Ã®");
3065 t = object_desc_str(t, " to speed");
3071 else if (have_flag(flgs, TR_BLOWS))
3075 t = object_desc_str(t, "¹¶·â");
3077 t = object_desc_str(t, " attack");
3080 if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
3086 else if (have_flag(flgs, TR_STEALTH))
3088 /* Dump " to stealth" */
3090 t = object_desc_str(t, "±£Ì©");
3092 t = object_desc_str(t, " to stealth");
3098 else if (have_flag(flgs, TR_SEARCH))
3100 /* Dump " to searching" */
3102 t = object_desc_str(t, "õº÷");
3104 t = object_desc_str(t, " to searching");
3110 else if (have_flag(flgs, TR_INFRA))
3112 /* Dump " to infravision" */
3114 t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ");
3116 t = object_desc_str(t, " to infravision");
3122 else if (have_flag(flgs, TR_TUNNEL))
3127 /* Finish the display */
3128 t = object_desc_chr(t, p2);
3131 /* Hack -- Process Lanterns/Torches */
3132 if (known && (o_ptr->tval == TV_LITE) && (!(artifact_p(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR))))
3134 /* Hack -- Turns of light for normal lites */
3136 t = object_desc_str(t, "(");
3138 t = object_desc_str(t, " (with ");
3141 if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4*2);
3142 else t = object_desc_num(t, o_ptr->xtra4);
3144 t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)");
3146 t = object_desc_str(t, " turns of light)");
3152 /* Indicate charging objects, but not rods. */
3153 if (known && o_ptr->timeout && o_ptr->tval != TV_ROD)
3155 /* Hack -- Dump " (charging)" if relevant */
3157 t = object_desc_str(t, "(½¼Å¶Ãæ)");
3159 t = object_desc_str(t, " (charging)");
3165 /* No more details wanted */
3166 if (mode < 3) goto copyback;
3169 /* No inscription yet */
3172 /* Use the game-generated "feeling" otherwise, if available */
3175 strcpy(tmp_val2, game_inscriptions[o_ptr->feeling]);
3178 /* Note "cursed" if the item is known to be cursed */
3179 else if (cursed_p(o_ptr) && (known || (o_ptr->ident & (IDENT_SENSE))))
3182 strcpy(tmp_val2, "¼ö¤ï¤ì¤Æ¤¤¤ë");
3184 strcpy(tmp_val2, "cursed");
3189 /* Note "unidentified" if the item is unidentified */
3190 else if ((o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET
3191 || o_ptr->tval == TV_LITE || o_ptr->tval == TV_FIGURINE)
3192 && object_aware_p(o_ptr) && !object_known_p(o_ptr)
3193 && !((o_ptr->ident)&IDENT_SENSE))
3196 strcpy(tmp_val2, "̤´ÕÄê");
3198 strcpy(tmp_val2, "unidentified");
3202 /* Mega-Hack -- note empty wands/staffs */
3203 else if (!known && (o_ptr->ident & (IDENT_EMPTY)))
3206 strcpy(tmp_val2, "¶õ");
3208 strcpy(tmp_val2, "empty");
3213 /* Note "tried" if the object has been tested unsuccessfully */
3214 else if (!aware && object_tried_p(o_ptr))
3217 strcpy(tmp_val2, "̤ȽÌÀ");
3219 strcpy(tmp_val2, "tried");
3224 /* Use the standard inscription if available */
3225 if (o_ptr->inscription)
3229 if (tmp_val2[0]) strcat(tmp_val2, ", ");
3231 /* Get inscription and convert {%} */
3232 get_inscription(buff, o_ptr);
3234 /* strcat with correct treating of kanji */
3235 my_strcat(tmp_val2, buff, sizeof(tmp_val2));
3238 /* Note the discount, if any */
3239 else if (o_ptr->discount && !(tmp_val2[0]))
3241 (void)object_desc_num(tmp_val2, o_ptr->discount);
3243 strcat(tmp_val2, "%°ú¤");
3245 strcat(tmp_val2, "% off");
3250 /* Append the inscription, if any */
3253 /* Append the inscription */
3254 t = object_desc_chr(t, ' ');
3255 t = object_desc_chr(t, c1);
3256 t = object_desc_str(t, tmp_val2);
3257 t = object_desc_chr(t, c2);
3262 for (i = 0; i < MAX_NLEN-2; i++)
3265 if (iskanji(*(t+i)))
3273 if (i == MAX_NLEN-2)
3276 if (iskanji(*(t+i)))
3282 *(buf+MAX_NLEN-1) = '\0';