X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fflavor.c;h=4aff4dc63a7f9df5d2cdbe165d4522e04ac89921;hb=25cf88bc70d8d08b155f78cc152b247711d0757d;hp=8e0664f629547b6fdd1d6fafe08fc11e87bd5e0d;hpb=432bff4cc1fd59c17b34233593ae61c385b471d5;p=hengband%2Fhengband.git diff --git a/src/flavor.c b/src/flavor.c index 8e0664f62..4aff4dc63 100644 --- a/src/flavor.c +++ b/src/flavor.c @@ -1,385 +1,22 @@ -/* Purpose: Object flavor code */ - -/* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke - * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. +/*! + * @file flavor.c + * @brief オブジェクトの記述処理 / Mbject flavor code + * @date 2014/01/03 + * @author + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n + *\n + * This software may be copied and distributed for educational, research,\n + * and not for profit purposes provided that this copyright and statement\n + * are included in all such copies. Other copyrights may also apply.\n */ #include "angband.h" - -/* - * Hack -- note that "TERM_MULTI" is now just "TERM_VIOLET". - * We will have to find a cleaner method for "MULTI_HUED" later. - * There were only two multi-hued "flavors" (one potion, one food). - * Plus five multi-hued "base-objects" (3 dragon scales, one blade - * of chaos, and one something else). See the SHIMMER_OBJECTS code - * in "dungeon.c" and the object color extractor in "cave.c". - */ -#define TERM_MULTI TERM_VIOLET - - -/* - * Max sizes of the following arrays - */ -#define MAX_ROCKS 59 /* Used with rings (min 38) */ -#define MAX_AMULETS 26 /* Used with amulets (min 14) */ -#define MAX_WOODS 34 /* Used with staffs (min 30) */ -#define MAX_METALS 40 /* Used with wands/rods (min 29/29) */ -#define MAX_COLORS 70 /* Used with potions (min 60) */ -#define MAX_SHROOM 20 /* Used with mushrooms (min 20) */ -#define MAX_TITLES 55 /* Used with scrolls (min 48) */ -#define MAX_SYLLABLES 164 /* Used with scrolls (see below) */ - - -/* - * Rings (adjectives and colors) - */ - -static cptr ring_adj[MAX_ROCKS] -#ifndef JP -= { - "Alexandrite", "Amethyst", "Aquamarine", "Azurite", "Beryl", - "Bloodstone", "Calcite", "Carnelian", "Corundum", "Diamond", - "Emerald", "Fluorite", "Garnet", "Granite", "Jade", - "Jasper", "Lapis Lazuli", "Malachite", "Marble", "Moonstone", - "Onyx", "Opal", "Pearl", "Quartz", "Quartzite", - "Rhodonite", "Ruby", "Sapphire", "Tiger Eye", "Topaz", - "Turquoise", "Zircon", "Platinum", "Bronze", "Gold", - "Obsidian", "Silver", "Tortoise Shell", "Mithril", "Jet", - "Engagement", "Adamantite", - "Wire", "Dilithium", "Bone", "Wooden", - "Spikard", "Serpent", "Wedding", "Double", - "Plain", "Brass", "Scarab","Shining", - "Rusty","Transparent", "Steel", "Tanzanite", - "Nephrite", -}; -#else -= { - "¶âÎÐÀФÎ","¥¢¥á¥¸¥¹¥È¤Î","¥¢¥¯¥¢¥Þ¥ê¥ó¤Î","¤á¤Î¤¦¤Î","ÎÐÃìÀФÎ", - "·ì¶Ì¿ï¤Î","Êý²òÀФÎ","ÀÖ¤á¤Î¤¦¤Î","¹Ë¶Ì¤Î","¥À¥¤¥¢¥â¥ó¥É¤Î", - "¥¨¥á¥é¥ë¥É¤Î","¥Û¥¿¥ëÀФÎ","¥¬¡¼¥Í¥Ã¥È¤Î","¸æ±ÆÀФÎ","¤Ò¤¹¤¤¤Î", - "¥¸¥ã¥¹¥Ñ¡¼¤Î","ÀÄÎÜÍþ¤Î","¥¯¥¸¥ã¥¯ÀФÎ","ÂçÍýÀФÎ","¥à¡¼¥ó¥¹¥È¡¼¥ó¤Î", - "¼Ê¤á¤Î¤¦¤Î","¥ª¥Ñ¡¼¥ë¤Î","¿¿¼î¤Î","¿å¾½¤Î","ÀбѴä¤Î", - "¥¶¥¯¥íÀФÎ","¥ë¥Ó¡¼¤Î","¥µ¥Õ¥¡¥¤¥¢¤Î","¥¿¥¤¥¬¡¼¥¢¥¤¤Î","¥È¥Ñ¡¼¥º¤Î", - "¥È¥ë¥³ÀФÎ","¥¸¥ë¥³¥ó¤Î","¥×¥é¥Á¥Ê¤Î","¥Ö¥í¥ó¥º¤Î","¶â¤Î", - "¹õÍËÀФÎ","¶ä¤Î","¤Ù¤Ã¹Ã¤Î","¥ß¥¹¥ê¥ë¤Î","¹õ¶Ì¤Î", - "º§Ìó","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î", - "¿Ë¶â¤Î","¥Ç¥£¥ê¥·¥¦¥à¤Î","¹ü¤Î","ÌÚ¤Î", - "¥¹¥Ô¥«¤Î" /*nuke me*/ ,"¼Ø¤Î","·ëº§","Æó½Å¤Î", - "¾þ¤ê¤Î¤Ê¤¤","ÀÄƼ¤Î","¥¹¥«¥é¥Ù¤Î" ,"µ±¤¯", - "»¬¤Ó¤¿","Æ©ÌÀ¤Ê","¹ÝÅ´¤Î","¥¿¥ó¥¶¥Ê¥¤¥È¤Î", - "Æð¶Ì¤Î", -}; -#endif - -static byte ring_col[MAX_ROCKS] = -{ - TERM_GREEN, TERM_VIOLET, TERM_L_BLUE, TERM_L_BLUE, TERM_L_GREEN, - TERM_RED, TERM_WHITE, TERM_RED, TERM_SLATE, TERM_WHITE, - TERM_GREEN, TERM_L_GREEN, TERM_RED, TERM_L_DARK, TERM_L_GREEN, - TERM_UMBER, TERM_BLUE, TERM_GREEN, TERM_WHITE, TERM_L_WHITE, - TERM_L_RED, TERM_L_WHITE, TERM_WHITE, TERM_L_WHITE, TERM_L_WHITE, - TERM_L_RED, TERM_RED, TERM_BLUE, TERM_YELLOW, TERM_YELLOW, - TERM_L_BLUE, TERM_L_UMBER, TERM_WHITE, TERM_L_UMBER, TERM_YELLOW, - TERM_L_DARK, TERM_L_WHITE, TERM_GREEN, TERM_L_BLUE, TERM_L_DARK, - TERM_YELLOW, TERM_VIOLET, - TERM_UMBER, TERM_L_WHITE, TERM_WHITE, TERM_UMBER, - TERM_BLUE, TERM_GREEN, TERM_YELLOW, TERM_ORANGE, - TERM_YELLOW, TERM_ORANGE, TERM_L_GREEN, TERM_YELLOW, - TERM_RED, TERM_WHITE, TERM_WHITE, TERM_YELLOW, - TERM_GREEN, -}; - - -/* - * Amulets (adjectives and colors) - */ -static cptr amulet_adj[MAX_AMULETS] -#ifndef JP -= { - "Amber", "Driftwood", "Coral", "Agate", "Ivory", - "Obsidian", "Bone", "Brass", "Bronze", "Pewter", - "Tortoise Shell", "Golden", "Azure", "Crystal", "Silver", - "Copper", "Swastika", "Platinum","Runed", "Rusty", - "Curved", "Dragon's claw", "Rosary", "Jade", "Mithril", - "Ruby" -}; -#else -= { - "àèàá¤Î","ήÌÚ¤Î","¥µ¥ó¥´¤Î","¤á¤Î¤¦¤Î","¾Ý²ç¤Î", - "¹õÍËÀФÎ","¹ü¤Î","¿¿ï«¤Î","ÀÄƼ¤Î","¤·¤í¤á¤Î", - "¤Ù¤Ã¹Ã¤Î","¶â¤Î","ÎÜÍþ¤Î","¿å¾½¤Î","¶ä¤Î", - "Ƽ¤Î","ÒĤÎ", "¥×¥é¥Á¥Ê¤Î", "¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","»¬¤Ó¤¿", - "¶Ê¤¬¤Ã¤¿", "¥É¥é¥´¥ó¤ÎÄÞ¤Î", "¿ô¼î¤Î", "¤Ò¤¹¤¤¤Î", "¥ß¥¹¥ê¥ë¤Î", - "¥ë¥Ó¡¼¤Î" -}; -#endif - -static byte amulet_col[MAX_AMULETS] = -{ - TERM_YELLOW, TERM_L_UMBER, TERM_WHITE, TERM_L_WHITE, TERM_WHITE, - TERM_L_DARK, TERM_WHITE, TERM_L_UMBER, TERM_L_UMBER, TERM_SLATE, - TERM_GREEN, TERM_YELLOW, TERM_L_BLUE, TERM_L_BLUE, TERM_L_WHITE, - TERM_L_UMBER, TERM_VIOLET, TERM_WHITE, TERM_UMBER, TERM_RED, - TERM_GREEN, TERM_L_GREEN, TERM_L_GREEN, TERM_GREEN, TERM_L_BLUE, - TERM_RED -}; - - -/* - * Staffs (adjectives and colors) - */ -static cptr staff_adj[MAX_WOODS] -#ifndef JP -= { - "Aspen", "Balsa", "Banyan", "Birch", "Cedar", - "Cottonwood", "Cypress", "Dogwood", "Elm", "Eucalyptus", - "Hemlock", "Hickory", "Ironwood", "Locust", "Mahogany", - "Maple", "Mulberry", "Oak", "Pine", "Redwood", - "Rosewood", "Spruce", "Sycamore", "Teak", "Walnut", - "Mistletoe", "Hawthorn", "Bamboo", "Silver", "Runed", - "Golden", "Ashen", "Ivory","Gnarled"/*,"Willow"*/ -}; -#else -= { - "¥Ý¥×¥é¤Î","¥Ð¥ë¥µ¤Î","¥Ð¥ó¥ä¥ó¤Î","¥«¥Ð¤Î","À¾ÍÎ¥¹¥®¤Î", - "ÛؤÎ","¥¤¥È¥¹¥®¤Î","¥ß¥º¥­¤Î","¥Ë¥ì¤Î","¥æ¡¼¥«¥ê¤Î", - "¥Ä¥¬¤Î","¥Ö¥Ê¤Î","¹õÃɤÎ","¥¢¥«¥·¥¢¤Î","¥Þ¥Û¥¬¥Ë¡¼¤Î", - "¥«¥¨¥Ç¤Î","¥¯¥ï¤Î","¥«¥·¤Î","¾¾¤Î","¿ù¤Î", - "»çÃɤÎ","¥¨¥¾¥Þ¥Ä¤Î","¥¤¥Á¥¸¥¯¤Î","¥Á¡¼¥¯¤Î","¥¯¥ë¥ß¤Î", - "¥ä¥É¥ê¥®¤Î","¥µ¥ó¥¶¥·¤Î","ÃݤÎ","¶ä¤Î","¥ë¡¼¥ó¤Î", - "¶â¤Î","¥È¥Í¥ê¥³¤Î", "¾Ý²ç¤Î", "·î·Ë¼ù¤Î" -}; -#endif - -static byte staff_col[MAX_WOODS] = -{ - TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, - TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, - TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER, TERM_L_UMBER, TERM_UMBER, - TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_RED, - TERM_RED, TERM_L_UMBER, TERM_L_UMBER, TERM_L_UMBER, TERM_UMBER, - TERM_GREEN, TERM_L_UMBER, TERM_L_UMBER, TERM_L_WHITE, TERM_UMBER, - TERM_YELLOW, TERM_SLATE, TERM_WHITE, TERM_SLATE -}; - - -/* - * Wands (adjectives and colors) - */ -static cptr wand_adj[MAX_METALS] -#ifndef JP -= { - "Aluminum", "Cast Iron", "Chromium", "Copper", "Gold", - "Iron", "Magnesium", "Molybdenum", "Nickel", "Rusty", - "Silver", "Steel", "Tin", "Titanium", "Tungsten", - "Zirconium", "Zinc", "Aluminum-Plated", "Copper-Plated", "Gold-Plated", - "Nickel-Plated", "Silver-Plated", "Steel-Plated", "Tin-Plated", "Zinc-Plated", - "Mithril-Plated", "Mithril", "Runed", "Bronze", "Brass", - "Platinum", "Lead","Lead-Plated", "Ivory" , "Adamantite", - "Uridium", "Long", "Short", "Hexagonal", "Carbonized" -}; -#else -= { - "¥¢¥ë¥ß¤Î","ÃòÅ´¤Î","¥¯¥í¥à¤Î","Ƽ¤Î","¶â¤Î", - "Å´¤Î","¥Þ¥°¥Í¥·¥¦¥à¤Î","¥â¥ê¥Ö¥Ç¥ó¤Î","¥Ë¥Ã¥±¥ë¤Î","»¬¤Ó¤¿", - "¶ä¤Î","¹ÝÅ´¤Î","¥Ö¥ê¥­¤Î","¥Á¥¿¥ó¤Î","¥¿¥ó¥°¥¹¥Æ¥ó¤Î", - "¥¸¥ë¥³¥ó¤Î","°¡±ô¤Î","¥¢¥ë¥ß¥á¥Ã¥­¤Î","Ƽ¥á¥Ã¥­¤Î","¶â¥á¥Ã¥­¤Î", - "ÇòƼ¥á¥Ã¥­¤Î","¶ä¥á¥Ã¥­¤Î","Å´¥á¥Ã¥­¤Î","¥¹¥º¥á¥Ã¥­¤Î","°¡±ô¥á¥Ã¥­¤Î", - "¥ß¥¹¥ê¥ë¥á¥Ã¥­¤Î","¥ß¥¹¥ê¥ë¤Î","¥ë¡¼¥ó¤¬¹ï¤Þ¤ì¤¿","ÀÄƼ¤Î","¿¿ï«¤Î", - "¥×¥é¥Á¥Ê¤Î","±ô¤Î","±ô¥á¥Ã¥­¤Î","¾Ý²ç¤Î","¥¢¥À¥Þ¥ó¥¿¥¤¥È¤Î", - "¥¤¥ê¥Â¥¦¥à¤Î","Ť¤","û¤¤","Ï»³Ñ·Á¤Î", "úÁǤÎ" -}; -#endif - -static byte wand_col[MAX_METALS] = -{ - TERM_L_BLUE, TERM_L_DARK, TERM_WHITE, TERM_L_UMBER, TERM_YELLOW, - TERM_SLATE, TERM_L_WHITE, TERM_L_WHITE, TERM_L_UMBER, TERM_RED, - TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE, TERM_WHITE, TERM_WHITE, - TERM_L_WHITE, TERM_L_WHITE, TERM_L_BLUE, TERM_L_UMBER, TERM_YELLOW, - TERM_L_UMBER, TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE, TERM_L_WHITE, - TERM_L_BLUE, TERM_L_BLUE, TERM_UMBER, TERM_L_UMBER, TERM_L_UMBER, - TERM_WHITE, TERM_SLATE, TERM_SLATE, TERM_WHITE, TERM_VIOLET, - TERM_L_RED, TERM_L_BLUE, TERM_BLUE, TERM_RED, TERM_L_DARK -}; - - -/* - * Rods (adjectives and colors). - * Efficiency -- copied from wand arrays - */ - -static cptr rod_adj[MAX_METALS]; - -static byte rod_col[MAX_METALS]; - - -/* - * Mushrooms (adjectives and colors) - */ - -static cptr food_adj[MAX_SHROOM] -#ifndef JP -= { - "Blue", "Black", "Black Spotted", "Brown", "Dark Blue", - "Dark Green", "Dark Red", "Yellow", "Furry", "Green", - "Grey", "Light Blue", "Light Green", "Violet", "Red", - "Slimy", "Tan", "White", "White Spotted", "Wrinkled", -}; -#else -= { - "ÀĤ¤","¹õ¤¤","¹õÈäÎ","Ã㿧¤Î","·²ÀĤÎ", - "¿¼ÎФÎ","¹È¿§¤Î","²«¿§¤¤","Âݤष¤¿","ÎФÎ", - "¥°¥ì¡¼¤Î","¶õ¿§¤Î","²«ÎФÎ","¥¹¥ß¥ì¿§¤Î","ÀÖ¤¤", - "¤Í¤Ð¤Í¤Ð¤·¤¿","²«³ì¿§¤Î","Çò¤¤","ÇòÈäÎ","¤·¤ï¤·¤ï¤Î", -}; -#endif - -static byte food_col[MAX_SHROOM] = -{ - TERM_BLUE, TERM_L_DARK, TERM_L_DARK, TERM_UMBER, TERM_BLUE, - TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_L_WHITE, TERM_GREEN, - TERM_SLATE, TERM_L_BLUE, TERM_L_GREEN, TERM_VIOLET, TERM_RED, - TERM_SLATE, TERM_L_UMBER, TERM_WHITE, TERM_WHITE, TERM_UMBER -}; - - -/* - * Color adjectives and colors, for potions. - * Hack -- The first four entries are hard-coded. - * (water, apple juice, slime mold juice, something) - */ - -static cptr potion_adj[MAX_COLORS] -#ifndef JP -= { - "Clear", "Light Brown", "Icky Green", "xxx", - "Azure", "Blue", "Blue Speckled", "Black", "Brown", "Brown Speckled", - "Bubbling", "Chartreuse", "Cloudy", "Copper Speckled", "Crimson", "Cyan", - "Dark Blue", "Dark Green", "Dark Red", "Gold Speckled", "Green", - "Green Speckled", "Grey", "Grey Speckled", "Hazy", "Indigo", - "Light Blue", "Light Green", "Magenta", "Metallic Blue", "Metallic Red", - "Metallic Green", "Metallic Purple", "Misty", "Orange", "Orange Speckled", - "Pink", "Pink Speckled", "Puce", "Purple", "Purple Speckled", - "Red", "Red Speckled", "Silver Speckled", "Smoky", "Tangerine", - "Violet", "Vermilion", "White", "Yellow", "Violet Speckled", - "Pungent", "Clotted Red", "Viscous Pink", "Oily Yellow", "Gloopy Green", - "Shimmering", "Coagulated Crimson", "Yellow Speckled", "Gold", - "Manly", "Stinking", "Oily Black", "Ichor", "Ivory White", "Sky Blue", - "Gray", "Silver", "Bronze", "Flashing", -}; -#else -= { - "Æ©ÌÀ¤Ê","ÇöÃ㿧¤Î","¤è¤É¤ó¤ÀÎФÎ","¼¿¹õ¤Î", - "º°ÊˤÎ","ÀĤ¤","ÀÄÈäÎ","¹õ¤¤","Ã㿧¤Î","ÃãÈäÎ", - "Ë¢¤À¤Ã¤¿","Çö²«Î理Î","Âù¤Ã¤¿","ƼÈäÎ","¹È¿§¤Î","¥·¥¢¥ó¿§¤Î", - "·²ÀÄ¿§¤Î","¿¼¤¤ÎФÎ","¿¼¤¤ÀÖ¿§¤Î","¶âÈäÎ","Î理Î", - "ÎÐÈäÎ","³¥¿§¤Î","³¥ÈäÎ","¤Ü¤ä¤±¤¿¿§¤Î","Íõ¿§¤Î", - "Çö¤¤ÀÄ¿§¤Î","Çö¤¤Î理Î","¥Þ¥¼¥ó¥¿¿§¤Î","ÀĤ¯µ±¤¯","ÀÖ¤¯µ±¤¯", - "ÎФ˵±¤¯","»ç¤Ëµ±¤¯","̸¾õ¤Î","¥ª¥ì¥ó¥¸¿§¤Î","¥ª¥ì¥ó¥¸ÈäÎ", - "¥Ô¥ó¥¯¿§¤Î","¥Ô¥ó¥¯ÈäÎ","¹õ³ì¿§¤Î","»ç¿§¤Î","¤¦¤¹¤¤»çÈäÎ", - "ÀÖ¤¤","ÀÖÈäÎ","¶äÈäÎ","±ì¤Ã¤¿","Üô¿§¤Î", - "¥¹¥ß¥ì¿§¤Î","¼ë¿§¤Î","Çò¤¤","²«¿§¤¤", "»çÈäÎ", - "»É·ã½­¤Î¤¹¤ë","¤è¤É¤ó¤ÀÀÖ¤Î","¥É¥í¥É¥í¤Î","¤Í¤Ð¤Ã¤¿²«¿§¤Î","°ÅÎ理Î", - "µ±¤¯","¤Í¤Ð¤Ã¤¿¿¼¹È¤Î","²«ÈäÎ","¶â¿§¤Î", - "Ã˽­¤¤" /*nuke me*/,"°­½­¤Î¤¹¤ë","¹õÌý¿§¤Î","ǾÞù¤Î", - "¾Ý²ç¿§¤Î","¶õ¿§¤Î", "¤Í¤º¤ß¿§¤Î", "¶ä¿§¤Î", "ÀÖƼ¿§¤Î", - "¥­¥é¥­¥é¸÷¤ë" -}; -#endif - -static byte potion_col[MAX_COLORS] = -{ - TERM_WHITE, TERM_L_UMBER, TERM_GREEN, 0, - TERM_L_BLUE, TERM_BLUE, TERM_BLUE, TERM_L_DARK, TERM_UMBER, TERM_UMBER, - TERM_L_WHITE, TERM_L_GREEN, TERM_WHITE, TERM_L_UMBER, TERM_RED, TERM_L_BLUE, - TERM_BLUE, TERM_GREEN, TERM_RED, TERM_YELLOW, TERM_GREEN, - TERM_GREEN, TERM_SLATE, TERM_SLATE, TERM_L_WHITE, TERM_VIOLET, - TERM_L_BLUE, TERM_L_GREEN, TERM_RED, TERM_BLUE, TERM_RED, - TERM_GREEN, TERM_VIOLET, TERM_L_WHITE, TERM_ORANGE, TERM_ORANGE, - TERM_L_RED, TERM_L_RED, TERM_VIOLET, TERM_VIOLET, TERM_VIOLET, - TERM_RED, TERM_RED, TERM_L_WHITE, TERM_L_DARK, TERM_ORANGE, - TERM_VIOLET, TERM_RED, TERM_WHITE, TERM_YELLOW, TERM_VIOLET, - TERM_L_RED, TERM_RED, TERM_L_RED, TERM_YELLOW, TERM_GREEN, - TERM_MULTI, TERM_RED, TERM_YELLOW, TERM_YELLOW, - TERM_L_UMBER, TERM_UMBER, TERM_L_DARK, TERM_RED, - TERM_WHITE, TERM_L_BLUE, TERM_L_WHITE, TERM_WHITE, TERM_RED, - TERM_YELLOW -}; - - -/* - * Syllables for scrolls (must be 1-4 letters each) - */ - -static cptr syllables[MAX_SYLLABLES] -#ifdef JP -= { - "Å·", "ÃÏ", "̵", "ÍÑ", "°ì", "Åá", "ξ", "ÃÇ", - "°á", "Ë¥", "Æü", "Àé", "½©", "Ëþ", "¿È", "ÁÏ", - "áØ", "¼·", "ž", "Ȭ", "ÅÝ", "²é", "¿Å", - "¾¨", "ÃÀ", "µ¯", "»à", "²ó", "À¸", "ʸ", - "Éð", "Æ»", "ε", "Ƭ", "¼Ø", "Èø", "ñ", "Åá", "ľ", "Æþ", - "¿Ê", "Âà", "¸Þ", "¡", "Ï»", "ç¥", "Âç", "»³", "ÌÄ", - "Æ°", "É÷", "ÎÓ", "²Ð", "Àä", "ÂÎ", "Ì¿", "»Í", - "ÌÌ", "Á¿", "²Î", "´°", "Á´", "·ç", "Ä·", "ÎÂ", - "ìí", "î½", "òµ", "Ì¥", "ò³", "ò´", "½Ä", - "²£", "¿Ô", "¿À", "½Ð", "µ´", "Ë×", "²¹", "¸Î", "ÃÎ", - "¿·", "½Õ", "²Æ", "Åß", "½ã", "¿¿", "¹¤", "¶½", - "Ì£", "ÄÅ", "³Î", "Èæ", "¶ì", "¿´", "»´", "߸", - "Ç°", "ȯ", "Á°", "Âå", "̤", "ʹ", "¶õ", "¸å", - "Ú¼", "¶â", "¿¹", "Íå", "Ëü", "¾Ý", "ÊÑ", "²½", - "½½", "Ãæ", "Ȭ", "¶å", "¿Í", "¿§", "»î", "¹Ô", - "ºø", "¸í", "»ö", "¼Â", "º¬", "µÛ", "¼ý", "¹ç", - "Ê»", "Á´", "¹ñ", "À©", "ÇÆ", "¾Æ", "Æù", "Äê", - "¿©", "¹ü", "²ç", "Ìø", "Èô", "æÆ", "Éõ", "°õ", - "¼À", "Íð", "Éð", "¾­", "·Ú", "Ǧ", "·õ", "ǽ", - "À»", "¼Ù", "¼ö", "¼±", "¸¸", "´¶", "ÆÇ", "°Ç", - "Íî", "±¢", "ÍÛ" -}; -#else -= { - "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", - "arg", "arze", "ash", "aus", "ban", "bar", "bat", "bek", - "bie", "bin", "bit", "bjor", "blu", "bot", "bu", - "byt", "comp", "con", "cos", "cre", "dalf", "dan", - "den", "der", "doe", "dok", "eep", "el", "eng", "er", "ere", "erk", - "esh", "evs", "fa", "fid", "flit", "for", "fri", "fu", "gan", - "gar", "glen", "gop", "gre", "ha", "he", "hyd", "i", - "ing", "ion", "ip", "ish", "it", "ite", "iv", "jo", - "kho", "kli", "klis", "la", "lech", "man", "mar", - "me", "mi", "mic", "mik", "mon", "mung", "mur", "nag", "nej", - "nelg", "nep", "ner", "nes", "nis", "nih", "nin", "o", - "od", "ood", "org", "orn", "ox", "oxy", "pay", "pet", - "ple", "plu", "po", "pot", "prok", "re", "rea", "rhov", - "ri", "ro", "rog", "rok", "rol", "sa", "san", "sat", - "see", "sef", "seh", "shu", "ski", "sna", "sne", "snik", - "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab", - "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u", - "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", - "vom", "wah", "wed", "werg", "wex", "whon", "wun", "x", - "yerg", "yp", "zun", "tri", "blaa", "jah", "bul", "on", - "foo", "ju", "xuxu" -}; -#endif - - -/* - * Hold the titles of scrolls, 6 to 14 characters each - * Also keep an array of scroll colors (always WHITE for now) - */ -static char scroll_adj[MAX_TITLES][16]; - -static byte scroll_col[MAX_TITLES]; - - -/* - * Certain items, if aware, are known instantly +/*! + * @brief 最初から簡易な名称が明らかになるベースアイテムの判定。 / Certain items, if aware, are known instantly + * @param i ベースアイテムID + * @return 簡易名称を明らかにするならTRUEを返す。 + * @details * This function is used only by "flavor_init()" */ static bool object_easy_know(int i) @@ -397,11 +34,12 @@ static bool object_easy_know(int i) case TV_DEATH_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: - case TV_HAJA_BOOK: + case TV_CRUSADE_BOOK: case TV_MUSIC_BOOK: case TV_HISSATSU_BOOK: + case TV_HEX_BOOK: { return (TRUE); } @@ -431,83 +69,51 @@ static bool object_easy_know(int i) return (FALSE); } - -/* - * Certain items have a flavor - * This function is used only by "flavor_init()" +/*! + * @brief 各種語彙からランダムな名前を作成する / Create a name from random parts. + * @param out_string 作成した名を保管する参照ポインタ + * @return なし + * @details 日本語の場合 aname_j.txt 英語の場合確率に応じて + * syllables 配列と elvish.txt を組み合わせる。\n */ -static bool object_flavor(int k_idx) -{ - object_kind *k_ptr = &k_info[k_idx]; - - /* Analyze the item */ - switch (k_ptr->tval) - { - case TV_AMULET: - { - return (0x80 + amulet_col[k_ptr->sval]); - } - - case TV_RING: - { - return (0x90 + ring_col[k_ptr->sval]); - } - - case TV_STAFF: - { - return (0xA0 + staff_col[k_ptr->sval]); - } - - case TV_WAND: - { - return (0xB0 + wand_col[k_ptr->sval]); - } - - case TV_ROD: - { - return (0xC0 + rod_col[k_ptr->sval]); - } - - case TV_SCROLL: - { - return (0xD0 + scroll_col[k_ptr->sval]); - } - - case TV_POTION: - { - return (0xE0 + potion_col[k_ptr->sval]); - } - - case TV_FOOD: - { - if (k_ptr->sval < SV_FOOD_MIN_FOOD) - { - return (0xF0 + food_col[k_ptr->sval]); - } - - break; - } - } - - /* No flavor */ - return (0); -} - - -void get_table_name(char *out_string) +void get_table_name_aux(char *out_string) { #ifdef JP - char Syllable[80]; - strcpy(out_string, "¡Ø"); + char Syllable[80]; get_rnd_line("aname_j.txt", 1, Syllable); - strcat(out_string, Syllable); + strcpy(out_string, Syllable); get_rnd_line("aname_j.txt", 2, Syllable); strcat(out_string, Syllable); - strcat(out_string, "¡Ù"); #else +#define MAX_SYLLABLES 164 /* Used with scrolls (see below) */ + + static cptr syllables[MAX_SYLLABLES] = { + "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", + "arg", "arze", "ash", "aus", "ban", "bar", "bat", "bek", + "bie", "bin", "bit", "bjor", "blu", "bot", "bu", + "byt", "comp", "con", "cos", "cre", "dalf", "dan", + "den", "der", "doe", "dok", "eep", "el", "eng", "er", "ere", "erk", + "esh", "evs", "fa", "fid", "flit", "for", "fri", "fu", "gan", + "gar", "glen", "gop", "gre", "ha", "he", "hyd", "i", + "ing", "ion", "ip", "ish", "it", "ite", "iv", "jo", + "kho", "kli", "klis", "la", "lech", "man", "mar", + "me", "mi", "mic", "mik", "mon", "mung", "mur", "nag", "nej", + "nelg", "nep", "ner", "nes", "nis", "nih", "nin", "o", + "od", "ood", "org", "orn", "ox", "oxy", "pay", "pet", + "ple", "plu", "po", "pot", "prok", "re", "rea", "rhov", + "ri", "ro", "rog", "rok", "rol", "sa", "san", "sat", + "see", "sef", "seh", "shu", "ski", "sna", "sne", "snik", + "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab", + "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u", + "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", + "vom", "wah", "wed", "werg", "wex", "whon", "wun", "x", + "yerg", "yp", "zun", "tri", "blaa", "jah", "bul", "on", + "foo", "ju", "xuxu" + }; + int testcounter = randint1(3) + 1; - strcpy(out_string, "'"); + strcpy(out_string, ""); if (randint1(3) == 2) { @@ -525,258 +131,208 @@ void get_table_name(char *out_string) } } - out_string[1] = toupper(out_string[1]); + out_string[0] = toupper(out_string[1]); - strcat(out_string, "'"); + out_string[16] = '\0'; #endif - - - out_string[18] = '\0'; - - return; } - -/* - * Prepare the "variable" part of the "k_info" array. - * - * The "color"/"metal"/"type" of an item is its "flavor". - * For the most part, flavors are assigned randomly each game. - * - * Initialize descriptions for the "colored" objects, including: - * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls. - * - * The first 4 entries for potions are fixed (Water, Apple Juice, - * Slime Mold Juice, Unused Potion). - * - * Scroll titles are always between 6 and 14 letters long. This is - * ensured because every title is composed of whole words, where every - * word is from 1 to 8 letters long (one or two syllables of 1 to 4 - * letters each), and that no scroll is finished until it attempts to - * grow beyond 15 letters. The first time this can happen is when the - * current title has 6 letters and the new word has 8 letters, which - * would result in a 6 letter scroll title. - * - * Duplicate titles are avoided by requiring that no two scrolls share - * the same first four letters (not the most efficient method, and not - * the least efficient method, but it will always work). - * - * Hack -- make sure everything stays the same for each saved game - * This is accomplished by the use of a saved "random seed", as in - * "town_gen()". Since no other functions are called while the special - * seed is in effect, so this function is pretty "safe". - * - * Note that the "hacked seed" may provide an RNG with alternating parity! +/*! + * @brief ランダムな名前をアーティファクト銘として整形する。 / Create a name from random parts with quotes. + * @param out_string 作成した名を保管する参照ポインタ + * @return なし + * @details get_table_name_aux()ほぼ完全に実装を依存している。 */ -void flavor_init(void) +void get_table_name(char *out_string) { - int i, j; - - byte temp_col; + char buff[80]; + get_table_name_aux(buff); + sprintf(out_string, _("『%s』", "'%s'"), buff); +} - cptr temp_adj; +/*! + * @brief ランダムなシンダリン銘を作成する / Make random Sindarin name + * @param out_string 作成した名を保管する参照ポインタ + * @return なし + * @details sname.txtが語幹の辞書となっている。 + */ +void get_table_sindarin_aux(char *out_string) +{ + char Syllable[80]; +#ifdef JP + char tmp[80]; +#endif + get_rnd_line("sname.txt", 1, Syllable); +#ifdef JP + strcpy(tmp, Syllable); +#else + strcpy(out_string, Syllable); +#endif - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; + get_rnd_line("sname.txt", 2, Syllable); +#ifdef JP + strcat(tmp, Syllable); + sindarin_to_kana(out_string, tmp); +#else + strcat(out_string, Syllable); +#endif +} - /* Hack -- Induce consistant flavors */ - Rand_value = seed_flavor; +/*! + * @brief シンダリン銘をアーティファクト用に整形する。 / Make random Sindarin name with quotes + * @param out_string 作成した名を保管する参照ポインタ + * @return なし + * @details get_table_sindarin_aux()ほぼ完全に実装を依存している。 + */ +void get_table_sindarin(char *out_string) +{ + char buff[80]; + get_table_sindarin_aux(buff); + sprintf(out_string, _("『%s』", "'%s'"), buff); +} - /* Efficiency -- Rods/Wands share initial array */ - for (i = 0; i < MAX_METALS; i++) - { - rod_adj[i] = wand_adj[i]; - rod_col[i] = wand_col[i]; - } +/*! + * @brief ベースアイテムの未確定名を共通tval間でシャッフルする / Shuffle flavor indices of a group of objects with given tval + * @param tval シャッフルしたいtval + * @return なし + * @details 巻物、各種魔道具などに利用される。 + */ +static void shuffle_flavors(byte tval) +{ + IDX *k_idx_list; + IDX k_idx_list_num = 0; + IDX i; + /* Allocate an array for a list of k_idx */ + C_MAKE(k_idx_list, max_k_idx, s16b); - /* Rings have "ring colors" */ - for (i = 0; i < MAX_ROCKS; i++) + /* Search objects with given tval for shuffle */ + for (i = 0; i < max_k_idx; i++) { - j = randint0(MAX_ROCKS); - temp_adj = ring_adj[i]; - ring_adj[i] = ring_adj[j]; - ring_adj[j] = temp_adj; - - temp_col = ring_col[i]; - ring_col[i] = ring_col[j]; - ring_col[j] = temp_col; - } + object_kind *k_ptr = &k_info[i]; - /* Hack -- The One Ring */ -#ifdef JP - ring_adj[SV_RING_POWER] = "¶â̵¹¤¤Î"; - ring_adj[SV_RING_AHO] = "¶âÍ­¹¤¤Î"; -#else - ring_adj[SV_RING_POWER] = "Plain Gold"; - ring_adj[SV_RING_AHO] = "Plain Goldarn"; -#endif + /* Skip non-Rings */ + if (k_ptr->tval != tval) continue; - if (!use_graphics) - { - ring_col[SV_RING_POWER] = TERM_YELLOW; - ring_col[SV_RING_AHO] = TERM_YELLOW; - } + /* Paranoia -- Skip objects without flavor */ + if (!k_ptr->flavor) continue; - /* Amulets have "amulet colors" */ - for (i = 0; i < MAX_AMULETS; i++) - { - j = randint0(MAX_AMULETS); - temp_adj = amulet_adj[i]; - amulet_adj[i] = amulet_adj[j]; - amulet_adj[j] = temp_adj; - - temp_col = amulet_col[i]; - amulet_col[i] = amulet_col[j]; - amulet_col[j] = temp_col; - } + /* Skip objects with a fixed flavor name */ + if (have_flag(k_ptr->flags, TR_FIXED_FLAVOR)) continue; - /* Staffs */ - for (i = 0; i < MAX_WOODS; i++) - { - j = randint0(MAX_WOODS); - temp_adj = staff_adj[i]; - staff_adj[i] = staff_adj[j]; - staff_adj[j] = temp_adj; - - temp_col = staff_col[i]; - staff_col[i] = staff_col[j]; - staff_col[j] = temp_col; - } + /* Remember k_idx */ + k_idx_list[k_idx_list_num] = i; - /* Wands */ - for (i = 0; i < MAX_METALS; i++) - { - j = randint0(MAX_METALS); - temp_adj = wand_adj[i]; - wand_adj[i] = wand_adj[j]; - wand_adj[j] = temp_adj; - - temp_col = wand_col[i]; - wand_col[i] = wand_col[j]; - wand_col[j] = temp_col; + /* Increase number of remembered indices */ + k_idx_list_num++; } - /* Rods */ - for (i = 0; i < MAX_METALS; i++) + /* Shuffle flavors */ + for (i = 0; i < k_idx_list_num; i++) { - j = randint0(MAX_METALS); - temp_adj = rod_adj[i]; - rod_adj[i] = rod_adj[j]; - rod_adj[j] = temp_adj; - - temp_col = rod_col[i]; - rod_col[i] = rod_col[j]; - rod_col[j] = temp_col; - } + object_kind *k1_ptr = &k_info[k_idx_list[i]]; + object_kind *k2_ptr = &k_info[k_idx_list[randint0(k_idx_list_num)]]; - /* Foods (Mushrooms) */ - for (i = 0; i < MAX_SHROOM; i++) - { - j = randint0(MAX_SHROOM); - temp_adj = food_adj[i]; - food_adj[i] = food_adj[j]; - food_adj[j] = temp_adj; - - temp_col = food_col[i]; - food_col[i] = food_col[j]; - food_col[j] = temp_col; - } - - /* Potions */ - for (i = 4; i < MAX_COLORS; i++) - { - j = randint0(MAX_COLORS - 4) + 4; - temp_adj = potion_adj[i]; - potion_adj[i] = potion_adj[j]; - potion_adj[j] = temp_adj; - - temp_col = potion_col[i]; - potion_col[i] = potion_col[j]; - potion_col[j] = temp_col; + /* Swap flavors of this pair */ + s16b tmp = k1_ptr->flavor; + k1_ptr->flavor = k2_ptr->flavor; + k2_ptr->flavor = tmp; } - /* Scrolls (random titles, always white) */ - for (i = 0; i < MAX_TITLES; i++) - { - /* Get a new title */ - while (TRUE) - { - char buf[80]; - - bool okay; - - /* Start a new title */ - buf[0] = '\0'; - - /* Collect words until done */ - while (1) - { - int q, s; + /* Free an array for a list of k_idx */ + C_KILL(k_idx_list, max_k_idx, s16b); +} - char tmp[80]; +/*! + * @brief ゲーム開始時に行われるベースアイテムの初期化ルーチン / Prepare the "variable" part of the "k_info" array. + * @return なし + * @details + * Prepare the "variable" part of the "k_info" array.\n + *\n + * The "color"/"metal"/"type" of an item is its "flavor".\n + * For the most part, flavors are assigned randomly each game.\n + *\n + * Initialize descriptions for the "colored" objects, including:\n + * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.\n + *\n + * The first 4 entries for potions are fixed (Water, Apple Juice,\n + * Slime Mold Juice, Unused Potion).\n + *\n + * Scroll titles are always between 6 and 14 letters long. This is\n + * ensured because every title is composed of whole words, where every\n + * word is from 1 to 8 letters long (one or two syllables of 1 to 4\n + * letters each), and that no scroll is finished until it attempts to\n + * grow beyond 15 letters. The first time this can happen is when the\n + * current title has 6 letters and the new word has 8 letters, which\n + * would result in a 6 letter scroll title.\n + *\n + * Duplicate titles are avoided by requiring that no two scrolls share\n + * the same first four letters (not the most efficient method, and not\n + * the least efficient method, but it will always work).\n + *\n + * Hack -- make sure everything stays the same for each saved game\n + * This is accomplished by the use of a saved "random seed", as in\n + * "town_gen()". Since no other functions are called while the special\n + * seed is in effect, so this function is pretty "safe".\n + *\n + * Note that the "hacked seed" may provide an RNG with alternating parity!\n + */ +void flavor_init(void) +{ + KIND_OBJECT_IDX i; + u32b state_backup[4]; - /* Start a new word */ - tmp[0] = '\0'; + /* Hack -- Backup the RNG state */ + Rand_state_backup(state_backup); - /* Choose one or two syllables */ - s = ((randint0(100) < 30) ? 1 : 2); + /* Hack -- Induce consistant flavors */ + Rand_state_set(seed_flavor); - /* Add a one or two syllable word */ - for (q = 0; q < s; q++) - { - /* Add the syllable */ - strcat(tmp, syllables[randint0(MAX_SYLLABLES)]); - } - /* Stop before getting too long */ - if (strlen(buf) + 1 + strlen(tmp) > 15) break; + /* Initialize flavor index of each object by itself */ + for (i = 0; i < max_k_idx; i++) + { + object_kind *k_ptr = &k_info[i]; - /* Add a space */ - strcat(buf, " "); + /* Skip objects without flavor name */ + if (!k_ptr->flavor_name) continue; - /* Add the word */ - strcat(buf, tmp); - } + /* + * Initialize flavor index to itself + * -> Shuffle it later + */ + k_ptr->flavor = i; + } - /* Save the title */ - strcpy(scroll_adj[i], buf+1); + /* Shuffle Rings */ + shuffle_flavors(TV_RING); - /* Assume okay */ - okay = TRUE; + /* Shuffle Amulets */ + shuffle_flavors(TV_AMULET); - /* Check for "duplicate" scroll titles */ - for (j = 0; j < i; j++) - { - cptr hack1 = scroll_adj[j]; - cptr hack2 = scroll_adj[i]; + /* Shuffle Staves */ + shuffle_flavors(TV_STAFF); - /* Compare first four characters */ - if (*hack1++ != *hack2++) continue; - if (*hack1++ != *hack2++) continue; - if (*hack1++ != *hack2++) continue; - if (*hack1++ != *hack2++) continue; + /* Shuffle Wands */ + shuffle_flavors(TV_WAND); - /* Not okay */ - okay = FALSE; + /* Shuffle Rods */ + shuffle_flavors(TV_ROD); - /* Stop looking */ - break; - } + /* Shuffle Mushrooms */ + shuffle_flavors(TV_FOOD); - /* Break when done */ - if (okay) break; - } + /* Shuffle Potions */ + shuffle_flavors(TV_POTION); - /* All scrolls are white */ - scroll_col[i] = TERM_WHITE; - } + /* Shuffle Scrolls */ + shuffle_flavors(TV_SCROLL); - /* Hack -- Use the "complex" RNG */ - Rand_quick = FALSE; + /* Hack -- Restore the RNG state */ + Rand_state_restore(state_backup); /* Analyze every object */ for (i = 1; i < max_k_idx; i++) @@ -786,9 +342,6 @@ void flavor_init(void) /* Skip "empty" objects */ if (!k_ptr->name) continue; - /* Extract "flavor" (if any) */ - k_ptr->flavor = object_flavor(i); - /* No flavor yields aware */ if (!k_ptr->flavor) k_ptr->aware = TRUE; @@ -798,9 +351,14 @@ void flavor_init(void) } -/* - * Print a char "c" into a string "t", as if by sprintf(t, "%c", c), - * and return a pointer to the terminator (t + 1). +/*! + * @brief 対象文字配列に一文字だけをコピーする。 + * @param t 保管先文字列ポインタ + * @param c 保管したい1文字 + * @return なし + * @details + * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),\n + * and return a pointer to the terminator (t + 1).\n */ static char *object_desc_chr(char *t, char c) { @@ -814,8 +372,12 @@ static char *object_desc_chr(char *t, char c) return (t); } - -/* +/*! + * @brief 対象文字配列に文字列をコピーする。 + * @param t 保管先文字列ポインタ + * @param s コピーしたい文字列ポインタ + * @return 保管先の末尾アドレス + * @details * Print a string "s" into a string "t", as if by strcpy(t, s), * and return a pointer to the terminator. */ @@ -831,9 +393,12 @@ static char *object_desc_str(char *t, cptr s) return (t); } - - -/* +/*! + * @brief 対象文字配列に符号なし整数値をコピーする。 + * @param t 保管先文字列ポインタ + * @param n コピーしたい数値 + * @return なし + * @details * Print an unsigned number "n" into a string "t", as if by * sprintf(t, "%u", n), and return a pointer to the terminator. */ @@ -868,12 +433,15 @@ static char *object_desc_num(char *t, uint n) #ifdef JP -/* - * ÆüËܸì¤Î¸Ä¿ôɽ¼¨¥ë¡¼¥Á¥ó - *¡Êcmd1.c ¤ÇήÍѤ¹¤ë¤¿¤á¤Ë object_desc_japanese ¤«¤é°ÜÆ°¤·¤¿¡£¡Ë +/*! + * @brief 日本語の個数表示ルーチン + * @param t 保管先文字列ポインタ + * @param o_ptr 記述したいオブジェクトの構造体参照ポインタ + * @return なし + * @details + * cmd1.c で流用するために object_desc_japanese から移動した。 */ - -extern char *object_desc_kosuu(char *t, object_type *o_ptr) +char *object_desc_kosuu(char *t, object_type *o_ptr) { t = object_desc_num(t, o_ptr->number); @@ -887,17 +455,17 @@ extern char *object_desc_kosuu(char *t, object_type *o_ptr) case TV_ROD: case TV_DIGGING: { - t = object_desc_str(t, "ËÜ"); + t = object_desc_str(t, "本"); break; } case TV_SCROLL: { - t = object_desc_str(t, "´¬"); + t = object_desc_str(t, "å·»"); break; } case TV_POTION: { - t = object_desc_str(t, "Éþ"); + t = object_desc_str(t, "服"); break; } case TV_LIFE_BOOK: @@ -907,13 +475,14 @@ extern char *object_desc_kosuu(char *t, object_type *o_ptr) case TV_DEATH_BOOK: case TV_TRUMP_BOOK: case TV_ARCANE_BOOK: - case TV_ENCHANT_BOOK: + case TV_CRAFT_BOOK: case TV_DAEMON_BOOK: - case TV_HAJA_BOOK: + case TV_CRUSADE_BOOK: case TV_MUSIC_BOOK: case TV_HISSATSU_BOOK: + case TV_HEX_BOOK: { - t = object_desc_str(t, "ºý"); + t = object_desc_str(t, "冊"); break; } case TV_SOFT_ARMOR: @@ -921,32 +490,32 @@ extern char *object_desc_kosuu(char *t, object_type *o_ptr) case TV_DRAG_ARMOR: case TV_CLOAK: { - t = object_desc_str(t, "Ãå"); + t = object_desc_str(t, "着"); break; } case TV_SWORD: case TV_HAFTED: case TV_BOW: { - t = object_desc_str(t, "¿¶"); + t = object_desc_str(t, "振"); break; } case TV_BOOTS: { - t = object_desc_str(t, "­"); + t = object_desc_str(t, "足"); break; } case TV_CARD: { - t = object_desc_str(t, "Ëç"); + t = object_desc_str(t, "枚"); break; } - /* ¿©¤Ù¤â¤Î by ita */ + /* 食べもの by ita */ case TV_FOOD: { if(o_ptr->sval == SV_FOOD_JERKY) - { - t = object_desc_str(t, "ÀÚ¤ì"); + { + t = object_desc_str(t, "切れ"); break; } } @@ -954,11 +523,11 @@ extern char *object_desc_kosuu(char *t, object_type *o_ptr) { if (o_ptr->number < 10) { - t = object_desc_str(t, "¤Ä"); + t = object_desc_str(t, "つ"); } else { - t = object_desc_str(t, "¸Ä"); + t = object_desc_str(t, "個"); } break; } @@ -967,115 +536,808 @@ extern char *object_desc_kosuu(char *t, object_type *o_ptr) } #endif -/* - * Print an signed number "v" into a string "t", as if by - * sprintf(t, "%+d", n), and return a pointer to the terminator. - * Note that we always print a sign, either "+" or "-". - */ -static char *object_desc_int(char *t, sint v) -{ - uint p, n; +/*! + * @brief 対象文字配列に符号あり整数値をコピーする。 + * @param t 保管先文字列ポインタ + * @param v コピーしたい数値 + * @return なし + * @details + * Print an signed number "v" into a string "t", as if by + * sprintf(t, "%+d", n), and return a pointer to the terminator. + * Note that we always print a sign, either "+" or "-". + */ +static char *object_desc_int(char *t, sint v) +{ + uint p, n; + + /* Negative */ + if (v < 0) + { + /* Take the absolute value */ + n = 0 - v; + + /* Use a "minus" sign */ + *t++ = '-'; + } + + /* Positive (or zero) */ + else + { + /* Use the actual number */ + n = v; + + /* Use a "plus" sign */ + *t++ = '+'; + } + + /* Find "size" of "n" */ + for (p = 1; n >= p * 10; p = p * 10) /* loop */; + + /* Dump each digit */ + while (p >= 1) + { + /* Dump the digit */ + *t++ = '0' + n / p; + + /* Remove the digit */ + n = n % p; + + /* Process next digit */ + p = p / 10; + } + + /* Terminate */ + *t = '\0'; + + /* Result */ + return (t); +} + + +/*! + * オブジェクトの特性表示記号テーブルの構造体 / Structs and tables for Auto Inscription for flags + */ +typedef struct flag_insc_table +{ +#ifdef JP + cptr japanese; +#endif + cptr english; + int flag; + int except_flag; +} flag_insc_table; + +#ifdef JP +/*! オブジェクトの特性表示記号テーブルの定義(pval要素) */ +static flag_insc_table flag_insc_plus[] = +{ + { "攻", "At", TR_BLOWS, -1 }, + { "速", "Sp", TR_SPEED, -1 }, + { "腕", "St", TR_STR, -1 }, + { "知", "In", TR_INT, -1 }, + { "è³¢", "Wi", TR_WIS, -1 }, + { "器", "Dx", TR_DEX, -1 }, + { "耐", "Cn", TR_CON, -1 }, + { "魅", "Ch", TR_CHR, -1 }, + { "道", "Md", TR_MAGIC_MASTERY, -1 }, + { "隠", "Sl", TR_STEALTH, -1 }, + { "探", "Sr", TR_SEARCH, -1 }, + { "赤", "If", TR_INFRA, -1 }, + { "掘", "Dg", TR_TUNNEL, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(免疫) */ +static flag_insc_table flag_insc_immune[] = +{ + { "酸", "Ac", TR_IM_ACID, -1 }, + { "電", "El", TR_IM_ELEC, -1 }, + { "火", "Fi", TR_IM_FIRE, -1 }, + { "冷", "Co", TR_IM_COLD, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(耐性) */ +static flag_insc_table flag_insc_resistance[] = +{ + { "酸", "Ac", TR_RES_ACID, TR_IM_ACID }, + { "電", "El", TR_RES_ELEC, TR_IM_ELEC }, + { "火", "Fi", TR_RES_FIRE, TR_IM_FIRE }, + { "冷", "Co", TR_RES_COLD, TR_IM_COLD }, + { "毒", "Po", TR_RES_POIS, -1 }, + { "閃", "Li", TR_RES_LITE, -1 }, + { "暗", "Dk", TR_RES_DARK, -1 }, + { "ç ´", "Sh", TR_RES_SHARDS, -1 }, + { "盲", "Bl", TR_RES_BLIND, -1 }, + { "ä¹±", "Cf", TR_RES_CONF, -1 }, + { "轟", "So", TR_RES_SOUND, -1 }, + { "獄", "Nt", TR_RES_NETHER, -1 }, + { "因", "Nx", TR_RES_NEXUS, -1 }, + { "沌", "Ca", TR_RES_CHAOS, -1 }, + { "劣", "Di", TR_RES_DISEN, -1 }, + { "恐", "Fe", TR_RES_FEAR, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(その他特性) */ +static flag_insc_table flag_insc_misc[] = +{ + { "易", "Es", TR_EASY_SPELL, -1 }, + { "減", "Dm", TR_DEC_MANA, -1 }, + { "投", "Th", TR_THROW, -1 }, + { "反", "Rf", TR_REFLECT, -1 }, + { "麻", "Fa", TR_FREE_ACT, -1 }, + { "視", "Si", TR_SEE_INVIS, -1 }, + { "経", "Hl", TR_HOLD_EXP, -1 }, + { "遅", "Sd", TR_SLOW_DIGEST, -1 }, + { "æ´»", "Rg", TR_REGEN, -1 }, + { "æµ®", "Lv", TR_LEVITATION, -1 }, + { "明", "Lu", TR_LITE_1, -1 }, + { "明", "Lu", TR_LITE_2, -1 }, + { "明", "Lu", TR_LITE_3, -1 }, + { "闇", "Dl", TR_LITE_M1, -1 }, + { "闇", "Dl", TR_LITE_M2, -1 }, + { "闇", "Dl", TR_LITE_M3, -1 }, + { "è­¦", "Wr", TR_WARNING, -1 }, + { "倍", "Xm", TR_XTRA_MIGHT, -1 }, + { "射", "Xs", TR_XTRA_SHOTS, -1 }, + { "瞬", "Te", TR_TELEPORT, -1 }, + { "怒", "Ag", TR_AGGRAVATE, -1 }, + { "祝", "Bs", TR_BLESSED, -1 }, + { "忌", "Ty", TR_TY_CURSE, -1 }, + { "呪", "C-", TR_ADD_L_CURSE, -1 }, + { "詛", "C+", TR_ADD_H_CURSE, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(オーラ) */ +static flag_insc_table flag_insc_aura[] = +{ + { "炎", "F", TR_SH_FIRE, -1 }, + { "電", "E", TR_SH_ELEC, -1 }, + { "冷", "C", TR_SH_COLD, -1 }, + { "魔", "M", TR_NO_MAGIC, -1 }, + { "瞬", "T", TR_NO_TELE, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(属性スレイ) */ +static flag_insc_table flag_insc_brand[] = +{ + { "酸", "A", TR_BRAND_ACID, -1 }, + { "電", "E", TR_BRAND_ELEC, -1 }, + { "焼", "F", TR_BRAND_FIRE, -1 }, + { "凍", "Co", TR_BRAND_COLD, -1 }, + { "毒", "P", TR_BRAND_POIS, -1 }, + { "沌", "Ca", TR_CHAOTIC, -1 }, + { "吸", "V", TR_VAMPIRIC, -1 }, + { "震", "Q", TR_IMPACT, -1 }, + { "切", "S", TR_VORPAL, -1 }, + { "理", "M", TR_FORCE_WEAPON, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(種族スレイ) */ +static flag_insc_table flag_insc_kill[] = +{ + { "邪", "*", TR_KILL_EVIL, -1 }, + { "人", "p", TR_KILL_HUMAN, -1 }, + { "龍", "D", TR_KILL_DRAGON, -1 }, + { "オ", "o", TR_KILL_ORC, -1 }, + { "ト", "T", TR_KILL_TROLL, -1 }, + { "å·¨", "P", TR_KILL_GIANT, -1 }, + { "デ", "U", TR_KILL_DEMON, -1 }, + { "æ­»", "L", TR_KILL_UNDEAD, -1 }, + { "動", "Z", TR_KILL_ANIMAL, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(種族*スレイ*) */ +static flag_insc_table flag_insc_slay[] = +{ + { "邪", "*", TR_SLAY_EVIL, TR_KILL_EVIL }, + { "人", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, + { "竜", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON }, + { "オ", "o", TR_SLAY_ORC, TR_KILL_ORC }, + { "ト", "T", TR_SLAY_TROLL, TR_KILL_TROLL }, + { "å·¨", "P", TR_SLAY_GIANT, TR_KILL_GIANT }, + { "デ", "U", TR_SLAY_DEMON, TR_KILL_DEMON }, + { "æ­»", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD }, + { "動", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(ESP1) */ +static flag_insc_table flag_insc_esp1[] = +{ + { "感", "Tele", TR_TELEPATHY, -1 }, + { "邪", "Evil", TR_ESP_EVIL, -1 }, + { "善", "Good", TR_ESP_GOOD, -1 }, + { "無", "Nolv", TR_ESP_NONLIVING, -1 }, + { "個", "Uniq", TR_ESP_UNIQUE, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(ESP2) */ +static flag_insc_table flag_insc_esp2[] = +{ + { "人", "p", TR_ESP_HUMAN, -1 }, + { "竜", "D", TR_ESP_DRAGON, -1 }, + { "オ", "o", TR_ESP_ORC, -1 }, + { "ト", "T", TR_ESP_TROLL, -1 }, + { "å·¨", "P", TR_ESP_GIANT, -1 }, + { "デ", "U", TR_ESP_DEMON, -1 }, + { "æ­»", "L", TR_ESP_UNDEAD, -1 }, + { "動", "Z", TR_ESP_ANIMAL, -1 }, + { NULL, NULL, 0, -1 } +}; + +/*! オブジェクトの特性表示記号テーブルの定義(能力維持) */ +static flag_insc_table flag_insc_sust[] = +{ + { "腕", "St", TR_SUST_STR, -1 }, + { "知", "In", TR_SUST_INT, -1 }, + { "è³¢", "Wi", TR_SUST_WIS, -1 }, + { "器", "Dx", TR_SUST_DEX, -1 }, + { "耐", "Cn", TR_SUST_CON, -1 }, + { "魅", "Ch", TR_SUST_CHR, -1 }, + { NULL, NULL, 0, -1 } +}; + +#else +static flag_insc_table flag_insc_plus[] = +{ + { "At", TR_BLOWS, -1 }, + { "Sp", TR_SPEED, -1 }, + { "St", TR_STR, -1 }, + { "In", TR_INT, -1 }, + { "Wi", TR_WIS, -1 }, + { "Dx", TR_DEX, -1 }, + { "Cn", TR_CON, -1 }, + { "Ch", TR_CHR, -1 }, + { "Md", TR_MAGIC_MASTERY, -1 }, + { "Sl", TR_STEALTH, -1 }, + { "Sr", TR_SEARCH, -1 }, + { "If", TR_INFRA, -1 }, + { "Dg", TR_TUNNEL, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_immune[] = +{ + { "Ac", TR_IM_ACID, -1 }, + { "El", TR_IM_ELEC, -1 }, + { "Fi", TR_IM_FIRE, -1 }, + { "Co", TR_IM_COLD, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_resistance[] = +{ + { "Ac", TR_RES_ACID, TR_IM_ACID }, + { "El", TR_RES_ELEC, TR_IM_ELEC }, + { "Fi", TR_RES_FIRE, TR_IM_FIRE }, + { "Co", TR_RES_COLD, TR_IM_COLD }, + { "Po", TR_RES_POIS, -1 }, + { "Li", TR_RES_LITE, -1 }, + { "Dk", TR_RES_DARK, -1 }, + { "Sh", TR_RES_SHARDS, -1 }, + { "Bl", TR_RES_BLIND, -1 }, + { "Cf", TR_RES_CONF, -1 }, + { "So", TR_RES_SOUND, -1 }, + { "Nt", TR_RES_NETHER, -1 }, + { "Nx", TR_RES_NEXUS, -1 }, + { "Ca", TR_RES_CHAOS, -1 }, + { "Di", TR_RES_DISEN, -1 }, + { "Fe", TR_RES_FEAR, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_misc[] = +{ + { "Es", TR_EASY_SPELL, -1 }, + { "Dm", TR_DEC_MANA, -1 }, + { "Th", TR_THROW, -1 }, + { "Rf", TR_REFLECT, -1 }, + { "Fa", TR_FREE_ACT, -1 }, + { "Si", TR_SEE_INVIS, -1 }, + { "Hl", TR_HOLD_EXP, -1 }, + { "Sd", TR_SLOW_DIGEST, -1 }, + { "Rg", TR_REGEN, -1 }, + { "Lv", TR_LEVITATION, -1 }, + { "Lu", TR_LITE_1, -1 }, + { "Lu", TR_LITE_2, -1 }, + { "Lu", TR_LITE_3, -1 }, + { "Dl", TR_LITE_M1, -1 }, + { "Dl", TR_LITE_M2, -1 }, + { "Dl", TR_LITE_M3, -1 }, + { "Wr", TR_WARNING, -1 }, + { "Xm", TR_XTRA_MIGHT, -1 }, + { "Xs", TR_XTRA_SHOTS, -1 }, + { "Te", TR_TELEPORT, -1 }, + { "Ag", TR_AGGRAVATE, -1 }, + { "Bs", TR_BLESSED, -1 }, + { "Ty", TR_TY_CURSE, -1 }, + { "C-", TR_ADD_L_CURSE, -1 }, + { "C+", TR_ADD_H_CURSE, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_aura[] = +{ + { "F", TR_SH_FIRE, -1 }, + { "E", TR_SH_ELEC, -1 }, + { "C", TR_SH_COLD, -1 }, + { "M", TR_NO_MAGIC, -1 }, + { "T", TR_NO_TELE, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_brand[] = +{ + { "A", TR_BRAND_ACID, -1 }, + { "E", TR_BRAND_ELEC, -1 }, + { "F", TR_BRAND_FIRE, -1 }, + { "Co", TR_BRAND_COLD, -1 }, + { "P", TR_BRAND_POIS, -1 }, + { "Ca", TR_CHAOTIC, -1 }, + { "V", TR_VAMPIRIC, -1 }, + { "Q", TR_IMPACT, -1 }, + { "S", TR_VORPAL, -1 }, + { "M", TR_FORCE_WEAPON, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_kill[] = +{ + { "*", TR_KILL_EVIL, -1 }, + { "p", TR_KILL_HUMAN, -1 }, + { "D", TR_KILL_DRAGON, -1 }, + { "o", TR_KILL_ORC, -1 }, + { "T", TR_KILL_TROLL, -1 }, + { "P", TR_KILL_GIANT, -1 }, + { "U", TR_KILL_DEMON, -1 }, + { "L", TR_KILL_UNDEAD, -1 }, + { "Z", TR_KILL_ANIMAL, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_slay[] = +{ + { "*", TR_SLAY_EVIL, TR_KILL_EVIL }, + { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, + { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON }, + { "o", TR_SLAY_ORC, TR_KILL_ORC }, + { "T", TR_SLAY_TROLL, TR_KILL_TROLL }, + { "P", TR_SLAY_GIANT, TR_KILL_GIANT }, + { "U", TR_SLAY_DEMON, TR_KILL_DEMON }, + { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD }, + { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_esp1[] = +{ + { "Tele", TR_TELEPATHY, -1 }, + { "Evil", TR_ESP_EVIL, -1 }, + { "Good", TR_ESP_GOOD, -1 }, + { "Nolv", TR_ESP_NONLIVING, -1 }, + { "Uniq", TR_ESP_UNIQUE, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_esp2[] = +{ + { "p", TR_ESP_HUMAN, -1 }, + { "D", TR_ESP_DRAGON, -1 }, + { "o", TR_ESP_ORC, -1 }, + { "T", TR_ESP_TROLL, -1 }, + { "P", TR_ESP_GIANT, -1 }, + { "U", TR_ESP_DEMON, -1 }, + { "L", TR_ESP_UNDEAD, -1 }, + { "Z", TR_ESP_ANIMAL, -1 }, + { NULL, 0, -1 } +}; + +static flag_insc_table flag_insc_sust[] = +{ + { "St", TR_SUST_STR, -1 }, + { "In", TR_SUST_INT, -1 }, + { "Wi", TR_SUST_WIS, -1 }, + { "Dx", TR_SUST_DEX, -1 }, + { "Cn", TR_SUST_CON, -1 }, + { "Ch", TR_SUST_CHR, -1 }, + { NULL, 0, -1 } +}; +#endif + +/* オブジェクトフラグを追加するための簡易なマクロ / Simple macro for get_inscription() */ +#define ADD_INSC(STR) (void)(ptr = object_desc_str(ptr, (STR))) + +/*! + * @brief get_inscriptionのサブセットとしてオブジェクトの特性フラグを返す / Helper function for get_inscription() + * @param fi_ptr 参照する特性表示記号テーブル + * @param flgs 対応するオブジェクトのフラグ文字列 + * @param kanji TRUEならば漢字記述/FALSEならば英語記述 + * @param ptr フラグ群を保管する文字列参照ポインタ + * @return フラグ群を保管する文字列参照ポインタ(ptrと同じ) + * @details + * Print an signed number "v" into a string "t", as if by + * sprintf(t, "%+d", n), and return a pointer to the terminator. + * Note that we always print a sign, either "+" or "-". + */ +static char *inscribe_flags_aux(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE], bool kanji, char *ptr) +{ +#ifndef JP + (void)kanji; +#endif + + while (fi_ptr->english) + { + if (have_flag(flgs, fi_ptr->flag) && + (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) +#ifdef JP + ADD_INSC(kanji ? fi_ptr->japanese : fi_ptr->english); +#else + ADD_INSC(fi_ptr->english); +#endif + fi_ptr++; + } + + return ptr; +} + + +/*! + * @brief オブジェクトの特性表示記号テーブル1つに従いオブジェクトの特性フラグ配列に1つでも該当の特性があるかを返す / Special variation of have_flag for auto-inscription + * @param fi_ptr 参照する特性表示記号テーブル + * @param flgs 対応するオブジェクトのフラグ文字列 + * @return 1つでも該当の特性があったらTRUEを返す。 + */ +static bool have_flag_of(flag_insc_table *fi_ptr, u32b flgs[TR_FLAG_SIZE]) +{ + while (fi_ptr->english) + { + if (have_flag(flgs, fi_ptr->flag) && + (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) + return (TRUE); + fi_ptr++; + } + + return (FALSE); +} + +/*! + * @brief オブジェクト名の特性短縮表記をまとめて提示する。 + * @param ptr 特性短縮表記を格納する文字列ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @param kanji TRUEならば漢字表記 / FALSEなら英語表記 + * @param all TRUEならばベースアイテム上で明らかなフラグは省略する + * @return ptrと同じアドレス + */ +static char *get_ability_abbreviation(char *ptr, object_type *o_ptr, bool kanji, bool all) +{ + char *prev_ptr = ptr; + u32b flgs[TR_FLAG_SIZE]; + + /* Extract the flags */ + object_flags(o_ptr, flgs); + + /* Remove obvious flags */ + if (!all) + { + object_kind *k_ptr = &k_info[o_ptr->k_idx]; + int j; + + /* Base object */ + for (j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~k_ptr->flags[j]; + + if (object_is_fixed_artifact(o_ptr)) + { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + + for (j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~a_ptr->flags[j]; + } + + if (object_is_ego(o_ptr)) + { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + + for (j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~e_ptr->flags[j]; + } + } - /* Negative */ - if (v < 0) + /* Remove lite flags when this is a dark lite object */ + if (have_dark_flag(flgs)) { - /* Take the absolute value */ - n = 0 - v; + if (have_flag(flgs, TR_LITE_1)) remove_flag(flgs, TR_LITE_1); + if (have_flag(flgs, TR_LITE_2)) remove_flag(flgs, TR_LITE_2); + if (have_flag(flgs, TR_LITE_3)) remove_flag(flgs, TR_LITE_3); + } + else if (have_lite_flag(flgs)) + { + add_flag(flgs, TR_LITE_1); + if (have_flag(flgs, TR_LITE_2)) remove_flag(flgs, TR_LITE_2); + if (have_flag(flgs, TR_LITE_3)) remove_flag(flgs, TR_LITE_3); + } - /* Use a "minus" sign */ - *t++ = '-'; + /* Plusses */ + if (have_flag_of(flag_insc_plus, flgs)) + { + if (kanji) + ADD_INSC("+"); } + ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr); - /* Positive (or zero) */ - else + /* Immunity */ + if (have_flag_of(flag_insc_immune, flgs)) { - /* Use the actual number */ - n = v; + if (!kanji && ptr != prev_ptr) + { + ADD_INSC(";"); + prev_ptr = ptr; + } + ADD_INSC("*"); + } + ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr); - /* Use a "plus" sign */ - *t++ = '+'; + /* Resistance */ + if (have_flag_of(flag_insc_resistance, flgs)) + { + if (kanji) + ADD_INSC("r"); + else if (ptr != prev_ptr) + { + ADD_INSC(";"); + prev_ptr = ptr; + } } + ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr); - /* Find "size" of "n" */ - for (p = 1; n >= p * 10; p = p * 10) /* loop */; + /* Misc Ability */ + if (have_flag_of(flag_insc_misc, flgs)) + { + if (ptr != prev_ptr) + { + ADD_INSC(";"); + prev_ptr = ptr; + } + } + ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr); - /* Dump each digit */ - while (p >= 1) + /* Aura */ + if (have_flag_of(flag_insc_aura, flgs)) { - /* Dump the digit */ - *t++ = '0' + n / p; + ADD_INSC("["); + } + ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr); - /* Remove the digit */ - n = n % p; + /* Brand Weapon */ + if (have_flag_of(flag_insc_brand, flgs)) + ADD_INSC("|"); + ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr); - /* Process next digit */ - p = p / 10; + /* Kill Weapon */ + if (have_flag_of(flag_insc_kill, flgs)) + ADD_INSC("/X"); + ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr); + + /* Slay Weapon */ + if (have_flag_of(flag_insc_slay, flgs)) + ADD_INSC("/"); + ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr); + + /* Esp */ + if (kanji) + { + if (have_flag_of(flag_insc_esp1, flgs) || + have_flag_of(flag_insc_esp2, flgs)) + ADD_INSC("~"); + ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); + ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); + } + else + { + if (have_flag_of(flag_insc_esp1, flgs)) + ADD_INSC("~"); + ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); + if (have_flag_of(flag_insc_esp2, flgs)) + ADD_INSC("~"); + ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); } - /* Terminate */ - *t = '\0'; + /* sustain */ + if (have_flag_of(flag_insc_sust, flgs)) + { + ADD_INSC("("); + } + ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr); - /* Result */ - return (t); + *ptr = '\0'; + + return ptr; +} + + +/*! + * @brief オブジェクト名の特性短縮表記+刻み内容を提示する。 / Get object inscription with auto inscription of object flags. + * @param buff 特性短縮表記を格納する文字列ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @return なし + */ +static void get_inscription(char *buff, object_type *o_ptr) +{ + cptr insc = quark_str(o_ptr->inscription); + char *ptr = buff; + + /* Not fully identified */ + if (!(o_ptr->ident & IDENT_MENTAL)) + { + /* Copy until end of line or '#' */ + while (*insc) + { + if (*insc == '#') break; +#ifdef JP + if (iskanji(*insc)) *buff++ = *insc++; +#endif + *buff++ = *insc++; + } + + *buff = '\0'; + return; + } + + *buff = '\0'; + for (; *insc; insc++) + { + /* Ignore fake artifact inscription */ + if (*insc == '#') break; + + /* {%} will be automatically converted */ + else if ('%' == *insc) + { + bool kanji = FALSE; + bool all; + cptr start = ptr; + + /* check for too long inscription */ + if (ptr >= buff + MAX_NLEN) continue; + +#ifdef JP + if ('%' == insc[1]) + { + insc++; + kanji = FALSE; + } + else + { + kanji = TRUE; + } +#endif + if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3]) + { + all = TRUE; + insc += 3; + } + else + { + all = FALSE; + } + + ptr = get_ability_abbreviation(ptr, o_ptr, kanji, all); + + if (ptr == start) + ADD_INSC(" "); + } + else + { + *ptr++ = *insc; + } + } + *ptr = '\0'; +} + +/*! + * @brief オブジェクトがクエストの達成目的か否かを返す。 + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @return 現在クエスト達成目的のアイテムならばTRUEを返す。 + */ +bool object_is_quest_target(object_type *o_ptr) +{ + if (p_ptr->inside_quest) + { + int a_idx = quest[p_ptr->inside_quest].k_idx; + if (a_idx) + { + artifact_type *a_ptr = &a_info[a_idx]; + if (!(a_ptr->gen_flags & TRG_INSTA_ART)) + { + if((o_ptr->tval == a_ptr->tval) && (o_ptr->sval == a_ptr->sval)) + { + return TRUE; + } + } + } + } + return FALSE; } -/* - * Creates a description of the item "o_ptr", and stores it in "out_val". - * - * One can choose the "verbosity" of the description, including whether - * or not the "number" of items should be described, and how much detail - * should be used when describing the item. - * - * The given "buf" must be MAX_NLEN chars long to hold the longest possible - * description, which can get pretty long, including incriptions, such as: - * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)". - * Note that the inscription will be clipped to keep the total description - * under MAX_NLEN-1 chars (plus a terminator). - * - * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient, - * portable, versions of some common "sprintf()" commands. - * - * Note that all ego-items (when known) append an "Ego-Item Name", unless - * the item is also an artifact, which should NEVER happen. - * - * Note that all artifacts (when known) append an "Artifact Name", so we - * have special processing for "Specials" (artifact Lites, Rings, Amulets). - * The "Specials" never use "modifiers" if they are "known", since they - * have special "descriptions", such as "The Necklace of the Dwarves". - * - * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone), - * plus the artifact name, just like any other artifact, if known. - * - * Special Ring's and Amulet's, if not "aware", use the same code as normal - * rings and amulets, and if "aware", use the "k_info" base-name (Ring or - * Amulet or Necklace). They will NEVER "append" the "k_info" name. But, - * they will append the artifact name, just like any artifact, if known. - * - * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware. - * - * If "pref" then a "numeric" prefix will be pre-pended. - * - * Mode: - * 0 -- The Cloak of Death - * 1 -- The Cloak of Death [1,+3] - * 2 -- The Cloak of Death [1,+3] (+2 to Stealth) - * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty} +/*! + * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val". + * @param buf 表記を返すための文字列参照ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @param mode 表記に関するオプション指定 + * @return 現在クエスト達成目的のアイテムならばTRUEを返す。 + * @details + * One can choose the "verbosity" of the description, including whether\n + * or not the "number" of items should be described, and how much detail\n + * should be used when describing the item.\n + *\n + * The given "buf" must be MAX_NLEN chars long to hold the longest possible\n + * description, which can get pretty long, including incriptions, such as:\n + * "no more Maces of Disruption (Defender) (+10,+10) [+5] (+3 to stealth)".\n + * Note that the inscription will be clipped to keep the total description\n + * under MAX_NLEN-1 chars (plus a terminator).\n + *\n + * Note the use of "object_desc_num()" and "object_desc_int()" as hyper-efficient,\n + * portable, versions of some common "sprintf()" commands.\n + *\n + * Note that all ego-items (when known) append an "Ego-Item Name", unless\n + * the item is also an artifact, which should NEVER happen.\n + *\n + * Note that all artifacts (when known) append an "Artifact Name", so we\n + * have special processing for "Specials" (artifact Lites, Rings, Amulets).\n + * The "Specials" never use "modifiers" if they are "known", since they\n + * have special "descriptions", such as "The Necklace of the Dwarves".\n + *\n + * Special Lite's use the "k_info" base-name (Phial, Star, or Arkenstone),\n + * plus the artifact name, just like any other artifact, if known.\n + *\n + * Special Ring's and Amulet's, if not "aware", use the same code as normal\n + * rings and amulets, and if "aware", use the "k_info" base-name (Ring or\n + * Amulet or Necklace). They will NEVER "append" the "k_info" name. But,\n + * they will append the artifact name, just like any artifact, if known.\n + *\n + * Hack -- Display "The One Ring" as "a Plain Gold Ring" until aware.\n + *\n + * Mode:\n + * OD_NAME_ONLY : The Cloak of Death\n + * OD_NAME_AND_ENCHANT : The Cloak of Death [1,+3]\n + * OD_OMIT_INSCRIPTION : The Cloak of Death [1,+3] (+2 to Stealth)\n + * 0 : The Cloak of Death [1,+3] (+2 to Stealth) {nifty}\n + *\n + * OD_OMIT_PREFIX : Forbidden numeric prefix\n + * OD_NO_PLURAL : Forbidden use of plural \n + * OD_STORE : Assume to be aware and known\n + * OD_NO_FLAVOR : Allow to hidden flavor\n + * OD_FORCE_FLAVOR : Get un-shuffled flavor name\n */ -void object_desc(char *buf, object_type *o_ptr, int pref, int mode) +void object_desc(char *buf, object_type *o_ptr, BIT_FLAGS mode) { - cptr basenm, modstr; - int power, indexx, i; + /* Extract object kind name */ + cptr kindname = k_name + k_info[o_ptr->k_idx].name; + + /* Extract default "base" string */ + cptr basenm = kindname; + + /* Assume no "modifier" string */ + cptr modstr = ""; + + int power; + int fire_rate; bool aware = FALSE; bool known = FALSE; - - bool append_name = FALSE; + bool flavor = TRUE; bool show_weapon = FALSE; bool show_armour = FALSE; - cptr s, u; + cptr s, s0; char *t; char p1 = '(', p2 = ')'; @@ -1084,34 +1346,48 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) char tmp_val[MAX_NLEN+160]; char tmp_val2[MAX_NLEN+10]; + char fake_insc_buf[30]; - u32b f1, f2, f3; - - object_type *bow_ptr; + u32b flgs[TR_FLAG_SIZE]; + object_type *bow_ptr; object_kind *k_ptr = &k_info[o_ptr->k_idx]; - - monster_race *r_ptr = &r_info[o_ptr->pval]; + object_kind *flavor_k_ptr = &k_info[k_ptr->flavor]; /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); /* See if the object is "aware" */ - if (object_aware_p(o_ptr) || (o_ptr->ident & IDENT_MENTAL)) aware = TRUE; + if (object_is_aware(o_ptr)) aware = TRUE; /* See if the object is "known" */ - if (object_known_p(o_ptr)) known = TRUE; + if (object_is_known(o_ptr)) known = TRUE; - /* Hack -- Extract the sub-type "indexx" */ - indexx = o_ptr->sval; + /* Allow flavors to be hidden when aware */ + if (aware && ((mode & OD_NO_FLAVOR) || plain_descriptions)) flavor = FALSE; - /* Extract default "base" string */ - basenm = get_object_name(o_ptr); + /* Object is in the inventory of a store or spoiler */ + if ((mode & OD_STORE) || (o_ptr->ident & IDENT_STORE)) + { + /* Don't show flavors */ + flavor = FALSE; - /* Assume no "modifier" string */ - modstr = ""; + /* Pretend known and aware */ + aware = TRUE; + known = TRUE; + } + + /* Force to be flavor name only */ + if (mode & OD_FORCE_FLAVOR) + { + aware = FALSE; + flavor = TRUE; + known = FALSE; + /* Cancel shuffling */ + flavor_k_ptr = k_ptr; + } /* Analyze the object */ switch (o_ptr->tval) @@ -1130,20 +1406,18 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_CAPTURE: { + monster_race *r_ptr = &r_info[o_ptr->pval]; + if (known) { if (!o_ptr->pval) { -#ifdef JP - modstr = "¡Ê¶õ¡Ë"; -#else - modstr = " (empty)"; -#endif + modstr = _(" (空)", " (empty)"); } else { #ifdef JP - sprintf(tmp_val2, "¡Ê%s¡Ë",r_name + r_ptr->name); + sprintf(tmp_val2, " (%s)",r_name + r_ptr->name); modstr = tmp_val2; #else cptr t = r_name + r_ptr->name; @@ -1170,6 +1444,8 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_FIGURINE: case TV_STATUE: { + monster_race *r_ptr = &r_info[o_ptr->pval]; + #ifdef JP modstr = r_name + r_ptr->name; #else @@ -1194,24 +1470,19 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Corpses */ case TV_CORPSE: { - modstr = r_name + r_ptr->name; + monster_race *r_ptr = &r_info[o_ptr->pval]; + modstr = r_name + r_ptr->name; #ifdef JP - sprintf(tmp_val2, "& #%s", basenm + 2); + basenm = "#%"; #else if (r_ptr->flags1 & RF1_UNIQUE) - { - sprintf(tmp_val2, "%s %s", basenm, "of #"); - } + basenm = "& % of #"; else - { - sprintf(tmp_val2, "& # %s", basenm + 2); - } + basenm = "& # %"; #endif - - basenm = tmp_val2; break; } @@ -1229,7 +1500,6 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) break; } - /* Armour */ case TV_BOOTS: case TV_GLOVES: @@ -1245,7 +1515,6 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) break; } - /* Lites (including a few "Specials") */ case TV_LITE: { @@ -1256,24 +1525,23 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_AMULET: { /* Known artifacts */ - if (artifact_p(o_ptr) && aware) break; - - if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break; + if (aware) + { + if (object_is_fixed_artifact(o_ptr)) break; + if (k_ptr->gen_flags & TRG_INSTA_ART) break; + } /* Color the object */ - modstr = amulet_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware ? "& %¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& ¥¢¥ß¥å¥ì¥Ã¥È"; - else - basenm = aware ? "& #%¤Î¥¢¥ß¥å¥ì¥Ã¥È" : "& #¥¢¥ß¥å¥ì¥Ã¥È"; + if (!flavor) basenm = "%のアミュレット"; + else if (aware) basenm = "%の#アミュレット"; + else basenm = "#アミュレット"; #else - basenm = "& Amulet~"; - else - basenm = aware ? "& # Amulet~" : "& # Amulet~"; + if (!flavor) basenm = "& Amulet~ of %"; + else if (aware) basenm = "& # Amulet~ of %"; + else basenm = "& # Amulet~"; #endif break; @@ -1283,24 +1551,23 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_RING: { /* Known artifacts */ - if (artifact_p(o_ptr) && aware) break; - - if ((k_ptr->gen_flags & TRG_INSTA_ART) && aware) break; + if (aware) + { + if (object_is_fixed_artifact(o_ptr)) break; + if (k_ptr->gen_flags & TRG_INSTA_ART) break; + } /* Color the object */ - modstr = ring_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware ? "& %¤Î»ØÎØ" : "& »ØÎØ"; - else - basenm = aware ? "& #%¤Î»ØÎØ" : "& #»ØÎØ"; + if (!flavor) basenm = "%の指輪"; + else if (aware) basenm = "%の#指輪"; + else basenm = "#指輪"; #else - basenm = "& Ring~"; - else - basenm = aware ? "& # Ring~" : "& # Ring~"; + if (!flavor) basenm = "& Ring~ of %"; + else if (aware) basenm = "& # Ring~ of %"; + else basenm = "& # Ring~"; #endif if (!k_ptr->to_h && !k_ptr->to_d && (o_ptr->to_h || o_ptr->to_d)) show_weapon = TRUE; @@ -1316,18 +1583,16 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_STAFF: { /* Color the object */ - modstr = staff_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware ? "& %¤Î¾ó" : "& ¾ó"; - else - basenm = aware ? "& #%¤Î¾ó" : "& #¾ó"; + if (!flavor) basenm = "%の杖"; + else if (aware) basenm = "%の#杖"; + else basenm = "#杖"; #else - basenm = "& Staff~"; - else - basenm = aware ? "& # Staff~" : "& # Staff~"; + if (!flavor) basenm = "& Staff~ of %"; + else if (aware) basenm = "& # Staff~ of %"; + else basenm = "& # Staff~"; #endif break; @@ -1336,18 +1601,16 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_WAND: { /* Color the object */ - modstr = wand_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware? "& %¤ÎËâË¡ËÀ":"& ËâË¡ËÀ"; - else - basenm = aware ? "& #%¤ÎËâË¡ËÀ" : "& #ËâË¡ËÀ"; + if (!flavor) basenm = "%の魔法棒"; + else if (aware) basenm = "%の#魔法棒"; + else basenm = "#魔法棒"; #else - basenm = "& Wand~"; - else - basenm = aware ? "& # Wand~" : "& # Wand~"; + if (!flavor) basenm = "& Wand~ of %"; + else if (aware) basenm = "& # Wand~ of %"; + else basenm = "& # Wand~"; #endif break; @@ -1356,18 +1619,16 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_ROD: { /* Color the object */ - modstr = rod_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware? "& %¤Î¥í¥Ã¥É":"& ¥í¥Ã¥É"; - else - basenm = aware ? "& #%¤Î¥í¥Ã¥É" : "& #¥í¥Ã¥É"; + if (!flavor) basenm = "%のロッド"; + else if (aware) basenm = "%の#ロッド"; + else basenm = "#ロッド"; #else - basenm = "& Rod~"; - else - basenm = aware ? "& # Rod~" : "& # Rod~"; + if (!flavor) basenm = "& Rod~ of %"; + else if (aware) basenm = "& # Rod~ of %"; + else basenm = "& # Rod~"; #endif break; @@ -1376,17 +1637,16 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_SCROLL: { /* Color the object */ - modstr = scroll_adj[indexx]; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) + modstr = k_name + flavor_k_ptr->flavor_name; + #ifdef JP - basenm = aware ? "& %¤Î´¬Êª" : "& ´¬Êª"; - else - basenm = aware ? "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿%¤Î´¬Êª" : "& ¡Ö#¡×¤È½ñ¤«¤ì¤¿´¬Êª"; + if (!flavor) basenm = "%の巻物"; + else if (aware) basenm = "「#」と書かれた%の巻物"; + else basenm = "「#」と書かれた巻物"; #else - basenm = "& Scroll~"; - else - basenm = aware ? "& Scroll~ titled \"#\"" : "& Scroll~ titled \"#\""; + if (!flavor) basenm = "& Scroll~ of %"; + else if (aware) basenm = "& Scroll~ titled \"#\" of %"; + else basenm = "& Scroll~ titled \"#\""; #endif break; @@ -1395,18 +1655,16 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_POTION: { /* Color the object */ - modstr = potion_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware ? "& %¤ÎÌô" : "& Ìô"; - else - basenm = aware ? "& #%¤ÎÌô" : "& #Ìô"; + if (!flavor) basenm = "%の薬"; + else if (aware) basenm = "%の#薬"; + else basenm = "#薬"; #else - basenm = "& Potion~"; - else - basenm = aware ? "& # Potion~" : "& # Potion~"; + if (!flavor) basenm = "& Potion~ of %"; + else if (aware) basenm = "& # Potion~ of %"; + else basenm = "& # Potion~"; #endif break; @@ -1415,48 +1673,40 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_FOOD: { /* Ordinary food is "boring" */ - if (o_ptr->sval >= SV_FOOD_MIN_FOOD) break; + if (!k_ptr->flavor_name) break; /* Color the object */ - modstr = food_adj[indexx]; + modstr = k_name + flavor_k_ptr->flavor_name; - if (aware) append_name = TRUE; - if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) #ifdef JP - basenm = aware ? "& %¤Î¥­¥Î¥³" : "& ¥­¥Î¥³"; - else - basenm = aware ? "& #%¤Î¥­¥Î¥³" : "& #¥­¥Î¥³"; + if (!flavor) basenm = "%のキノコ"; + else if (aware) basenm = "%の#キノコ"; + else basenm = "#キノコ"; #else - basenm = "& Mushroom~"; - else - basenm = aware ? "& # Mushroom~" : "& # Mushroom~"; + if (!flavor) basenm = "& Mushroom~ of %"; + else if (aware) basenm = "& # Mushroom~ of %"; + else basenm = "& # Mushroom~"; #endif break; } - case TV_PARCHEMENT: + case TV_PARCHMENT: { - modstr = basenm; -#ifdef JP - basenm = "& ÍÓÈé»æ - #"; -#else - basenm = "& Parchement~ - #"; -#endif + basenm = _("羊皮紙 - %", "& Parchment~ - %"); break; } /* Magic Books */ case TV_LIFE_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& À¸Ì¿¤ÎËâË¡½ñ#"; + basenm = "生命の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Life Magic #"; + basenm = "& Book~ of Life Magic %"; else - basenm = "& Life Spellbook~ #"; + basenm = "& Life Spellbook~ %"; #endif break; @@ -1464,14 +1714,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_SORCERY_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& Àç½Ñ¤ÎËâË¡½ñ#"; + basenm = "仙術の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Sorcery #"; + basenm = "& Book~ of Sorcery %"; else - basenm = "& Sorcery Spellbook~ #"; + basenm = "& Sorcery Spellbook~ %"; #endif break; @@ -1479,14 +1728,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_NATURE_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& ¼«Á³¤ÎËâË¡½ñ#"; + basenm = "自然の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Nature Magic #"; + basenm = "& Book~ of Nature Magic %"; else - basenm = "& Nature Spellbook~ #"; + basenm = "& Nature Spellbook~ %"; #endif break; @@ -1494,14 +1742,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_CHAOS_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& ¥«¥ª¥¹¤ÎËâË¡½ñ#"; + basenm = "カオスの魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Chaos Magic #"; + basenm = "& Book~ of Chaos Magic %"; else - basenm = "& Chaos Spellbook~ #"; + basenm = "& Chaos Spellbook~ %"; #endif break; @@ -1509,14 +1756,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_DEATH_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& °Å¹õ¤ÎËâË¡½ñ#"; + basenm = "暗黒の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Death Magic #"; + basenm = "& Book~ of Death Magic %"; else - basenm = "& Death Spellbook~ #"; + basenm = "& Death Spellbook~ %"; #endif break; @@ -1524,14 +1770,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_TRUMP_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& ¥È¥é¥ó¥×¤ÎËâË¡½ñ#"; + basenm = "トランプの魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Trump Magic #"; + basenm = "& Book~ of Trump Magic %"; else - basenm = "& Trump Spellbook~ #"; + basenm = "& Trump Spellbook~ %"; #endif break; @@ -1539,85 +1784,86 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_ARCANE_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& Èë½Ñ¤ÎËâË¡½ñ#"; + basenm = "秘術の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Arcane Magic #"; + basenm = "& Book~ of Arcane Magic %"; else - basenm = "& Arcane Spellbook~ #"; + basenm = "& Arcane Spellbook~ %"; #endif break; } - case TV_ENCHANT_BOOK: + + case TV_CRAFT_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& ¾¢¤ÎËâË¡½ñ#"; + basenm = "匠の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Craft Magic #"; + basenm = "& Book~ of Craft Magic %"; else - basenm = "& Craft Spellbook~ #"; + basenm = "& Craft Spellbook~ %"; #endif break; } + case TV_DAEMON_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& °­Ëâ¤ÎËâË¡½ñ#"; + basenm = "悪魔の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Daemon Magic #"; + basenm = "& Book~ of Daemon Magic %"; else - basenm = "& Daemon Spellbook~ #"; + basenm = "& Daemon Spellbook~ %"; #endif break; } - case TV_HAJA_BOOK: + + case TV_CRUSADE_BOOK: { - modstr = basenm; #ifdef JP - basenm = "& Ç˼٤ÎËâË¡½ñ#"; + basenm = "破邪の魔法書%"; #else if (mp_ptr->spell_book == TV_LIFE_BOOK) - basenm = "& Book~ of Crusade Magic #"; + basenm = "& Book~ of Crusade Magic %"; else - basenm = "& Crusade Spellbook~ #"; + basenm = "& Crusade Spellbook~ %"; #endif break; } + case TV_MUSIC_BOOK: { - modstr = basenm; -#ifdef JP - basenm = "& ²Î½¸#"; -#else - basenm = "& Song Book~ #"; -#endif - + basenm = _("歌集%", "& Song Book~ %"); break; } + case TV_HISSATSU_BOOK: { - modstr = basenm; + basenm = _("& 武芸の書%", "Book~ of Kendo %"); + break; + } + + case TV_HEX_BOOK: + { #ifdef JP - basenm = "& Éð·Ý¤Î½ñ#"; + basenm = "呪術の魔法書%"; #else - basenm = "& Book~ of Kendo #"; + if (mp_ptr->spell_book == TV_LIFE_BOOK) + basenm = "& Book~ of Hex Magic %"; + else + basenm = "& Hex Spellbook~ %"; #endif break; } - - /* Hack -- Gold/Gems */ case TV_GOLD: { @@ -1628,16 +1874,17 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Used in the "inventory" routine */ default: { -#ifdef JP - strcpy(buf, "(¤Ê¤·)"); -#else - strcpy(buf, "(nothing)"); -#endif - + strcpy(buf, _("(なし)", "(nothing)")); return; } } + /* Use full name from k_info or a_info */ + if (aware && have_flag(flgs, TR_FULL_NAME)) + { + if (known && o_ptr->name1) basenm = a_name + a_info[o_ptr->name1].name; + else basenm = kindname; + } /* Start dumping the result */ t = tmp_val; @@ -1649,31 +1896,24 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) s = basenm; /* No prefix */ - if (!pref) + if (mode & OD_OMIT_PREFIX) { /* Nothing */ } else if (o_ptr->number > 1) { - if ( change_numeral == FALSE ){ - t = object_desc_num(t, o_ptr->number); - if (o_ptr->number > 9) - t = object_desc_str(t, "¸Ä¤Î "); - else - t = object_desc_str(t, "¤Ä¤Î "); - } - else - { - t = object_desc_kosuu(t,o_ptr); - t = object_desc_str(t, "¤Î "); - } + t = object_desc_kosuu(t, o_ptr); + t = object_desc_str(t, "の "); } - /* ±Ñ¸ì¤Î¾ì¹ç¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï The ¤¬ÉÕ¤¯¤Î¤Çʬ¤«¤ë¤¬ - * ÆüËܸì¤Ç¤Ïʬ¤«¤é¤Ê¤¤¤Î¤Ç¥Þ¡¼¥¯¤ò¤Ä¤±¤ë + /* 英語の場合アーティファクトは The が付くので分かるが + * 日本語では分からないのでマークをつける */ - if (known && artifact_p(o_ptr)) t = object_desc_str(t, "¡ú"); - else if (known && o_ptr->art_name) t = object_desc_str(t, "¡ù"); + if (known) + { + if (object_is_fixed_artifact(o_ptr)) t = object_desc_str(t, "★"); + else if (o_ptr->art_name) t = object_desc_str(t, "☆"); + } #else @@ -1684,7 +1924,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) s = basenm + 2; /* No prefix */ - if (!pref) + if (mode & OD_OMIT_PREFIX) { /* Nothing */ } @@ -1703,33 +1943,35 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) } /* Hack -- The only one of its kind */ - else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) - { - t = object_desc_str(t, "The "); - } - - /* Unique corpses are unique */ - else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE)) + else if ((known && object_is_artifact(o_ptr)) || + ((o_ptr->tval == TV_CORPSE) && + (r_info[o_ptr->pval].flags1 & RF1_UNIQUE))) { t = object_desc_str(t, "The "); } - /* A single one, with a vowel in the modifier */ - else if ((*s == '#') && (is_a_vowel(modstr[0]))) + /* A single one */ + else { - t = object_desc_str(t, "an "); - } + bool vowel; - /* A single one, with a vowel */ - else if (is_a_vowel(*s)) - { - t = object_desc_str(t, "an "); - } + switch (*s) + { + case '#': vowel = is_a_vowel(modstr[0]); break; + case '%': vowel = is_a_vowel(*kindname); break; + default: vowel = is_a_vowel(*s); break; + } - /* A single one, without a vowel */ - else - { - t = object_desc_str(t, "a "); + if (vowel) + { + /* A single one, with a vowel */ + t = object_desc_str(t, "an "); + } + else + { + /* A single one, without a vowel */ + t = object_desc_str(t, "a "); + } } } @@ -1740,7 +1982,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) s = basenm; /* No pref */ - if (!pref) + if (mode & OD_OMIT_PREFIX) { /* Nothing */ } @@ -1759,7 +2001,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) } /* Hack -- The only one of its kind */ - else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) + else if (known && object_is_artifact(o_ptr)) { t = object_desc_str(t, "The "); } @@ -1776,50 +2018,86 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* while (*s == '~') s++; */ #ifdef JP - if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3) + if (object_is_smith(o_ptr)) { - t = object_desc_str(t,format("ÃÃÌê»Õ%s¤Î",player_name)); + t = object_desc_str(t, format("鍛冶師%sの", p_ptr->name)); } - /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¡¢Ì¾¤Î¤¢¤ë¥¢¥¤¥Æ¥à¤Î̾Á°¤òÉղ乤ë */ - if (known) { - /* ¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È */ + /* 伝説のアイテム、名のあるアイテムの名前を付加する */ + if (known) + { + /* ランダム・アーティファクト */ if (o_ptr->art_name) - { char temp[256]; - strcpy(temp, quark_str(o_ptr->art_name)); - /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */ - /* ±Ñ¸ìÈǤΥ»¡¼¥Ö¥Õ¥¡¥¤¥ë¤«¤éÍ褿 'of XXX' ¤Ï,¡ÖXXX¤Î¡×¤Èɽ¼¨¤¹¤ë */ - if ( strncmp( temp , "of ",3)==0 ) {t=object_desc_str(t,&temp[3]);t=object_desc_str(t,"¤Î");} - else - if ( strncmp( temp , "¡Ø" , 2 ) != 0 && temp[0]!='\'') - t=object_desc_str(t, temp); - } - /* ÅÁÀâ¤Î¥¢¥¤¥Æ¥à */ - else if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - /* '¡Ø' ¤«¤é»Ï¤Þ¤é¤Ê¤¤ÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ½é¤ËÉղ乤ë */ - if ( strncmp( (a_name + a_ptr->name), "¡Ø" , 2) != 0){ - t=object_desc_str(t, (a_name + a_ptr->name)); - } - } - /* ̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à */ - else if (o_ptr->name2) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - t=object_desc_str(t, (e_name + e_ptr->name)); - } - } + { + cptr temp = quark_str(o_ptr->art_name); + + /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ + /* 英語版のセーブファイルから来た 'of XXX' は,「XXXの」と表示する */ + if (strncmp(temp, "of ", 3) == 0) + { + t = object_desc_str(t, &temp[3]); + t = object_desc_str(t, "の"); + } + else if ((strncmp(temp, "『", 2) != 0) && + (strncmp(temp, "《", 2) != 0) && + (temp[0] != '\'')) + t = object_desc_str(t, temp); + } + /* 伝説のアイテム */ + else if (o_ptr->name1 && !have_flag(flgs, TR_FULL_NAME)) + { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + /* '『' から始まらない伝説のアイテムの名前は最初に付加する */ + if (strncmp(a_name + a_ptr->name, "『", 2) != 0) + { + t = object_desc_str(t, a_name + a_ptr->name); + } + } + /* 名のあるアイテム */ + else if (object_is_ego(o_ptr)) + { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + t = object_desc_str(t, e_name + e_ptr->name); + } + } #endif + /* Copy the string */ - for (; *s; s++) + for (s0 = NULL; *s || s0; ) { + /* The end of the flavour/kind string. */ + if (!*s) + { + s = s0 + 1; + s0 = NULL; + } + + /* Begin to append the modifier (flavor) */ + else if ((*s == '#') && !s0) + { + s0 = s; + s = modstr; + + /* Paranoia -- Never append multiple modstrs */ + modstr = ""; + } + + /* Begin to append the kind name */ + else if ((*s == '%') && !s0) + { + s0 = s; + s = kindname; + + /* Paranoia -- Never append multiple kindnames */ + kindname = ""; + } + +#ifndef JP /* Pluralizer */ -#ifdef JP - if (*s == '#') -#else - if (*s == '~') + else if (*s == '~') { /* Add a plural if needed */ - if (pref && o_ptr->number != 1) + if (!(mode & OD_NO_PLURAL) && (o_ptr->number != 1)) { char k = t[-1]; @@ -1831,30 +2109,15 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Add an 's' */ *t++ = 's'; } + s++; } - - /* Modifier */ - else if (*s == '#') #endif - { - /* Insert the modifier */ - for (u = modstr; *u; u++) *t++ = *u; - } - -#ifdef JP - else if (*s == '%') - /* saigo ¤ÎÂå¤ï¤ê¡£¸úǽ¤òÉÕ²½¤¹¤ë by ita*/ - { - modstr=get_object_name(o_ptr); - for (u = modstr; *u; u++) *t++ = *u; - } -#endif /* Normal */ else { /* Copy */ - *t++ = *s; + *t++ = *s++; } } @@ -1862,38 +2125,38 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) *t = '\0'; - /* Append the "kind name" to the "base name" */ -#ifndef JP - if (append_name) - { - t = object_desc_str(t, " of "); - t = object_desc_str(t, get_object_name(o_ptr)); - } -#endif - - #ifdef JP - /* '¡Ø'¤«¤é»Ï¤Þ¤ëÅÁÀâ¤Î¥¢¥¤¥Æ¥à¤Î̾Á°¤ÏºÇ¸å¤ËÉղ乤ë */ - if (known) { - /* ¥é¥ó¥À¥à¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î̾Á°¤Ï¥»¡¼¥Ö¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿ - ¤µ¤ì¤ë¤Î¤Ç¡¢±Ñ¸ìÈǤÎ̾Á°¤â¤½¤ì¤é¤·¤¯ÊÑ´¹¤¹¤ë */ + /* '『'から始まる伝説のアイテムの名前は最後に付加する */ + if (known) + { + /* ランダムアーティファクトの名前はセーブファイルに記録 + されるので、英語版の名前もそれらしく変換する */ if (o_ptr->art_name) - { char temp[256];int itemp; - strcpy(temp, quark_str(o_ptr->art_name)); - /* MEGA HACK by ita*/ - if ( strncmp( temp , "¡Ø" , 2 ) == 0 ) t=object_desc_str(t, temp);else - if( temp[0]=='\'' ) { itemp=strlen(temp);temp[itemp-1]=0; - t=object_desc_str(t,"¡Ø"); - t=object_desc_str(t,&temp[1]); - t=object_desc_str(t,"¡Ù");} - - } - else if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - if ( strncmp( (a_name + a_ptr->name) , "¡Ø" , 2 ) == 0 ){ - t=object_desc_str(t, (a_name + a_ptr->name)); - } - } + { + char temp[256]; + int itemp; + strcpy(temp, quark_str(o_ptr->art_name)); + /* MEGA HACK by ita */ + if (strncmp(temp, "『", 2) == 0 || + strncmp(temp, "《", 2) == 0) + t = object_desc_str(t, temp); + else if (temp[0] == '\'') + { + itemp = strlen(temp); + temp[itemp - 1] = 0; + t = object_desc_str(t, "『"); + t = object_desc_str(t, &temp[1]); + t = object_desc_str(t, "』"); + } + } + else if (object_is_fixed_artifact(o_ptr)) + { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + if (strncmp(a_name + a_ptr->name, "『", 2) == 0) + { + t = object_desc_str(t, a_name + a_ptr->name); + } + } else if (o_ptr->inscription) { cptr str = quark_str(o_ptr->inscription); @@ -1911,56 +2174,55 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (*str) { /* Find the '#' */ - cptr str = strchr(quark_str(o_ptr->inscription), '#'); + cptr str_aux = my_strchr(quark_str(o_ptr->inscription), '#'); /* Add the false name */ - t=object_desc_str(t,"¡Ø"); - t = object_desc_str(t, &str[1]); - t=object_desc_str(t,"¡Ù"); + t = object_desc_str(t,"『"); + t = object_desc_str(t, &str_aux[1]); + t = object_desc_str(t,"』"); } } - } + } #else - if ((o_ptr->tval > TV_CAPTURE) && o_ptr->xtra3) + if (object_is_smith(o_ptr)) { - t = object_desc_str(t,format(" of %s the smith",player_name)); + t = object_desc_str(t,format(" of %s the Smith",p_ptr->name)); } /* Hack -- Append "Artifact" or "Special" names */ - if (known) + if (known && !have_flag(flgs, TR_FULL_NAME)) { /* Is it a new random artifact ? */ if (o_ptr->art_name) { t = object_desc_chr(t, ' '); - t = object_desc_str(t, quark_str(o_ptr->art_name)); } /* Grab any artifact name */ - else if (o_ptr->name1) + else if (object_is_fixed_artifact(o_ptr)) { artifact_type *a_ptr = &a_info[o_ptr->name1]; t = object_desc_chr(t, ' '); - t = object_desc_str(t, (a_name + a_ptr->name)); + t = object_desc_str(t, a_name + a_ptr->name); } /* Grab any ego-item name */ else { - if (o_ptr->name2) + if (object_is_ego(o_ptr)) { ego_item_type *e_ptr = &e_info[o_ptr->name2]; t = object_desc_chr(t, ' '); - t = object_desc_str(t, (e_name + e_ptr->name)); + t = object_desc_str(t, e_name + e_ptr->name); } - if (o_ptr->inscription && strchr(quark_str(o_ptr->inscription), '#')) + if (o_ptr->inscription && my_strchr(quark_str(o_ptr->inscription), '#')) { /* Find the '#' */ - cptr str = strchr(quark_str(o_ptr->inscription), '#'); + cptr str = my_strchr(quark_str(o_ptr->inscription), '#'); /* Add the false name */ t = object_desc_chr(t, ' '); @@ -1971,9 +2233,8 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) #endif - /* No more details wanted */ - if (mode < 1) goto copyback; + if (mode & OD_NAME_ONLY) goto object_desc_done; /* Hack -- Chests must be described in detail */ if (o_ptr->tval == TV_CHEST) @@ -1987,12 +2248,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* May be "empty" */ else if (!o_ptr->pval) { -#ifdef JP -t = object_desc_str(t, "(¶õ)"); -#else - t = object_desc_str(t, " (empty)"); -#endif - + t = object_desc_str(t, _("(空)", " (empty)")); } /* May be "disarmed" */ @@ -2000,21 +2256,11 @@ t = object_desc_str(t, "( { if (chest_traps[0 - o_ptr->pval]) { -#ifdef JP -t = object_desc_str(t, "(²ò½üºÑ)"); -#else - t = object_desc_str(t, " (disarmed)"); -#endif - + t = object_desc_str(t, _("(解除済)", " (disarmed)")); } else { -#ifdef JP -t = object_desc_str(t, "(Èó»Ü¾û)"); -#else - t = object_desc_str(t, " (unlocked)"); -#endif - + t = object_desc_str(t, _("(非施錠)", " (unlocked)")); } } @@ -2026,62 +2272,32 @@ t = object_desc_str(t, "( { case 0: { -#ifdef JP -t = object_desc_str(t, "(»Ü¾û)"); -#else - t = object_desc_str(t, " (Locked)"); -#endif - + t = object_desc_str(t, _("(施錠)", " (Locked)")); break; } case CHEST_LOSE_STR: { -#ifdef JP -t = object_desc_str(t, "(ÆÇ¿Ë)"); -#else - t = object_desc_str(t, " (Poison Needle)"); -#endif - + t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); break; } case CHEST_LOSE_CON: { -#ifdef JP -t = object_desc_str(t, "(ÆÇ¿Ë)"); -#else - t = object_desc_str(t, " (Poison Needle)"); -#endif - + t = object_desc_str(t, _("(毒針)", " (Poison Needle)")); break; } case CHEST_POISON: { -#ifdef JP -t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)"); -#else - t = object_desc_str(t, " (Gas Trap)"); -#endif - + t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); break; } case CHEST_PARALYZE: { -#ifdef JP -t = object_desc_str(t, "(¥¬¥¹¡¦¥È¥é¥Ã¥×)"); -#else - t = object_desc_str(t, " (Gas Trap)"); -#endif - + t = object_desc_str(t, _("(ガス・トラップ)", " (Gas Trap)")); break; } case CHEST_EXPLODE: { -#ifdef JP -t = object_desc_str(t, "(ÇúȯÁõÃÖ)"); -#else - t = object_desc_str(t, " (Explosion Device)"); -#endif - + t = object_desc_str(t, _("(爆発装置)", " (Explosion Device)")); break; } case CHEST_SUMMON: @@ -2089,42 +2305,22 @@ t = object_desc_str(t, "( case CHEST_E_SUMMON: case CHEST_H_SUMMON: { -#ifdef JP -t = object_desc_str(t, "(¾¤´­¤Î¥ë¡¼¥ó)"); -#else - t = object_desc_str(t, " (Summoning Runes)"); -#endif - + t = object_desc_str(t, _("(召喚のルーン)", " (Summoning Runes)")); break; } case CHEST_RUNES_OF_EVIL: { -#ifdef JP -t = object_desc_str(t, "(¼Ù°­¤Ê¥ë¡¼¥ó)"); -#else - t = object_desc_str(t, " (Gleaming Black Runes)"); -#endif - + t = object_desc_str(t, _("(邪悪なルーン)", " (Gleaming Black Runes)")); break; } case CHEST_ALARM: { -#ifdef JP -t = object_desc_str(t, "(·ÙÊóÁõÃÖ)"); -#else - t = object_desc_str(t, " (Alarm)"); -#endif - + t = object_desc_str(t, _("(警報装置)", " (Alarm)")); break; } default: { -#ifdef JP -t = object_desc_str(t, "(¥Þ¥ë¥Á¡¦¥È¥é¥Ã¥×)"); -#else - t = object_desc_str(t, " (Multiple Traps)"); -#endif - + t = object_desc_str(t, _("(マルチ・トラップ)", " (Multiple Traps)")); break; } } @@ -2133,7 +2329,11 @@ t = object_desc_str(t, "( /* Display the item like a weapon */ - if (f3 & (TR3_SHOW_MODS)) show_weapon = TRUE; + if (have_flag(flgs, TR_SHOW_MODS)) show_weapon = TRUE; + + /* Display the item like a weapon */ + if (object_is_smith(o_ptr) && (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)) + show_weapon = TRUE; /* Display the item like a weapon */ if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE; @@ -2152,7 +2352,13 @@ t = object_desc_str(t, "( case TV_HAFTED: case TV_POLEARM: case TV_SWORD: - case TV_DIGGING: + case TV_DIGGING: + + /* In Vault Quest, hide the dice of target weapon. */ + if(object_is_quest_target(o_ptr) && !known) + { + break; + } /* Append a "damage" string */ t = object_desc_chr(t, ' '); @@ -2170,10 +2376,10 @@ t = object_desc_str(t, "( case TV_BOW: /* Mega-Hack -- Extract the "base power" */ - power = (o_ptr->sval % 10); + power = bow_tmul(o_ptr->sval); /* Apply the "Extra Might" flag */ - if (f3 & (TR3_XTRA_MIGHT)) power++; + if (have_flag(flgs, TR_XTRA_MIGHT)) power++; /* Append a special "damage" string */ t = object_desc_chr(t, ' '); @@ -2181,7 +2387,22 @@ t = object_desc_str(t, "( t = object_desc_chr(t, 'x'); t = object_desc_num(t, power); t = object_desc_chr(t, p2); - + + fire_rate = calc_num_fire(o_ptr); + /* Show Fire rate */ + if (fire_rate != 0 && power > 0 && known) + { + fire_rate = bow_energy(o_ptr->sval) / fire_rate; + + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); + t = object_desc_num(t, fire_rate/100); + t = object_desc_chr(t, '.'); + t = object_desc_num(t, fire_rate%100); + t = object_desc_str(t, "turn"); + t = object_desc_chr(t, p2); + } + /* All done */ break; } @@ -2222,92 +2443,100 @@ t = object_desc_str(t, "( bow_ptr = &inventory[INVEN_BOW]; - /* if have a firing weapon + ammo matches bow*/ - if (bow_ptr->k_idx && - (((bow_ptr->sval == SV_SLING) && (o_ptr->tval == TV_SHOT)) || - (((bow_ptr->sval == SV_SHORT_BOW) || - (bow_ptr->sval == SV_LONG_BOW) || - (bow_ptr->sval == SV_NAMAKE_BOW)) && (o_ptr->tval == TV_ARROW)) || - (((bow_ptr->sval == SV_LIGHT_XBOW) || - (bow_ptr->sval == SV_HEAVY_XBOW)) && (o_ptr->tval == TV_BOLT)))) + /* If have a firing weapon + ammo matches bow */ + if (bow_ptr->k_idx && (o_ptr->tval == p_ptr->tval_ammo)) { - int avgdam = 10; - int tmul; - s16b energy_fire; - - avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2; + int avgdam = o_ptr->dd * (o_ptr->ds + 1) * 10 / 2; + int tmul = bow_tmul(bow_ptr->sval); + ENERGY energy_fire = bow_energy(bow_ptr->sval); - /* See if the bow is "known" - then set damage bonus*/ - if (object_known_p(bow_ptr)) - { - avgdam += (bow_ptr->to_d * 10); - } + /* See if the bow is "known" - then set damage bonus */ + if (object_is_known(bow_ptr)) avgdam += (bow_ptr->to_d * 10); - /* effect of ammo */ + /* Effect of ammo */ if (known) avgdam += (o_ptr->to_d * 10); - energy_fire = bow_energy(bow_ptr->sval); - tmul = bow_tmul(bow_ptr->sval); - /* Get extra "power" from "extra might" */ if (p_ptr->xtra_might) tmul++; tmul = tmul * (100 + (int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128); - /* launcher multiplier */ + /* Launcher multiplier */ avgdam *= tmul; avgdam /= (100 * 10); + + /* Get extra damage from concentration */ + if (p_ptr->concent) avgdam = boost_concentration_damage(avgdam); + if (avgdam < 0) avgdam = 0; - /* display (shot damage/ avg damage) */ + /* Display (shot damage/ shot damage with critical/ avg damage with critical) */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); + + if(show_ammo_no_crit) + { + /* Damage with no-crit */ + t = object_desc_num(t, avgdam); + t = object_desc_str(t, show_ammo_detail ? "/shot " : "/"); + } + + /* Apply Expect damage of Critical */ + avgdam = calc_expect_crit_shot(o_ptr->weight, o_ptr->to_h, bow_ptr->to_h, avgdam); t = object_desc_num(t, avgdam); - t = object_desc_chr(t, '/'); - + + t = show_ammo_no_crit ? object_desc_str(t, show_ammo_detail ? "/crit " : "/") + : object_desc_str(t, show_ammo_detail ? "/shot " : "/"); + if (p_ptr->num_fire == 0) { t = object_desc_chr(t, '0'); } else { - /* calc effects of energy */ + /* Calc effects of energy */ avgdam *= (p_ptr->num_fire * 100); - avgdam /= energy_fire; - t = object_desc_num(t, avgdam); + t = object_desc_str(t, show_ammo_detail ? "/turn" : ""); + + if(show_ammo_crit_ratio) + { + int percent = calc_crit_ratio_shot(known ? o_ptr->to_h : 0, known ? bow_ptr->to_h : 0); + + t = object_desc_chr(t, '/'); + t = object_desc_num(t, percent / 100); + t = object_desc_chr(t, '.'); + if(percent % 100 < 10) + { + t = object_desc_chr(t, '0'); + } + t = object_desc_num(t, percent % 100); + t = object_desc_str(t, show_ammo_detail ? "% crit" : "%"); + } } t = object_desc_chr(t, p2); } else if ((p_ptr->pclass == CLASS_NINJA) && (o_ptr->tval == TV_SPIKE)) { - int avgdam; - s16b energy_fire; + int avgdam = p_ptr->mighty_throw ? (1 + 3) : 1; + s16b energy_fire = 100 - p_ptr->lev; - if (p_ptr->mighty_throw) - avgdam = 1 + 3; - else - avgdam = 1; - avgdam += ((p_ptr->lev+30)*(p_ptr->lev+30)-900)/55; - - energy_fire = 100 - p_ptr->lev; + avgdam += ((p_ptr->lev + 30) * (p_ptr->lev + 30) - 900) / 55; - /* display (shot damage/ avg damage) */ + /* Display (shot damage/ avg damage) */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, p1); t = object_desc_num(t, avgdam); t = object_desc_chr(t, '/'); - /* calc effects of energy */ + /* Calc effects of energy */ avgdam = 100 * avgdam / energy_fire; t = object_desc_num(t, avgdam); - t = object_desc_chr(t, p2); } - /* Add the armor bonuses */ if (known) @@ -2344,328 +2573,284 @@ t = object_desc_str(t, "( /* No more details wanted */ - if (mode < 2) goto copyback; + if (mode & OD_NAME_AND_ENCHANT) goto object_desc_done; - /* - * Hack -- Wands and Staffs have charges. Make certain how many charges - * a stack of staffs really has is clear. -LM- - */ - if (known && - ((o_ptr->tval == TV_STAFF) || - (o_ptr->tval == TV_WAND))) + if (known) /* Known item only */ { - /* Dump " (N charges)" */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - - /* Clear explaination for staffs. */ - if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) - { - t = object_desc_num(t, o_ptr->number); - t = object_desc_str(t, "x "); - } - t = object_desc_num(t, o_ptr->pval); -#ifdef JP - t = object_desc_str(t, "²óʬ"); -#else - t = object_desc_str(t, " charge"); - - if (o_ptr->pval != 1) + /* + * Hack -- Wands and Staffs have charges. Make certain how many charges + * a stack of staffs really has is clear. -LM- + */ + if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { - t = object_desc_chr(t, 's'); - } -#endif - + /* Dump " (N charges)" */ + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); - t = object_desc_chr(t, p2); - } - /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may - * be in any state of charge or discharge, this now includes a number. -LM- - */ - else if (known && (o_ptr->tval == TV_ROD)) - { - /* Hack -- Dump " (# charging)" if relevant */ - if (o_ptr->timeout) - { - /* Stacks of rods display an exact count of charging rods. */ - if (o_ptr->number > 1) + /* Clear explaination for staffs. */ + if ((o_ptr->tval == TV_STAFF) && (o_ptr->number > 1)) { - /* Paranoia. */ - if (k_ptr->pval == 0) k_ptr->pval = 1; - - /* Find out how many rods are charging, by dividing - * current timeout by each rod's maximum timeout. - * Ensure that any remainder is rounded up. Display - * very discharged stacks as merely fully discharged. - */ - power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; - if (power > o_ptr->number) power = o_ptr->number; - - /* Display prettily. */ - t = object_desc_str(t, " ("); - t = object_desc_num(t, power); + t = object_desc_num(t, o_ptr->number); + t = object_desc_str(t, "x "); + } + t = object_desc_num(t, o_ptr->pval); #ifdef JP - t = object_desc_str(t, "ËÜ ½¼Å¶Ãæ)"); + t = object_desc_str(t, "回分"); #else - t = object_desc_str(t, " charging)"); + t = object_desc_str(t, " charge"); + if (o_ptr->pval != 1) t = object_desc_chr(t, 's'); #endif - } - - /* "one Rod of Perception (1 charging)" would look tacky. */ - else + t = object_desc_chr(t, p2); + } + /* Hack -- Rods have a "charging" indicator. Now that stacks of rods may + * be in any state of charge or discharge, this now includes a number. -LM- + */ + else if (o_ptr->tval == TV_ROD) + { + /* Hack -- Dump " (# charging)" if relevant */ + if (o_ptr->timeout) { -#ifdef JP -t = object_desc_str(t, "(½¼Å¶Ãæ)"); -#else - t = object_desc_str(t, " (charging)"); -#endif + /* Stacks of rods display an exact count of charging rods. */ + if (o_ptr->number > 1) + { + /* Paranoia. */ + if (k_ptr->pval == 0) k_ptr->pval = 1; + + /* Find out how many rods are charging, by dividing + * current timeout by each rod's maximum timeout. + * Ensure that any remainder is rounded up. Display + * very discharged stacks as merely fully discharged. + */ + power = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval; + if (power > o_ptr->number) power = o_ptr->number; + + /* Display prettily. */ + t = object_desc_str(t, " ("); + t = object_desc_num(t, power); + t = object_desc_str(t, _("本 充填中)", " charging)")); + } + /* "one Rod of Perception (1 charging)" would look tacky. */ + else + { + t = object_desc_str(t, _("(充填中)", " (charging)")); + } } } - } - /* Dump "pval" flags for wearable items */ - if (known && (f1 & (TR1_PVAL_MASK))) - { - /* Start the display */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); + /* Dump "pval" flags for wearable items */ + if (have_pval_flags(flgs)) + { + /* Start the display */ + t = object_desc_chr(t, ' '); + t = object_desc_chr(t, p1); - /* Dump the "pval" itself */ - t = object_desc_int(t, o_ptr->pval); + /* Dump the "pval" itself */ + t = object_desc_int(t, o_ptr->pval); - /* Do not display the "pval" flags */ - if (f3 & (TR3_HIDE_TYPE)) - { - /* Nothing */ - } + /* Do not display the "pval" flags */ + if (have_flag(flgs, TR_HIDE_TYPE)) + { + /* Nothing */ + } - /* Speed */ - else if (f1 & (TR1_SPEED)) - { - /* Dump " to speed" */ + /* Speed */ + else if (have_flag(flgs, TR_SPEED)) + { + /* Dump " to speed" */ + t = object_desc_str(t, _("加速", " to speed")); + } + + /* Attack speed */ + else if (have_flag(flgs, TR_BLOWS)) + { + /* Add " attack" */ #ifdef JP -t = object_desc_str(t, "²Ã®"); + t = object_desc_str(t, "攻撃"); #else - t = object_desc_str(t, " to speed"); + t = object_desc_str(t, " attack"); + + /* Add "attacks" */ + if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's'); #endif + } - } + /* Stealth */ + else if (have_flag(flgs, TR_STEALTH)) + { + /* Dump " to stealth" */ + t = object_desc_str(t, _("隠密", " to stealth")); + } - /* Attack speed */ - else if (f1 & (TR1_BLOWS)) - { - /* Add " attack" */ -#ifdef JP -t = object_desc_str(t, "¹¶·â"); -#else - t = object_desc_str(t, " attack"); + /* Search */ + else if (have_flag(flgs, TR_SEARCH)) + { + /* Dump " to searching" */ + t = object_desc_str(t, _("探索", " to searching")); + } - /* Add "attacks" */ - if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's'); -#endif + /* Infravision */ + else if (have_flag(flgs, TR_INFRA)) + { + /* Dump " to infravision" */ + t = object_desc_str(t, _("赤外線視力", " to infravision")); + } + /* Finish the display */ + t = object_desc_chr(t, p2); } - /* Stealth */ - else if (f1 & (TR1_STEALTH)) + /* Hack -- Process Lanterns/Torches */ + if ((o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR)))) { - /* Dump " to stealth" */ + /* Hack -- Turns of light for normal lites */ #ifdef JP -t = object_desc_str(t, "±£Ì©"); + t = object_desc_chr(t, '('); #else - t = object_desc_str(t, " to stealth"); + t = object_desc_str(t, " (with "); #endif + if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4 * 2); + else t = object_desc_num(t, o_ptr->xtra4); + t = object_desc_str(t, _("ターンの寿命)", " turns of light)")); } - /* Search */ - else if (f1 & (TR1_SEARCH)) + /* Indicate charging objects, but not rods. */ + if (o_ptr->timeout && (o_ptr->tval != TV_ROD)) { - /* Dump " to searching" */ -#ifdef JP -t = object_desc_str(t, "õº÷"); -#else - t = object_desc_str(t, " to searching"); -#endif - + /* Hack -- Dump " (charging)" if relevant */ + t = object_desc_str(t, _("(充填中)", " (charging)")); } + } - /* Infravision */ - else if (f1 & (TR1_INFRA)) - { - /* Dump " to infravision" */ -#ifdef JP -t = object_desc_str(t, "ÀÖ³°Àþ»ëÎÏ"); -#else - t = object_desc_str(t, " to infravision"); -#endif - } + /* No more details wanted */ + if (mode & OD_OMIT_INSCRIPTION) goto object_desc_done; - /* Tunneling */ - else if (f1 & (TR1_TUNNEL)) - { - /* Nothing */ - } - /* Finish the display */ - t = object_desc_chr(t, p2); - } + /* Prepare real inscriptions in a buffer */ + tmp_val2[0] = '\0'; - /* Hack -- Process Lanterns/Torches */ - if (known && (o_ptr->tval == TV_LITE) && (!(artifact_p(o_ptr) || (o_ptr->sval == SV_LITE_FEANOR)))) + /* Auto abbreviation inscribe */ + if ((abbrev_extra || abbrev_all) && (o_ptr->ident & IDENT_MENTAL)) { - /* Hack -- Turns of light for normal lites */ -#ifdef JP -t = object_desc_str(t, "("); -#else - t = object_desc_str(t, " (with "); -#endif + if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '%')) + { + bool kanji, all; - if (o_ptr->name2 == EGO_LITE_LONG) t = object_desc_num(t, o_ptr->xtra4*2); - else t = object_desc_num(t, o_ptr->xtra4); #ifdef JP -t = object_desc_str(t, "¥¿¡¼¥ó¤Î¼÷Ì¿)"); + kanji = TRUE; #else - t = object_desc_str(t, " turns of light)"); + kanji = FALSE; #endif + all = abbrev_all; + get_ability_abbreviation(tmp_val2, o_ptr, kanji, all); + } } - - /* Indicate charging objects, but not rods. */ - if (known && o_ptr->timeout && o_ptr->tval != TV_ROD) + /* Use the standard inscription if available */ + if (o_ptr->inscription) { - /* Hack -- Dump " (charging)" if relevant */ -#ifdef JP -t = object_desc_str(t, "(½¼Å¶Ãæ)"); -#else - t = object_desc_str(t, " (charging)"); -#endif + char buff[1024]; - } + if (tmp_val2[0]) strcat(tmp_val2, ", "); + /* Get inscription and convert {%} */ + get_inscription(buff, o_ptr); - /* No more details wanted */ - if (mode < 3) goto copyback; + /* strcat with correct treating of kanji */ + my_strcat(tmp_val2, buff, sizeof(tmp_val2)); + } - /* No inscription yet */ - tmp_val2[0] = '\0'; + /* No fake inscription yet */ + fake_insc_buf[0] = '\0'; /* Use the game-generated "feeling" otherwise, if available */ if (o_ptr->feeling) { - strcpy(tmp_val2, game_inscriptions[o_ptr->feeling]); + strcpy(fake_insc_buf, game_inscriptions[o_ptr->feeling]); } /* Note "cursed" if the item is known to be cursed */ - else if (cursed_p(o_ptr) && (known || (o_ptr->ident & (IDENT_SENSE)))) + else if (object_is_cursed(o_ptr) && (known || (o_ptr->ident & IDENT_SENSE))) { -#ifdef JP -strcpy(tmp_val2, "¼ö¤ï¤ì¤Æ¤¤¤ë"); -#else - strcpy(tmp_val2, "cursed"); -#endif - + strcpy(fake_insc_buf, _("呪われている", "cursed")); } - + /* Note "unidentified" if the item is unidentified */ - else if ((o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET - || o_ptr->tval == TV_LITE || o_ptr->tval == TV_FIGURINE) - && object_aware_p(o_ptr) && !object_known_p(o_ptr) - && !((o_ptr->ident)&IDENT_SENSE)) + else if (((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET) + || (o_ptr->tval == TV_LITE) || (o_ptr->tval == TV_FIGURINE)) + && aware && !known + && !(o_ptr->ident & IDENT_SENSE)) { -#ifdef JP -strcpy(tmp_val2, "̤´ÕÄê"); -#else - strcpy(tmp_val2, "unidentified"); -#endif + strcpy(fake_insc_buf, _("未鑑定", "unidentified")); } /* Mega-Hack -- note empty wands/staffs */ - else if (!known && (o_ptr->ident & (IDENT_EMPTY))) + else if (!known && (o_ptr->ident & IDENT_EMPTY)) { -#ifdef JP -strcpy(tmp_val2, "¶õ"); -#else - strcpy(tmp_val2, "empty"); -#endif - + strcpy(fake_insc_buf, _("空", "empty")); } /* Note "tried" if the object has been tested unsuccessfully */ - else if (!aware && object_tried_p(o_ptr)) + else if (!aware && object_is_tried(o_ptr)) { -#ifdef JP -strcpy(tmp_val2, "̤ȽÌÀ"); -#else - strcpy(tmp_val2, "tried"); -#endif - + strcpy(fake_insc_buf, _("未判明", "tried")); } - /* Use the standard inscription if available */ - if (o_ptr->inscription) + /* Note the discount, if any */ + if (o_ptr->discount) { - char *u = tmp_val2; - - if (tmp_val2[0]) strcat(tmp_val2, ", "); - - strcat(tmp_val2, quark_str(o_ptr->inscription)); + /* Hidden by real inscription unless in a store */ + if (!tmp_val2[0] || (o_ptr->ident & IDENT_STORE)) + { + char discount_num_buf[4]; - for (; *u && (*u != '#'); u++); + /* Append to other fake inscriptions if any */ + if (fake_insc_buf[0]) strcat(fake_insc_buf, ", "); - *u = '\0'; + (void)object_desc_num(discount_num_buf, o_ptr->discount); + strcat(fake_insc_buf, discount_num_buf); + strcat(fake_insc_buf, _("%引き", "% off")); + } } - /* Note the discount, if any */ - else if (o_ptr->discount && !(tmp_val2[0])) - { - (void)object_desc_num(tmp_val2, o_ptr->discount); -#ifdef JP - strcat(tmp_val2, "%°ú¤­"); -#else - strcat(tmp_val2, "% off"); -#endif - - } /* Append the inscription, if any */ - if (tmp_val2[0]) + if (fake_insc_buf[0] || tmp_val2[0]) { /* Append the inscription */ t = object_desc_chr(t, ' '); t = object_desc_chr(t, c1); - t = object_desc_str(t, tmp_val2); - t = object_desc_chr(t, c2); - } -copyback: - t = tmp_val; - for (i = 0; i < MAX_NLEN-2; i++) - { -#ifdef JP - if (iskanji(*(t+i))) + /* Append fake inscriptions */ + if (fake_insc_buf[0]) { - *(buf+i) = *(t+i); - i++; + t = object_desc_str(t, fake_insc_buf); } -#endif - *(buf+i) = *(t+i); - } - if (i == MAX_NLEN-2) - { -#ifdef JP - if (iskanji(*(t+i))) - *(buf+i) = '\0'; - else -#endif - *(buf+i) = *(t+i); + + /* Append a separater */ + if (fake_insc_buf[0] && tmp_val2[0]) + { + t = object_desc_chr(t, ','); + t = object_desc_chr(t, ' '); + } + + /* Append real inscriptions */ + if (tmp_val2[0]) + { + t = object_desc_str(t, tmp_val2); + } + + t = object_desc_chr(t, c2); } - *(buf+MAX_NLEN-1) = '\0'; + +object_desc_done: + my_strcpy(buf, tmp_val, MAX_NLEN); } +