X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fwizard1.c;h=f0ca3bdf785ee3bd203c6c066d97fda0b0dcac71;hb=68a85285a9ce8d1abc1307bbcb517abbad5228b9;hp=678751c8c462a3a53ab62aed0ec5912f3d735c92;hpb=a815d0463878760c3f84817d2af7c69574a5e17c;p=hengband%2Fhengband.git diff --git a/src/wizard1.c b/src/wizard1.c index 678751c8c..f0ca3bdf7 100644 --- a/src/wizard1.c +++ b/src/wizard1.c @@ -1,6 +1,14 @@ -/* File: wizard1.c */ - -/* Purpose: Spoiler generation -BEN- */ +/*! + * @file wizard1.c + * @brief ウィザードモードの処理(スポイラー出力中心) / Spoiler generation -BEN- + * @date 2014/02/17 + * @author + * Copyright (c) 1997 Ben Harrison, and others + * 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. Other copyrights may also apply. + * 2013 Deskull rearranged comment for Doxygen. + */ #include "angband.h" @@ -15,58 +23,68 @@ static FILE *fff = NULL; -/* +/*! + * @brief シンボル職の記述名を返す / * Extract a textual representation of an attribute + * @param r_ptr モンスター種族の構造体ポインタ + * @return シンボル職の記述名 */ -static cptr attr_to_text(byte a) +static cptr attr_to_text(monster_race *r_ptr) { - switch (a) - { #ifdef JP000 -case TERM_DARK: return ("XXX¤¤"); -case TERM_WHITE: return ("Çò¤¤"); -case TERM_SLATE: return ("Àij¥¿§¤Î"); -case TERM_ORANGE: return ("¥ª¥ì¥ó¥¸¤Î"); -case TERM_RED: return ("ÀÖ¤¤"); -case TERM_GREEN: return ("ÎФÎ"); -case TERM_BLUE: return ("ÀĤ¤"); -case TERM_UMBER: return ("àèàῧ¤Î"); -case TERM_L_DARK: return ("³¥¿§¤Î"); -case TERM_L_WHITE: return ("ÌÀÀij¥¿§¤Î"); -case TERM_VIOLET: return ("»ç¤Î"); -case TERM_YELLOW: return ("²«¿§¤¤"); -case TERM_L_RED: return ("ÌÀ¤¤ÀÖ¤Î"); -case TERM_L_GREEN: return ("ÌÀ¤¤ÎФÎ"); -case TERM_L_BLUE: return ("ÌÀ¤¤ÀĤÎ"); -case TERM_L_UMBER: return ("ÌÀ¤¤àèàῧ¤Î"); + if (r_ptr->flags1 & RF1_ATTR_CLEAR) return "透明な"; + if (r_ptr->flags1 & RF1_ATTR_MULTI) return "万色の"; + if (r_ptr->flags1 & RF1_ATTR_SEMIRAND) return "準ランダムな"; #else - case TERM_DARK: return ("xxx"); - case TERM_WHITE: return ("White"); - case TERM_SLATE: return ("Slate"); - case TERM_ORANGE: return ("Orange"); - case TERM_RED: return ("Red"); - case TERM_GREEN: return ("Green"); - case TERM_BLUE: return ("Blue"); - case TERM_UMBER: return ("Umber"); - case TERM_L_DARK: return ("L.Dark"); - case TERM_L_WHITE: return ("L.Slate"); - case TERM_VIOLET: return ("Violet"); - case TERM_YELLOW: return ("Yellow"); - case TERM_L_RED: return ("L.Red"); - case TERM_L_GREEN: return ("L.Green"); - case TERM_L_BLUE: return ("L.Blue"); - case TERM_L_UMBER: return ("L.Umber"); + if (r_ptr->flags1 & RF1_ATTR_CLEAR) return "Clear"; + if (r_ptr->flags1 & RF1_ATTR_MULTI) return "Multi"; + if (r_ptr->flags1 & RF1_ATTR_SEMIRAND) return "S.Rand"; #endif + switch (r_ptr->d_attr) + { +#ifdef JP000 + case TERM_DARK: return "XXXい"; + case TERM_WHITE: return "白い"; + case TERM_SLATE: return "青灰色の"; + case TERM_ORANGE: return "オレンジの"; + case TERM_RED: return "赤い"; + case TERM_GREEN: return "緑の"; + case TERM_BLUE: return "青い"; + case TERM_UMBER: return "琥珀色の"; + case TERM_L_DARK: return "灰色の"; + case TERM_L_WHITE: return "明青灰色の"; + case TERM_VIOLET: return "紫の"; + case TERM_YELLOW: return "黄色い"; + case TERM_L_RED: return "明い赤の"; + case TERM_L_GREEN: return "明い緑の"; + case TERM_L_BLUE: return "明い青の"; + case TERM_L_UMBER: return "明い琥珀色の"; +#else + case TERM_DARK: return "xxx"; + case TERM_WHITE: return "White"; + case TERM_SLATE: return "Slate"; + case TERM_ORANGE: return "Orange"; + case TERM_RED: return "Red"; + case TERM_GREEN: return "Green"; + case TERM_BLUE: return "Blue"; + case TERM_UMBER: return "Umber"; + case TERM_L_DARK: return "L.Dark"; + case TERM_L_WHITE: return "L.Slate"; + case TERM_VIOLET: return "Violet"; + case TERM_YELLOW: return "Yellow"; + case TERM_L_RED: return "L.Red"; + case TERM_L_GREEN: return "L.Green"; + case TERM_L_BLUE: return "L.Blue"; + case TERM_L_UMBER: return "L.Umber"; +#endif } - /* Oops */ #ifdef JP000 -return ("ÊѤÊ"); + return "変な"; #else - return ("Icky"); + return "Icky"; #endif - } @@ -76,7 +94,7 @@ return (" */ typedef struct { - byte tval; + OBJECT_TYPE_VALUE tval; cptr name; } grouper; @@ -92,96 +110,68 @@ typedef struct */ static grouper group_item[] = { -#ifdef JP -{ TV_SHOT, "¼Í·âʪ" }, -#else - { TV_SHOT, "Ammo" }, -#endif - + { TV_SHOT, _("射撃物", "Ammo") }, { TV_ARROW, NULL }, { TV_BOLT, NULL }, - -#ifdef JP -{ TV_BOW, "µÝ" }, -#else - { TV_BOW, "Bows" }, -#endif - - -#ifdef JP -{ TV_SWORD, "Éð´ï" }, -#else - { TV_SWORD, "Weapons" }, -#endif - + { TV_BOW, _("弓", "Bows") }, + { TV_DIGGING, _("武器", "Weapons") }, { TV_POLEARM, NULL }, { TV_HAFTED, NULL }, - { TV_DIGGING, NULL }, - -#ifdef JP -{ TV_SOFT_ARMOR, "Ëɶñ¡ÊÂΡË" }, -#else - { TV_SOFT_ARMOR, "Armour (Body)" }, -#endif - + { TV_SWORD, NULL }, + { TV_SOFT_ARMOR, _("防具 (体)", "Armour (Body)") }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, - -#ifdef JP -{ TV_CLOAK, "Ëɶñ¡Ê¤½¤Î¾¡Ë" }, -#else - { TV_CLOAK, "Armour (Misc)" }, -#endif - - { TV_SHIELD, NULL }, + { TV_BOOTS, _("防具 (その他)", "Armour (Misc)") }, + { TV_GLOVES, NULL }, { TV_HELM, NULL }, { TV_CROWN, NULL }, - { TV_GLOVES, NULL }, - { TV_BOOTS, NULL }, + { TV_SHIELD, NULL }, + { TV_CLOAK, NULL }, #ifdef JP -{ TV_AMULET, "¥¢¥ß¥å¥ì¥Ã¥È" }, -{ TV_RING, "»ØÎØ" }, + { TV_LITE, "光源" }, + { TV_AMULET, "アミュレット" }, + { TV_RING, "指輪" }, #else + { TV_LITE, "Light Sources" }, { TV_AMULET, "Amulets" }, { TV_RING, "Rings" }, #endif - #ifdef JP -{ TV_SCROLL, "´¬Êª" }, -{ TV_POTION, "Ìô" }, -{ TV_FOOD, "¿©ÎÁ" }, + { TV_STAFF, "杖" }, + { TV_WAND, "魔法棒" }, + { TV_ROD, "ロッド" }, #else - { TV_SCROLL, "Scrolls" }, - { TV_POTION, "Potions" }, - { TV_FOOD, "Food" }, + { TV_STAFF, "Staffs" }, + { TV_WAND, "Wands" }, + { TV_ROD, "Rods" }, #endif - #ifdef JP -{ TV_ROD, "¥í¥Ã¥É" }, -{ TV_WAND, "ËâË¡ËÀ" }, -{ TV_STAFF, "¾ó" }, + { TV_SCROLL, "巻物" }, + { TV_POTION, "薬" }, + { TV_FOOD, "食料" }, #else - { TV_ROD, "Rods" }, - { TV_WAND, "Wands" }, - { TV_STAFF, "Staffs" }, + { TV_SCROLL, "Scrolls" }, + { TV_POTION, "Potions" }, + { TV_FOOD, "Food" }, #endif - #ifdef JP -{ TV_LIFE_BOOK, "ËâË¡½ñ¡ÊÀ¸Ì¿¡Ë" }, -{ TV_SORCERY_BOOK, "ËâË¡½ñ¡ÊÀç½Ñ¡Ë" }, -{ TV_NATURE_BOOK, "ËâË¡½ñ¡Ê¼«Á³¡Ë" }, -{ TV_CHAOS_BOOK, "ËâË¡½ñ¡Ê¥«¥ª¥¹¡Ë" }, -{ TV_DEATH_BOOK, "ËâË¡½ñ¡Ê°Å¹õ¡Ë" }, -{ TV_TRUMP_BOOK, "ËâË¡½ñ¡Ê¥È¥é¥ó¥×¡Ë" }, -{ TV_ARCANE_BOOK, "ËâË¡½ñ¡ÊÈë½Ñ¡Ë" }, -{ TV_ENCHANT_BOOK, "ËâË¡½ñ¡Ê¾¢¡Ë" }, -{ TV_DAEMON_BOOK, "ËâË¡½ñ¡Ê°­Ëâ¡Ë" }, -{ TV_MUSIC_BOOK, "²Î½¸" }, -{ TV_HISSATSU_BOOK, "Éð·Ý¤Î½ñ" }, + { TV_LIFE_BOOK, "魔法書 (生命)" }, + { TV_SORCERY_BOOK, "魔法書 (仙術)" }, + { TV_NATURE_BOOK, "魔法書 (自然)" }, + { TV_CHAOS_BOOK, "魔法書 (カオス)" }, + { TV_DEATH_BOOK, "魔法書 (暗黒)" }, + { TV_TRUMP_BOOK, "魔法書 (トランプ)" }, + { TV_ARCANE_BOOK, "魔法書 (秘術)" }, + { TV_CRAFT_BOOK, "魔法書 (匠)" }, + { TV_DAEMON_BOOK, "魔法書 (悪魔)" }, + { TV_CRUSADE_BOOK, "魔法書 (破邪)" }, + { TV_MUSIC_BOOK, "歌集" }, + { TV_HISSATSU_BOOK, "武芸の書" }, + { TV_HEX_BOOK, "魔法書 (呪術)" }, #else { TV_LIFE_BOOK, "Books (Life)" }, { TV_SORCERY_BOOK, "Books (Sorcery)" }, @@ -190,70 +180,64 @@ static grouper group_item[] = { TV_DEATH_BOOK, "Books (Death)" }, { TV_TRUMP_BOOK, "Books (Trump)" }, { TV_ARCANE_BOOK, "Books (Arcane)" }, - { TV_ENCHANT_BOOK, "Books (Craft)" }, + { TV_CRAFT_BOOK, "Books (Craft)" }, { TV_DAEMON_BOOK, "Books (Daemon)" }, + { TV_CRUSADE_BOOK, "Books (Crusade)" }, { TV_MUSIC_BOOK, "Song Books" }, { TV_HISSATSU_BOOK, "Books (Kendo)" }, + { TV_HEX_BOOK, "Books (Hex)" }, #endif #ifdef JP -{ TV_PARCHEMENT, "ÍÓÈé»æ" }, -#else -{ TV_PARCHEMENT, "Parchement" }, -#endif - -#ifdef JP -{ TV_CHEST, "È¢" }, + { TV_WHISTLE, "笛" }, + { TV_CAPTURE, "キャプチャー・ボール" }, + { TV_CARD, "エクスプレスカード" }, #else - { TV_CHEST, "Chests" }, + { TV_WHISTLE, "Whistle" }, + { TV_CAPTURE, "Capture Ball" }, + { TV_CARD, "Express Card" }, #endif -#ifdef JP -{ TV_CAPTURE, "¥­¥ã¥×¥Á¥ã¡¼¡¦¥Ü¡¼¥ë" }, -#else - { TV_CAPTURE, "Capture Ball" }, -#endif + { TV_CHEST, _("ç®±", "Chests") }, #ifdef JP -{ TV_CARD, "¥¨¥¯¥¹¥×¥ì¥¹¥«¡¼¥É" }, + { TV_FIGURINE, "人形" }, + { TV_STATUE, "像" }, + { TV_CORPSE, "死体" }, #else - { TV_CARD, "Express Card" }, -#endif - { TV_FIGURINE, "Magical Figurines" }, { TV_STATUE, "Statues" }, { TV_CORPSE, "Corpses" }, - -#ifdef JP -{ TV_WHISTLE, "Å«" }, -#else - { TV_WHISTLE, "Whistle" }, -#endif - -#ifdef JP -{ TV_SPIKE, "¤¯¤µ¤Ó" }, -#else - { TV_SPIKE, "Spike" }, #endif - { TV_LITE, NULL }, - { TV_FLASK, NULL }, - { TV_JUNK, NULL }, + { TV_SKELETON, _("その他", "Misc") }, { TV_BOTTLE, NULL }, - { TV_SKELETON, NULL }, + { TV_JUNK, NULL }, + { TV_SPIKE, NULL }, + { TV_FLASK, NULL }, + { TV_PARCHMENT, NULL }, { 0, "" } }; -/* +/*! + * @brief ベースアイテムの各情報を文字列化する / * Describe the kind + * @param buf 名称を返すバッファ参照ポインタ + * @param dam ダメージダイス記述を返すバッファ参照ポインタ + * @param wgt 重量記述を返すバッファ参照ポインタ + * @param lev 生成階記述を返すバッファ参照ポインタ + * @param chance 生成機会を返すバッファ参照ポインタ + * @param val 価値を返すバッファ参照ポインタ + * @param k ベースアイテムID + * @return なし */ -static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int k) +static void kind_info(char *buf, char *dam, char *wgt, char *chance, DEPTH *lev, PRICE *val, OBJECT_IDX k) { object_type forge; object_type *q_ptr; - + int i; /* Get local object */ q_ptr = &forge; @@ -272,18 +256,18 @@ static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int /* Level */ - (*lev) = get_object_level(q_ptr); + (*lev) = k_info[q_ptr->k_idx].level; /* Value */ (*val) = object_value(q_ptr); /* Hack */ - if (!buf || !dam || !wgt) return; + if (!buf || !dam || !chance || !wgt) return; /* Description (too brief) */ - object_desc_store(buf, q_ptr, FALSE, 0); + object_desc(buf, q_ptr, (OD_NAME_ONLY | OD_STORE)); /* Misc info */ @@ -333,29 +317,46 @@ static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int } } + /* Chance */ + strcpy(chance, ""); + for(i = 0; i < 4; i++) + { + char chance_aux[20] = ""; + if(k_info[q_ptr->k_idx].chance[i] > 0) + { + sprintf(chance_aux, "%s%3dF:%+4d", (i != 0 ? "/" : ""), + (int)k_info[q_ptr->k_idx].locale[i], 100/k_info[q_ptr->k_idx].chance[i]); + strcat(chance, chance_aux); + } + } + /* Weight */ - sprintf(wgt, "%3d.%d", q_ptr->weight / 10, q_ptr->weight % 10); + sprintf(wgt, "%3d.%d", (int)(q_ptr->weight / 10), (int)(q_ptr->weight % 10)); } -/* +/*! + * @brief 各ベースアイテムの情報を一行毎に記述する / * Create a spoiler file for items + * @param fname ファイル名 + * @return なし */ static void spoil_obj_desc(cptr fname) { - int i, k, s, t, n = 0; + int i, k, s, t, n = 0, group_start = 0; - u16b who[200]; + OBJECT_IDX who[200]; char buf[1024]; char wgt[80]; + char chance[80]; char dam[80]; /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_USER, fname); + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); @@ -363,7 +364,6 @@ static void spoil_obj_desc(cptr fname) /* Open the file */ fff = my_fopen(buf, "w"); - /* Oops */ if (!fff) { msg_print("Cannot create spoiler file."); @@ -372,15 +372,14 @@ static void spoil_obj_desc(cptr fname) /* Header */ - fprintf(fff, "Spoiler File -- Basic Items (Hengband %d.%d.%d)\n\n\n", - FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); + fprintf(fff, "Spoiler File -- Basic Items (Hengband %d.%d.%d.%d)\n\n\n", + FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH, FAKE_VER_EXTRA); /* More Header */ - fprintf(fff, "%-45s %8s%7s%5s%9s\n", - "Description", "Dam/AC", "Wgt", "Lev", "Cost"); - fprintf(fff, "%-45s %8s%7s%5s%9s\n", - "----------------------------------------", - "------", "---", "---", "----"); + fprintf(fff, "%-37s%8s%7s%5s %40s%9s\n", + "Description", "Dam/AC", "Wgt", "Lev", "Chance", "Cost"); + fprintf(fff, "%-37s%8s%7s%5s %40s%9s\n", + "-------------------------------------", "------", "---", "---", "----------------", "----"); /* List the groups */ for (i = 0; TRUE; i++) @@ -388,54 +387,59 @@ static void spoil_obj_desc(cptr fname) /* Write out the group title */ if (group_item[i].name) { - /* Hack -- bubble-sort by cost and then level */ - for (s = 0; s < n - 1; s++) + if (n) { - for (t = 0; t < n - 1; t++) + /* Hack -- bubble-sort by cost and then level */ + for (s = 0; s < n - 1; s++) { - int i1 = t; - int i2 = t + 1; + for (t = 0; t < n - 1; t++) + { + int i1 = t; + int i2 = t + 1; - int e1; - int e2; + DEPTH e1; + DEPTH e2; - s32b t1; - s32b t2; + PRICE t1; + PRICE t2; - kind_info(NULL, NULL, NULL, &e1, &t1, who[i1]); - kind_info(NULL, NULL, NULL, &e2, &t2, who[i2]); + kind_info(NULL, NULL, NULL, NULL, &e1, &t1, who[i1]); + kind_info(NULL, NULL, NULL, NULL, &e2, &t2, who[i2]); - if ((t1 > t2) || ((t1 == t2) && (e1 > e2))) - { - int tmp = who[i1]; - who[i1] = who[i2]; - who[i2] = tmp; + if ((t1 > t2) || ((t1 == t2) && (e1 > e2))) + { + u16b tmp = who[i1]; + who[i1] = who[i2]; + who[i2] = tmp; + } } } - } - /* Spoil each item */ - for (s = 0; s < n; s++) - { - int e; - s32b v; + fprintf(fff, "\n\n%s\n\n", group_item[group_start].name); - /* Describe the kind */ - kind_info(buf, dam, wgt, &e, &v, who[s]); + /* Spoil each item */ + for (s = 0; s < n; s++) + { + DEPTH e; + PRICE v; - /* Dump it */ - fprintf(fff, " %-45s%8s%7s%5d%9ld\n", - buf, dam, wgt, e, (long)(v)); - } + /* Describe the kind */ + kind_info(buf, dam, wgt, chance, &e, &v, who[s]); - /* Start a new set */ - n = 0; + /* Dump it */ + fprintf(fff, " %-35s%8s%7s%5d %-40s%9ld\n", + buf, dam, wgt, (int)e, chance, (long)(v)); + } + + /* Start a new set */ + n = 0; + } /* Notice the end */ if (!group_item[i].tval) break; /* Start a new set */ - fprintf(fff, "\n\n%s\n\n", group_item[i].name); + group_start = i; } /* Acquire legal item types */ @@ -450,7 +454,7 @@ static void spoil_obj_desc(cptr fname) if (k_ptr->gen_flags & (TRG_INSTA_ART)) continue; /* Save the index */ - who[n++] = k; + who[n++] = (u16b)k; } } @@ -462,7 +466,6 @@ static void spoil_obj_desc(cptr fname) return; } - /* Message */ msg_print("Successfully created a spoiler file."); } @@ -502,28 +505,29 @@ static void spoil_obj_desc(cptr fname) static grouper group_artifact[] = { #ifdef JP - { TV_SWORD, "Åá·õ" }, - { TV_POLEARM, "Áä/Éà" }, - { TV_HAFTED, "Æß´ï" }, - { TV_DIGGING, "¥·¥ã¥Ù¥ë/¤Ä¤ë¤Ï¤·" }, - { TV_BOW, "Èô¤ÓÆ»¶ñ" }, - { TV_ARROW, "Ìð" }, - - { TV_SOFT_ARMOR, "³»" }, + { TV_SWORD, "刀剣" }, + { TV_POLEARM, "槍/斧" }, + { TV_HAFTED, "鈍器" }, + { TV_DIGGING, "シャベル/つるはし" }, + { TV_BOW, "飛び道具" }, + { TV_ARROW, "矢" }, + { TV_BOLT, NULL }, + + { TV_SOFT_ARMOR, "鎧" }, { TV_HARD_ARMOR, NULL }, { TV_DRAG_ARMOR, NULL }, - { TV_CLOAK, "¥¯¥í¡¼¥¯" }, - { TV_SHIELD, "½â" }, + { TV_CLOAK, "クローク" }, + { TV_SHIELD, "盾" }, { TV_CARD, NULL }, - { TV_HELM, "³õ/´§" }, + { TV_HELM, "兜/冠" }, { TV_CROWN, NULL }, - { TV_GLOVES, "äƼê" }, - { TV_BOOTS, "·¤" }, + { TV_GLOVES, "籠手" }, + { TV_BOOTS, "靴" }, - { TV_LITE, "¸÷¸»" }, - { TV_AMULET, "¥¢¥ß¥å¥ì¥Ã¥È" }, - { TV_RING, "»ØÎØ" }, + { TV_LITE, "光源" }, + { TV_AMULET, "アミュレット" }, + { TV_RING, "指輪" }, #else { TV_SWORD, "Edged Weapons" }, { TV_POLEARM, "Polearms" }, @@ -531,6 +535,7 @@ static grouper group_artifact[] = { TV_DIGGING, "Shovels/Picks" }, { TV_BOW, "Bows" }, { TV_ARROW, "Ammo" }, + { TV_BOLT, NULL }, { TV_SOFT_ARMOR, "Body Armor" }, { TV_HARD_ARMOR, NULL }, @@ -568,7 +573,7 @@ typedef struct flag_desc flag_desc; struct flag_desc { - const u32b flag; + const int flag; const char *const desc; }; @@ -584,19 +589,19 @@ struct flag_desc static flag_desc stat_flags_desc[] = { #ifdef JP - { TR1_STR, "ÏÓÎÏ" }, - { TR1_INT, "ÃÎǽ" }, - { TR1_WIS, "¸­¤µ" }, - { TR1_DEX, "´ïÍѤµ" }, - { TR1_CON, "Âѵ×ÎÏ" }, - { TR1_CHR, "Ì¥ÎÏ" } + { TR_STR, "腕力" }, + { TR_INT, "知能" }, + { TR_WIS, "賢さ" }, + { TR_DEX, "器用さ" }, + { TR_CON, "耐久力" }, + { TR_CHR, "魅力" } #else - { TR1_STR, "STR" }, - { TR1_INT, "INT" }, - { TR1_WIS, "WIS" }, - { TR1_DEX, "DEX" }, - { TR1_CON, "CON" }, - { TR1_CHR, "CHR" } + { TR_STR, "STR" }, + { TR_INT, "INT" }, + { TR_WIS, "WIS" }, + { TR_DEX, "DEX" }, + { TR_CON, "CON" }, + { TR_CHR, "CHR" } #endif }; @@ -608,20 +613,20 @@ static flag_desc stat_flags_desc[] = static flag_desc pval_flags1_desc[] = { #ifdef JP - { TR1_MAGIC_MASTERY, "ËâË¡Æ»¶ñ»ÈÍÑǽÎÏ" }, - { TR1_STEALTH, "±£Ì©" }, - { TR1_SEARCH, "õº÷" }, - { TR1_INFRA, "ÀÖ³°Àþ»ëÎÏ" }, - { TR1_TUNNEL, "ºÎ·¡" }, - { TR1_BLOWS, "¹¶·â²ó¿ô" }, - { TR1_SPEED, "¥¹¥Ô¡¼¥É" } -#else - { TR1_STEALTH, "Stealth" }, - { TR1_SEARCH, "Searching" }, - { TR1_INFRA, "Infravision" }, - { TR1_TUNNEL, "Tunneling" }, - { TR1_BLOWS, "Attacks" }, - { TR1_SPEED, "Speed" } + { TR_MAGIC_MASTERY, "魔法道具使用能力" }, + { TR_STEALTH, "隠密" }, + { TR_SEARCH, "探索" }, + { TR_INFRA, "赤外線視力" }, + { TR_TUNNEL, "採掘" }, + { TR_BLOWS, "攻撃回数" }, + { TR_SPEED, "スピード" } +#else + { TR_STEALTH, "Stealth" }, + { TR_SEARCH, "Searching" }, + { TR_INFRA, "Infravision" }, + { TR_TUNNEL, "Tunneling" }, + { TR_BLOWS, "Attacks" }, + { TR_SPEED, "Speed" } #endif }; @@ -632,25 +637,43 @@ static flag_desc pval_flags1_desc[] = static flag_desc slay_flags_desc[] = { #ifdef JP - { TR1_SLAY_ANIMAL, "ưʪ" }, - { TR1_SLAY_EVIL, "¼Ù°­" }, - { TR1_SLAY_UNDEAD, "¥¢¥ó¥Ç¥Ã¥É" }, - { TR1_SLAY_DEMON, "°­Ëâ" }, - { TR1_SLAY_ORC, "¥ª¡¼¥¯" }, - { TR1_SLAY_TROLL, "¥È¥í¥ë" }, - { TR1_SLAY_GIANT, "µð¿Í" }, - { TR1_SLAY_DRAGON, "¥É¥é¥´¥ó" }, - { TR1_KILL_DRAGON, "*¥É¥é¥´¥ó*" }, -#else - { TR1_SLAY_ANIMAL, "Animal" }, - { TR1_SLAY_EVIL, "Evil" }, - { TR1_SLAY_UNDEAD, "Undead" }, - { TR1_SLAY_DEMON, "Demon" }, - { TR1_SLAY_ORC, "Orc" }, - { TR1_SLAY_TROLL, "Troll" }, - { TR1_SLAY_GIANT, "Giant" }, - { TR1_SLAY_DRAGON, "Dragon" }, - { TR1_KILL_DRAGON, "Xdragon" } + { TR_SLAY_ANIMAL, "動物" }, + { TR_KILL_ANIMAL, "*動物*" }, + { TR_SLAY_EVIL, "邪悪" }, + { TR_KILL_EVIL, "*邪悪*" }, + { TR_SLAY_HUMAN, "人間" }, + { TR_KILL_HUMAN, "*人間*" }, + { TR_SLAY_UNDEAD, "アンデッド" }, + { TR_KILL_UNDEAD, "*アンデッド*" }, + { TR_SLAY_DEMON, "悪魔" }, + { TR_KILL_DEMON, "*悪魔*" }, + { TR_SLAY_ORC, "オーク" }, + { TR_KILL_ORC, "*オーク*" }, + { TR_SLAY_TROLL, "トロル" }, + { TR_KILL_TROLL, "*トロル*" }, + { TR_SLAY_GIANT, "巨人" }, + { TR_KILL_GIANT, "*巨人*" }, + { TR_SLAY_DRAGON, "ドラゴン" }, + { TR_KILL_DRAGON, "*ドラゴン*" }, +#else + { TR_SLAY_ANIMAL, "Animal" }, + { TR_KILL_ANIMAL, "XAnimal" }, + { TR_SLAY_EVIL, "Evil" }, + { TR_KILL_EVIL, "XEvil" }, + { TR_SLAY_HUMAN, "Human" }, + { TR_KILL_HUMAN, "XHuman" }, + { TR_SLAY_UNDEAD, "Undead" }, + { TR_KILL_UNDEAD, "XUndead" }, + { TR_SLAY_DEMON, "Demon" }, + { TR_KILL_DEMON, "XDemon" }, + { TR_SLAY_ORC, "Orc" }, + { TR_KILL_ORC, "XOrc" }, + { TR_SLAY_TROLL, "Troll" }, + { TR_KILL_TROLL, "XTroll" }, + { TR_SLAY_GIANT, "Giant" }, + { TR_KILL_GIANT, "Xgiant" }, + { TR_SLAY_DRAGON, "Dragon" }, + { TR_KILL_DRAGON, "Xdragon" } #endif }; @@ -665,29 +688,29 @@ static flag_desc slay_flags_desc[] = static flag_desc brand_flags_desc[] = { #ifdef JP - { TR1_BRAND_ACID, "Íϲò" }, - { TR1_BRAND_ELEC, "ÅÅ·â" }, - { TR1_BRAND_FIRE, "¾Æ´þ" }, - { TR1_BRAND_COLD, "Åà·ë" }, - { TR1_BRAND_POIS, "ÆÇ»¦" }, - - { TR1_FORCE_WEAPON, "ÍýÎÏ" }, - { TR1_CHAOTIC, "º®ÆÙ" }, - { TR1_VAMPIRIC, "µÛ·ì" }, - { TR1_IMPACT, "ÃÏ¿Ì" }, - { TR1_VORPAL, "ÀÚ¤ìÌ£" }, -#else - { TR1_BRAND_ACID, "Acid Brand" }, - { TR1_BRAND_ELEC, "Lightning Brand" }, - { TR1_BRAND_FIRE, "Flame Tongue" }, - { TR1_BRAND_COLD, "Frost Brand" }, - { TR1_BRAND_POIS, "Poisoned" }, - - { TR1_FORCE_WEAPON, "Force" }, - { TR1_CHAOTIC, "Mark of Chaos" }, - { TR1_VAMPIRIC, "Vampiric" }, - { TR1_IMPACT, "Earthquake impact on hit" }, - { TR1_VORPAL, "Very sharp" }, + { TR_BRAND_ACID, "溶解" }, + { TR_BRAND_ELEC, "電撃" }, + { TR_BRAND_FIRE, "焼棄" }, + { TR_BRAND_COLD, "凍結" }, + { TR_BRAND_POIS, "毒殺" }, + + { TR_FORCE_WEAPON, "理力" }, + { TR_CHAOTIC, "混沌" }, + { TR_VAMPIRIC, "吸血" }, + { TR_IMPACT, "地震" }, + { TR_VORPAL, "切れ味" }, +#else + { TR_BRAND_ACID, "Acid Brand" }, + { TR_BRAND_ELEC, "Lightning Brand" }, + { TR_BRAND_FIRE, "Flame Tongue" }, + { TR_BRAND_COLD, "Frost Brand" }, + { TR_BRAND_POIS, "Poisoned" }, + + { TR_FORCE_WEAPON, "Force" }, + { TR_CHAOTIC, "Mark of Chaos" }, + { TR_VAMPIRIC, "Vampiric" }, + { TR_IMPACT, "Earthquake impact on hit" }, + { TR_VORPAL, "Very sharp" }, #endif }; @@ -698,39 +721,39 @@ static flag_desc brand_flags_desc[] = static const flag_desc resist_flags_desc[] = { #ifdef JP - { TR2_RES_ACID, "»À" }, - { TR2_RES_ELEC, "ÅÅ·â" }, - { TR2_RES_FIRE, "²Ð±ê" }, - { TR2_RES_COLD, "Î䵤" }, - { TR2_RES_POIS, "ÆÇ" }, - { TR2_RES_FEAR, "¶²ÉÝ"}, - { TR2_RES_LITE, "Á®¸÷" }, - { TR2_RES_DARK, "°Å¹õ" }, - { TR2_RES_BLIND, "ÌÕÌÜ" }, - { TR2_RES_CONF, "º®Íð" }, - { TR2_RES_SOUND, "¹ì²»" }, - { TR2_RES_SHARDS, "ÇËÊÒ" }, - { TR2_RES_NETHER, "ÃϹö" }, - { TR2_RES_NEXUS, "°ø²Ìº®Íð" }, - { TR2_RES_CHAOS, "¥«¥ª¥¹" }, - { TR2_RES_DISEN, "Îô²½" }, -#else - { TR2_RES_ACID, "Acid" }, - { TR2_RES_ELEC, "Lightning" }, - { TR2_RES_FIRE, "Fire" }, - { TR2_RES_COLD, "Cold" }, - { TR2_RES_POIS, "Poison" }, - { TR2_RES_FEAR, "Fear"}, - { TR2_RES_LITE, "Light" }, - { TR2_RES_DARK, "Dark" }, - { TR2_RES_BLIND, "Blindness" }, - { TR2_RES_CONF, "Confusion" }, - { TR2_RES_SOUND, "Sound" }, - { TR2_RES_SHARDS, "Shards" }, - { TR2_RES_NETHER, "Nether" }, - { TR2_RES_NEXUS, "Nexus" }, - { TR2_RES_CHAOS, "Chaos" }, - { TR2_RES_DISEN, "Disenchantment" }, + { TR_RES_ACID, "酸" }, + { TR_RES_ELEC, "電撃" }, + { TR_RES_FIRE, "火炎" }, + { TR_RES_COLD, "冷気" }, + { TR_RES_POIS, "毒" }, + { TR_RES_FEAR, "恐怖"}, + { TR_RES_LITE, "閃光" }, + { TR_RES_DARK, "暗黒" }, + { TR_RES_BLIND, "盲目" }, + { TR_RES_CONF, "æ··ä¹±" }, + { TR_RES_SOUND, "轟音" }, + { TR_RES_SHARDS, "破片" }, + { TR_RES_NETHER, "地獄" }, + { TR_RES_NEXUS, "因果混乱" }, + { TR_RES_CHAOS, "カオス" }, + { TR_RES_DISEN, "劣化" }, +#else + { TR_RES_ACID, "Acid" }, + { TR_RES_ELEC, "Lightning" }, + { TR_RES_FIRE, "Fire" }, + { TR_RES_COLD, "Cold" }, + { TR_RES_POIS, "Poison" }, + { TR_RES_FEAR, "Fear"}, + { TR_RES_LITE, "Light" }, + { TR_RES_DARK, "Dark" }, + { TR_RES_BLIND, "Blindness" }, + { TR_RES_CONF, "Confusion" }, + { TR_RES_SOUND, "Sound" }, + { TR_RES_SHARDS, "Shards" }, + { TR_RES_NETHER, "Nether" }, + { TR_RES_NEXUS, "Nexus" }, + { TR_RES_CHAOS, "Chaos" }, + { TR_RES_DISEN, "Disenchantment" }, #endif }; @@ -741,15 +764,15 @@ static const flag_desc resist_flags_desc[] = static const flag_desc immune_flags_desc[] = { #ifdef JP - { TR2_IM_ACID, "»À" }, - { TR2_IM_ELEC, "ÅÅ·â" }, - { TR2_IM_FIRE, "²Ð±ê" }, - { TR2_IM_COLD, "Î䵤" }, + { TR_IM_ACID, "酸" }, + { TR_IM_ELEC, "電撃" }, + { TR_IM_FIRE, "火炎" }, + { TR_IM_COLD, "冷気" }, #else - { TR2_IM_ACID, "Acid" }, - { TR2_IM_ELEC, "Lightning" }, - { TR2_IM_FIRE, "Fire" }, - { TR2_IM_COLD, "Cold" }, + { TR_IM_ACID, "Acid" }, + { TR_IM_ELEC, "Lightning" }, + { TR_IM_FIRE, "Fire" }, + { TR_IM_COLD, "Cold" }, #endif }; @@ -760,19 +783,19 @@ static const flag_desc immune_flags_desc[] = static const flag_desc sustain_flags_desc[] = { #ifdef JP - { TR2_SUST_STR, "ÏÓÎÏ" }, - { TR2_SUST_INT, "ÃÎǽ" }, - { TR2_SUST_WIS, "¸­¤µ" }, - { TR2_SUST_DEX, "´ïÍѤµ" }, - { TR2_SUST_CON, "Âѵ×ÎÏ" }, - { TR2_SUST_CHR, "Ì¥ÎÏ" }, + { TR_SUST_STR, "腕力" }, + { TR_SUST_INT, "知能" }, + { TR_SUST_WIS, "賢さ" }, + { TR_SUST_DEX, "器用さ" }, + { TR_SUST_CON, "耐久力" }, + { TR_SUST_CHR, "魅力" }, #else - { TR2_SUST_STR, "STR" }, - { TR2_SUST_INT, "INT" }, - { TR2_SUST_WIS, "WIS" }, - { TR2_SUST_DEX, "DEX" }, - { TR2_SUST_CON, "CON" }, - { TR2_SUST_CHR, "CHR" }, + { TR_SUST_STR, "STR" }, + { TR_SUST_INT, "INT" }, + { TR_SUST_WIS, "WIS" }, + { TR_SUST_DEX, "DEX" }, + { TR_SUST_CON, "CON" }, + { TR_SUST_CHR, "CHR" }, #endif }; @@ -783,15 +806,15 @@ static const flag_desc sustain_flags_desc[] = static const flag_desc misc_flags2_desc[] = { #ifdef JP - { TR2_THROW, "ÅêÚ³" }, - { TR2_REFLECT, "È¿¼Í" }, - { TR2_FREE_ACT, "ËãáãÃΤ餺" }, - { TR2_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý" }, + { TR_THROW, "投擲" }, + { TR_REFLECT, "反射" }, + { TR_FREE_ACT, "麻痺知らず" }, + { TR_HOLD_EXP, "経験値維持" }, #else - { TR2_THROW, "Throwing" }, - { TR2_REFLECT, "Reflection" }, - { TR2_FREE_ACT, "Free Action" }, - { TR2_HOLD_LIFE, "Hold Life" }, + { TR_THROW, "Throwing" }, + { TR_REFLECT, "Reflection" }, + { TR_FREE_ACT, "Free Action" }, + { TR_HOLD_EXP, "Hold Experience" }, #endif }; @@ -805,41 +828,65 @@ static const flag_desc misc_flags2_desc[] = static const flag_desc misc_flags3_desc[] = { #ifdef JP - { TR3_SH_FIRE, "²Ð±ê¥ª¡¼¥é" }, - { TR3_SH_ELEC, "Åŷ⥪¡¼¥é" }, - { TR3_SH_COLD, "Î䵤¥ª¡¼¥é" }, - { TR3_NO_TELE, "È¿¥Æ¥ì¥Ý¡¼¥È" }, - { TR3_NO_MAGIC, "È¿ËâË¡" }, - { TR3_FEATHER, "ÉâÍ·" }, - { TR3_SEE_INVIS, "²Ä»ëÆ©ÌÀ" }, - { TR3_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼" }, - { TR3_SLOW_DIGEST, "Ãپò½" }, - { TR3_REGEN, "µÞ®²óÉü" }, - { TR3_WARNING, "·Ù¹ð" }, -/* { TR3_XTRA_MIGHT, "¶¯Îϼͷâ" }, */ - { TR3_XTRA_SHOTS, "Äɲüͷâ" }, /* always +1? */ - { TR3_DRAIN_EXP, "·Ð¸³Ã͵ۼý" }, - { TR3_AGGRAVATE, "È¿´¶" }, - { TR3_BLESSED, "½ËÊ¡" }, - { TR3_DEC_MANA, "¾ÃÈñËâÎϸº¾¯" }, -#else - { TR3_SH_FIRE, "Fiery Aura" }, - { TR3_SH_ELEC, "Electric Aura" }, - { TR3_SH_COLD, "Coldly Aura" }, - { TR3_NO_TELE, "Prevent Teleportation" }, - { TR3_NO_MAGIC, "Anti-Magic" }, - { TR3_FEATHER, "Levitation" }, - { TR3_SEE_INVIS, "See Invisible" }, - { TR3_TELEPATHY, "ESP" }, - { TR3_SLOW_DIGEST, "Slow Digestion" }, - { TR3_REGEN, "Regeneration" }, - { TR3_WARNING, "Warning" }, -/* { TR3_XTRA_MIGHT, "Extra Might" }, */ - { TR3_XTRA_SHOTS, "+1 Extra Shot" }, /* always +1? */ - { TR3_DRAIN_EXP, "Drains Experience" }, - { TR3_AGGRAVATE, "Aggravates" }, - { TR3_BLESSED, "Blessed Blade" }, - { TR3_DEC_MANA, "Decrease Shouhi Mana" }, + { TR_SH_FIRE, "火炎オーラ" }, + { TR_SH_ELEC, "電撃オーラ" }, + { TR_SH_COLD, "冷気オーラ" }, + { TR_NO_TELE, "反テレポート" }, + { TR_NO_MAGIC, "反魔法" }, + { TR_LEVITATION, "浮遊" }, + { TR_SEE_INVIS, "可視透明" }, + { TR_TELEPATHY, "テレパシー" }, + { TR_ESP_ANIMAL, "動物感知" }, + { TR_ESP_UNDEAD, "不死感知" }, + { TR_ESP_DEMON, "悪魔感知" }, + { TR_ESP_ORC, "オーク感知" }, + { TR_ESP_TROLL, "トロル感知" }, + { TR_ESP_GIANT, "巨人感知" }, + { TR_ESP_DRAGON, "ドラゴン感知" }, + { TR_ESP_HUMAN, "人間感知" }, + { TR_ESP_EVIL, "邪悪感知" }, + { TR_ESP_GOOD, "善良感知" }, + { TR_ESP_NONLIVING, "無生物感知" }, + { TR_ESP_UNIQUE, "ユニーク感知" }, + { TR_SLOW_DIGEST, "遅消化" }, + { TR_REGEN, "急速回復" }, + { TR_WARNING, "警告" }, +/* { TR_XTRA_MIGHT, "強力射撃" }, */ + { TR_XTRA_SHOTS, "追加射撃" }, /* always +1? */ + { TR_DRAIN_EXP, "経験値吸収" }, + { TR_AGGRAVATE, "反感" }, + { TR_BLESSED, "祝福" }, + { TR_DEC_MANA, "消費魔力減少" }, +#else + { TR_SH_FIRE, "Fiery Aura" }, + { TR_SH_ELEC, "Electric Aura" }, + { TR_SH_COLD, "Coldly Aura" }, + { TR_NO_TELE, "Prevent Teleportation" }, + { TR_NO_MAGIC, "Anti-Magic" }, + { TR_LEVITATION, "Levitation" }, + { TR_SEE_INVIS, "See Invisible" }, + { TR_TELEPATHY, "ESP" }, + { TR_ESP_ANIMAL, "Sense Animal" }, + { TR_ESP_UNDEAD, "Sense Undead" }, + { TR_ESP_DEMON, "Sense Demon" }, + { TR_ESP_ORC, "Sense Orc" }, + { TR_ESP_TROLL, "Sense Troll" }, + { TR_ESP_GIANT, "Sense Giant" }, + { TR_ESP_DRAGON, "Sense Dragon" }, + { TR_ESP_HUMAN, "Sense Human" }, + { TR_ESP_EVIL, "Sense Evil" }, + { TR_ESP_GOOD, "Sense Good" }, + { TR_ESP_NONLIVING, "Sense Nonliving" }, + { TR_ESP_UNIQUE, "Sense Unique" }, + { TR_SLOW_DIGEST, "Slow Digestion" }, + { TR_REGEN, "Regeneration" }, + { TR_WARNING, "Warning" }, +/* { TR_XTRA_MIGHT, "Extra Might" }, */ + { TR_XTRA_SHOTS, "+1 Extra Shot" }, /* always +1? */ + { TR_DRAIN_EXP, "Drains Experience" }, + { TR_AGGRAVATE, "Aggravates" }, + { TR_BLESSED, "Blessed Blade" }, + { TR_DEC_MANA, "Decrease Mana Consumption Rate" }, #endif }; @@ -912,6 +959,9 @@ typedef struct + 1 /* type of curse */ + 1]; /* sentinel NULL */ + /* Additional ability or resistance */ + char addition[80]; + /* A string describing an artifact's activation */ cptr activation; @@ -920,8 +970,12 @@ typedef struct } obj_desc_list; -/* +/*! + * @brief ファイルポインタ先に同じ文字を複数出力する / * Write out `n' of the character `c' to the spoiler file + * @param n 出力する数 + * @param c 出力するキャラクタ + * @return なし */ static void spoiler_out_n_chars(int n, char c) { @@ -929,8 +983,11 @@ static void spoiler_out_n_chars(int n, char c) } -/* +/*! + * @brief ファイルポインタ先に改行を複数出力する / * Write out `n' blank lines to the spoiler file + * @param n 改行を出力する数 + * @return なし */ static void spoiler_blanklines(int n) { @@ -938,8 +995,11 @@ static void spoiler_blanklines(int n) } -/* +/*! + * @brief ファイルポインタ先に複数のハイフンで装飾した文字列を出力する / * Write a line to the spoiler file and then "underline" it with hypens + * @param str 出力したい文字列 + * @return なし */ static void spoiler_underline(cptr str) { @@ -950,24 +1010,34 @@ static void spoiler_underline(cptr str) -/* +/*! + * @brief アーティファクトの特性一覧を出力する / + * Write a line to the spoiler file and then "underline" it with hypens + * @param art_flags アーティファクトのフラグ群 + * @param flag_ptr フラグ記述情報の参照ポインタ + * @param desc_ptr 記述内容を返すための文字列参照ポインタ + * @param n_elmnts フラグの要素数 + * @return desc_ptrと同じアドレス + * @details + *
  * This function does most of the actual "analysis". Given a set of bit flags
  * (which will be from one of the flags fields from the object in question),
  * a "flag description structure", a "description list", and the number of
  * elements in the "flag description structure", this function sets the
  * "description list" members to the appropriate descriptions contained in
  * the "flag description structure".
