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 30 /* Used with amulets (min 14) */
30 #define MAX_WOODS 34 /* Used with staffs (min 30) */
31 #define MAX_METALS 40 /* Used with wands/rods (min 29/29) */
32 #define MAX_COLORS 70 /* Used with potions (min 60) */
33 #define MAX_SHROOM 20 /* Used with mushrooms (min 20) */
34 #define MAX_TITLES 55 /* Used with scrolls (min 48) */
35 #define MAX_SYLLABLES 164 /* Used with scrolls (see below) */
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",
109 "Ruby", "Emerald", "Sapphire", "Garnet", "Diamond"
113 "àèàá¤Î","ήÌÚ¤Î","¥µ¥ó¥´¤Î","¤á¤Î¤¦¤Î","¾Ý²ç¤Î",
114 "¹õÍËÀФÎ","¹ü¤Î","¿¿ï«¤Î","ÀÄƼ¤Î","¤·¤í¤á¤Î",
115 "¤Ù¤Ã¹Ã¤Î","¶â¤Î","ÎÜÍþ¤Î","¿å¾½¤Î","¶ä¤Î",
116 "Ƽ¤Î","ÒĤÎ", "¥×¥é¥Á¥Ê¤Î", "¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","»¬¤Ó¤¿",
117 "¶Ê¤¬¤Ã¤¿", "¥É¥é¥´¥ó¤ÎÄÞ¤Î", "¿ô¼î¤Î", "¤Ò¤¹¤¤¤Î", "¥ß¥¹¥ê¥ë¤Î",
118 "¥ë¥Ó¡¼¤Î", "¥¨¥á¥é¥ë¥É¤Î", "¥µ¥Õ¥¡¥¤¥¢¤Î", "¥¬¡¼¥Í¥Ã¥È¤Î", "¥À¥¤¥¢¥â¥ó¥É¤Î"
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,
129 TERM_RED, TERM_GREEN, TERM_BLUE, TERM_RED, TERM_WHITE
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]);
498 * Prepare the "variable" part of the "k_info" array.
500 * The "color"/"metal"/"type" of an item is its "flavor".
501 * For the most part, flavors are assigned randomly each game.
503 * Initialize descriptions for the "colored" objects, including:
504 * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.
506 * The first 4 entries for potions are fixed (Water, Apple Juice,
507 * Slime Mold Juice, Unused Potion).
509 * Scroll titles are always between 6 and 14 letters long. This is
510 * ensured because every title is composed of whole words, where every
511 * word is from 1 to 8 letters long (one or two syllables of 1 to 4
512 * letters each), and that no scroll is finished until it attempts to
513 * grow beyond 15 letters. The first time this can happen is when the
514 * current title has 6 letters and the new word has 8 letters, which
515 * would result in a 6 letter scroll title.
517 * Duplicate titles are avoided by requiring that no two scrolls share
518 * the same first four letters (not the most efficient method, and not
519 * the least efficient method, but it will always work).
521 * Hack -- make sure everything stays the same for each saved game
522 * This is accomplished by the use of a saved "random seed", as in
523 * "town_gen()". Since no other functions are called while the special
524 * seed is in effect, so this function is pretty "safe".
526 * Note that the "hacked seed" may provide an RNG with alternating parity!
528 void flavor_init(void)
537 /* Hack -- Use the "simple" RNG */
540 /* Hack -- Induce consistant flavors */
541 Rand_value = seed_flavor;
544 /* Efficiency -- Rods/Wands share initial array */
545 for (i = 0; i < MAX_METALS; i++)
547 rod_adj[i] = wand_adj[i];
548 rod_col[i] = wand_col[i];
552 /* Rings have "ring colors" */
553 for (i = 0; i < MAX_ROCKS; i++)
555 j = randint0(MAX_ROCKS);
556 temp_adj = ring_adj[i];
557 ring_adj[i] = ring_adj[j];
558 ring_adj[j] = temp_adj;
560 temp_col = ring_col[i];
561 ring_col[i] = ring_col[j];
562 ring_col[j] = temp_col;
565 /* Hack -- The One Ring */
567 ring_adj[SV_RING_POWER] = "¶â̵¹¤¤Î";
568 ring_adj[SV_RING_AHO] = "¶â͹¤¤Î";
570 ring_adj[SV_RING_POWER] = "Plain Gold";
571 ring_adj[SV_RING_AHO] = "Plain Goldarn";
576 ring_col[SV_RING_POWER] = TERM_YELLOW;
577 ring_col[SV_RING_AHO] = TERM_YELLOW;
580 /* Amulets have "amulet colors" */
581 for (i = 0; i < MAX_AMULETS; i++)
583 j = randint0(MAX_AMULETS);
584 temp_adj = amulet_adj[i];
585 amulet_adj[i] = amulet_adj[j];
586 amulet_adj[j] = temp_adj;
588 temp_col = amulet_col[i];
589 amulet_col[i] = amulet_col[j];
590 amulet_col[j] = temp_col;
594 for (i = 0; i < MAX_WOODS; i++)
596 j = randint0(MAX_WOODS);
597 temp_adj = staff_adj[i];
598 staff_adj[i] = staff_adj[j];
599 staff_adj[j] = temp_adj;
601 temp_col = staff_col[i];
602 staff_col[i] = staff_col[j];
603 staff_col[j] = temp_col;
607 for (i = 0; i < MAX_METALS; i++)
609 j = randint0(MAX_METALS);
610 temp_adj = wand_adj[i];
611 wand_adj[i] = wand_adj[j];
612 wand_adj[j] = temp_adj;
614 temp_col = wand_col[i];
615 wand_col[i] = wand_col[j];
616 wand_col[j] = temp_col;
620 for (i = 0; i < MAX_METALS; i++)
622 j = randint0(MAX_METALS);
623 temp_adj = rod_adj[i];
624 rod_adj[i] = rod_adj[j];
625 rod_adj[j] = temp_adj;
627 temp_col = rod_col[i];
628 rod_col[i] = rod_col[j];
629 rod_col[j] = temp_col;
632 /* Foods (Mushrooms) */
633 for (i = 0; i < MAX_SHROOM; i++)
635 j = randint0(MAX_SHROOM);
636 temp_adj = food_adj[i];
637 food_adj[i] = food_adj[j];
638 food_adj[j] = temp_adj;
640 temp_col = food_col[i];
641 food_col[i] = food_col[j];
642 food_col[j] = temp_col;
646 for (i = 4; i < MAX_COLORS; i++)
648 j = randint0(MAX_COLORS - 4) + 4;
649 temp_adj = potion_adj[i];
650 potion_adj[i] = potion_adj[j];
651 potion_adj[j] = temp_adj;
653 temp_col = potion_col[i];
654 potion_col[i] = potion_col[j];
655 potion_col[j] = temp_col;
658 /* Scrolls (random titles, always white) */
659 for (i = 0; i < MAX_TITLES; i++)
661 /* Get a new title */
668 /* Start a new title */
671 /* Collect words until done */
678 /* Start a new word */
681 /* Choose one or two syllables */
682 s = ((randint0(100) < 30) ? 1 : 2);
684 /* Add a one or two syllable word */
685 for (q = 0; q < s; q++)
687 /* Add the syllable */
688 strcat(tmp, syllables[randint0(MAX_SYLLABLES)]);
691 /* Stop before getting too long */
692 if (strlen(buf) + 1 + strlen(tmp) > 15) break;
702 strcpy(scroll_adj[i], buf+1);
707 /* Check for "duplicate" scroll titles */
708 for (j = 0; j < i; j++)
710 cptr hack1 = scroll_adj[j];
711 cptr hack2 = scroll_adj[i];
713 /* Compare first four characters */
714 if (*hack1++ != *hack2++) continue;
715 if (*hack1++ != *hack2++) continue;
716 if (*hack1++ != *hack2++) continue;
717 if (*hack1++ != *hack2++) continue;
726 /* Break when done */
730 /* All scrolls are white */
731 scroll_col[i] = TERM_WHITE;
735 /* Hack -- Use the "complex" RNG */
738 /* Analyze every object */
739 for (i = 1; i < max_k_idx; i++)
741 object_kind *k_ptr = &k_info[i];
743 /* Skip "empty" objects */
744 if (!k_ptr->name) continue;
746 /* Extract "flavor" (if any) */
747 k_ptr->flavor = object_flavor(i);
749 /* No flavor yields aware */
750 if (!k_ptr->flavor) k_ptr->aware = TRUE;
752 /* Check for "easily known" */
753 k_ptr->easy_know = object_easy_know(i);
759 * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),
760 * and return a pointer to the terminator (t + 1).
762 static char *object_desc_chr(char *t, char c)
776 * Print a string "s" into a string "t", as if by strcpy(t, s),
777 * and return a pointer to the terminator.
779 static char *object_desc_str(char *t, cptr s)
781 /* Copy the string */
782 while (*s) *t++ = *s++;
794 * Print an unsigned number "n" into a string "t", as if by
795 * sprintf(t, "%u", n), and return a pointer to the terminator.
797 static char *object_desc_num(char *t, uint n)
801 /* Find "size" of "n" */
802 for (p = 1; n >= p * 10; p = p * 10) /* loop */;
804 /* Dump each digit */
810 /* Remove the digit */
813 /* Process next digit */
829 * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó
830 *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë
833 char *object_desc_kosuu(char *t, object_type *o_ptr)
835 t = object_desc_num(t, o_ptr->number);
847 t = object_desc_str(t, "ËÜ");
852 t = object_desc_str(t, "´¬");
857 t = object_desc_str(t, "Éþ");
861 case TV_SORCERY_BOOK:
867 case TV_ENCHANT_BOOK:
869 case TV_CRUSADE_BOOK:
871 case TV_HISSATSU_BOOK:
873 t = object_desc_str(t, "ºý");
881 t = object_desc_str(t, "Ãå");
888 t = object_desc_str(t, "¿¶");
893 t = object_desc_str(t, "");
898 t = object_desc_str(t, "Ëç");
901 /* ¿©¤Ù¤â¤Î by ita */
904 if(o_ptr->sval == SV_FOOD_JERKY)
906 t = object_desc_str(t, "ÀÚ¤ì");
912 if (o_ptr->number < 10)
914 t = object_desc_str(t, "¤Ä");
918 t = object_desc_str(t, "¸Ä");
928 * Print an signed number "v" into a string "t", as if by
929 * sprintf(t, "%+d", n), and return a pointer to the terminator.
930 * Note that we always print a sign, either "+" or "-".
932 static char *object_desc_int(char *t, sint v)
939 /* Take the absolute value */
942 /* Use a "minus" sign */
946 /* Positive (or zero) */
949 /* Use the actual number */
952 /* Use a "plus" sign */
956 /* Find "size" of "n" */
957 for (p = 1; n >= p * 10; p = p * 10) /* loop */;
959 /* Dump each digit */
965 /* Remove the digit */
968 /* Process next digit */
981 * Structs and tables for Auto Inscription for flags
984 typedef struct flag_insc_table
995 static flag_insc_table flag_insc_plus[] =
997 { "¹¶", "At", TR_BLOWS, -1 },
998 { "®", "Sp", TR_SPEED, -1 },
999 { "ÏÓ", "St", TR_STR, -1 },
1000 { "ÃÎ", "In", TR_INT, -1 },
1001 { "¸", "Wi", TR_WIS, -1 },
1002 { "´ï", "Dx", TR_DEX, -1 },
1003 { "ÂÑ", "Cn", TR_CON, -1 },
1004 { "̥", "Ch", TR_CHR, -1 },
1005 { "ƻ", "Md", TR_MAGIC_MASTERY, -1 },
1006 { "±£", "Sl", TR_STEALTH, -1 },
1007 { "õ", "Sr", TR_SEARCH, -1 },
1008 { "ÀÖ", "If", TR_INFRA, -1 },
1009 { "·¡", "Dg", TR_TUNNEL, -1 },
1010 { NULL, NULL, 0, -1 }
1013 static flag_insc_table flag_insc_immune[] =
1015 { "»À", "Ac", TR_IM_ACID, -1 },
1016 { "ÅÅ", "El", TR_IM_ELEC, -1 },
1017 { "²Ð", "Fi", TR_IM_FIRE, -1 },
1018 { "Îä", "Co", TR_IM_COLD, -1 },
1019 { NULL, NULL, 0, -1 }
1022 static flag_insc_table flag_insc_resistance[] =
1024 { "»À", "Ac", TR_RES_ACID, TR_IM_ACID },
1025 { "ÅÅ", "El", TR_RES_ELEC, TR_IM_ELEC },
1026 { "²Ð", "Fi", TR_RES_FIRE, TR_IM_FIRE },
1027 { "Îä", "Co", TR_RES_COLD, TR_IM_COLD },
1028 { "ÆÇ", "Po", TR_RES_POIS, -1 },
1029 { "Á®", "Li", TR_RES_LITE, -1 },
1030 { "°Å", "Dk", TR_RES_DARK, -1 },
1031 { "ÇË", "Sh", TR_RES_SHARDS, -1 },
1032 { "ÌÕ", "Bl", TR_RES_BLIND, -1 },
1033 { "Íð", "Cf", TR_RES_CONF, -1 },
1034 { "¹ì", "So", TR_RES_SOUND, -1 },
1035 { "¹ö", "Nt", TR_RES_NETHER, -1 },
1036 { "°ø", "Nx", TR_RES_NEXUS, -1 },
1037 { "ÆÙ", "Ca", TR_RES_CHAOS, -1 },
1038 { "Îô", "Di", TR_RES_DISEN, -1 },
1039 { "¶²", "Fe", TR_RES_FEAR, -1 },
1040 { NULL, NULL, 0, -1 }
1043 static flag_insc_table flag_insc_misc[] =
1045 { "ËâÎÏ", "Ma", TR_DEC_MANA, -1 },
1046 { "Åê", "Th", TR_THROW, -1 },
1047 { "ȿ", "Rf", TR_REFLECT, -1 },
1048 { "Ëã", "Fa", TR_FREE_ACT, -1 },
1049 { "ȑ", "Si", TR_SEE_INVIS, -1 },
1050 { "·Ð", "Hl", TR_HOLD_LIFE, -1 },
1051 { "ÃÙ", "Sd", TR_SLOW_DIGEST, -1 },
1052 { "³è", "Rg", TR_REGEN, -1 },
1053 { "Éâ", "Lv", TR_LEVITATION, -1 },
1054 { "ÌÀ", "Lu", TR_LITE, -1 },
1055 { "·Ù", "Wr", TR_WARNING, -1 },
1056 { "ÇÜ", "Xm", TR_XTRA_MIGHT, -1 },
1057 { "¼Í", "Xs", TR_XTRA_SHOTS, -1 },
1058 { "½Ö", "Te", TR_TELEPORT, -1 },
1059 { "ÅÜ", "Ag", TR_AGGRAVATE, -1 },
1060 { "½Ë", "Bs", TR_BLESSED, -1 },
1061 { "´÷", "Ty", TR_TY_CURSE, -1 },
1062 { NULL, NULL, 0, -1 }
1065 static flag_insc_table flag_insc_aura[] =
1067 { "±ê", "F", TR_SH_FIRE, -1 },
1068 { "ÅÅ", "E", TR_SH_ELEC, -1 },
1069 { "Îä", "C", TR_SH_COLD, -1 },
1070 { "Ëâ", "M", TR_NO_MAGIC, -1 },
1071 { "½Ö", "T", TR_NO_TELE, -1 },
1072 { NULL, NULL, 0, -1 }
1075 static flag_insc_table flag_insc_brand[] =
1077 { "»À", "A", TR_BRAND_ACID, -1 },
1078 { "ÅÅ", "E", TR_BRAND_ELEC, -1 },
1079 { "¾Æ", "F", TR_BRAND_FIRE, -1 },
1080 { "Åà", "Co", TR_BRAND_COLD, -1 },
1081 { "ÆÇ", "P", TR_BRAND_POIS, -1 },
1082 { "ÆÙ", "Ca", TR_CHAOTIC, -1 },
1083 { "µÛ", "V", TR_VAMPIRIC, -1 },
1084 { "¿Ì", "Q", TR_IMPACT, -1 },
1085 { "ÀÚ", "S", TR_VORPAL, -1 },
1086 { "Íý", "M", TR_FORCE_WEAPON, -1 },
1087 { NULL, NULL, 0, -1 }
1090 static flag_insc_table flag_insc_kill[] =
1092 { "¼Ù", "*", TR_KILL_EVIL, -1 },
1093 { "¿Í", "p", TR_KILL_HUMAN, -1 },
1094 { "ζ", "D", TR_KILL_DRAGON, -1 },
1095 { "¥ª", "o", TR_KILL_ORC, -1 },
1096 { "¥È", "T", TR_KILL_TROLL, -1 },
1097 { "µð", "P", TR_KILL_GIANT, -1 },
1098 { "¥Ç", "U", TR_KILL_DEMON, -1 },
1099 { "Ȉ", "L", TR_KILL_UNDEAD, -1 },
1100 { "ư", "Z", TR_KILL_ANIMAL, -1 },
1101 { NULL, NULL, 0, -1 }
1104 static flag_insc_table flag_insc_slay[] =
1106 { "¼Ù", "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1107 { "¿Í", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1108 { "ε", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1109 { "¥ª", "o", TR_SLAY_ORC, TR_KILL_ORC },
1110 { "¥È", "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1111 { "µð", "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1112 { "¥Ç", "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1113 { "Ȉ", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1114 { "ư", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1115 { NULL, NULL, 0, -1 }
1118 static flag_insc_table flag_insc_esp1[] =
1120 { "´¶", "Tele", TR_TELEPATHY, -1 },
1121 { "¼Ù", "Evil", TR_ESP_EVIL, -1 },
1122 { "Á±", "Good", TR_ESP_GOOD, -1 },
1123 { "̵", "Nolv", TR_ESP_NONLIVING, -1 },
1124 { "¸Ä", "Uniq", TR_ESP_UNIQUE, -1 },
1125 { NULL, NULL, 0, -1 }
1128 static flag_insc_table flag_insc_esp2[] =
1130 { "¿Í", "p", TR_ESP_HUMAN, -1 },
1131 { "ε", "D", TR_ESP_DRAGON, -1 },
1132 { "¥ª", "o", TR_ESP_ORC, -1 },
1133 { "¥È", "T", TR_ESP_TROLL, -1 },
1134 { "µð", "P", TR_ESP_GIANT, -1 },
1135 { "¥Ç", "U", TR_ESP_DEMON, -1 },
1136 { "Ȉ", "L", TR_ESP_UNDEAD, -1 },
1137 { "ư", "Z", TR_ESP_ANIMAL, -1 },
1138 { NULL, NULL, 0, -1 }
1141 static flag_insc_table flag_insc_sust[] =
1143 { "ÏÓ", "St", TR_SUST_STR, -1 },
1144 { "ÃÎ", "In", TR_SUST_INT, -1 },
1145 { "¸", "Wi", TR_SUST_WIS, -1 },
1146 { "´ï", "Dx", TR_SUST_DEX, -1 },
1147 { "ÂÑ", "Cn", TR_SUST_CON, -1 },
1148 { "̥", "Ch", TR_SUST_CHR, -1 },
1149 { NULL, NULL, 0, -1 }
1153 static flag_insc_table flag_insc_plus[] =
1155 { "At", TR_BLOWS, -1 },
1156 { "Sp", TR_SPEED, -1 },
1157 { "St", TR_STR, -1 },
1158 { "In", TR_INT, -1 },
1159 { "Wi", TR_WIS, -1 },
1160 { "Dx", TR_DEX, -1 },
1161 { "Cn", TR_CON, -1 },
1162 { "Ch", TR_CHR, -1 },
1163 { "Md", TR_MAGIC_MASTERY, -1 },
1164 { "Sl", TR_STEALTH, -1 },
1165 { "Sr", TR_SEARCH, -1 },
1166 { "If", TR_INFRA, -1 },
1167 { "Dg", TR_TUNNEL, -1 },
1171 static flag_insc_table flag_insc_immune[] =
1173 { "Ac", TR_IM_ACID, -1 },
1174 { "El", TR_IM_ELEC, -1 },
1175 { "Fi", TR_IM_FIRE, -1 },
1176 { "Co", TR_IM_COLD, -1 },
1180 static flag_insc_table flag_insc_resistance[] =
1182 { "Ac", TR_RES_ACID, TR_IM_ACID },
1183 { "El", TR_RES_ELEC, TR_IM_ELEC },
1184 { "Fi", TR_RES_FIRE, TR_IM_FIRE },
1185 { "Co", TR_RES_COLD, TR_IM_COLD },
1186 { "Po", TR_RES_POIS, -1 },
1187 { "Li", TR_RES_LITE, -1 },
1188 { "Dk", TR_RES_DARK, -1 },
1189 { "Sh", TR_RES_SHARDS, -1 },
1190 { "Bl", TR_RES_BLIND, -1 },
1191 { "Cf", TR_RES_CONF, -1 },
1192 { "So", TR_RES_SOUND, -1 },
1193 { "Nt", TR_RES_NETHER, -1 },
1194 { "Nx", TR_RES_NEXUS, -1 },
1195 { "Ca", TR_RES_CHAOS, -1 },
1196 { "Di", TR_RES_DISEN, -1 },
1197 { "Fe", TR_RES_FEAR, -1 },
1201 static flag_insc_table flag_insc_misc[] =
1203 { "Ma", TR_DEC_MANA, -1 },
1204 { "Th", TR_THROW, -1 },
1205 { "Rf", TR_REFLECT, -1 },
1206 { "Fa", TR_FREE_ACT, -1 },
1207 { "Si", TR_SEE_INVIS, -1 },
1208 { "Hl", TR_HOLD_LIFE, -1 },
1209 { "Sd", TR_SLOW_DIGEST, -1 },
1210 { "Rg", TR_REGEN, -1 },
1211 { "Lv", TR_LEVITATION, -1 },
1212 { "Lu", TR_LITE, -1 },
1213 { "Wr", TR_WARNING, -1 },
1214 { "Xm", TR_XTRA_MIGHT, -1 },
1215 { "Xs", TR_XTRA_SHOTS, -1 },
1216 { "Te", TR_TELEPORT, -1 },
1217 { "Ag", TR_AGGRAVATE, -1 },
1218 { "Bs", TR_BLESSED, -1 },
1219 { "Ty", TR_TY_CURSE, -1 },
1223 static flag_insc_table flag_insc_aura[] =
1225 { "F", TR_SH_FIRE, -1 },
1226 { "E", TR_SH_ELEC, -1 },
1227 { "C", TR_SH_COLD, -1 },
1228 { "M", TR_NO_MAGIC, -1 },
1229 { "T", TR_NO_TELE, -1 },
1233 static flag_insc_table flag_insc_brand[] =
1235 { "A", TR_BRAND_ACID, -1 },
1236 { "E", TR_BRAND_ELEC, -1 },
1237 { "F", TR_BRAND_FIRE, -1 },
1238 { "Co", TR_BRAND_COLD, -1 },
1239 { "P", TR_BRAND_POIS, -1 },
1240 { "Ca", TR_CHAOTIC, -1 },
1241 { "V", TR_VAMPIRIC, -1 },
1242 { "Q", TR_IMPACT, -1 },
1243 { "S", TR_VORPAL, -1 },
1244 { "M", TR_FORCE_WEAPON, -1 },
1248 static flag_insc_table flag_insc_kill[] =
1250 { "*", TR_KILL_EVIL, -1 },
1251 { "p", TR_KILL_HUMAN, -1 },
1252 { "D", TR_KILL_DRAGON, -1 },
1253 { "o", TR_KILL_ORC, -1 },
1254 { "T", TR_KILL_TROLL, -1 },
1255 { "P", TR_KILL_GIANT, -1 },
1256 { "U", TR_KILL_DEMON, -1 },
1257 { "L", TR_KILL_UNDEAD, -1 },
1258 { "Z", TR_KILL_ANIMAL, -1 },
1262 static flag_insc_table flag_insc_slay[] =
1264 { "*", TR_SLAY_EVIL, TR_KILL_EVIL },
1265 { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN },
1266 { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
1267 { "o", TR_SLAY_ORC, TR_KILL_ORC },
1268 { "T", TR_SLAY_TROLL, TR_KILL_TROLL },
1269 { "P", TR_SLAY_GIANT, TR_KILL_GIANT },
1270 { "U", TR_SLAY_DEMON, TR_KILL_DEMON },
1271 { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
1272 { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
1276 static flag_insc_table flag_insc_esp1[] =
1278 { "Tele", TR_TELEPATHY, -1 },
1279 { "Evil", TR_ESP_EVIL, -1 },
1280 { "Good", TR_ESP_GOOD, -1 },
1281 { "Nolv", TR_ESP_NONLIVING, -1 },
1282 { "Uniq", TR_ESP_UNIQUE, -1 },
1286 static flag_insc_table flag_insc_esp2[] =
1288 { "p", TR_ESP_HUMAN, -1 },
1289 { "D", TR_ESP_DRAGON, -1 },
1290 { "o", TR_ESP_ORC, -1 },
1291 { "T", TR_ESP_TROLL, -1 },
1292 { "P", TR_ESP_GIANT, -1 },
1293 { "U", TR_ESP_DEMON, -1 },
1294 { "L", TR_ESP_UNDEAD, -1 },
1295 { "Z", TR_ESP_ANIMAL, -1 },
1299 static flag_insc_table flag_insc_sust[] =
1301 { "St", TR_SUST_STR, -1 },
1302 { "In", TR_SUST_INT, -1 },
1303 { "Wi", TR_SUST_WIS, -1 },
1304 { "Dx", TR_SUST_DEX, -1 },
1305 { "Cn", TR_SUST_CON, -1 },
1306 { "Ch", TR_SUST_CHR, -1 },
1311 /* Simple macro for get_inscription() */
1312 #define ADD_INSC(STR) (void)(ptr = object_desc_str(ptr, (STR)))
1315 * Helper function for get_inscription()
1317 static char *inscribe_flags_aux(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE], bool kanji, char *ptr)
1323 while (fi_ptr->english)
1325 if (have_flag(flgs, fi_ptr->flag) &&
1326 (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1328 ADD_INSC(kanji ? fi_ptr->japanese : fi_ptr->english);
1330 ADD_INSC(fi_ptr->english);
1340 * Special variation of have_flag for auto-inscription
1342 static bool have_flag_of(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE])
1344 while (fi_ptr->english)
1346 if (have_flag(flgs, fi_ptr->flag) &&
1347 (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
1355 static char *get_ability_abbreviation(char *ptr, object_type *o_ptr, bool kanji, bool all)
1357 char *prev_ptr = ptr;
1358 u32b flgs[TR_FLAG_SIZE];
1360 /* Extract the flags */
1361 object_flags(o_ptr, flgs);
1364 /* Remove obvious flags */
1367 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1371 for (j = 0; j < TR_FLAG_SIZE; j++)
1372 flgs[j] &= ~k_ptr->flags[j];
1374 if (object_is_fixed_artifact(o_ptr))
1376 artifact_type *a_ptr = &a_info[o_ptr->name1];
1378 for (j = 0; j < TR_FLAG_SIZE; j++)
1379 flgs[j] &= ~a_ptr->flags[j];
1382 if (object_is_ego(o_ptr))
1384 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1386 for (j = 0; j < TR_FLAG_SIZE; j++)
1387 flgs[j] &= ~e_ptr->flags[j];
1393 if (have_flag_of(flag_insc_plus, flgs))
1398 ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr);
1401 if (have_flag_of(flag_insc_immune, flgs))
1403 if (!kanji && ptr != prev_ptr)
1410 ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr);
1413 if (have_flag_of(flag_insc_resistance, flgs))
1417 else if (ptr != prev_ptr)
1423 ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr);
1426 if (have_flag_of(flag_insc_misc, flgs))
1428 if (ptr != prev_ptr)
1434 ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr);
1437 if (have_flag_of(flag_insc_aura, flgs))
1441 ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr);
1444 if (have_flag_of(flag_insc_brand, flgs))
1446 ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr);
1449 if (have_flag_of(flag_insc_kill, flgs))
1451 ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr);
1454 if (have_flag_of(flag_insc_slay, flgs))
1456 ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr);
1461 if (have_flag_of(flag_insc_esp1, flgs) ||
1462 have_flag_of(flag_insc_esp2, flgs))
1464 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1465 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1469 if (have_flag_of(flag_insc_esp1, flgs))
1471 ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr);
1472 if (have_flag_of(flag_insc_esp2, flgs))
1474 ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr);
1478 if (have_flag_of(flag_insc_sust, flgs))
1482 ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr);
1491 * Get object inscription with auto inscription of object flags.
1493 static void get_inscription(char *buff, object_type *o_ptr)
1495 cptr insc = quark_str(o_ptr->inscription);
1498 /* Not fully identified */
1499 if (!(o_ptr->ident & IDENT_MENTAL))
1501 /* Copy until end of line or '#' */
1504 if (*insc == '#') break;
1506 if (iskanji(*insc)) *buff++ = *insc++;
1516 for (; *insc; insc++)
1518 /* Ignore fake artifact inscription */
1519 if (*insc == '#') break;
1521 /* {%} will be automatically converted */
1522 else if ('%' == *insc)
1528 /* check for too long inscription */
1529 if (ptr >= buff + MAX_NLEN) continue;
1542 if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3])
1552 ptr = get_ability_abbreviation(ptr, o_ptr, kanji, all);
1567 * Creates a description of the item "o_ptr", and stores it in "out_val".
1569 * One can choose the "verbosity" of the description, including whether
1570 * or not the "number" of items should be described, and how much detail
1571 * should be used when describing the item.
1573 * The given "buf" must be MAX_NLEN chars long to hold the longest possible
1574 * description, which can get pretty long, including incriptions, such as:
1575 * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".
1576 * Note that the inscription will be clipped to keep the total description
1577 * under MAX_NLEN-1 chars (plus a terminator).
1579 * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,
1580 * portable, versions of some common "sprintf()" commands.
1582 * Note that all ego-items (when known) append an "Ego-Item Name", unless
1583 * the item is also an artifact, which should NEVER happen.
1585 * Note that all artifacts (when known) append an "Artifact Name", so we
1586 * have special processing for "Specials" (artifact Lites, Rings, Amulets).
1587 * The "Specials" never use "modifiers" if they are "known", since they
1588 * have special "descriptions", such as "The Necklace of the Dwarves".
1590 * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),
1591 * plus the artifact name, just like any other artifact, if known.
1593 * Special Ring's and Amulet's, if not "aware", use the same code as normal
1594 * rings and amulets, and if "aware", use the "k_info" base-name (Ring or
1595 * Amulet or Necklace). They will NEVER "append" the "k_info" name. But,
1596 * they will append the artifact name, just like any artifact, if known.
1598 * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.
1601 * OD_NAME_ONLY : The Cloak of Death
1602 * OD_NAME_AND_ENCHANT : The Cloak of Death [1,+3]
1603 * OD_OMIT_INSCRIPTION : The Cloak of Death [1,+3] (+2 to Stealth)
1604 * 0 : The Cloak of Death [1,+3] (+2 to Stealth) {nifty}
1606 * OD_OMIT_PREFIX : Forbidden numeric prefix
1607 * OD_NO_PLURAL : Forbidden use of plural
1608 * OD_STORE : Assume to be aware and known
1609 * OD_NO_FLAVOR : Allow to hidden flavor
1611 void object_desc(char *buf, object_type *o_ptr, u32b mode)
1613 /* Extract object kind name */
1614 cptr kindname = k_name + k_info[o_ptr->k_idx].name;
1616 /* Extract default "base" string */
1617 cptr basenm = kindname;
1619 /* Assume no "modifier" string */
1622 /* Hack -- Extract the sub-type "indexx" */
1623 int indexx = o_ptr->sval;
1631 bool show_weapon = FALSE;
1632 bool show_armour = FALSE;
1637 char p1 = '(', p2 = ')';
1638 char b1 = '[', b2 = ']';
1639 char c1 = '{', c2 = '}';
1641 char tmp_val[MAX_NLEN+160];
1642 char tmp_val2[MAX_NLEN+10];
1643 char fake_insc_buf[30];
1645 u32b flgs[TR_FLAG_SIZE];
1647 object_type *bow_ptr;
1649 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1651 /* Extract some flags */
1652 object_flags(o_ptr, flgs);
1654 /* See if the object is "aware" */
1655 if (object_is_aware(o_ptr)) aware = TRUE;
1657 /* See if the object is "known" */
1658 if (object_is_known(o_ptr)) known = TRUE;
1660 /* Allow flavors to be hidden when aware */
1661 if (aware && ((mode & OD_NO_FLAVOR) || plain_descriptions)) flavor = FALSE;
1663 /* Object is in the inventory of a store or spoiler */
1664 if ((mode & OD_STORE) || (o_ptr->ident & IDENT_STORE))
1666 /* Don't show flavors */
1669 /* Pretend known and aware */
1674 /* Analyze the object */
1675 switch (o_ptr->tval)
1677 /* Some objects are easy to describe */
1691 monster_race *r_ptr = &r_info[o_ptr->pval];
1700 modstr = " (empty)";
1706 sprintf(tmp_val2, " (%s)",r_name + r_ptr->name);
1709 cptr t = r_name + r_ptr->name;
1711 if (!(r_ptr->flags1 & RF1_UNIQUE))
1713 sprintf(tmp_val2, " (%s%s)", (is_a_vowel(*t) ? "an " : "a "), t);
1719 sprintf(tmp_val2, "(%s)", t);
1729 /* Figurines/Statues */
1733 monster_race *r_ptr = &r_info[o_ptr->pval];
1736 modstr = r_name + r_ptr->name;
1738 cptr t = r_name + r_ptr->name;
1740 if (!(r_ptr->flags1 & RF1_UNIQUE))
1742 sprintf(tmp_val2, "%s%s", (is_a_vowel(*t) ? "an " : "a "), t);
1759 monster_race *r_ptr = &r_info[o_ptr->pval];
1761 modstr = r_name + r_ptr->name;
1766 if (r_ptr->flags1 & RF1_UNIQUE)
1767 basenm = "& % of #";
1775 /* Missiles/ Bows/ Weapons */
1806 /* Lites (including a few "Specials") */
1812 /* Amulets (including a few "Specials") */
1815 /* Known artifacts */
1818 if (object_is_fixed_artifact(o_ptr)) break;
1819 if (k_ptr->gen_flags & TRG_INSTA_ART) break;
1822 /* Color the object */
1823 modstr = amulet_adj[indexx];
1826 if (!flavor) basenm = "%¤Î¥¢¥ß¥å¥ì¥Ã¥È";
1827 else if (aware) basenm = "%¤Î#¥¢¥ß¥å¥ì¥Ã¥È";
1828 else basenm = "#¥¢¥ß¥å¥ì¥Ã¥È";
1830 if (!flavor) basenm = "& Amulet~ of %";
1831 else if (aware) basenm = "& # Amulet~ of %";
1832 else basenm = "& # Amulet~";
1838 /* Rings (including a few "Specials") */
1841 /* Known artifacts */
1844 if (object_is_fixed_artifact(o_ptr)) break;
1845 if (k_ptr->gen_flags & TRG_INSTA_ART) break;
1848 /* Color the object */
1849 modstr = ring_adj[indexx];
1852 if (!flavor) basenm = "%¤Î»ØÎØ";
1853 else if (aware) basenm = "%¤Î#»ØÎØ";
1854 else basenm = "#»ØÎØ";
1856 if (!flavor) basenm = "& Ring~ of %";
1857 else if (aware) basenm = "& # Ring~ of %";
1858 else basenm = "& # Ring~";
1861 if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE;
1873 /* Color the object */
1874 modstr = staff_adj[indexx];
1877 if (!flavor) basenm = "%¤Î¾ó";
1878 else if (aware) basenm = "%¤Î#¾ó";
1879 else basenm = "#¾ó";
1881 if (!flavor) basenm = "& Staff~ of %";
1882 else if (aware) basenm = "& # Staff~ of %";
1883 else basenm = "& # Staff~";
1891 /* Color the object */
1892 modstr = wand_adj[indexx];
1895 if (!flavor) basenm = "%¤ÎËâË¡ËÀ";
1896 else if (aware) basenm = "%¤Î#ËâË¡ËÀ";
1897 else basenm = "#ËâË¡ËÀ";
1899 if (!flavor) basenm = "& Wand~ of %";
1900 else if (aware) basenm = "& # Wand~ of %";
1901 else basenm = "& # Wand~";
1909 /* Color the object */
1910 modstr = rod_adj[indexx];
1913 if (!flavor) basenm = "%¤Î¥í¥Ã¥É";
1914 else if (aware) basenm = "%¤Î#¥í¥Ã¥É";
1915 else basenm = "#¥í¥Ã¥É";
1917 if (!flavor) basenm = "& Rod~ of %";
1918 else if (aware) basenm = "& # Rod~ of %";
1919 else basenm = "& # Rod~";
1927 /* Color the object */
1928 modstr = scroll_adj[indexx];
1931 if (!flavor) basenm = "%¤Î´¬Êª";
1932 else if (aware) basenm = "¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª";
1933 else basenm = "¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª";
1935 if (!flavor) basenm = "& Scroll~ of %";
1936 else if (aware) basenm = "& Scroll~ titled \"#\" of %";
1937 else basenm = "& Scroll~ titled \"#\"";
1945 /* Color the object */
1946 modstr = potion_adj[indexx];
1949 if (!flavor) basenm = "%¤ÎÌô";
1950 else if (aware) basenm = "%¤Î#Ìô";
1951 else basenm = "#Ìô";
1953 if (!flavor) basenm = "& Potion~ of %";
1954 else if (aware) basenm = "& # Potion~ of %";
1955 else basenm = "& # Potion~";
1963 /* Ordinary food is "boring" */
1964 if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break;
1966 /* Color the object */
1967 modstr = food_adj[indexx];
1970 if (!flavor) basenm = "%¤Î¥¥Î¥³";
1971 else if (aware) basenm = "%¤Î#¥¥Î¥³";
1972 else basenm = "#¥¥Î¥³";
1974 if (!flavor) basenm = "& Mushroom~ of %";
1975 else if (aware) basenm = "& # Mushroom~ of %";
1976 else basenm = "& # Mushroom~";
1985 basenm = "ÍÓÈé»æ - %";
1987 basenm = "& Parchment~ - %";
1996 basenm = "À¸Ì¿¤ÎËâË¡½ñ%";
1998 if (mp_ptr->spell_book == TV_LIFE_BOOK)
1999 basenm = "& Book~ of Life Magic %";
2001 basenm = "& Life Spellbook~ %";
2007 case TV_SORCERY_BOOK:
2010 basenm = "Àç½Ñ¤ÎËâË¡½ñ%";
2012 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2013 basenm = "& Book~ of Sorcery %";
2015 basenm = "& Sorcery Spellbook~ %";
2021 case TV_NATURE_BOOK:
2024 basenm = "¼«Á³¤ÎËâË¡½ñ%";
2026 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2027 basenm = "& Book~ of Nature Magic %";
2029 basenm = "& Nature Spellbook~ %";
2038 basenm = "¥«¥ª¥¹¤ÎËâË¡½ñ%";
2040 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2041 basenm = "& Book~ of Chaos Magic %";
2043 basenm = "& Chaos Spellbook~ %";
2052 basenm = "°Å¹õ¤ÎËâË¡½ñ%";
2054 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2055 basenm = "& Book~ of Death Magic %";
2057 basenm = "& Death Spellbook~ %";
2066 basenm = "¥È¥é¥ó¥×¤ÎËâË¡½ñ%";
2068 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2069 basenm = "& Book~ of Trump Magic %";
2071 basenm = "& Trump Spellbook~ %";
2077 case TV_ARCANE_BOOK:
2080 basenm = "Èë½Ñ¤ÎËâË¡½ñ%";
2082 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2083 basenm = "& Book~ of Arcane Magic %";
2085 basenm = "& Arcane Spellbook~ %";
2091 case TV_ENCHANT_BOOK:
2094 basenm = "¾¢¤ÎËâË¡½ñ%";
2096 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2097 basenm = "& Book~ of Craft Magic %";
2099 basenm = "& Craft Spellbook~ %";
2105 case TV_DAEMON_BOOK:
2108 basenm = "°Ëâ¤ÎËâË¡½ñ%";
2110 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2111 basenm = "& Book~ of Daemon Magic %";
2113 basenm = "& Daemon Spellbook~ %";
2119 case TV_CRUSADE_BOOK:
2122 basenm = "Ç˼٤ÎËâË¡½ñ%";
2124 if (mp_ptr->spell_book == TV_LIFE_BOOK)
2125 basenm = "& Book~ of Crusade Magic %";
2127 basenm = "& Crusade Spellbook~ %";
2138 basenm = "& Song Book~ %";
2144 case TV_HISSATSU_BOOK:
2147 basenm = "& Éð·Ý¤Î½ñ%";
2149 basenm = "Book~ of Kendo %";
2155 /* Hack -- Gold/Gems */
2158 strcpy(buf, basenm);
2162 /* Used in the "inventory" routine */
2166 strcpy(buf, "(¤Ê¤·)");
2168 strcpy(buf, "(nothing)");
2175 /* Use full name from k_info or a_info */
2176 if (aware && have_flag(flgs, TR_FULL_NAME))
2178 if (known && o_ptr->name1) basenm = a_name + a_info[o_ptr->name1].name;
2179 else basenm = kindname;
2182 /* Start dumping the result */
2186 if (basenm[0] == '&')
2192 if (mode & OD_OMIT_PREFIX)
2196 else if (o_ptr->number > 1)
2198 t = object_desc_kosuu(t, o_ptr);
2199 t = object_desc_str(t, "¤Î ");
2202 /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬
2203 * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë
2207 if (object_is_fixed_artifact(o_ptr)) t = object_desc_str(t, "¡ú");
2208 else if (o_ptr->art_name) t = object_desc_str(t, "¡ù");
2213 /* The object "expects" a "number" */
2214 if (basenm[0] == '&')
2216 /* Skip the ampersand (and space) */
2220 if (mode & OD_OMIT_PREFIX)
2225 /* Hack -- None left */
2226 else if (o_ptr->number <= 0)
2228 t = object_desc_str(t, "no more ");
2231 /* Extract the number */
2232 else if (o_ptr->number > 1)
2234 t = object_desc_num(t, o_ptr->number);
2235 t = object_desc_chr(t, ' ');
2238 /* Hack -- The only one of its kind */
2239 else if (known && object_is_artifact(o_ptr))
2241 t = object_desc_str(t, "The ");
2244 /* Unique corpses are unique */
2245 else if (o_ptr->tval == TV_CORPSE)
2247 monster_race *r_ptr = &r_info[o_ptr->pval];
2249 if (r_ptr->flags1 & RF1_UNIQUE)
2251 t = object_desc_str(t, "The ");
2262 case '#': vowel = is_a_vowel(modstr[0]); break;
2263 case '%': vowel = is_a_vowel(*kindname); break;
2264 default: vowel = is_a_vowel(*s); break;
2269 /* A single one, with a vowel */
2270 t = object_desc_str(t, "an ");
2274 /* A single one, without a vowel */
2275 t = object_desc_str(t, "a ");
2280 /* Hack -- objects that "never" take an article */
2287 if (mode & OD_OMIT_PREFIX)
2292 /* Hack -- all gone */
2293 else if (o_ptr->number <= 0)
2295 t = object_desc_str(t, "no more ");
2298 /* Prefix a number if required */
2299 else if (o_ptr->number > 1)
2301 t = object_desc_num(t, o_ptr->number);
2302 t = object_desc_chr(t, ' ');
2305 /* Hack -- The only one of its kind */
2306 else if (known && object_is_artifact(o_ptr))
2308 t = object_desc_str(t, "The ");
2311 /* Hack -- single items get no prefix */
2319 /* Paranoia -- skip illegal tildes */
2320 /* while (*s == '~') s++; */
2323 if (object_is_smith(o_ptr))
2325 t = object_desc_str(t, format("ÃÃÌê»Õ%s¤Î", player_name));
2328 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */
2331 /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */
2332 if (o_ptr->art_name)
2334 cptr temp = quark_str(o_ptr->art_name);
2336 /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2337 /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */
2338 if (strncmp(temp, "of ", 3) == 0)
2340 t = object_desc_str(t, &temp[3]);
2341 t = object_desc_str(t, "¤Î");
2343 else if ((strncmp(temp, "¡Ø", 2) != 0) &&
2344 (strncmp(temp, "¡Ô", 2) != 0) &&
2346 t = object_desc_str(t, temp);
2348 /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */
2349 else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME))
2351 artifact_type *a_ptr = &a_info[o_ptr->name1];
2352 /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */
2353 if (strncmp(a_name + a_ptr->name, "¡Ø", 2) != 0)
2355 t = object_desc_str(t, a_name + a_ptr->name);
2358 /* ̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */
2359 else if (object_is_ego(o_ptr))
2361 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2362 t = object_desc_str(t, e_name + e_ptr->name);
2367 /* Copy the string */
2370 /* Insert the modifier (flavor) */
2373 t = object_desc_str(t, modstr);
2375 /* Paranoia -- Never append multiple modstr's */
2379 /* Append kind name */
2382 t = object_desc_str(t, kindname);
2384 /* Paranoia -- Never append multiple kindname's */
2392 /* Add a plural if needed */
2393 if (!(mode & OD_NO_PLURAL) && (o_ptr->number != 1))
2397 /* XXX XXX XXX Mega-Hack */
2399 /* Hack -- "Cutlass-es" and "Torch-es" */
2400 if ((k == 's') || (k == 'h')) *t++ = 'e';
2421 /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */
2424 /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤ËµÏ¿
2425 ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */
2426 if (o_ptr->art_name)
2430 strcpy(temp, quark_str(o_ptr->art_name));
2431 /* MEGA HACK by ita */
2432 if (strncmp(temp, "¡Ø", 2) == 0 ||
2433 strncmp(temp, "¡Ô", 2) == 0)
2434 t = object_desc_str(t, temp);
2435 else if (temp[0] == '\'')
2437 itemp = strlen(temp);
2438 temp[itemp - 1] = 0;
2439 t = object_desc_str(t, "¡Ø");
2440 t = object_desc_str(t, &temp[1]);
2441 t = object_desc_str(t, "¡Ù");
2444 else if (object_is_fixed_artifact(o_ptr))
2446 artifact_type *a_ptr = &a_info[o_ptr->name1];
2447 if (strncmp(a_name + a_ptr->name, "¡Ø", 2) == 0)
2449 t = object_desc_str(t, a_name + a_ptr->name);
2452 else if (o_ptr->inscription)
2454 cptr str = quark_str(o_ptr->inscription);
2463 if (*str == '#') break;
2469 cptr str = my_strchr(quark_str(o_ptr->inscription), '#');
2471 /* Add the false name */
2472 t = object_desc_str(t,"¡Ø");
2473 t = object_desc_str(t, &str[1]);
2474 t = object_desc_str(t,"¡Ù");
2479 if (object_is_smith(o_ptr))
2481 t = object_desc_str(t,format(" of %s the Smith",player_name));
2484 /* Hack -- Append "Artifact" or "Special" names */
2485 if (known && !have_flag(flgs, TR_FULL_NAME))
2487 /* Is it a new random artifact ? */
2488 if (o_ptr->art_name)
2490 t = object_desc_chr(t, ' ');
2491 t = object_desc_str(t, quark_str(o_ptr->art_name));
2494 /* Grab any artifact name */
2495 else if (object_is_fixed_artifact(o_ptr))
2497 artifact_type *a_ptr = &a_info[o_ptr->name1];
2499 t = object_desc_chr(t, ' ');
2500 t = object_desc_str(t, a_name + a_ptr->name);
2503 /* Grab any ego-item name */
2506 if (object_is_ego(o_ptr))
2508 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2510 t = object_desc_chr(t, ' ');
2511 t = object_desc_str(t, e_name + e_ptr->name);
2514 if (o_ptr->inscription && my_strchr(quark_str(o_ptr->inscription), '#'))
2517 cptr str = my_strchr(quark_str(o_ptr->inscription), '#');
2519 /* Add the false name */
2520 t = object_desc_chr(t, ' ');
2521 t = object_desc_str(t, &str[1]);
2528 /* No more details wanted */
2529 if (mode & OD_NAME_ONLY) goto object_desc_done;
2531 /* Hack -- Chests must be described in detail */
2532 if (o_ptr->tval == TV_CHEST)
2534 /* Not searched yet */
2540 /* May be "empty" */
2541 else if (!o_ptr->pval)
2544 t = object_desc_str(t, "(¶õ)");
2546 t = object_desc_str(t, " (empty)");
2550 /* May be "disarmed" */
2551 else if (o_ptr->pval < 0)
2553 if (chest_traps[0 - o_ptr->pval])
2556 t = object_desc_str(t, "(²ò½üºÑ)");
2558 t = object_desc_str(t, " (disarmed)");
2564 t = object_desc_str(t, "(Èó»Ü¾û)");
2566 t = object_desc_str(t, " (unlocked)");
2571 /* Describe the traps, if any */
2574 /* Describe the traps */
2575 switch (chest_traps[o_ptr->pval])
2580 t = object_desc_str(t, "(»Ü¾û)");
2582 t = object_desc_str(t, " (Locked)");
2586 case CHEST_LOSE_STR:
2589 t = object_desc_str(t, "(ÆÇ¿Ë)");
2591 t = object_desc_str(t, " (Poison Needle)");
2595 case CHEST_LOSE_CON:
2598 t = object_desc_str(t, "(ÆÇ¿Ë)");
2600 t = object_desc_str(t, " (Poison Needle)");
2607 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2609 t = object_desc_str(t, " (Gas Trap)");
2613 case CHEST_PARALYZE:
2616 t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)");
2618 t = object_desc_str(t, " (Gas Trap)");
2625 t = object_desc_str(t, "(ÇúȯÁõÃÖ)");
2627 t = object_desc_str(t, " (Explosion Device)");
2632 case CHEST_BIRD_STORM:
2633 case CHEST_E_SUMMON:
2634 case CHEST_H_SUMMON:
2637 t = object_desc_str(t, "(¾¤´¤Î¥ë¡¼¥ó)");
2639 t = object_desc_str(t, " (Summoning Runes)");
2643 case CHEST_RUNES_OF_EVIL:
2646 t = object_desc_str(t, "(¼Ù°¤Ê¥ë¡¼¥ó)");
2648 t = object_desc_str(t, " (Gleaming Black Runes)");
2655 t = object_desc_str(t, "(·ÙÊóÁõÃÖ)");
2657 t = object_desc_str(t, " (Alarm)");
2664 t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)");
2666 t = object_desc_str(t, " (Multiple Traps)");
2675 /* Display the item like a weapon */
2676 if (have_flag(flgs, TR_SHOW_MODS)) show_weapon = TRUE;
2678 /* Display the item like a weapon */
2679 if (object_is_smith(o_ptr) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE))
2682 /* Display the item like a weapon */
2683 if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE;
2685 /* Display the item like armour */
2686 if (o_ptr->ac) show_armour = TRUE;
2689 /* Dump base weapon info */
2690 switch (o_ptr->tval)
2692 /* Missiles and Weapons */
2701 /* Append a "damage" string */
2702 t = object_desc_chr(t, ' ');
2703 t = object_desc_chr(t, p1);
2704 t = object_desc_num(t, o_ptr->dd);
2705 t = object_desc_chr(t, 'd');
2706 t = object_desc_num(t, o_ptr->ds);
2707 t = object_desc_chr(t, p2);
2713 /* Bows get a special "damage string" */
2716 /* Mega-Hack -- Extract the "base power" */
2717 power = bow_tmul(o_ptr->sval);
2719 /* Apply the "Extra Might" flag */
2720 if (have_flag(flgs, TR_XTRA_MIGHT)) power++;
2722 /* Append a special "damage" string */
2723 t = object_desc_chr(t, ' ');
2724 t = object_desc_chr(t, p1);
2725 t = object_desc_chr(t, 'x');
2726 t = object_desc_num(t, power);
2727 t = object_desc_chr(t, p2);
2734 /* Add the weapon bonuses */
2737 /* Show the tohit/todam on request */
2740 t = object_desc_chr(t, ' ');
2741 t = object_desc_chr(t, p1);
2742 t = object_desc_int(t, o_ptr->to_h);
2743 t = object_desc_chr(t, ',');
2744 t = object_desc_int(t, o_ptr->to_d);
2745 t = object_desc_chr(t, p2);
2748 /* Show the tohit if needed */
2749 else if (o_ptr->to_h)
2751 t = object_desc_chr(t, ' ');
2752 t = object_desc_chr(t, p1);
2753 t = object_desc_int(t, o_ptr->to_h);
2754 t = object_desc_chr(t, p2);
2757 /* Show the todam if needed */
2758 else if (o_ptr->to_d)
2760 t = object_desc_chr(t, ' ');
2761 t = object_desc_chr(t, p1);
2762 t = object_desc_int(t, o_ptr->to_d);
2763 t = object_desc_chr(t, p2);
2767 bow_ptr = &inventory[INVEN_BOW];
2769 /* If have a firing weapon + ammo matches bow */
2770 if (bow_ptr->k_idx && (o_ptr->tval == p_ptr->tval_ammo))
2772 int avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2;
2773 int tmul = bow_tmul(bow_ptr->sval);
2774 s16b energy_fire = bow_energy(bow_ptr->sval);
2776 /* See if the bow is "known" - then set damage bonus */
2777 if (object_is_known(bow_ptr)) avgdam += (bow_ptr->to_d * 10);
2779 /* Effect of ammo */
2780 if (known) avgdam += (o_ptr->to_d * 10);
2782 /* Get extra "power" from "extra might" */
2783 if (p_ptr->xtra_might) tmul++;
2785 tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2787 /* Launcher multiplier */
2789 avgdam /= (100 * 10);
2790 if (avgdam < 0) avgdam = 0;
2792 /* Display (shot damage/ avg damage) */
2793 t = object_desc_chr(t, ' ');
2794 t = object_desc_chr(t, p1);
2795 t = object_desc_num(t, avgdam);
2796 t = object_desc_chr(t, '/');
2798 if (p_ptr->num_fire == 0)
2800 t = object_desc_chr(t, '0');
2804 /* Calc effects of energy */
2805 avgdam *= (p_ptr->num_fire * 100);
2806 avgdam /= energy_fire;
2807 t = object_desc_num(t, avgdam);
2810 t = object_desc_chr(t, p2);
2812 else if ((p_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE))
2814 int avgdam = p_ptr->mighty_throw ? (1 + 3) : 1;
2815 s16b energy_fire = 100 - p_ptr->lev;
2817 avgdam += ((p_ptr->lev + 30) * (p_ptr->lev + 30) - 900) / 55;
2819 /* Display (shot damage/ avg damage) */
2820 t = object_desc_chr(t, ' ');
2821 t = object_desc_chr(t, p1);
2822 t = object_desc_num(t, avgdam);
2823 t = object_desc_chr(t, '/');
2825 /* Calc effects of energy */
2826 avgdam = 100 * avgdam / energy_fire;
2828 t = object_desc_num(t, avgdam);
2829 t = object_desc_chr(t, p2);
2832 /* Add the armor bonuses */
2835 /* Show the armor class info */
2838 t = object_desc_chr(t, ' ');
2839 t = object_desc_chr(t, b1);
2840 t = object_desc_num(t, o_ptr->ac);
2841 t = object_desc_chr(t, ',');
2842 t = object_desc_int(t, o_ptr->to_a);
2843 t = object_desc_chr(t, b2);
2846 /* No base armor, but does increase armor */
2847 else if (o_ptr->to_a)
2849 t = object_desc_chr(t, ' ');
2850 t = object_desc_chr(t, b1);
2851 t = object_desc_int(t, o_ptr->to_a);
2852 t = object_desc_chr(t, b2);
2856 /* Hack -- always show base armor */
2857 else if (show_armour)
2859 t = object_desc_chr(t, ' ');
2860 t = object_desc_chr(t, b1);
2861 t = object_desc_num(t, o_ptr->ac);
2862 t = object_desc_chr(t, b2);
2866 /* No more details wanted */
2867 if (mode & OD_NAME_AND_ENCHANT) goto object_desc_done;
2870 if (known) /* Known item only */
2873 * Hack -- Wands and Staffs have charges. Make certain how many charges
2874 * a stack of staffs really has is clear. -LM-
2876 if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND)))
2878 /* Dump " (N charges)" */
2879 t = object_desc_chr(t, ' ');
2880 t = object_desc_chr(t, p1);
2882 /* Clear explaination for staffs. */
2883 if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1))
2885 t = object_desc_num(t, o_ptr->number);
2886 t = object_desc_str(t, "x ");
2888 t = object_desc_num(t, o_ptr->pval);
2890 t = object_desc_str(t, "²óʬ");
2892 t = object_desc_str(t, " charge");
2893 if (o_ptr->pval != 1) t = object_desc_chr(t, 's');
2896 t = object_desc_chr(t, p2);
2898 /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may
2899 * be in any state of charge or discharge, this now includes a number. -LM-
2901 else if (o_ptr->tval == TV_ROD)
2903 /* Hack -- Dump " (# charging)" if relevant */
2906 /* Stacks of rods display an exact count of charging rods. */
2907 if (o_ptr->number > 1)
2910 if (k_ptr->pval == 0) k_ptr->pval = 1;
2912 /* Find out how many rods are charging, by dividing
2913 * current timeout by each rod's maximum timeout.
2914 * Ensure that any remainder is rounded up. Display
2915 * very discharged stacks as merely fully discharged.
2917 power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2918 if (power > o_ptr->number) power = o_ptr->number;
2920 /* Display prettily. */
2921 t = object_desc_str(t, " (");
2922 t = object_desc_num(t, power);
2924 t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)");
2926 t = object_desc_str(t, " charging)");
2930 /* "one Rod of Perception (1 charging)" would look tacky. */
2934 t = object_desc_str(t, "(½¼Å¶Ãæ)");
2936 t = object_desc_str(t, " (charging)");
2942 /* Dump "pval" flags for wearable items */
2943 if (have_pval_flags(flgs))
2945 /* Start the display */
2946 t = object_desc_chr(t, ' ');
2947 t = object_desc_chr(t, p1);
2949 /* Dump the "pval" itself */
2950 t = object_desc_int(t, o_ptr->pval);
2952 /* Do not display the "pval" flags */
2953 if (have_flag(flgs, TR_HIDE_TYPE))
2959 else if (have_flag(flgs, TR_SPEED))
2961 /* Dump " to speed" */
2963 t = object_desc_str(t, "²Ã®");
2965 t = object_desc_str(t, " to speed");
2970 else if (have_flag(flgs, TR_BLOWS))
2974 t = object_desc_str(t, "¹¶·â");
2976 t = object_desc_str(t, " attack");
2979 if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's');
2984 else if (have_flag(flgs, TR_STEALTH))
2986 /* Dump " to stealth" */
2988 t = object_desc_str(t, "±£Ì©");
2990 t = object_desc_str(t, " to stealth");
2995 else if (have_flag(flgs, TR_SEARCH))
2997 /* Dump " to searching" */
2999 t = object_desc_str(t, "õº÷");
3001 t = object_desc_str(t, " to searching");
3006 else if (have_flag(flgs, TR_INFRA))
3008 /* Dump " to infravision" */
3010 t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ");
3012 t = object_desc_str(t, " to infravision");
3016 /* Finish the display */
3017 t = object_desc_chr(t, p2);
3020 /* Hack -- Process Lanterns/Torches */
3021 if ((o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR))))
3023 /* Hack -- Turns of light for normal lites */
3025 t = object_desc_chr(t, '(');
3027 t = object_desc_str(t, " (with ");
3030 if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4 * 2);
3031 else t = object_desc_num(t, o_ptr->xtra4);
3033 t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)");
3035 t = object_desc_str(t, " turns of light)");
3039 /* Indicate charging objects, but not rods. */
3040 if (o_ptr->timeout && (o_ptr->tval != TV_ROD))
3042 /* Hack -- Dump " (charging)" if relevant */
3044 t = object_desc_str(t, "(½¼Å¶Ãæ)");
3046 t = object_desc_str(t, " (charging)");
3052 /* No more details wanted */
3053 if (mode & OD_OMIT_INSCRIPTION) goto object_desc_done;
3056 /* Prepare real inscriptions in a buffer */
3059 /* Auto abbreviation inscribe */
3060 if ((abbrev_extra || abbrev_all) && (o_ptr->ident & IDENT_MENTAL))
3062 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '%'))
3073 get_ability_abbreviation(tmp_val2, o_ptr, kanji, all);
3077 /* Use the standard inscription if available */
3078 if (o_ptr->inscription)
3082 if (tmp_val2[0]) strcat(tmp_val2, ", ");
3084 /* Get inscription and convert {%} */
3085 get_inscription(buff, o_ptr);
3087 /* strcat with correct treating of kanji */
3088 my_strcat(tmp_val2, buff, sizeof(tmp_val2));
3092 /* No fake inscription yet */
3093 fake_insc_buf[0] = '\0';
3095 /* Use the game-generated "feeling" otherwise, if available */
3098 strcpy(fake_insc_buf, game_inscriptions[o_ptr->feeling]);
3101 /* Note "cursed" if the item is known to be cursed */
3102 else if (object_is_cursed(o_ptr) && (known || (o_ptr->ident & IDENT_SENSE)))
3105 strcpy(fake_insc_buf, "¼ö¤ï¤ì¤Æ¤¤¤ë");
3107 strcpy(fake_insc_buf, "cursed");
3111 /* Note "unidentified" if the item is unidentified */
3112 else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)
3113 || (o_ptr->tval == TV_LITE) || (o_ptr->tval == TV_FIGURINE))
3115 && !(o_ptr->ident & IDENT_SENSE))
3118 strcpy(fake_insc_buf, "̤´ÕÄê");
3120 strcpy(fake_insc_buf, "unidentified");
3124 /* Mega-Hack -- note empty wands/staffs */
3125 else if (!known && (o_ptr->ident & IDENT_EMPTY))
3128 strcpy(fake_insc_buf, "¶õ");
3130 strcpy(fake_insc_buf, "empty");
3134 /* Note "tried" if the object has been tested unsuccessfully */
3135 else if (!aware && object_is_tried(o_ptr))
3138 strcpy(fake_insc_buf, "̤ȽÌÀ");
3140 strcpy(fake_insc_buf, "tried");
3144 /* Note the discount, if any */
3145 if (o_ptr->discount)
3147 /* Hidden by real inscription unless in a store */
3148 if (!tmp_val2[0] || (o_ptr->ident & IDENT_STORE))
3150 /* Append to other fake inscriptions if any */
3151 if (fake_insc_buf[0]) strcat(fake_insc_buf, ", ");
3153 (void)object_desc_num(fake_insc_buf, o_ptr->discount);
3155 strcat(fake_insc_buf, "%°ú¤");
3157 strcat(fake_insc_buf, "% off");
3163 /* Append the inscription, if any */
3164 if (fake_insc_buf[0] || tmp_val2[0])
3166 /* Append the inscription */
3167 t = object_desc_chr(t, ' ');
3168 t = object_desc_chr(t, c1);
3170 /* Append fake inscriptions */
3171 if (fake_insc_buf[0])
3173 t = object_desc_str(t, fake_insc_buf);
3176 /* Append a separater */
3177 if (fake_insc_buf[0] && tmp_val2[0])
3179 t = object_desc_chr(t, ',');
3180 t = object_desc_chr(t, ' ');
3183 /* Append real inscriptions */
3186 t = object_desc_str(t, tmp_val2);
3189 t = object_desc_chr(t, c2);
3193 my_strcpy(buf, tmp_val, MAX_NLEN);