- *
  * The possibly updated description pointer is returned.
+ * 
*/ -static cptr *spoiler_flag_aux(const u32b art_flags, const flag_desc *flag_ptr, +static cptr *spoiler_flag_aux(const BIT_FLAGS art_flags[TR_FLAG_SIZE], + const flag_desc *flag_ptr, cptr *desc_ptr, const int n_elmnts) { int i; for (i = 0; i < n_elmnts; ++i) { - if (art_flags & flag_ptr[i].flag) + if (have_flag(art_flags, flag_ptr[i].flag)) { *desc_ptr++ = flag_ptr[i].desc; } @@ -977,26 +1047,31 @@ static cptr *spoiler_flag_aux(const u32b art_flags, const flag_desc *flag_ptr, } -/* +/*! + * @brief アイテムの特定記述内容を返す / * Acquire a "basic" description "The Cloak of Death [1,+10]" + * @param o_ptr 記述を得たいオブジェクトの参照ポインタ + * @param desc_ptr 記述内容を返すための文字列参照ポインタ + * @return なし */ -static void analyze_general (object_type *o_ptr, char *desc_ptr) +static void analyze_general(object_type *o_ptr, char *desc_ptr) { /* Get a "useful" description of the object */ - object_desc_store(desc_ptr, o_ptr, TRUE, 1); + object_desc(desc_ptr, o_ptr, (OD_NAME_AND_ENCHANT | OD_STORE)); } -/* +/*! + * @brief アーティファクトがプレイヤーに与えるpval修正を構造体に収める / * List "player traits" altered by an artifact's pval. These include stats, * speed, infravision, tunneling, stealth, searching, and extra attacks. + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param p_ptr pval修正構造体の参照ポインタ + * @return なし */ -static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr) +static void analyze_pval(object_type *o_ptr, pval_info_type *pi_ptr) { - const u32b all_stats = (TR1_STR | TR1_INT | TR1_WIS | - TR1_DEX | TR1_CON | TR1_CHR); - - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; cptr *affects_list; @@ -1004,38 +1079,38 @@ static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr) if (!o_ptr->pval) { /* An "empty" pval description indicates that pval == 0 */ - p_ptr->pval_desc[0] = '\0'; + pi_ptr->pval_desc[0] = '\0'; return; } /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - affects_list = p_ptr->pval_affects; + affects_list = pi_ptr->pval_affects; /* Create the "+N" string */ - sprintf(p_ptr->pval_desc, "%s%d", POSITIZE(o_ptr->pval), o_ptr->pval); + sprintf(pi_ptr->pval_desc, "%s%d", POSITIZE(o_ptr->pval), o_ptr->pval); /* First, check to see if the pval affects all stats */ - if ((f1 & all_stats) == all_stats) + if (have_flag(flgs, TR_STR) && have_flag(flgs, TR_INT) && + have_flag(flgs, TR_WIS) && have_flag(flgs, TR_DEX) && + have_flag(flgs, TR_CON) && have_flag(flgs, TR_CHR)) { -#ifdef JP - *affects_list++ = "Á´Ç½ÎÏ"; -#else - *affects_list++ = "All stats"; -#endif + *affects_list++ = _("全能力", "All stats"); } /* Are any stats affected? */ - else if (f1 & all_stats) + else if (have_flag(flgs, TR_STR) || have_flag(flgs, TR_INT) || + have_flag(flgs, TR_WIS) || have_flag(flgs, TR_DEX) || + have_flag(flgs, TR_CON) || have_flag(flgs, TR_CHR)) { - affects_list = spoiler_flag_aux(f1, stat_flags_desc, + affects_list = spoiler_flag_aux(flgs, stat_flags_desc, affects_list, N_ELEMENTS(stat_flags_desc)); } /* And now the "rest" */ - affects_list = spoiler_flag_aux(f1, pval_flags1_desc, + affects_list = spoiler_flag_aux(flgs, pval_flags1_desc, affects_list, N_ELEMENTS(pval_flags1_desc)); @@ -1043,29 +1118,41 @@ static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr) *affects_list = NULL; } - -/* Note the slaying specialties of a weapon */ -static void analyze_slay (object_type *o_ptr, cptr *slay_list) +/*! + * @brief アーティファクトの種族スレイ特性を構造体に収める / + * Note the slaying specialties of a weapon + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param slay_list 種族スレイ構造体の参照ポインタ + * @return なし + */ +static void analyze_slay(object_type *o_ptr, cptr *slay_list) { - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - slay_list = spoiler_flag_aux(f1, slay_flags_desc, slay_list, + slay_list = spoiler_flag_aux(flgs, slay_flags_desc, slay_list, N_ELEMENTS(slay_flags_desc)); /* Terminate the description list */ *slay_list = NULL; } -/* Note an object's elemental brands */ -static void analyze_brand (object_type *o_ptr, cptr *brand_list) + +/*! + * @brief アーティファクトの属性ブランド特性を構造体に収める / + * Note an object's elemental brands + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param brand_list 属性ブランド構造体の参照ポインタ + * @return なし + */ +static void analyze_brand(object_type *o_ptr, cptr *brand_list) { - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - brand_list = spoiler_flag_aux(f1, brand_flags_desc, brand_list, + brand_list = spoiler_flag_aux(flgs, brand_flags_desc, brand_list, N_ELEMENTS(brand_flags_desc)); /* Terminate the description list */ @@ -1073,14 +1160,20 @@ static void analyze_brand (object_type *o_ptr, cptr *brand_list) } -/* Note the resistances granted by an object */ -static void analyze_resist (object_type *o_ptr, cptr *resist_list) +/*! + * @brief アーティファクトの通常耐性を構造体に収める / + * Note an object's elemental brands + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param resist_list 通常耐性構造体の参照ポインタ + * @return なし + */ +static void analyze_resist(object_type *o_ptr, cptr *resist_list) { - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - resist_list = spoiler_flag_aux(f2, resist_flags_desc, + resist_list = spoiler_flag_aux(flgs, resist_flags_desc, resist_list, N_ELEMENTS(resist_flags_desc)); /* Terminate the description list */ @@ -1088,45 +1181,54 @@ static void analyze_resist (object_type *o_ptr, cptr *resist_list) } -/* Note the immunities granted by an object */ -static void analyze_immune (object_type *o_ptr, cptr *immune_list) +/*! + * @brief アーティファクトの免疫特性を構造体に収める / + * Note the immunities granted by an object + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param immune_list 免疫構造体の参照ポインタ + * @return なし + */ +static void analyze_immune(object_type *o_ptr, cptr *immune_list) { - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - immune_list = spoiler_flag_aux(f2, immune_flags_desc, + immune_list = spoiler_flag_aux(flgs, immune_flags_desc, immune_list, N_ELEMENTS(immune_flags_desc)); /* Terminate the description list */ *immune_list = NULL; } -/* Note which stats an object sustains */ -static void analyze_sustains (object_type *o_ptr, cptr *sustain_list) +/*! + * @brief アーティファクトの維持特性を構造体に収める / + * Note which stats an object sustains + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param sustain_list 維持特性構造体の参照ポインタ + * @return なし + */ +static void analyze_sustains(object_type *o_ptr, cptr *sustain_list) { - const u32b all_sustains = (TR2_SUST_STR | TR2_SUST_INT | TR2_SUST_WIS | - TR2_SUST_DEX | TR2_SUST_CON | TR2_SUST_CHR); - - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); /* Simplify things if an item sustains all stats */ - if ((f2 & all_sustains) == all_sustains) + if (have_flag(flgs, TR_SUST_STR) && have_flag(flgs, TR_SUST_INT) && + have_flag(flgs, TR_SUST_WIS) && have_flag(flgs, TR_SUST_DEX) && + have_flag(flgs, TR_SUST_CON) && have_flag(flgs, TR_SUST_CHR)) { -#ifdef JP - *sustain_list++ = "Á´Ç½ÎÏ"; -#else - *sustain_list++ = "All stats"; -#endif + *sustain_list++ = _("全能力", "All stats"); } /* Should we bother? */ - else if ((f2 & all_sustains)) + else if (have_flag(flgs, TR_SUST_STR) || have_flag(flgs, TR_SUST_INT) || + have_flag(flgs, TR_SUST_WIS) || have_flag(flgs, TR_SUST_DEX) || + have_flag(flgs, TR_SUST_CON) || have_flag(flgs, TR_SUST_CHR)) { - sustain_list = spoiler_flag_aux(f2, sustain_flags_desc, + sustain_list = spoiler_flag_aux(flgs, sustain_flags_desc, sustain_list, N_ELEMENTS(sustain_flags_desc)); } @@ -1136,87 +1238,85 @@ static void analyze_sustains (object_type *o_ptr, cptr *sustain_list) } -/* +/*! + * @brief アーティファクトのその他の特性を構造体に収める / * Note miscellaneous powers bestowed by an artifact such as see invisible, * free action, permanent light, etc. + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param misc_list その他の特性構造体の参照ポインタ + * @return なし */ -static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list) +static void analyze_misc_magic(object_type *o_ptr, cptr *misc_list) { - u32b f1, f2, f3; + BIT_FLAGS flgs[TR_FLAG_SIZE]; + POSITION rad; + char desc[256]; - object_flags(o_ptr, &f1, &f2, &f3); + object_flags(o_ptr, flgs); - misc_list = spoiler_flag_aux(f2, misc_flags2_desc, misc_list, + misc_list = spoiler_flag_aux(flgs, misc_flags2_desc, misc_list, N_ELEMENTS(misc_flags2_desc)); - misc_list = spoiler_flag_aux(f3, misc_flags3_desc, misc_list, + misc_list = spoiler_flag_aux(flgs, misc_flags3_desc, misc_list, N_ELEMENTS(misc_flags3_desc)); /* - * Artifact lights -- large radius light. - */ - if ((o_ptr->tval == TV_LITE) && artifact_p(o_ptr)) + * Glowing artifacts -- small radius light. + */ + rad = 0; + if (have_flag(flgs, TR_LITE_1)) rad += 1; + if (have_flag(flgs, TR_LITE_2)) rad += 2; + if (have_flag(flgs, TR_LITE_3)) rad += 3; + if (have_flag(flgs, TR_LITE_M1)) rad -= 1; + if (have_flag(flgs, TR_LITE_M2)) rad -= 2; + if (have_flag(flgs, TR_LITE_M3)) rad -= 3; + + if(o_ptr->name2 == EGO_LITE_SHINE) rad++; + + if (have_flag(flgs, TR_LITE_FUEL)) { -#ifdef JP - *misc_list++ = "±Êµ×¸÷¸»(Ⱦ·Â3)"; -#else - *misc_list++ = "Permanent Light(3)"; -#endif + if(rad > 0) sprintf(desc, _("それは燃料補給によって明かり(半径 %d)を授ける。", "It provides light (radius %d) when fueled."), (int)rad); } - - /* - * Glowing artifacts -- small radius light. - */ - if (f3 & (TR3_LITE)) + else { -#ifdef JP - *misc_list++ = "±Êµ×¸÷¸»(Ⱦ·Â1)"; -#else - *misc_list++ = "Permanent Light(1)"; -#endif + if(rad > 0) sprintf(desc, _("永久光源(半径 %d)", "Permanent Light(radius %d)"), (int)rad); + if(rad < 0) sprintf(desc, _("永久光源(半径-%d)。", "Permanent Light(radius -%d)"), (int)-rad); } + if(rad != 0) *misc_list++ = quark_str(quark_add(desc)); + /* * Handle cursed objects here to avoid redundancies such as noting * that a permanently cursed object is heavily cursed as well as * being "lightly cursed". */ -/* if (cursed_p(o_ptr)) */ - if (1) +/* if (object_is_cursed(o_ptr)) */ { - if (f3 & TR3_TY_CURSE) + if (have_flag(flgs, TR_TY_CURSE)) { -#ifdef JP - *misc_list++ = "ÂÀ¸Å¤Î±åÇ°"; -#else - *misc_list++ = "Ancient Curse"; -#endif + *misc_list++ = _("太古の怨念", "Ancient Curse"); } - if (f3 & TR3_PERMA_CURSE) + if (o_ptr->curse_flags & TRC_PERMA_CURSE) { -#ifdef JP - *misc_list++ = "±Ê±ó¤Î¼ö¤¤"; -#else - *misc_list++ = "Permanently Cursed"; -#endif + *misc_list++ = _("永遠の呪い", "Permanently Cursed"); } - else if (f3 & TR3_HEAVY_CURSE) + else if (o_ptr->curse_flags & TRC_HEAVY_CURSE) { -#ifdef JP - *misc_list++ = "¶¯ÎϤʼö¤¤"; -#else - *misc_list++ = "Heavily Cursed"; -#endif + *misc_list++ = _("強力な呪い", "Heavily Cursed"); } /* else */ - else if (f3 & TR3_CURSED) + else if (o_ptr->curse_flags & TRC_CURSED) { -#ifdef JP - *misc_list++ = "¼ö¤¤"; -#else - *misc_list++ = "Cursed"; -#endif + *misc_list++ = _("呪い", "Cursed"); + } + if (have_flag(flgs, TR_ADD_L_CURSE)) + { + *misc_list++ = _("呪いを増やす", "Cursing"); + } + if (have_flag(flgs, TR_ADD_H_CURSE)) + { + *misc_list++ = _("強力な呪いを増やす", "Heavily Cursing"); } } @@ -1225,69 +1325,107 @@ static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list) } +/*! + * @brief アーティファクトの追加ランダム特性を構造体に収める / + * Note additional ability and/or resistance of fixed artifacts + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param addition 追加ランダム耐性構造体の参照ポインタ + * @return なし + */ +static void analyze_addition(object_type *o_ptr, char *addition) +{ + artifact_type *a_ptr = &a_info[o_ptr->name1]; + /* Init */ + strcpy(addition, ""); -/* +#ifdef JP + if ((a_ptr->gen_flags & TRG_XTRA_POWER) && (a_ptr->gen_flags & TRG_XTRA_H_RES)) strcat(addition, "能力and耐性"); + else if (a_ptr->gen_flags & TRG_XTRA_POWER) + { + strcat(addition, "能力"); + if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "(1/2でand耐性)"); + } + else if (a_ptr->gen_flags & TRG_XTRA_H_RES) + { + strcat(addition, "耐性"); + if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "(1/2でand能力)"); + } + else if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "能力or耐性"); +#else + if ((a_ptr->gen_flags & TRG_XTRA_POWER) && (a_ptr->gen_flags & TRG_XTRA_H_RES)) strcat(addition, "Ability and Resistance"); + else if (a_ptr->gen_flags & TRG_XTRA_POWER) + { + strcat(addition, "Ability"); + if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "(plus Resistance about 1/2)"); + } + else if (a_ptr->gen_flags & TRG_XTRA_H_RES) + { + strcat(addition, "Resistance"); + if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "(plus Ability about 1/2)"); + } + else if (a_ptr->gen_flags & TRG_XTRA_RES_OR_POWER) strcat(addition, "Ability or Resistance"); +#endif +} + + +/*! + * @brief アーティファクトの基本情報を文字列に収める / * Determine the minimum depth an artifact can appear, its rarity, its weight, * and its value in gold pieces + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param misc_desc 基本情報を収める文字列参照ポインタ + * @return なし */ -static void analyze_misc (object_type *o_ptr, char *misc_desc) +static void analyze_misc(object_type *o_ptr, char *misc_desc) { artifact_type *a_ptr = &a_info[o_ptr->name1]; + sprintf(misc_desc, _("レベル %d, 希少度 %u, %d.%d kg, $%ld", "Level %d, Rarity %u, %d.%d lbs, %ld Gold"), + (int)a_ptr->level, a_ptr->rarity, #ifdef JP - sprintf(misc_desc, "¥ì¥Ù¥ë %u, ´õ¾¯ÅÙ %u, %d.%d kg, ¡ð%ld", - a_ptr->level, a_ptr->rarity, - lbtokg1(a_ptr->weight), lbtokg2(a_ptr->weight), a_ptr->cost); + lbtokg1(a_ptr->weight), lbtokg2(a_ptr->weight), (long int)a_ptr->cost); #else - sprintf(misc_desc, "Level %u, Rarity %u, %d.%d lbs, %ld Gold", - a_ptr->level, a_ptr->rarity, a_ptr->weight / 10, a_ptr->weight % 10, a_ptr->cost); #endif } -/* +/*! + * @brief アーティファクトの情報全体を構造体に収める / * Fill in an object description structure for a given object + * and its value in gold pieces + * @param o_ptr オブジェクト構造体の参照ポインタ + * @param desc_ptr 全アーティファクト情報を収める文字列参照ポインタ + * @return なし */ static void object_analyze(object_type *o_ptr, obj_desc_list *desc_ptr) { analyze_general(o_ptr, desc_ptr->description); - analyze_pval(o_ptr, &desc_ptr->pval_info); - analyze_brand(o_ptr, desc_ptr->brands); - analyze_slay(o_ptr, desc_ptr->slays); - analyze_immune(o_ptr, desc_ptr->immunities); - analyze_resist(o_ptr, desc_ptr->resistances); - analyze_sustains(o_ptr, desc_ptr->sustains); - analyze_misc_magic(o_ptr, desc_ptr->misc_magic); - + analyze_addition(o_ptr, desc_ptr->addition); analyze_misc(o_ptr, desc_ptr->misc_desc); - desc_ptr->activation = item_activation(o_ptr); } +/*! + * @brief バッファにアーティファクト出力情報ヘッダを収める / + * @return なし + */ static void print_header(void) { char buf[80]; -#ifndef FAKE_VERSION - sprintf(buf, "Artifact Spoilers for Angband Version %d.%d.%d", - VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); - spoiler_underline(buf); -#else /* FAKE_VERSION */ sprintf(buf, "Artifact Spoilers for Hengband Version %d.%d.%d", - FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); + FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); spoiler_underline(buf); -#endif /* FAKE_VERSION */ - } /* @@ -1332,6 +1470,13 @@ static void print_header(void) #define LIST_SEP ';' #endif +/*! + * @brief フラグ名称を出力する汎用関数 + * @param header ヘッダに出力するフラグ群の名前 + * @param list フラグ名リスト + * @param separator フラグ表示の区切り記号 + * @return なし + */ static void spoiler_outlist(cptr header, cptr *list, char separator) { int line_len, buf_len; @@ -1423,13 +1568,15 @@ static void spoiler_outlist(cptr header, cptr *list, char separator) fprintf(fff, "%s\n", line); } - -/* Create a spoiler file entry for an artifact */ - +/*! + * @brief アーティファクト一件をスポイラー出力する / + * Create a spoiler file entry for an artifact + * @param art_ptr アーティファクト情報をまとめた構造体の参照ポインタ + * @return なし + */ static void spoiler_print_art(obj_desc_list *art_ptr) { pval_info_type *pval_ptr = &art_ptr->pval_info; - char buf[80]; /* Don't indent the first line */ @@ -1439,48 +1586,27 @@ static void spoiler_print_art(obj_desc_list *art_ptr) if (pval_ptr->pval_desc[0]) { /* Mention the effects of pval */ -#ifdef JP - sprintf(buf, "%s¤Î½¤Àµ:", pval_ptr->pval_desc); -#else - sprintf(buf, "%s to", pval_ptr->pval_desc); -#endif + sprintf(buf, _("%sの修正:", "%s to"), pval_ptr->pval_desc); spoiler_outlist(buf, pval_ptr->pval_affects, ITEM_SEP); } /* Now deal with the description lists */ - -#ifdef JP - spoiler_outlist("ÂÐ:", art_ptr->slays, ITEM_SEP); - - spoiler_outlist("Éð´ï°À­:", art_ptr->brands, LIST_SEP); - - spoiler_outlist("ÌȱÖ:", art_ptr->immunities, ITEM_SEP); - - spoiler_outlist("ÂÑÀ­:", art_ptr->resistances, ITEM_SEP); - - spoiler_outlist("°Ý»ý:", art_ptr->sustains, ITEM_SEP); -#else - spoiler_outlist("Slay", art_ptr->slays, ITEM_SEP); - - spoiler_outlist("", art_ptr->brands, LIST_SEP); - - spoiler_outlist("Immunity to", art_ptr->immunities, ITEM_SEP); - - spoiler_outlist("Resist", art_ptr->resistances, ITEM_SEP); - - spoiler_outlist("Sustain", art_ptr->sustains, ITEM_SEP); -#endif + spoiler_outlist(_("対:", "Slay"), art_ptr->slays, ITEM_SEP); + spoiler_outlist(_("武器属性:", ""), art_ptr->brands, LIST_SEP); + spoiler_outlist(_("免疫:", "Immunity to"), art_ptr->immunities, ITEM_SEP); + spoiler_outlist(_("耐性:", "Resist"), art_ptr->resistances, ITEM_SEP); + spoiler_outlist(_("維持:", "Sustain"), art_ptr->sustains, ITEM_SEP); spoiler_outlist("", art_ptr->misc_magic, LIST_SEP); + if (art_ptr->addition[0]) + { + fprintf(fff, _("%s追加: %s\n", "%sAdditional %s\n"), INDENT1, art_ptr->addition); + } /* Write out the possible activation at the primary indention level */ if (art_ptr->activation) { -#ifdef JP - fprintf(fff, "%sȯư: %s\n", INDENT1, art_ptr->activation); -#else - fprintf(fff, "%sActivates for %s\n", INDENT1, art_ptr->activation); -#endif + fprintf(fff, _("%s発動: %s\n", "%sActivates for %s\n"), INDENT1, art_ptr->activation); } /* End with the miscellaneous facts */ @@ -1488,30 +1614,31 @@ static void spoiler_print_art(obj_desc_list *art_ptr) } -/* +/*! + * @brief アーティファクト情報を出力するためにダミー生成を行う / * Hack -- Create a "forged" artifact + * @param o_ptr 一時生成先を保管するオブジェクト構造体 + * @param name1 生成するアーティファクトID + * @return 生成が成功した場合TRUEを返す */ -static bool make_fake_artifact(object_type *o_ptr, int name1) +static bool make_fake_artifact(object_type *o_ptr, IDX name1) { - int i; - + IDX i; artifact_type *a_ptr = &a_info[name1]; - /* Ignore "empty" artifacts */ if (!a_ptr->name) return FALSE; /* Acquire the "kind" index */ i = lookup_kind(a_ptr->tval, a_ptr->sval); - /* Oops */ if (!i) return (FALSE); /* Create the artifact */ object_prep(o_ptr, i); /* Save the name */ - o_ptr->name1 = name1; + o_ptr->name1 = (byte_hack)name1; /* Extract the fields */ o_ptr->pval = a_ptr->pval; @@ -1528,23 +1655,24 @@ static bool make_fake_artifact(object_type *o_ptr, int name1) } -/* +/*! + * @brief アーティファクト情報のスポイラー出力を行うメインルーチン / * Create a spoiler file for artifacts + * @param fname 生成ファイル名 + * @return なし */ static void spoil_artifact(cptr fname) { - int i, j; + int i; + IDX j; object_type forge; object_type *q_ptr; - obj_desc_list artifact; - char buf[1024]; - /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_USER, fname); + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); @@ -1552,7 +1680,6 @@ static void spoil_artifact(cptr fname) /* Open the file */ fff = my_fopen(buf, "w"); - /* Oops */ if (!fff) { msg_print("Cannot create spoiler file."); @@ -1583,8 +1710,6 @@ static void spoil_artifact(cptr fname) /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Attempt to "forge" the artifact */ @@ -1605,16 +1730,15 @@ static void spoil_artifact(cptr fname) return; } - /* Message */ msg_print("Successfully created a spoiler file."); } - - - -/* +/*! + * @brief モンスター簡易情報のスポイラー出力を行うメインルーチン / * Create a spoiler file for monsters -BEN- + * @param fname 生成ファイル名 + * @return なし */ static void spoil_mon_desc(cptr fname) { @@ -1634,7 +1758,7 @@ static void spoil_mon_desc(cptr fname) char exp[80]; /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_USER, fname); + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); @@ -1642,7 +1766,6 @@ static void spoil_mon_desc(cptr fname) /* Open the file */ fff = my_fopen(buf, "w"); - /* Oops */ if (!fff) { msg_print("Cannot create spoiler file."); @@ -1653,16 +1776,9 @@ static void spoil_mon_desc(cptr fname) C_MAKE(who, max_r_idx, s16b); /* Dump the header */ - -#ifndef FAKE_VERSION - fprintf(fff, "Monster Spoilers for Angband Version %d.%d.%d\n", - VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); - fprintf(fff, "------------------------------------------\n\n"); -#else fprintf(fff, "Monster Spoilers for Hengband Version %d.%d.%d\n", - FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); + FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); fprintf(fff, "------------------------------------------\n\n"); -#endif /* Dump the header */ fprintf(fff, " %-38.38s%4s%4s%4s%7s%5s %11.11s\n", @@ -1677,15 +1793,15 @@ static void spoil_mon_desc(cptr fname) monster_race *r_ptr = &r_info[i]; /* Use that monster */ - if (r_ptr->name) who[n++] = i; + if (r_ptr->name) who[n++] = (s16b)i; } - /* Select the sort method */ - ang_sort_comp = ang_sort_comp_hook; - ang_sort_swap = ang_sort_swap_hook; + /* Select the sort method */ + ang_sort_comp = ang_sort_comp_hook; + ang_sort_swap = ang_sort_swap_hook; - /* Sort the array by dungeon depth of monsters */ - ang_sort(who, &why, n); + /* Sort the array by dungeon depth of monsters */ + ang_sort(who, &why, n); /* Scan again */ for (i = 0; i < n; i++) @@ -1696,30 +1812,27 @@ static void spoil_mon_desc(cptr fname) if (r_ptr->flags7 & (RF7_KAGE)) continue; /* Get the "name" */ -/* if (r_ptr->flags1 & (RF1_QUESTOR)) */ - if (0) + /* + else if (r_ptr->flags3 & (RF3_NO_CONF)) { - sprintf(nam, "[Q] %s", name); + sprintf(nam, "[*] %s", name); } + */ else if (r_ptr->flags1 & (RF1_UNIQUE)) { sprintf(nam, "[U] %s", name); } else { -#ifdef JP - sprintf(nam, " %s", name); -#else - sprintf(nam, "The %s", name); -#endif + sprintf(nam, _(" %s", "The %s"), name); } /* Level */ - sprintf(lev, "%d", r_ptr->level); + sprintf(lev, "%d", (int)r_ptr->level); /* Rarity */ - sprintf(rar, "%d", r_ptr->rarity); + sprintf(rar, "%d", (int)r_ptr->rarity); /* Speed */ if (r_ptr->speed >= 110) @@ -1749,7 +1862,7 @@ static void spoil_mon_desc(cptr fname) sprintf(exp, "%ld", (long)(r_ptr->mexp)); /* Hack -- use visual instead */ - sprintf(exp, "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char); + sprintf(exp, "%s '%c'", attr_to_text(r_ptr), r_ptr->d_char); /* Dump the info */ fprintf(fff, "%-42.42s%4s%4s%4s%7s%5s %11.11s\n", @@ -1783,25 +1896,14 @@ static void spoil_mon_desc(cptr fname) * Primarily based on code already in mon-desc.c, mostly by -BEN- */ -/* - * Pronoun arrays - */ -static cptr wd_che[3] = -#ifdef JP -{ "¤½¤ì", "Èà", "Èà½÷" }; -#else -{ "It", "He", "She" }; -#endif - -#ifndef JP -static cptr wd_lhe[3] = -{ "it", "he", "she" }; -#endif -/* +/*! + * @brief 文字列をファイルポインタに出力する / * Buffer text to the given file. (-SHAWN-) * This is basically c_roff() from mon-desc.c with a few changes. + * @param str 文字列参照ポインタ + * @return なし */ static void spoil_out(cptr str) { @@ -1810,8 +1912,11 @@ static void spoil_out(cptr str) /* Line buffer */ static char roff_buf[256]; + /* Delay buffer */ + static char roff_waiting_buf[256]; + #ifdef JP - char iskanji2=0; + bool iskanji_flag = FALSE; #endif /* Current pointer into line roff_buf */ static char *roff_p = roff_buf; @@ -1819,17 +1924,28 @@ static void spoil_out(cptr str) /* Last space saved into roff_buf */ static char *roff_s = NULL; + /* Mega-Hack -- Delayed output */ + static bool waiting_output = FALSE; + /* Special handling for "new sequence" */ if (!str) { + if (waiting_output) + { + fputs(roff_waiting_buf, fff); + waiting_output = FALSE; + } + if (roff_p != roff_buf) roff_p--; while (*roff_p == ' ' && roff_p != roff_buf) roff_p--; + if (roff_p == roff_buf) fprintf(fff, "\n"); else { *(roff_p + 1) = '\0'; fprintf(fff, "%s\n\n", roff_buf); } + roff_p = roff_buf; roff_s = NULL; roff_buf[0] = '\0'; @@ -1840,27 +1956,62 @@ static void spoil_out(cptr str) for (; *str; str++) { #ifdef JP - char cbak; - int k_flag = iskanji((unsigned char)(*str)); + char cbak; + bool k_flag = iskanji((unsigned char)(*str)); #endif char ch = *str; - int wrap = (ch == '\n'); + bool wrap = (ch == '\n'); #ifdef JP - if (!isprint(ch) && !k_flag && !iskanji2) ch = ' '; - if(k_flag && !iskanji2)iskanji2=1;else iskanji2=0; + if (!isprint((unsigned char)ch) && !k_flag && !iskanji_flag) ch = ' '; + iskanji_flag = k_flag && !iskanji_flag; #else if (!isprint(ch)) ch = ' '; #endif -#ifdef JP - if ( roff_p >= roff_buf+( (k_flag) ? 74 : 75) ) wrap=1; - if ((ch == ' ') && (roff_p + 2 >= roff_buf + ((k_flag) ? 74 : 75))) wrap = 1; + if (waiting_output) + { + fputs(roff_waiting_buf, fff); + if (!wrap) fputc('\n', fff); + waiting_output = FALSE; + } + + if (!wrap) + { +#ifdef JP + if (roff_p >= roff_buf + (k_flag ? 74 : 75)) wrap = TRUE; + else if ((ch == ' ') && (roff_p >= roff_buf + (k_flag ? 72 : 73))) wrap = TRUE; #else - if (roff_p >= roff_buf + 75) wrap = 1; - if ((ch == ' ') && (roff_p + 2 >= roff_buf + 75)) wrap = 1; + if (roff_p >= roff_buf + 75) wrap = TRUE; + else if ((ch == ' ') && (roff_p >= roff_buf + 73)) wrap = TRUE; #endif + if (wrap) + { +#ifdef JP + bool k_flag_local; + bool iskanji_flag_local = FALSE; + cptr tail = str + (k_flag ? 2 : 1); +#else + cptr tail = str + 1; +#endif + + for (; *tail; tail++) + { + if (*tail == ' ') continue; + +#ifdef JP + k_flag_local = iskanji((unsigned char)(*tail)); + if (isprint((unsigned char)*tail) || k_flag_local || iskanji_flag_local) break; + iskanji_flag_local = k_flag_local && !iskanji_flag_local; +#else + if (isprint(*tail)) break; +#endif + } + + if (!*tail) waiting_output = TRUE; + } + } /* Handle line-wrap */ if (wrap) @@ -1868,21 +2019,22 @@ static void spoil_out(cptr str) *roff_p = '\0'; r = roff_p; #ifdef JP - cbak=' '; + cbak = ' '; #endif if (roff_s && (ch != ' ')) { #ifdef JP - cbak=*roff_s; + cbak = *roff_s; #endif *roff_s = '\0'; r = roff_s + 1; } - fprintf(fff, "%s\n", roff_buf); + if (!waiting_output) fprintf(fff, "%s\n", roff_buf); + else strcpy(roff_waiting_buf, roff_buf); roff_s = NULL; roff_p = roff_buf; #ifdef JP - if(cbak != ' ') *roff_p++ = cbak; + if (cbak != ' ') *roff_p++ = cbak; #endif while (*r) *roff_p++ = *r++; } @@ -1891,16 +2043,18 @@ static void spoil_out(cptr str) if ((roff_p > roff_buf) || (ch != ' ')) { #ifdef JP - if( !k_flag ){ - if (ch == ' ' || ch == '(' ) roff_s = roff_p; - } - else{ - if( iskanji2 && - strncmp(str, "¡£", 2) != 0 && - strncmp(str, "¡¢", 2) != 0 && - strncmp(str, "¥£", 2) != 0 && - strncmp(str, "¡¼", 2) != 0) roff_s = roff_p; - } + if (!k_flag) + { + if ((ch == ' ') || (ch == '(')) roff_s = roff_p; + } + else + { + if (iskanji_flag && + strncmp(str, "。", 2) != 0 && + strncmp(str, "、", 2) != 0 && + strncmp(str, "ィ", 2) != 0 && + strncmp(str, "ー", 2) != 0) roff_s = roff_p; + } #else if (ch == ' ') roff_s = roff_p; #endif @@ -1911,27 +2065,40 @@ static void spoil_out(cptr str) } -/* + +/*! + * @brief 関数ポインタ用の出力関数 / + * Hook function used in spoil_mon_info() + * @param attr 未使用 + * @param str 文字列参照ポインタ + * @return なし + */ +static void roff_func(byte attr, cptr str) +{ + /* Unused */ + (void)attr; + + spoil_out(str); +} + + +/*! + * @brief モンスター詳細情報をスポイラー出力するメインルーチン / * Create a spoiler file for monsters (-SHAWN-) + * @param fname ファイル名 + * @return なし */ static void spoil_mon_info(cptr fname) { char buf[1024]; - int msex, vn, i, j, k, l, n=0; - bool breath, magic, sin; - cptr p, q; - cptr vp[64]; - u32b flags1, flags2, flags3, flags4, flags5, flags6, flags7; + int i, l, n = 0; + BIT_FLAGS flags1; u16b why = 2; s16b *who; - -#ifdef JP - char jverb_buf[64]; -#endif /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_USER, fname); + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); @@ -1939,7 +2106,6 @@ static void spoil_mon_info(cptr fname) /* Open the file */ fff = my_fopen(buf, "w"); - /* Oops */ if (!fff) { msg_print("Cannot create spoiler file."); @@ -1948,13 +2114,8 @@ static void spoil_mon_info(cptr fname) /* Dump the header */ -#ifndef FAKE_VERSION - sprintf(buf, "Monster Spoilers for Angband Version %d.%d.%d\n", - VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); -#else sprintf(buf, "Monster Spoilers for Hengband Version %d.%d.%d\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); -#endif spoil_out(buf); spoil_out("------------------------------------------\n\n"); @@ -1968,7 +2129,7 @@ static void spoil_mon_info(cptr fname) monster_race *r_ptr = &r_info[i]; /* Use that monster */ - if (r_ptr->name) who[n++] = i; + if (r_ptr->name) who[n++] = (s16b)i; } /* Select the sort method */ @@ -1988,27 +2149,16 @@ static void spoil_mon_info(cptr fname) /* Extract the flags */ flags1 = r_ptr->flags1; - flags2 = r_ptr->flags2; - flags3 = r_ptr->flags3; - flags4 = r_ptr->flags4; - flags5 = r_ptr->flags5; - flags6 = r_ptr->flags6; - flags7 = r_ptr->flags7; - breath = FALSE; - magic = FALSE; - - /* Extract a gender (if applicable) */ - if (flags1 & (RF1_FEMALE)) msex = 2; - else if (flags1 & (RF1_MALE)) msex = 1; - else msex = 0; - /* Prefix */ + /* if (flags1 & (RF1_QUESTOR)) { spoil_out("[Q] "); } - else if (flags1 & (RF1_UNIQUE)) + else + */ + if (flags1 & (RF1_UNIQUE)) { spoil_out("[U] "); } @@ -2020,16 +2170,12 @@ static void spoil_mon_info(cptr fname) } /* Name */ -#ifdef JP - sprintf(buf, "%s/%s (", (r_name + r_ptr->name),(r_name+r_ptr->E_name)); /* ---)--- */ -#else - sprintf(buf, "%s (", (r_name + r_ptr->name)); /* ---)--- */ -#endif + sprintf(buf, _("%s/%s (", "%s ("), (r_name + r_ptr->name), _(r_name+r_ptr->E_name, "")); /* ---)--- */ spoil_out(buf); /* Color */ - spoil_out(attr_to_text(r_ptr->d_attr)); + spoil_out(attr_to_text(r_ptr)); /* Symbol --(-- */ sprintf(buf, " '%c')\n", r_ptr->d_char); @@ -2041,11 +2187,11 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); /* Number */ - sprintf(buf, "Num:%d ", n); + sprintf(buf, "Num:%d ", who[l]); spoil_out(buf); /* Level */ - sprintf(buf, "Lev:%d ", r_ptr->level); + sprintf(buf, "Lev:%d ", (int)r_ptr->level); spoil_out(buf); /* Rarity */ @@ -2082,1073 +2228,262 @@ static void spoil_mon_info(cptr fname) sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp)); spoil_out(buf); + /* Reuse the code of monster recall. */ + output_monster_spoiler(who[l], roff_func); - /* Describe */ - spoil_out(r_text + r_ptr->text); -#ifdef JP - spoil_out("¡£ "); -#else - spoil_out(" "); -#endif - - + spoil_out(NULL); + } -#ifdef JP - spoil_out("¤³¤Î"); + /* Free the "who" array */ + C_KILL(who, max_r_idx, s16b); -if (flags2 & RF2_ELDRITCH_HORROR) spoil_out("¶¸µ¤¤òͶ¤¦");/*nuke me*/ -if (flags3 & RF3_ANIMAL) spoil_out("¼«Á³³¦¤Î"); -if (flags3 & RF3_EVIL) spoil_out("¼Ù°­¤Ê¤ë"); -if (flags3 & RF3_GOOD) spoil_out("Á±ÎɤÊ"); -if (flags3 & RF3_UNDEAD) spoil_out("¥¢¥ó¥Ç¥Ã¥É¤Î"); + /* Check for errors */ + if (ferror(fff) || my_fclose(fff)) + { + msg_print("Cannot close spoiler file."); + return; + } -if ((flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC | RF3_AMBERITE)) || (flags2 & RF2_QUANTUM)) -{ - if (flags3 & RF3_DRAGON) spoil_out("¥É¥é¥´¥ó"); - if (flags3 & RF3_DEMON) spoil_out("¥Ç¡¼¥â¥ó"); - if (flags3 & RF3_GIANT) spoil_out("¥¸¥ã¥¤¥¢¥ó¥È"); - if (flags3 & RF3_TROLL) spoil_out("¥È¥í¥ë"); - if (flags3 & RF3_ORC) spoil_out("¥ª¡¼¥¯"); - if (flags3 & RF3_AMBERITE) spoil_out("¥¢¥ó¥Ð¡¼¤Î²¦Â²");/*nuke me*/ - if (flags2 & RF2_QUANTUM) spoil_out("ÎÌ»ÒÀ¸Êª"); + msg_print("Successfully created a spoiler file."); } -else spoil_out("¥â¥ó¥¹¥¿¡¼"); -#else - spoil_out("This"); - - if (flags2 & (RF2_ELDRITCH_HORROR)) spoil_out (" sanity-blasting"); - if (flags3 & (RF3_ANIMAL)) spoil_out(" natural"); - if (flags3 & (RF3_EVIL)) spoil_out(" evil"); - if (flags3 & (RF3_GOOD)) spoil_out(" good"); - if (flags3 & (RF3_UNDEAD)) spoil_out(" undead"); - - if (flags3 & (RF3_DRAGON)) spoil_out(" dragon"); - else if (flags3 & (RF3_DEMON)) spoil_out(" demon"); - else if (flags3 & (RF3_GIANT)) spoil_out(" giant"); - else if (flags3 & (RF3_TROLL)) spoil_out(" troll"); - else if (flags3 & (RF3_ORC)) spoil_out(" orc"); - else if (flags3 & (RF3_AMBERITE)) spoil_out (" Amberite"); - else spoil_out(" creature"); -#endif - - -#ifdef JP - spoil_out("¤Ï"); -#else - spoil_out(" moves"); -#endif - - - if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25))) - { -#ifdef JP -spoil_out("¤«¤Ê¤êÉÔµ¬Â§¤Ë"); -#else - spoil_out(" extremely erratically"); -#endif - - } - else if (flags1 & (RF1_RAND_50)) - { -#ifdef JP -spoil_out("´öʬÉÔµ¬Â§¤Ë"); -#else - spoil_out(" somewhat erratically"); -#endif - - } - else if (flags1 & (RF1_RAND_25)) - { -#ifdef JP -spoil_out("¾¯¡¹ÉÔµ¬Â§¤Ë"); -#else - spoil_out(" a bit erratically"); -#endif - - } - else - { -#ifdef JP -spoil_out("ÉáÄ̤Ë"); -#else - spoil_out(" normally"); -#endif - - } - -#ifdef JP -spoil_out("Æ°¤¤¤Æ¤¤¤ë"); -#endif - if (flags1 & (RF1_NEVER_MOVE)) - { -#ifdef JP -spoil_out("¤¬¡¢¿¯Æþ¼Ô¤òÄÉÀפ·¤Ê¤¤"); -#else - spoil_out(", but does not deign to chase intruders"); -#endif - - } - -#ifdef JP - spoil_out("¤³¤È¤¬¤¢¤ë¡£"); -#else - spoil_out(". "); -#endif - - - if (!r_ptr->level || (flags1 & (RF1_FORCE_DEPTH))) - { - sprintf(buf, "%s is never found out of depth. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags1 & (RF1_FORCE_SLEEP)) - { - sprintf(buf, "%s is always created sluggish. ", wd_che[msex]); - spoil_out(buf); - } - if (flags2 & (RF2_AURA_FIRE)) - { - sprintf(buf, "%s is surrounded by flames. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags3 & (RF3_AURA_COLD)) - { - sprintf(buf, "%s is surrounded by ice. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags2 & (RF2_AURA_ELEC)) - { - sprintf(buf, "%s is surrounded by electricity. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags2 & (RF2_REFLECTING)) - { - sprintf(buf, "%s reflects bolt spells. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags1 & (RF1_ESCORT)) - { - sprintf(buf, "%s usually appears with ", wd_che[msex]); - spoil_out(buf); - if (flags1 & (RF1_ESCORTS)) spoil_out("escorts. "); - else spoil_out("an escort. "); - } - - if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS)) - { - sprintf(buf, "%s usually appears in groups. ", wd_che[msex]); - spoil_out(buf); - } - - /* Collect inate attacks */ - vn = 0; -#ifdef JP -if (flags4 & RF4_SHRIEK) vp[vn++] = "ÈáÌĤǽõ¤±¤òµá¤á¤ë"; -if (flags4 & RF4_ROCKET) vp[vn++] = "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë"; -if (flags4 & RF4_SHOOT) vp[vn++] = "¼Í·â¤ò¤¹¤ë"; -if (flags6 & (RF6_SPECIAL)) vp[vn++] = "ÆÃÊ̤ʹÔÆ°¤ò¤¹¤ë"; -#else - if (flags4 & RF4_SHRIEK) vp[vn++] = "shriek for help"; - if (flags4 & RF4_ROCKET) vp[vn++] = "shoot a rocket"; - if (flags4 & RF4_SHOOT) vp[vn++] = "fire missiles"; - if (flags6 & (RF6_SPECIAL)) vp[vn++] = "do something"; -#endif - - - if (vn) - { -#ifdef JP - spoil_out(wd_che[msex]); - spoil_out("¤Ï"); -#else - spoil_out(wd_che[msex]); -#endif - - for (i = 0; i < vn; i++) - { -#ifdef JP - if(i!=vn-1){ - jverb3(vp[i],jverb_buf); - spoil_out(jverb_buf); - spoil_out("¤ê¡¢"); - } - else spoil_out(vp[i]); -#else - if (!i) spoil_out(" may "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); -#endif - - } -#ifdef JP - spoil_out("¤³¤È¤¬¤Ç¤­¤ë¡£"); -#else - spoil_out(". "); -#endif - - } - - /* Collect breaths */ - vn = 0; -#ifdef JP -if (flags4 & (RF4_BR_ACID)) vp[vn++] = "»À"; -if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "°ðºÊ"; -if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "²Ð±ê"; -if (flags4 & (RF4_BR_COLD)) vp[vn++] = "Î䵤"; -if (flags4 & (RF4_BR_POIS)) vp[vn++] = "ÆÇ"; -if (flags4 & (RF4_BR_NETH)) vp[vn++] = "ÃϹö"; -if (flags4 & (RF4_BR_LITE)) vp[vn++] = "Á®¸÷"; -if (flags4 & (RF4_BR_DARK)) vp[vn++] = "°Å¹õ"; -if (flags4 & (RF4_BR_CONF)) vp[vn++] = "º®Íð"; -if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "¹ì²»"; -if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "¥«¥ª¥¹"; -if (flags4 & (RF4_BR_DISE)) vp[vn++] = "Îô²½"; -if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "°ø²Ìº®Íð"; -if (flags4 & (RF4_BR_TIME)) vp[vn++] = "»þ´ÖµÕž"; -if (flags4 & (RF4_BR_INER)) vp[vn++] = "ÃÙÆß"; -if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "½ÅÎÏ"; -if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "ÇËÊÒ"; -if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "¥×¥é¥º¥Þ"; -if (flags4 & (RF4_BR_WALL)) vp[vn++] = "¥Õ¥©¡¼¥¹"; -if (flags4 & (RF4_BR_MANA)) vp[vn++] = "ËâÎÏ"; -if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "Êü¼ÍÀ­ÇÑ´þʪ"; -if (flags4 & (RF4_BR_DISI)) vp[vn++] = "ʬ²ò"; -#else - if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid"; - if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning"; - if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire"; - if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost"; - if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison"; - if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether"; - if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light"; - if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness"; - if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion"; - if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound"; - if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos"; - if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment"; - if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus"; - if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time"; - if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia"; - if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity"; - if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards"; - if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma"; - if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force"; - if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana"; - if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste"; - if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration"; -#endif - - - if (vn) - { - breath = TRUE; -#ifdef JP - spoil_out(wd_che[msex]); - spoil_out("¤Ï"); -#else - spoil_out(wd_che[msex]); -#endif - -#ifdef JP - spoil_out("¤Ï"); -#endif - for (i = 0; i < vn; i++) - { -#ifdef JP - if ( i != 0 ) spoil_out("¤ä"); -#else - if (!i) spoil_out(" may breathe "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" or "); -#endif - - spoil_out(vp[i]); - } -#ifdef JP - spoil_out("¤Î¥Ö¥ì¥¹¤ò"); - if (flags2 & (RF2_POWERFUL)) spoil_out("¶¯ÎϤË"); - spoil_out("ÅǤ¯¤³¤È¤¬¤¢"); -#else - if (flags2 & (RF2_POWERFUL)) spoil_out(" powerfully"); -#endif - } - /* Collect spells */ - vn = 0; -#ifdef JP -if (flags5 & (RF5_BA_ACID)) vp[vn++] = "¥¢¥·¥Ã¥É¡¦¥Ü¡¼¥ë¤Î"; -if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "¥µ¥ó¥À¡¼¡¦¥Ü¡¼¥ë¤Î"; -if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë¤Î"; -if (flags5 & (RF5_BA_COLD)) vp[vn++] = "¥¢¥¤¥¹¡¦¥Ü¡¼¥ë¤Î"; -if (flags5 & (RF5_BA_POIS)) vp[vn++] = "°­½­±À¤Î"; -if (flags5 & (RF5_BA_NETH)) vp[vn++] = "ÃϹöµå¤Î"; -if (flags5 & (RF5_BA_WATE)) vp[vn++] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¡¼¥ë¤Î"; -if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "Êü¼Íǽµå¤Î"; -#else - if (flags5 & (RF5_BA_ACID)) vp[vn++] = "produce acid balls"; - if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "produce lightning balls"; - if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "produce fire balls"; - if (flags5 & (RF5_BA_COLD)) vp[vn++] = "produce frost balls"; - if (flags5 & (RF5_BA_POIS)) vp[vn++] = "produce poison balls"; - if (flags5 & (RF5_BA_NETH)) vp[vn++] = "produce nether balls"; - if (flags5 & (RF5_BA_WATE)) vp[vn++] = "produce water balls"; - if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "produce balls of radiation"; -#endif - -#ifdef JP -if (flags5 & (RF5_BA_MANA)) vp[vn++] = "ËâÎϤÎÍò¤Î"; -if (flags5 & (RF5_BA_DARK)) vp[vn++] = "°Å¹õ¤ÎÍò¤Î"; -if (flags5 & (RF5_BA_LITE)) vp[vn++] = "¥¹¥¿¡¼¥Ð¡¼¥¹¥È¤Î"; -if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "½ã¥í¥°¥ë¥¹¤Î"; -#else - if (flags5 & (RF5_BA_MANA)) vp[vn++] = "produce mana storms"; - if (flags5 & (RF5_BA_DARK)) vp[vn++] = "produce darkness storms"; - if (flags4 & (RF5_BA_LITE)) vp[vn++] = "produce starburst"; - if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "invoke raw Logrus"; -#endif -#ifdef JP -if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "ÇËÌǤμê¤Î"; -if (flags6 & (RF6_PSY_SPEAR)) vp[vn++] = "¸÷¤Î·õ¤Î"; -if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "ËâÎϤòµÛ¤¤¼è¤ë"; -if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "Àº¿À¤ò¹¶·â¤¹¤ë"; -if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "Ǿ¤ò¹¶·â¤¹¤ë"; -if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "·Ú½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë"; -if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "½Å½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë"; -if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "Ã×Ì¿½ý¤ò°ú¤­µ¯¤³¤·¤Æ¼ö¤¤¤ò¤«¤±¤ë"; -if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "È빦¤òÆͤ¯"; -if (flags5 & (RF5_BO_ACID)) vp[vn++] = "¥¢¥·¥Ã¥É¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "¥µ¥ó¥À¡¼¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_COLD)) vp[vn++] = "¥¢¥¤¥¹¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_NETH)) vp[vn++] = "ÃϹö¤ÎÌð¤Î"; -if (flags5 & (RF5_BO_WATE)) vp[vn++] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_MANA)) vp[vn++] = "ËâÎϤÎÌð¤Î"; -if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È¤Î"; -if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "¶Ë´¨¤ÎÌð¤Î"; -if (flags5 & (RF5_MISSILE)) vp[vn++] = "¥Þ¥¸¥Ã¥¯¥ß¥µ¥¤¥ë¤Î"; -if (flags5 & (RF5_SCARE)) vp[vn++] = "¶²Éݤò¸Æ¤Óµ¯¤³¤¹"; -if (flags5 & (RF5_BLIND)) vp[vn++] = "Ìܤò¤¯¤é¤Þ¤»¤ë"; -if (flags5 & (RF5_CONF)) vp[vn++] = "º®Í𤵤»¤ë"; -if (flags5 & (RF5_SLOW)) vp[vn++] = "¸ºÂ®¤µ¤»¤ë"; -if (flags5 & (RF5_HOLD)) vp[vn++] = "Ëãá㤵¤»¤ë"; -if (flags6 & (RF6_HASTE)) vp[vn++] = "¼«Ê¬¤ò²Ã®¤¹¤ë"; -if (flags6 & (RF6_HEAL)) vp[vn++] = "¼«Ê¬¤ò¼£Ìþ¤¹¤ë"; -if (flags6 & (RF6_INVULNER)) vp[vn++] = "̵½ý¤Îµå¤Î"; -if (flags4 & (RF4_DISPEL)) vp[vn++] = "ËâÎϤò¾Ã¤·µî¤ë"; -if (flags6 & (RF6_BLINK)) vp[vn++] = "½Ö»þ¤Ë¾Ã¤¨¤ë"; -if (flags6 & (RF6_TPORT)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤¹¤ë"; -if (flags6 & (RF6_WORLD)) vp[vn++] = "»þ¤ò»ß¤á¤ë"; -if (flags6 & (RF6_TELE_TO)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤Ç°ú¤­Ì᤹"; -if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë"; -if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë¤µ¤»¤ë"; -if (flags6 & (RF6_DARKNESS)) vp[vn++] = "°Å°Ç¤òºî¤ë"; -if (flags6 & (RF6_TRAPS)) vp[vn++] = "¥È¥é¥Ã¥×¤òºî¤ë"; -if (flags6 & (RF6_FORGET)) vp[vn++] = "µ­²±¤ò¾Ãµî¤¹¤ë"; -if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "»à¼Ô¤òᴤ餻¤ë"; -if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "°ìÂΤΥâ¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "Ê£¿ô¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_KIN)) vp[vn++] = "µß±ç¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_ANT)) vp[vn++] = "¥¢¥ê¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "¥¯¥â¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_HOUND)) vp[vn++] = "¥Ï¥¦¥ó¥É¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "¥Ò¥É¥é¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "°ìÂΤÎÅ·»È¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_DEMON)) vp[vn++] = "°ìÂΤΥǡ¼¥â¥ó¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "°ìÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "°ìÂΤΥɥ饴¥ó¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "¸ÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_CYBER)) vp[vn++] = "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_AMBERITES)) vp[vn++] = "¥¢¥ó¥Ð¡¼¤Î²¦Â²¤ò¾¤´­¤¹¤ë"; -if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë"; -#else - if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "invoke the Hand of Doom"; - if (flags6 & (RF6_PSY_SPEAR)) vp[vn++] = "psycho-spear"; - if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "drain mana"; - if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "cause mind blasting"; - if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "cause brain smashing"; - if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; - if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; - if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; - if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (flags5 & (RF5_BO_ACID)) vp[vn++] = "produce acid bolts"; - if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "produce lightning bolts"; - if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "produce fire bolts"; - if (flags5 & (RF5_BO_COLD)) vp[vn++] = "produce frost bolts"; - if (flags5 & (RF5_BO_NETH)) vp[vn++] = "produce nether bolts"; - if (flags5 & (RF5_BO_WATE)) vp[vn++] = "produce water bolts"; - if (flags5 & (RF5_BO_MANA)) vp[vn++] = "produce mana bolts"; - if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "produce plasma bolts"; - if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "produce ice bolts"; - if (flags5 & (RF5_MISSILE)) vp[vn++] = "produce magic missiles"; - if (flags5 & (RF5_SCARE)) vp[vn++] = "terrify"; - if (flags5 & (RF5_BLIND)) vp[vn++] = "blind"; - if (flags5 & (RF5_CONF)) vp[vn++] = "confuse"; - if (flags5 & (RF5_SLOW)) vp[vn++] = "slow"; - if (flags5 & (RF5_HOLD)) vp[vn++] = "paralyze"; - if (flags6 & (RF6_HASTE)) vp[vn++] = "haste-self"; - if (flags6 & (RF6_HEAL)) vp[vn++] = "heal-self"; - if (flags6 & (RF6_INVULNER)) vp[vn++] = "make invulnerable"; - if (flags6 & (RF6_BLINK)) vp[vn++] = "blink-self"; - if (flags6 & (RF6_TPORT)) vp[vn++] = "teleport-self"; - if (flags6 & (RF6_WORLD)) vp[vn++] = "stop the time"; - if (flags6 & (RF6_TELE_TO)) vp[vn++] = "teleport to"; - if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "teleport away"; - if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "teleport level"; - if (flags6 & (RF6_DARKNESS)) vp[vn++] = "create darkness"; - if (flags6 & (RF6_TRAPS)) vp[vn++] = "create traps"; - if (flags6 & (RF6_FORGET)) vp[vn++] = "cause amnesia"; - if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "raise dead"; - if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "summon a monster"; - if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "summon monsters"; - if (flags6 & (RF6_S_KIN)) vp[vn++] = "summon aid"; - if (flags6 & (RF6_S_ANT)) vp[vn++] = "summon ants"; - if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "summon spiders"; - if (flags6 & (RF6_S_HOUND)) vp[vn++] = "summon hounds"; - if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "summon hydras"; - if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "summon an angel"; - if (flags6 & (RF6_S_DEMON)) vp[vn++] = "summon a demon"; - if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "summon an undead"; - if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "summon a dragon"; - if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "summon greater undead"; - if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "summon ancient dragons"; - if (flags6 & (RF6_S_CYBER)) vp[vn++] = "summon Cyberdemons"; - if (flags6 & (RF6_S_AMBERITES)) vp[vn++] = "summon Lords of Amber"; - if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "summon unique monsters"; -#endif +#define MAX_EVOL_DEPTH 64 - if (vn) - { - magic = TRUE; - if (breath) - { -#ifdef JP - spoil_out("¤ê¡¢¤Ê¤ª¤«¤Ä"); -#else - spoil_out(", and is also"); -#endif - - } - else - { -#ifdef JP - spoil_out(wd_che[msex]); - spoil_out("¤Ï"); -#else - spoil_out(wd_che[msex]); - spoil_out(" is"); -#endif - - } +/*! + * @brief int配列でstrncmp()と似た比較処理を行う / + * Compare two int-type array like strncmp() and return TRUE if equals + * @param a 比較するint配列1 + * @param b 比較するint配列2 + * @param length + * @return 両者の値が等しければTRUEを返す + */ +static bool int_n_cmp(int *a, int *b, int length) +{ + /* Null-string comparation is always TRUE */ + if (!length) return TRUE; -#ifdef JP - /* Adverb */ - if (flags2 & (RF2_SMART)) spoil_out("Ū³Î¤Ë"); + do + { + if (*a != *(b++)) return FALSE; + if (!(*(a++))) break; + } + while (--length); - /* Verb Phrase */ - spoil_out("ËâË¡¤ò»È¤¦¤³¤È¤¬¤Ç¤­¡¢"); -#else - spoil_out(" magical, casting spells"); - if (flags2 & (RF2_SMART)) spoil_out(" intelligently"); -#endif + return TRUE; +} - for (i = 0; i < vn; i++) - { -#ifdef JP - if ( i != 0 ) spoil_out("¼öʸ¡¢"); -#else - if (!i) spoil_out(" which "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" or "); -#endif +/*! + * @brief ある木が指定された木の部分木かどうかを返す / + * Returns TRUE if an evolution tree is "partial tree" + * @param tree 元となる木構造リスト + * @param partial_tree 部分木かどうか判定したい木構造リスト + * @return 部分木ならばTRUEを返す + */ +static bool is_partial_tree(int *tree, int *partial_tree) +{ + int pt_head = *(partial_tree++); + int pt_len = 0; - spoil_out(vp[i]); - } -#ifdef JP - spoil_out("¼öʸ¤ò¾§¤¨¤ë¤³¤È¤¬¤¢"); -#endif - } + while (partial_tree[pt_len]) pt_len++; - if (breath || magic) + while (*tree) + { + if (*(tree++) == pt_head) { -#ifdef JP - sprintf(buf, "¤ë(³ÎΨ:Ìó1/%d)¡£", - 200 / (r_ptr->freq_inate + r_ptr->freq_spell)); - spoil_out(buf); -#else - sprintf(buf, "; 1 time in %d. ", - 200 / (r_ptr->freq_inate + r_ptr->freq_spell)); - spoil_out(buf); -#endif - + if (int_n_cmp(tree, partial_tree, pt_len)) return TRUE; } + } - /* Collect special abilities. */ - vn = 0; -#ifdef JP -if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) vp[vn++] = "¥À¥ó¥¸¥ç¥ó¤ò¾È¤é¤¹"; -if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) vp[vn++] = "¸÷¤Ã¤Æ¤¤¤ë"; -if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "¥É¥¢¤ò³«¤±¤ë"; -if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "¥É¥¢¤òÂǤÁÇˤë"; -if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "Êɤò¤¹¤êÈ´¤±¤ë"; -if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "Êɤò·¡¤ê¿Ê¤à"; -if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "¼å¤¤¥â¥ó¥¹¥¿¡¼¤ò²¡¤·¤Î¤±¤ë"; -if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "¼å¤¤¥â¥ó¥¹¥¿¡¼¤òÅݤ¹"; -if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦"; -if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "¥¢¥¤¥Æ¥à¤ò²õ¤¹"; -#else - if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) vp[vn++] = "illuminate the dungeon"; - if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) vp[vn++] = "illuminate the dungeon"; - if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors"; - if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors"; - if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls"; - if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls"; - if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters"; - if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters"; - if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects"; - if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects"; -#endif - + return FALSE; +} - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { -#ifdef JP - if(i!=vn-1){ - jverb1(vp[i],jverb_buf); - spoil_out(jverb_buf); - spoil_out("¡¢"); - } - else spoil_out(vp[i]); -#else - if (!i) spoil_out(" can "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); -#endif - } - spoil_out(". "); - } +/*! + * @brief 進化ツリーをソートするためモンスター種族の判定関数 / + * Sorting hook -- Comp function + * @param u 進化木構造データ + * @param v 未使用 + * @param a 比較したいモンスター種族ID1 + * @param b 比較したいモンスター種族ID2 + * @return 2が大きければTRUEを返す + */ +static bool ang_sort_comp_evol_tree(vptr u, vptr v, int a, int b) +{ + int **evol_tree = (int **)u; - if (flags2 & (RF2_INVISIBLE)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤ÏÆ©ÌÀ¤ÇÌܤ˸«¤¨¤Ê¤¤¡£"); -#else - spoil_out(" is invisible. "); -#endif + int w1 = evol_tree[a][0]; + int w2 = evol_tree[b][0]; + monster_race *r1_ptr = &r_info[w1]; + monster_race *r2_ptr = &r_info[w2]; - } - if (flags2 & (RF2_COLD_BLOOD)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤ÏÎä·ìưʪ¤Ç¤¢¤ë¡£"); -#else - spoil_out(" is cold blooded. "); -#endif + /* Unused */ + (void)v; - } - if (flags2 & (RF2_EMPTY_MIND)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤Ï¥Æ¥ì¥Ñ¥·¡¼¤Ç¤Ï´¶ÃΤǤ­¤Ê¤¤¡£"); -#else - spoil_out(" is not detected by telepathy. "); -#endif + /* Used tree first */ + if (w1 && !w2) return TRUE; + if (!w1 && w2) return FALSE; - } - if (flags2 & (RF2_WEIRD_MIND)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤Ï¤Þ¤ì¤Ë¥Æ¥ì¥Ñ¥·¡¼¤Ç´¶ÃΤǤ­¤ë¡£"); -#else - spoil_out(" is rarely detected by telepathy. "); -#endif + /* Sort by monster level */ + if (r1_ptr->level < r2_ptr->level) return TRUE; + if (r1_ptr->level > r2_ptr->level) return FALSE; - } - if (flags2 & (RF2_MULTIPLY)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤ÏÇúȯŪ¤ËÁý¿£¤¹¤ë¡£"); -#else - spoil_out(" breeds explosively. "); -#endif + /* Sort by monster experience */ + if (r1_ptr->mexp < r2_ptr->mexp) return TRUE; + if (r1_ptr->mexp > r2_ptr->mexp) return FALSE; - } - if (flags2 & (RF2_REGENERATE)) - { - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤ÏÁÇÁ᤯ÂÎÎϤò²óÉü¤¹¤ë¡£"); -#else - spoil_out(" regenerates quickly. "); -#endif + /* Compare indexes */ + return w1 <= w2; +} - } +/*! + * @brief 進化ツリーをソートするため木構造のスワップ関数 / + * Sorting hook -- Swap function + * @param u 進化木構造データ + * @param v 未使用 + * @param a スワップしたい木構造1 + * @param b スワップしたい木構造2 + * @return 2が大きければTRUEを返す + */ +static void ang_sort_swap_evol_tree(vptr u, vptr v, int a, int b) +{ + int **evol_tree = (int **)u; + int *holder; - /* Collect susceptibilities */ - vn = 0; -#ifdef JP -if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "´ä¤ò½üµî¤¹¤ë¤â¤Î"; -if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "ÌÀ¤ë¤¤¸÷"; -if (flags3 & (RF3_HURT_FIRE)) vp[vn++] = "²Ð"; -if (flags3 & (RF3_HURT_COLD)) vp[vn++] = "Î䵤"; -#else - if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "rock remover"; - if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "bright light"; - if (flags3 & (RF3_HURT_FIRE)) vp[vn++] = "fire"; - if (flags3 & (RF3_HURT_COLD)) vp[vn++] = "cold"; -#endif + /* Unused */ + (void)v; + /* Swap */ + holder = evol_tree[a]; + evol_tree[a] = evol_tree[b]; + evol_tree[b] = holder; +} - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" is hurt by "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } +/*! + * @brief 進化ツリーをスポイラー出力するメインルーチン / + * Print monsters' evolution information to file + * @param fname 出力ファイル名 + * @return なし + */ +static void spoil_mon_evol(cptr fname) +{ + char buf[1024]; + monster_race *r_ptr; + int **evol_tree, i, j, n, r_idx; + int *evol_tree_zero; /* For C_KILL() */ - /* Collect immunities */ - vn = 0; -#ifdef JP -if (flags3 & (RF3_IM_ACID)) vp[vn++] = "»À"; -if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "ÅÅ·â"; -if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "²Ð"; -if (flags3 & (RF3_IM_COLD)) vp[vn++] = "Î䵤"; -if (flags3 & (RF3_IM_POIS)) vp[vn++] = "ÆÇ"; -#else - if (flags3 & (RF3_IM_ACID)) vp[vn++] = "acid"; - if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "lightning"; - if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "fire"; - if (flags3 & (RF3_IM_COLD)) vp[vn++] = "cold"; - if (flags3 & (RF3_IM_POIS)) vp[vn++] = "poison"; -#endif + /* Build the filename */ + path_build(buf, sizeof buf, ANGBAND_DIR_USER, fname); + /* File type is "TEXT" */ + FILE_TYPE(FILE_TYPE_TEXT); - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" resists "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } + /* Open the file */ + fff = my_fopen(buf, "w"); - /* Collect resistances */ - vn = 0; -#ifdef JP -if (flags3 & (RF3_RES_NETH)) vp[vn++] = "ÃϹö"; -if (flags3 & (RF3_RES_WATE)) vp[vn++] = "¿å"; -if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "¥×¥é¥º¥Þ"; -if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "°ø²Ìº®Íð"; -if (flags3 & (RF3_RES_DISE)) vp[vn++] = "Îô²½"; -if (flags3 & (RF3_RES_ALL )) vp[vn++] = "¤¢¤é¤æ¤ë¸ú²Ì"; -#else - if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether"; - if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water"; - if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma"; - if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus"; - if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment"; - if (flags3 & (RF3_RES_ALL )) vp[vn++] = "all"; -#endif + if (!fff) + { + msg_print("Cannot create spoiler file."); + return; + } - if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation"; -#ifdef JP -if ((flags3 & RF3_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È"; -#else - if ((flags3 & RF3_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "teleportation"; -#endif + /* Dump the header */ + sprintf(buf, "Monster Spoilers for Hengband Version %d.%d.%d\n", + FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); + spoil_out(buf); + spoil_out("------------------------------------------\n\n"); - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" resists "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } + /* Allocate the "evol_tree" array (2-dimension) */ + C_MAKE(evol_tree, max_r_idx, int *); + C_MAKE(*evol_tree, max_r_idx * (MAX_EVOL_DEPTH + 1), int); + for (i = 1; i < max_r_idx; i++) evol_tree[i] = *evol_tree + i * (MAX_EVOL_DEPTH + 1); + evol_tree_zero = *evol_tree; - /* Collect non-effects */ - vn = 0; -#ifdef JP -if (flags3 & (RF3_NO_STUN)) vp[vn++] = "Û¯Û°¤È¤·¤Ê¤¤"; -if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "¶²Éݤò´¶¤¸¤Ê¤¤"; -if (flags3 & (RF3_NO_CONF)) vp[vn++] = "º®Í𤷤ʤ¤"; -if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "̲¤é¤µ¤ì¤Ê¤¤"; -if ((flags3 & RF3_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "¥Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Ê¤¤"; -#else - if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned"; - if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened"; - if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused"; - if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept"; - if ((flags3 & RF3_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) vp[vn++] = "teleported"; -#endif + /* Step 1: Build the evolution tree */ + for (i = 1; i < max_r_idx; i++) + { + r_ptr = &r_info[i]; + /* No evolution */ + if (!r_ptr->next_exp) continue; - if (vn) + /* Trace evolution */ + n = 0; + evol_tree[i][n++] = i; + do { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" cannot be "); - else if (i < vn-1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); - } - spoil_out(". "); + evol_tree[i][n++] = r_ptr->next_r_idx; + r_ptr = &r_info[r_ptr->next_r_idx]; } + while (r_ptr->next_exp && (n < MAX_EVOL_DEPTH)); + } - spoil_out(wd_che[msex]); -#ifdef JP -spoil_out("¤Ï¿¯Æþ¼Ô"); -if (r_ptr->sleep > 200) spoil_out("¤ò̵»ë¤·¤¬¤Á¤Ç¤¢¤ë¤¬"); -else if (r_ptr->sleep > 95) spoil_out("¤ËÂФ·¤Æ¤Û¤È¤ó¤ÉÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬"); -else if (r_ptr->sleep > 75) spoil_out("¤ËÂФ·¤Æ¤¢¤Þ¤êÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬"); -else if (r_ptr->sleep > 45) spoil_out("¤ò¸«²á¤´¤·¤¬¤Á¤Ç¤¢¤ë¤¬"); -else if (r_ptr->sleep > 25) spoil_out("¤ò¤Û¤ó¤Î¾¯¤·¤Ï¸«¤Æ¤ª¤ê"); -else if (r_ptr->sleep > 10) spoil_out("¤ò¤·¤Ð¤é¤¯¤Ï¸«¤Æ¤ª¤ê"); -else if (r_ptr->sleep > 5) spoil_out("¤ò´öʬÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê"); -else if (r_ptr->sleep > 3) spoil_out("¤òÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê"); -else if (r_ptr->sleep > 1) spoil_out("¤ò¤«¤Ê¤êÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê"); -else if (r_ptr->sleep > 0) spoil_out("¤ò·Ù²ü¤·¤Æ¤ª¤ê"); -else spoil_out("¤ò¤«¤Ê¤ê·Ù²ü¤·¤Æ¤ª¤ê"); -spoil_out("¡¢"); -sprintf(buf, " %d ¥Õ¥£¡¼¥ÈÀ褫¤é¿¯Æþ¼Ô¤Ëµ¤ÉÕ¤¯¤³¤È¤¬¤¢¤ë¡£", - 10 * r_ptr->aaf); - spoil_out(buf); -#else - if (r_ptr->sleep > 200) spoil_out(" prefers to ignore"); - else if (r_ptr->sleep > 95) spoil_out(" pays very little attention to"); - else if (r_ptr->sleep > 75) spoil_out(" pays little attention to"); - else if (r_ptr->sleep > 45) spoil_out(" tends to overlook"); - else if (r_ptr->sleep > 25) spoil_out(" takes quite a while to see"); - else if (r_ptr->sleep > 10) spoil_out(" takes a while to see"); - else if (r_ptr->sleep > 5) spoil_out(" is fairly observant of"); - else if (r_ptr->sleep > 3) spoil_out(" is observant of"); - else if (r_ptr->sleep > 1) spoil_out(" is very observant of"); - else if (r_ptr->sleep > 0) spoil_out(" is vigilant for"); - else spoil_out(" is ever vigilant for"); - - sprintf(buf, " intruders, which %s may notice from %d feet. ", - wd_lhe[msex], 10 * r_ptr->aaf); - spoil_out(buf); -#endif - - - i = 0; - if (flags1 & (RF1_DROP_60)) i += 1; - if (flags1 & (RF1_DROP_90)) i += 2; - if (flags1 & (RF1_DROP_1D2)) i += 2; - if (flags1 & (RF1_DROP_2D2)) i += 4; - if (flags1 & (RF1_DROP_3D2)) i += 6; - if (flags1 & (RF1_DROP_4D2)) i += 8; + /* Step 2: Scan the evolution trees and remove "partial tree" */ + for (i = 1; i < max_r_idx; i++) + { + /* Not evolution tree */ + if (!evol_tree[i][0]) continue; - /* Drops gold and/or items */ - if (i) + for (j = 1; j < max_r_idx; j++) { - sin = FALSE; - spoil_out(wd_che[msex]); - spoil_out(" will carry"); + /* Same tree */ + if (i == j) continue; - if (i == 1) - { - spoil_out(" a"); sin = TRUE; - } - else if (i == 2) - { - spoil_out(" one or two"); - sin = TRUE; - } - else - { - sprintf(buf, " up to %u", i); - spoil_out(buf); - } - - if (flags1 & (RF1_DROP_GREAT)) - { - if (sin) spoil_out("n"); - spoil_out(" exceptional object"); - } - else if (flags1 & (RF1_DROP_GOOD)) - { - spoil_out(" good object"); - } - else if (flags1 & (RF1_DROP_USEFUL)) - { - spoil_out(" useful object"); - } - else if (flags1 & (RF1_ONLY_ITEM)) - { - spoil_out(" object"); - } - else if (flags1 & (RF1_ONLY_GOLD)) - { - spoil_out(" treasure"); - } - else - { - spoil_out(" object"); - if (i > 1) spoil_out("s"); - spoil_out(" or treasure"); - } - if (i > 1) spoil_out("s"); + /* Not evolution tree */ + if (!evol_tree[j][0]) continue; - if (flags1 & (RF1_DROP_CHOSEN)) + /* Is evolution tree[i] is part of [j]? */ + if (is_partial_tree(evol_tree[j], evol_tree[i])) { - spoil_out(", in addition to chosen objects"); + /* Remove this evolution tree */ + evol_tree[i][0] = 0; + break; } - - spoil_out(". "); } + } - /* Count the actual attacks */ - for (i = 0, j = 0; j < 4; j++) - { - if (r_ptr->blow[j].method) i++; - } - - /* Examine the actual attacks */ - for (k = 0, j = 0; j < 4; j++) - { - if (!r_ptr->blow[j].method) continue; - - if (r_ptr->blow[j].method == RBM_SHOOT) continue; - - /* No method yet */ - p = "???"; - - /* Acquire the method */ - switch (r_ptr->blow[j].method) - { -#ifdef JP -case RBM_HIT: p = "²¥¤ë"; break; -case RBM_TOUCH: p = "¿¨¤ë"; break; -case RBM_PUNCH: p = "¥Ñ¥ó¥Á¤¹¤ë"; break; -case RBM_KICK: p = "½³¤ë"; break; -case RBM_CLAW: p = "¤Ò¤Ã¤«¤¯"; break; -case RBM_BITE: p = "³ú¤à"; break; -case RBM_STING: p = "»É¤¹"; break; -case RBM_SLASH: p = "»Â¤ë"; break; -#else - case RBM_HIT: p = "hit"; break; - case RBM_TOUCH: p = "touch"; break; - case RBM_PUNCH: p = "punch"; break; - case RBM_KICK: p = "kick"; break; - case RBM_CLAW: p = "claw"; break; - case RBM_BITE: p = "bite"; break; - case RBM_STING: p = "sting"; break; - case RBM_SLASH: p = "slash"; break; -#endif -#ifdef JP -case RBM_BUTT: p = "³Ñ¤ÇÆͤ¯"; break; -case RBM_CRUSH: p = "ÂÎÅö¤¿¤ê¤¹¤ë"; break; -case RBM_ENGULF: p = "°û¤ß¹þ¤à"; break; -case RBM_CHARGE: p = "ÀÁµá½ñ¤ò¤è¤³¤¹"; break; -case RBM_CRAWL: p = "ÂΤξå¤òÇ礤²ó¤ë"; break; -case RBM_DROOL: p = "¤è¤À¤ì¤ò¤¿¤é¤¹"; break; -case RBM_SPIT: p = "¤Ä¤Ð¤òÅǤ¯"; break; -case RBM_EXPLODE: p = "Çúȯ¤¹¤ë"; break; -case RBM_GAZE: p = "¤Ë¤é¤à"; break; -case RBM_WAIL: p = "µã¤­¶«¤Ö"; break; -case RBM_SPORE: p = "˦»Ò¤òÈô¤Ð¤¹"; break; -#else - case RBM_BUTT: p = "butt"; break; - case RBM_CRUSH: p = "crush"; break; - case RBM_ENGULF: p = "engulf"; break; - case RBM_CHARGE: p = "charge"; break; - case RBM_CRAWL: p = "crawl on you"; break; - case RBM_DROOL: p = "drool on you"; break; - case RBM_SPIT: p = "spit"; break; - case RBM_EXPLODE: p = "explode"; break; - case RBM_GAZE: p = "gaze"; break; - case RBM_WAIL: p = "wail"; break; - case RBM_SPORE: p = "release spores"; break; -#endif - - case RBM_XXX4: break; -#ifdef JP -case RBM_BEG: p = "¶â¤ò¤»¤¬¤à"; break; -case RBM_INSULT: p = "Éî¿«¤¹¤ë"; break; -case RBM_MOAN: p = "¤¦¤á¤¯"; break; -case RBM_SHOW: p = "²Î¤¦"; break; -#else - case RBM_BEG: p = "beg"; break; - case RBM_INSULT: p = "insult"; break; - case RBM_MOAN: p = "moan"; break; - case RBM_SHOW: p = "sing"; break; -#endif - - } - - - /* Default effect */ - q = "???"; - - /* Acquire the effect */ - switch (r_ptr->blow[j].effect) - { -#ifdef JP -case RBE_SUPERHURT: -case RBE_HURT: q = "¹¶·â¤¹¤ë"; break; -case RBE_POISON: q = "ÆǤò¤¯¤é¤ï¤¹"; break; -case RBE_UN_BONUS: q = "Îô²½¤µ¤»¤ë"; break; -case RBE_UN_POWER: q = "ËâÎϤòµÛ¤¤¼è¤ë"; break; -case RBE_EAT_GOLD: q = "¶â¤òÅð¤à"; break; -case RBE_EAT_ITEM: q = "¥¢¥¤¥Æ¥à¤òÅð¤à"; break; -case RBE_EAT_FOOD: q = "¤¢¤Ê¤¿¤Î¿©ÎÁ¤ò¿©¤Ù¤ë"; break; -case RBE_EAT_LITE: q = "ÌÀ¤«¤ê¤òµÛ¼ý¤¹¤ë"; break; -case RBE_ACID: q = "»À¤òÈô¤Ð¤¹"; break; -case RBE_ELEC: q = "´¶ÅŤµ¤»¤ë"; break; -#else - case RBE_SUPERHURT: - case RBE_HURT: q = "attack"; break; - case RBE_POISON: q = "poison"; break; - case RBE_UN_BONUS: q = "disenchant"; break; - case RBE_UN_POWER: q = "drain charges"; break; - case RBE_EAT_GOLD: q = "steal gold"; break; - case RBE_EAT_ITEM: q = "steal items"; break; - case RBE_EAT_FOOD: q = "eat your food"; break; - case RBE_EAT_LITE: q = "absorb light"; break; - case RBE_ACID: q = "shoot acid"; break; - case RBE_ELEC: q = "electrocute"; break; -#endif + /* Step 3: Sort the evolution trees */ -#ifdef JP -case RBE_FIRE: q = "dz¤ä¤¹"; break; -case RBE_COLD: q = "Åà¤é¤»¤ë"; break; -case RBE_BLIND: q = "ÌÕÌܤˤ¹¤ë"; break; -case RBE_CONFUSE: q = "º®Í𤵤»¤ë"; break; -case RBE_TERRIFY: q = "¶²Éݤµ¤»¤ë"; break; -case RBE_PARALYZE: q = "Ëãá㤵¤»¤ë"; break; -case RBE_LOSE_STR: q = "ÏÓÎϤò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_INT: q = "ÃÎǽ¤ò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_WIS: q = "¸­¤µ¤ò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_DEX: q = "´ïÍѤµ¤ò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_CON: q = "Âѵ×ÎϤò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_CHR: q = "Ì¥ÎϤò¸º¾¯¤µ¤»¤ë"; break; -case RBE_LOSE_ALL: q = "Á´¥¹¥Æ¡¼¥¿¥¹¤ò¸º¾¯¤µ¤»¤ë"; break; -case RBE_SHATTER: q = "Ê´ºÕ¤¹¤ë"; break; -case RBE_EXP_10: q = "·Ð¸³Ãͤò¸º¾¯(10d6+)¤µ¤»¤ë"; break; -case RBE_EXP_20: q = "·Ð¸³Ãͤò¸º¾¯(20d6+)¤µ¤»¤ë"; break; -case RBE_EXP_40: q = "·Ð¸³Ãͤò¸º¾¯(40d6+)¤µ¤»¤ë"; break; -case RBE_EXP_80: q = "·Ð¸³Ãͤò¸º¾¯(80d6+)¤µ¤»¤ë"; break; -case RBE_DISEASE: q = "ɵ¤¤Ë¤¹¤ë"; break; -case RBE_TIME: q = "»þ´ÖµÕž"; break; -case RBE_EXP_VAMP: q = "À¸Ì¿ÎϤòµÛ¼ý¤¹¤ë"; break; -case RBE_DR_MANA: q = "ËâÎϤòÃ¥¤¦"; break; -#else - case RBE_FIRE: q = "burn"; break; - case RBE_COLD: q = "freeze"; break; - case RBE_BLIND: q = "blind"; break; - case RBE_CONFUSE: q = "confuse"; break; - case RBE_TERRIFY: q = "terrify"; break; - case RBE_PARALYZE: q = "paralyze"; break; - case RBE_LOSE_STR: q = "reduce strength"; break; - case RBE_LOSE_INT: q = "reduce intelligence"; break; - case RBE_LOSE_WIS: q = "reduce wisdom"; break; - case RBE_LOSE_DEX: q = "reduce dexterity"; break; - case RBE_LOSE_CON: q = "reduce constitution"; break; - case RBE_LOSE_CHR: q = "reduce charisma"; break; - case RBE_LOSE_ALL: q = "reduce all stats"; break; - case RBE_SHATTER: q = "shatter"; break; - case RBE_EXP_10: q = "lower experience (by 10d6+)"; break; - case RBE_EXP_20: q = "lower experience (by 20d6+)"; break; - case RBE_EXP_40: q = "lower experience (by 40d6+)"; break; - case RBE_EXP_80: q = "lower experience (by 80d6+)"; break; - case RBE_DISEASE: q = "disease"; break; - case RBE_TIME: q = "time"; break; - case RBE_EXP_VAMP: q = "drain life force"; break; - case RBE_DR_MANA: q = "drain mana force"; break; -#endif - } + /* Select the sort method */ + ang_sort_comp = ang_sort_comp_evol_tree; + ang_sort_swap = ang_sort_swap_evol_tree; + /* Sort the array */ + ang_sort(evol_tree, NULL, max_r_idx); - if (!k) - { - spoil_out(wd_che[msex]); - spoil_out(" can "); - } - else if (k < i-1) - { - spoil_out(", "); - } - else - { - spoil_out(", and "); - } - - /* Describe the method */ - spoil_out(p); + /* Step 4: Print the evolution trees */ + for (i = 0; i < max_r_idx; i++) + { + r_idx = evol_tree[i][0]; - /* Describe the effect, if any */ - if (r_ptr->blow[j].effect) - { - spoil_out(" to "); - spoil_out(q); - if (r_ptr->blow[j].d_dice && r_ptr->blow[j].d_side) - { - spoil_out(" with damage"); - if (r_ptr->blow[j].d_side == 1) - sprintf(buf, " %d", r_ptr->blow[j].d_dice); - else - sprintf(buf, " %dd%d", - r_ptr->blow[j].d_dice, r_ptr->blow[j].d_side); - spoil_out(buf); - } - } + /* No evolution or removed evolution tree */ + if (!r_idx) continue; - k++; - } + /* Trace the evolution tree */ + r_ptr = &r_info[r_idx]; + fprintf(fff, _("[%d]: %s (レベル%d, '%c')\n", "[%d]: %s (Level %d, '%c')\n"), + r_idx, r_name + r_ptr->name, (int)r_ptr->level, r_ptr->d_char); - if (k) - { - spoil_out(". "); - } - else if (flags1 & (RF1_NEVER_BLOW)) + for (n = 1; r_ptr->next_exp; n++) { - sprintf(buf, "%s has no physical attacks. ", wd_che[msex]); - spoil_out(buf); + fprintf(fff, "%*s-(%ld)-> ", n * 2, "", (long int)r_ptr->next_exp); + fprintf(fff, "[%d]: ", r_ptr->next_r_idx); + r_ptr = &r_info[r_ptr->next_r_idx]; + fprintf(fff, _("%s (レベル%d, '%c')\n", "%s (Level %d, '%c')\n"), + r_name + r_ptr->name, (int)r_ptr->level, r_ptr->d_char); } - spoil_out(NULL); + /* End of evolution tree */ + fputc('\n', fff); } - /* Free the "who" array */ - C_KILL(who, max_r_idx, s16b); + /* Free the "evol_tree" array (2-dimension) */ + C_KILL(evol_tree_zero, max_r_idx * (MAX_EVOL_DEPTH + 1), int); + C_KILL(evol_tree, max_r_idx, int *); /* Check for errors */ if (ferror(fff) || my_fclose(fff)) @@ -3162,30 +2497,21 @@ case RBE_DR_MANA: q = " - - - /* * Forward declare */ extern void do_cmd_spoilers(void); -/* +/*! + * @brief スポイラー出力を行うコマンドのメインルーチン / * Create Spoiler files -BEN- + * @return なし */ void do_cmd_spoilers(void) { - int i; - - /* Save the screen */ screen_save(); - - /* Drop priv's */ - safe_setuid_drop(); - - /* Interact */ while (1) { @@ -3196,73 +2522,65 @@ void do_cmd_spoilers(void) prt("Create a spoiler file.", 2, 0); /* Prompt for a file */ - prt("(1) Brief Object Info (obj-desc.spo)", 5, 5); - prt("(2) Brief Artifact Info (artifact.spo)", 6, 5); - prt("(3) Brief Monster Info (mon-desc.spo)", 7, 5); - prt("(4) Full Monster Info (mon-info.spo)", 8, 5); + prt("(1) Brief Object Info (obj-desc.txt)", 5, 5); + prt("(2) Brief Artifact Info (artifact.txt)", 6, 5); + prt("(3) Brief Monster Info (mon-desc.txt)", 7, 5); + prt("(4) Full Monster Info (mon-info.txt)", 8, 5); + prt("(5) Monster Evolution Info (mon-evol.txt)", 9, 5); /* Prompt */ -#ifdef JP -prt("¥³¥Þ¥ó¥É:", 18, 0); -#else - prt("Command: ", 12, 0); -#endif - + prt(_("コマンド:", "Command: "), _(18, 12), 0); /* Get a choice */ - i = inkey(); - - /* Escape */ - if (i == ESCAPE) + switch (inkey()) { - break; - } + /* Escape */ + case ESCAPE: + /* Restore the screen */ + screen_load(); + return; /* Option (1) */ - else if (i == '1') - { - spoil_obj_desc("obj-desc.spo"); - } + case '1': + spoil_obj_desc("obj-desc.txt"); + break; /* Option (2) */ - else if (i == '2') - { - spoil_artifact("artifact.spo"); - } + case '2': + spoil_artifact("artifact.txt"); + break; /* Option (3) */ - else if (i == '3') - { - spoil_mon_desc("mon-desc.spo"); - } + case '3': + spoil_mon_desc("mon-desc.txt"); + break; /* Option (4) */ - else if (i == '4') - { - spoil_mon_info("mon-info.spo"); - } + case '4': + spoil_mon_info("mon-info.txt"); + break; - /* Oops */ - else - { + /* Option (5) */ + case '5': + spoil_mon_evol("mon-evol.txt"); + break; + + default: bell(); + break; } /* Flush messages */ msg_print(NULL); } - - - /* Grab priv's */ - safe_setuid_grab(); - - - /* Restore the screen */ - screen_load(); } -/* +/*! + * @brief ランダムアーティファクト1件を解析する / * Fill in an object description structure for a given object + * @param o_ptr ランダムアーティファクトのオブジェクト構造体参照ポインタ + * @param desc_ptr 記述内容を収める構造体参照ポインタ + * @return なし */ static void random_artifact_analyze(object_type *o_ptr, obj_desc_list *desc_ptr) { @@ -3276,7 +2594,7 @@ static void random_artifact_analyze(object_type *o_ptr, obj_desc_list *desc_ptr) analyze_misc_magic(o_ptr, desc_ptr->misc_magic); desc_ptr->activation = item_activation(o_ptr); #ifdef JP - sprintf(desc_ptr->misc_desc, "½Å¤µ %d.%d kg", + sprintf(desc_ptr->misc_desc, "重さ %d.%d kg", lbtokg1(o_ptr->weight), lbtokg2(o_ptr->weight)); #else sprintf(desc_ptr->misc_desc, "Weight %d.%d lbs", @@ -3284,8 +2602,14 @@ static void random_artifact_analyze(object_type *o_ptr, obj_desc_list *desc_ptr) #endif } -/* Create a spoiler file entry for an artifact */ - +/*! + * @brief ランダムアーティファクト1件をスポイラー出力する / + * Create a spoiler file entry for an artifact + * @param o_ptr ランダムアーティファクトのオブジェクト構造体参照ポインタ + * @param art_ptr 記述内容を収めた構造体参照ポインタ + * Fill in an object description structure for a given object + * @return なし + */ static void spoiler_print_randart(object_type *o_ptr, obj_desc_list *art_ptr) { pval_info_type *pval_ptr = &art_ptr->pval_info; @@ -3298,33 +2622,25 @@ static void spoiler_print_randart(object_type *o_ptr, obj_desc_list *art_ptr) /* unidentified */ if (!(o_ptr->ident & (IDENT_MENTAL))) { -#ifdef JP - fprintf(fff, "%sÉÔÌÀ\n",INDENT1); -#else - fprintf(fff, "%sUnknown\n",INDENT1); -#endif + fprintf(fff, _("%s不明\n", "%sUnknown\n"),INDENT1); } else { /* An "empty" pval description indicates that the pval affects nothing */ if (pval_ptr->pval_desc[0]) { /* Mention the effects of pval */ -#ifdef JP - sprintf(buf, "%s¤Î½¤Àµ:", pval_ptr->pval_desc); -#else - sprintf(buf, "%s to", pval_ptr->pval_desc); -#endif + sprintf(buf, _("%sの修正:", "%s to"), pval_ptr->pval_desc); spoiler_outlist(buf, pval_ptr->pval_affects, ITEM_SEP); } - + /* Now deal with the description lists */ #ifdef JP - spoiler_outlist("ÂÐ:", art_ptr->slays, ITEM_SEP); - spoiler_outlist("Éð´ï°À­:", art_ptr->brands, LIST_SEP); - spoiler_outlist("ÌȱÖ:", art_ptr->immunities, ITEM_SEP); - spoiler_outlist("ÂÑÀ­:", art_ptr->resistances, ITEM_SEP); - spoiler_outlist("°Ý»ý:", art_ptr->sustains, ITEM_SEP); + spoiler_outlist("対:", art_ptr->slays, ITEM_SEP); + spoiler_outlist("武器属性:", art_ptr->brands, LIST_SEP); + spoiler_outlist("免疫:", art_ptr->immunities, ITEM_SEP); + spoiler_outlist("耐性:", art_ptr->resistances, ITEM_SEP); + spoiler_outlist("維持:", art_ptr->sustains, ITEM_SEP); #else spoiler_outlist("Slay", art_ptr->slays, ITEM_SEP); spoiler_outlist("", art_ptr->brands, LIST_SEP); @@ -3337,24 +2653,25 @@ static void spoiler_print_randart(object_type *o_ptr, obj_desc_list *art_ptr) /* Write out the possible activation at the primary indention level */ if (art_ptr->activation) { -#ifdef JP - fprintf(fff, "%sȯư: %s\n", INDENT1, art_ptr->activation); -#else - fprintf(fff, "%sActivates for %s\n", INDENT1, art_ptr->activation); -#endif + fprintf(fff, _("%s発動: %s\n", "%sActivates for %s\n"), INDENT1, art_ptr->activation); } } /* End with the miscellaneous facts */ fprintf(fff, "%s%s\n\n", INDENT1, art_ptr->misc_desc); } -/* Create a part of file for random artifacts */ +/*! + * @brief ランダムアーティファクト内容をスポイラー出力するサブルーチン / + * @param o_ptr ランダムアーティファクトのオブジェクト構造体参照ポインタ + * @param i 出力したい記録ランダムアーティファクトID + * @return なし + */ static void spoil_random_artifact_aux(object_type *o_ptr, int i) { obj_desc_list artifact; - if (!object_known_p(o_ptr) || !o_ptr->art_name + if (!object_is_known(o_ptr) || !o_ptr->art_name || o_ptr->tval != group_artifact[i].tval) return; @@ -3365,8 +2682,11 @@ static void spoil_random_artifact_aux(object_type *o_ptr, int i) spoiler_print_randart(o_ptr, &artifact); } -/* +/*! + * @brief ランダムアーティファクト内容をスポイラー出力するメインルーチン / * Create a list file for random artifacts + * @param fname 出力ファイル名 + * @return なし */ void spoil_random_artifact(cptr fname) { @@ -3378,11 +2698,8 @@ void spoil_random_artifact(cptr fname) char buf[1024]; - /* Drop priv's */ - safe_setuid_drop(); - /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_USER, fname); + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); /* File type is "TEXT" */ FILE_TYPE(FILE_TYPE_TEXT); @@ -3390,7 +2707,6 @@ void spoil_random_artifact(cptr fname) /* Open the file */ fff = my_fopen(buf, "w"); - /* Oops */ if (!fff) { msg_print("Cannot create list file."); @@ -3442,10 +2758,6 @@ void spoil_random_artifact(cptr fname) return; } - /* Grab priv's */ - safe_setuid_grab(); - - /* Message */ msg_print("Successfully created a list file."); }