OSDN Git Service

Merge branch 'Release-3.0.0Alpha' into release/3.0.0Alpha
[hengband/hengband.git] / src / cmd-item / cmd-smith.c
1 /*!
2  * @brief プレイヤーの鍛冶コマンド実装
3  * @date 2019/03/11
4  * @author deskull
5  */
6
7 #include "cmd-item/cmd-smith.h"
8 #include "action/action-limited.h"
9 #include "autopick/autopick.h"
10 #include "core/asking-player.h"
11 #include "core/player-update-types.h"
12 #include "core/window-redrawer.h"
13 #include "flavor/flavor-describer.h"
14 #include "flavor/object-flavor-types.h"
15 #include "floor/floor-object.h"
16 #include "game-option/text-display-options.h"
17 #include "io/command-repeater.h"
18 #include "io/input-key-acceptor.h"
19 #include "io/input-key-requester.h"
20 #include "main/sound-of-music.h"
21 #include "mind/mind-weaponsmith.h"
22 #include "object-enchant/object-ego.h"
23 #include "object-enchant/special-object-flags.h"
24 #include "object-enchant/tr-types.h"
25 #include "object-enchant/trc-types.h"
26 #include "object-hook/hook-armor.h"
27 #include "object-hook/hook-enchant.h"
28 #include "object-hook/hook-weapon.h"
29 #include "object/item-tester-hooker.h"
30 #include "object/item-use-flags.h"
31 #include "object/object-flags.h" // todo 相互参照している.
32 #include "object/object-generator.h"
33 #include "perception/object-perception.h"
34 #include "player/player-status.h"
35 #include "term/screen-processor.h"
36 #include "term/term-color-types.h"
37 #include "util/bit-flags-calculator.h"
38 #include "util/buffer-shaper.h"
39 #include "util/int-char-converter.h"
40 #include "view/display-messages.h"
41
42 /*!
43  * エッセンス情報の構造体 / A structure for smithing
44  */
45 typedef struct {
46     int add; /* TR flag number or special essence id */
47     concptr add_name; /* Name of this ability */
48     ESSENCE_IDX type; /* Menu number */
49     int essence; /* Index for carrying essences */
50     int value; /* Needed value to add this ability */
51 } essence_type;
52
53 /*!
54  * エッセンス情報テーブル Smithing type data for Weapon smith
55  */
56 #ifdef JP
57 static essence_type essence_info[] = { { TR_STR, "腕力", 4, TR_STR, 20 }, { TR_INT, "知能", 4, TR_INT, 20 }, { TR_WIS, "賢さ", 4, TR_WIS, 20 },
58     { TR_DEX, "器用さ", 4, TR_DEX, 20 }, { TR_CON, "耐久力", 4, TR_CON, 20 }, { TR_CHR, "魅力", 4, TR_CHR, 20 },
59     { TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "隠密", 4, TR_STEALTH, 40 }, { TR_SEARCH, "探索", 4, TR_SEARCH, 15 },
60     { TR_INFRA, "赤外線視力", 4, TR_INFRA, 15 }, { TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15 }, { TR_SPEED, "スピード", 4, TR_SPEED, 12 },
61     { TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60 },
62     { TR_IMPACT, "地震発動", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20 }, { TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20 },
63     { TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20 }, { TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20 },
64     { TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15 }, { TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15 },
65     { TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15 },
66     { TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20 }, { TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20 },
67     { TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "反射", 2, TR_REFLECT, 20 }, { TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20 },
68     { TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20 }, { TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15 },
69     { TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15 }, { TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25 },
70     { TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20 }, { TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20 },
71     { TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20 }, { TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20 },
72     { TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20 }, { TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20 },
73     { TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20 }, { TR_SH_FIRE, "", 0, -2, 0 },
74     { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15 }, { TR_WARNING, "警告", 3, TR_WARNING, 20 },
75     { TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "永久光源", 3, TR_LITE_1, 15 }, { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 },
76     { TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20 }, { TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15 },
77     { TR_REGEN, "急速回復", 3, TR_REGEN, 20 }, { TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25 },
78
79     { TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100 }, { TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60 },
80     { TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20 }, { TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60 },
81     { TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60 },
82     { TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60 },
83     { TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60 },
84     { TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15 }, { TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60 },
85     { TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20 }, { TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60 },
86     { TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20 }, { TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60 },
87     { TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20 }, { TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60 },
88
89     { TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40 }, { TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40 },
90     { TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40 }, { TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40 },
91     { TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40 },
92
93     { ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "防御", 10, TR_ES_AC, 15 }, { ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50 },
94     { ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50 }, { ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50 },
95     { ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50 }, { ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50 }, { ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50 },
96     { ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50 }, { ESSENCE_RESISTANCE, "全耐性", 2, -1, 150 }, { ESSENCE_SUSTAIN, "装備保持", 10, -1, 10 },
97     { ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200 },
98
99     { -1, NULL, 0, -1, 0 } };
100 #else
101 static essence_type essence_info[] = { { TR_STR, "strength", 4, TR_STR, 20 }, { TR_INT, "intelligence", 4, TR_INT, 20 }, { TR_WIS, "wisdom", 4, TR_WIS, 20 },
102     { TR_DEX, "dexterity", 4, TR_DEX, 20 }, { TR_CON, "constitution", 4, TR_CON, 20 }, { TR_CHR, "charisma", 4, TR_CHR, 20 },
103     { TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "stealth", 4, TR_STEALTH, 40 }, { TR_SEARCH, "serching", 4, TR_SEARCH, 15 },
104     { TR_INFRA, "infravision", 4, TR_INFRA, 15 }, { TR_TUNNEL, "digging", 4, TR_TUNNEL, 15 }, { TR_SPEED, "speed", 4, TR_SPEED, 12 },
105     { TR_BLOWS, "extra attack", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60 },
106     { TR_IMPACT, "quake activation", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20 },
107     { TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20 }, { TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20 },
108     { TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20 },
109     { TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15 },
110     { TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15 }, { TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15 },
111     { TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15 },
112     { TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20 },
113     { TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20 }, { TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "reflection", 2, TR_REFLECT, 20 },
114     { TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20 }, { TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20 },
115     { TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15 },
116     { TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15 },
117     { TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25 }, { TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20 },
118     { TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20 },
119     { TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20 },
120     { TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20 }, { TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20 },
121     { TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20 },
122     { TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20 },
123     { TR_SH_FIRE, "", 0, -2, 0 }, { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15 },
124     { TR_WARNING, "warning", 3, TR_WARNING, 20 }, { TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "permanent light", 3, TR_LITE_1, 15 },
125     { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 }, { TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20 },
126     { TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15 },
127     { TR_REGEN, "regeneration", 3, TR_REGEN, 20 }, { TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25 },
128
129     { TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100 }, { TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20 },
130     { TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60 }, { TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60 },
131     { TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60 },
132     { TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60 },
133     { TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60 }, { TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15 },
134     { TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60 }, { TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20 },
135     { TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60 }, { TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20 },
136     { TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60 }, { TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20 },
137     { TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60 },
138
139     { TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40 },
140     { TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40 }, { TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40 },
141     { TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40 },
142     { TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40 },
143
144     { ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15 },
145     { ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50 }, { ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50 },
146     { ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50 }, { ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50 },
147     { ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50 }, { ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50 }, { ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50 },
148     { ESSENCE_RESISTANCE, "resistance", 2, -1, 150 }, { ESSENCE_SUSTAIN, "elements proof", 10, -1, 10 },
149     { ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200 },
150
151     { -1, NULL, 0, -1, 0 } };
152 #endif
153
154 /*!
155  * エッセンス名テーブル / Essense names for Weapon smith
156  */
157 #ifdef JP
158 concptr essence_name[] = { "腕力", "知能", "賢さ", "器用さ", "耐久力", "魅力", "魔力支配", "", "隠密", "探索", "赤外線視力", "採掘", "スピード", "追加攻撃",
159     "カオス攻撃", "吸血攻撃", "動物倍打", "邪悪倍打", "不死倍打", "悪魔倍打", "オーク倍打", "トロル倍打", "巨人倍打", "竜倍打", "", "", "地震", "毒殺", "溶解",
160     "電撃", "焼棄", "凍結", "能力維持", "", "", "", "", "", "", "", "免疫", "", "", "", "", "反射", "麻痺知らず", "経験値維持", "耐酸", "耐電撃", "耐火炎",
161     "耐冷気", "耐毒", "耐恐怖", "耐閃光", "耐暗黒", "耐盲目", "耐混乱", "耐轟音", "耐破片", "耐地獄", "耐因果混乱", "耐カオス", "耐劣化", "", "", "人間倍打",
162     "", "", "反魔法", "", "", "警告", "", "", "", "浮遊", "永久光源", "可視透明", "テレパシー", "遅消化", "急速回復", "", "", "", "", "", "", "", "",
163     "テレポート", "", "", "攻撃", "防御",
164
165     NULL };
166
167 #else
168
169 concptr essence_name[] = { "strength", "intelligen.", "wisdom", "dexterity", "constitut.", "charisma", "magic mast.", "", "stealth", "serching", "infravision",
170     "digging", "speed", "extra atk", "chaos brand", "vampiric", "slay animal", "slay evil", "slay undead", "slay demon", "slay orc", "slay troll", "slay giant",
171     "slay dragon", "", "", "quake", "pois. brand", "acid brand", "elec. brand", "fire brand", "cold brand", "sustain", "", "", "", "", "", "", "", "immunity",
172     "", "", "", "", "reflection", "free action", "hold exp", "res. acid", "res. elec.", "res. fire", "res. cold", "res. poison", "res. fear", "res. light",
173     "res. dark", "res. blind", "res.confuse", "res. sound", "res. shard", "res. nether", "res. nexus", "res. chaos", "res. disen.", "", "", "slay human", "",
174     "", "anti magic", "", "", "warning", "", "", "", "levitation", "perm. light", "see invis.", "telepathy", "slow dige.", "regen.", "", "", "", "", "", "", "",
175     "", "teleport", "", "", "weapon enc.", "armor enc.",
176
177     NULL };
178 #endif
179
180 static concptr const kaji_tips[5] = {
181 #ifdef JP
182     "現在持っているエッセンスの一覧を表示する。",
183     "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
184     "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
185     "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
186     "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
187 #else
188     "Display essences you have.",
189     "Extract essences from an item. The item become non magical.",
190     "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
191     "Add essences to an item. The improved items or artifacts cannot be reimprove.",
192     "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
193 #endif
194 };
195
196 /*!
197  * @brief 所持しているエッセンス一覧を表示する
198  * @return なし
199  */
200 static void display_essence(player_type *creature_ptr)
201 {
202     int i, num = 0;
203
204     screen_save();
205     for (i = 1; i < 22; i++) {
206         prt("", i, 0);
207     }
208     prt(_("エッセンス   個数     エッセンス   個数     エッセンス   個数", "Essence      Num      Essence      Num      Essence      Num "), 1, 8);
209     for (i = 0; essence_name[i]; i++) {
210         if (!essence_name[i][0])
211             continue;
212         prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22);
213         num++;
214     }
215     prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
216     (void)inkey();
217     screen_load();
218     return;
219 }
220
221 /*!
222  * @brief エッセンスの抽出処理
223  * @param creature_ptr プレーヤーへの参照ポインタ
224  * @return なし
225  */
226 static void drain_essence(player_type *creature_ptr)
227 {
228     int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)];
229     size_t i;
230     OBJECT_IDX item;
231     int dec = 4;
232     bool observe = FALSE;
233     int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
234     TIME_EFFECT old_timeout;
235     BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
236     object_type *o_ptr;
237     concptr q, s;
238     POSITION iy, ix;
239     byte marked;
240     ITEM_NUMBER number;
241     OBJECT_IDX next_o_idx;
242
243     for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
244         drain_value[i] = 0;
245
246     item_tester_hook = object_is_weapon_armour_ammo;
247
248     q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
249     s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
250
251     o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
252     if (!o_ptr)
253         return;
254
255     if (object_is_known(o_ptr) && !object_is_nameless(creature_ptr, o_ptr)) {
256         GAME_TEXT o_name[MAX_NLEN];
257         describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
258         if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name)))
259             return;
260     }
261
262     take_turn(creature_ptr, 100);
263
264     object_flags(creature_ptr, o_ptr, old_flgs);
265     if (has_flag(old_flgs, TR_KILL_DRAGON))
266         add_flag(old_flgs, TR_SLAY_DRAGON);
267     if (has_flag(old_flgs, TR_KILL_ANIMAL))
268         add_flag(old_flgs, TR_SLAY_ANIMAL);
269     if (has_flag(old_flgs, TR_KILL_EVIL))
270         add_flag(old_flgs, TR_SLAY_EVIL);
271     if (has_flag(old_flgs, TR_KILL_UNDEAD))
272         add_flag(old_flgs, TR_SLAY_UNDEAD);
273     if (has_flag(old_flgs, TR_KILL_DEMON))
274         add_flag(old_flgs, TR_SLAY_DEMON);
275     if (has_flag(old_flgs, TR_KILL_ORC))
276         add_flag(old_flgs, TR_SLAY_ORC);
277     if (has_flag(old_flgs, TR_KILL_TROLL))
278         add_flag(old_flgs, TR_SLAY_TROLL);
279     if (has_flag(old_flgs, TR_KILL_GIANT))
280         add_flag(old_flgs, TR_SLAY_GIANT);
281     if (has_flag(old_flgs, TR_KILL_HUMAN))
282         add_flag(old_flgs, TR_SLAY_HUMAN);
283
284     old_to_a = o_ptr->to_a;
285     old_ac = o_ptr->ac;
286     old_to_h = o_ptr->to_h;
287     old_to_d = o_ptr->to_d;
288     old_ds = o_ptr->ds;
289     old_dd = o_ptr->dd;
290     old_pval = o_ptr->pval;
291     old_name2 = o_ptr->name2;
292     old_timeout = o_ptr->timeout;
293     if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE))
294         dec--;
295     if (has_flag(old_flgs, TR_ADD_L_CURSE))
296         dec--;
297     if (has_flag(old_flgs, TR_ADD_H_CURSE))
298         dec--;
299     if (has_flag(old_flgs, TR_AGGRAVATE))
300         dec--;
301     if (has_flag(old_flgs, TR_NO_TELE))
302         dec--;
303     if (has_flag(old_flgs, TR_DRAIN_EXP))
304         dec--;
305     if (has_flag(old_flgs, TR_DRAIN_HP))
306         dec--;
307     if (has_flag(old_flgs, TR_DRAIN_MANA))
308         dec--;
309     if (has_flag(old_flgs, TR_CALL_ANIMAL))
310         dec--;
311     if (has_flag(old_flgs, TR_CALL_DEMON))
312         dec--;
313     if (has_flag(old_flgs, TR_CALL_DRAGON))
314         dec--;
315     if (has_flag(old_flgs, TR_CALL_UNDEAD))
316         dec--;
317     if (has_flag(old_flgs, TR_COWARDICE))
318         dec--;
319     if (has_flag(old_flgs, TR_LOW_MELEE))
320         dec--;
321     if (has_flag(old_flgs, TR_LOW_AC))
322         dec--;
323     if (has_flag(old_flgs, TR_LOW_MAGIC))
324         dec--;
325     if (has_flag(old_flgs, TR_FAST_DIGEST))
326         dec--;
327     if (has_flag(old_flgs, TR_SLOW_REGEN))
328         dec--;
329     if (has_flag(old_flgs, TR_TY_CURSE))
330         dec--;
331
332     iy = o_ptr->iy;
333     ix = o_ptr->ix;
334     next_o_idx = o_ptr->next_o_idx;
335     marked = o_ptr->marked;
336     number = o_ptr->number;
337
338     object_prep(creature_ptr, o_ptr, o_ptr->k_idx);
339
340     o_ptr->iy = iy;
341     o_ptr->ix = ix;
342     o_ptr->next_o_idx = next_o_idx;
343     o_ptr->marked = marked;
344     o_ptr->number = number;
345     if (o_ptr->tval == TV_DRAG_ARMOR)
346         o_ptr->timeout = old_timeout;
347     o_ptr->ident |= (IDENT_FULL_KNOWN);
348     object_aware(creature_ptr, o_ptr);
349     object_known(o_ptr);
350
351     object_flags(creature_ptr, o_ptr, new_flgs);
352
353     for (i = 0; essence_info[i].add_name; i++) {
354         essence_type *es_ptr = &essence_info[i];
355         PARAMETER_VALUE pval = 0;
356
357         if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
358             pval = (has_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
359
360         if (es_ptr->add < TR_FLAG_MAX && (!has_flag(new_flgs, es_ptr->add) || pval) && has_flag(old_flgs, es_ptr->add)) {
361             if (pval) {
362                 drain_value[es_ptr->essence] += 10 * pval;
363             } else if (es_ptr->essence != -2) {
364                 drain_value[es_ptr->essence] += 10;
365             } else if (es_ptr->add == TR_SH_FIRE) {
366                 drain_value[TR_BRAND_FIRE] += 10;
367                 drain_value[TR_RES_FIRE] += 10;
368             } else if (es_ptr->add == TR_SH_ELEC) {
369                 drain_value[TR_BRAND_ELEC] += 10;
370                 drain_value[TR_RES_ELEC] += 10;
371             } else if (es_ptr->add == TR_SH_COLD) {
372                 drain_value[TR_BRAND_COLD] += 10;
373                 drain_value[TR_RES_COLD] += 10;
374             } else if (es_ptr->add == TR_LITE_2) {
375                 drain_value[TR_LITE_1] += 20;
376             } else if (es_ptr->add == TR_LITE_3) {
377                 drain_value[TR_LITE_1] += 30;
378             }
379         }
380     }
381
382     if ((has_flag(old_flgs, TR_FORCE_WEAPON)) && !(has_flag(new_flgs, TR_FORCE_WEAPON))) {
383         drain_value[TR_INT] += 5;
384         drain_value[TR_WIS] += 5;
385     }
386     if ((has_flag(old_flgs, TR_VORPAL)) && !(has_flag(new_flgs, TR_VORPAL))) {
387         drain_value[TR_BRAND_POIS] += 5;
388         drain_value[TR_BRAND_ACID] += 5;
389         drain_value[TR_BRAND_ELEC] += 5;
390         drain_value[TR_BRAND_FIRE] += 5;
391         drain_value[TR_BRAND_COLD] += 5;
392     }
393     if ((has_flag(old_flgs, TR_DEC_MANA)) && !(has_flag(new_flgs, TR_DEC_MANA))) {
394         drain_value[TR_INT] += 10;
395     }
396     if ((has_flag(old_flgs, TR_XTRA_MIGHT)) && !(has_flag(new_flgs, TR_XTRA_MIGHT))) {
397         drain_value[TR_STR] += 10;
398     }
399     if ((has_flag(old_flgs, TR_XTRA_SHOTS)) && !(has_flag(new_flgs, TR_XTRA_SHOTS))) {
400         drain_value[TR_DEX] += 10;
401     }
402     if (old_name2 == EGO_2WEAPON) {
403         drain_value[TR_DEX] += 20;
404     }
405     if (object_is_weapon_ammo(o_ptr)) {
406         if (old_ds > o_ptr->ds)
407             drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10;
408
409         if (old_dd > o_ptr->dd)
410             drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10;
411     }
412     if (old_to_h > o_ptr->to_h)
413         drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10;
414     if (old_to_d > o_ptr->to_d)
415         drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10;
416     if (old_ac > o_ptr->ac)
417         drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10;
418     if (old_to_a > o_ptr->to_a)
419         drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10;
420
421     for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) {
422         drain_value[i] *= number;
423         drain_value[i] = drain_value[i] * dec / 4;
424         drain_value[i] = MAX(drain_value[i], 0);
425         if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT))
426             drain_value[i] /= 10;
427         if (drain_value[i]) {
428             observe = TRUE;
429         }
430     }
431     if (!observe) {
432         msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
433     } else {
434         msg_print(_("抽出したエッセンス:", "Extracted essences:"));
435
436         for (i = 0; essence_name[i]; i++) {
437             if (!essence_name[i][0])
438                 continue;
439             if (!drain_value[i])
440                 continue;
441
442             creature_ptr->magic_num1[i] += drain_value[i];
443             creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]);
444             msg_print(NULL);
445             msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
446         }
447     }
448
449     /* Apply autodestroy/inscription to the drained item */
450     autopick_alter_item(creature_ptr, item, TRUE);
451     creature_ptr->update |= (PU_COMBINE | PU_REORDER);
452     creature_ptr->window |= (PW_INVEN);
453 }
454
455 /*!
456  * @brief 付加するエッセンスの大別を選択する
457  * @return 選んだエッセンスの大別ID
458  */
459 static COMMAND_CODE choose_essence(void)
460 {
461     COMMAND_CODE mode = 0;
462     char choice;
463     COMMAND_CODE menu_line = (use_menu ? 1 : 0);
464
465 #ifdef JP
466     concptr menu_name[] = { "武器属性", "耐性", "能力", "数値", "スレイ", "ESP", "その他" };
467 #else
468     concptr menu_name[] = { "Brand weapon", "Resistance", "Ability", "Magic number", "Slay", "ESP", "Others" };
469 #endif
470     const COMMAND_CODE mode_max = 7;
471
472     if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
473         return mode;
474     mode = 0;
475     if (use_menu) {
476         screen_save();
477
478         while (!mode) {
479             int i;
480             for (i = 0; i < mode_max; i++)
481 #ifdef JP
482                 prt(format(" %s %s", (menu_line == 1 + i) ? "》" : "  ", menu_name[i]), 2 + i, 14);
483             prt("どの種類のエッセンス付加を行いますか?", 0, 0);
484 #else
485                 prt(format(" %s %s", (menu_line == 1 + i) ? "> " : "  ", menu_name[i]), 2 + i, 14);
486             prt("Choose from menu.", 0, 0);
487 #endif
488
489             choice = inkey();
490             switch (choice) {
491             case ESCAPE:
492             case 'z':
493             case 'Z':
494                 screen_load();
495                 return 0;
496             case '2':
497             case 'j':
498             case 'J':
499                 menu_line++;
500                 break;
501             case '8':
502             case 'k':
503             case 'K':
504                 menu_line += mode_max - 1;
505                 break;
506             case '\r':
507             case '\n':
508             case 'x':
509             case 'X':
510                 mode = menu_line;
511                 break;
512             }
513             if (menu_line > mode_max)
514                 menu_line -= mode_max;
515         }
516         screen_load();
517     } else {
518         screen_save();
519         while (!mode) {
520             int i;
521
522             for (i = 0; i < mode_max; i++)
523                 prt(format("  %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
524
525             if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE)) {
526                 screen_load();
527                 return 0;
528             }
529
530             if (isupper(choice))
531                 choice = (char)tolower(choice);
532
533             if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
534                 mode = (int)choice - 'a' + 1;
535         }
536         screen_load();
537     }
538
539     repeat_push(mode);
540     return mode;
541 }
542
543 /*!
544  * @brief エッセンスを実際に付加する
545  * @param mode エッセンスの大別ID
546  * @return なし
547  */
548 static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode)
549 {
550     OBJECT_IDX item;
551     int max_num = 0;
552     COMMAND_CODE i;
553     bool flag, redraw;
554     char choice;
555     concptr q, s;
556     object_type *o_ptr;
557     int ask = TRUE;
558     char out_val[160];
559     int num[22];
560     GAME_TEXT o_name[MAX_NLEN];
561     int use_essence;
562     essence_type *es_ptr;
563     bool able[22] = { 0 };
564     tval_type tval = 0;
565     int menu_line = (use_menu ? 1 : 0);
566
567     for (i = 0; essence_info[i].add_name; i++) {
568         es_ptr = &essence_info[i];
569
570         if (es_ptr->type != mode)
571             continue;
572         num[max_num++] = i;
573     }
574
575     if (!repeat_pull(&i) || i < 0 || i >= max_num) {
576         flag = FALSE;
577         redraw = FALSE;
578
579         (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
580         if (use_menu)
581             screen_save();
582
583         choice = (always_show_list || use_menu) ? ESCAPE : 1;
584         while (!flag) {
585             if (choice == ESCAPE)
586                 choice = ' ';
587             else if (!get_com(out_val, &choice, FALSE))
588                 break;
589
590             if (use_menu && choice != ' ') {
591                 switch (choice) {
592                 case '0': {
593                     screen_load();
594                     return;
595                 }
596
597                 case '8':
598                 case 'k':
599                 case 'K': {
600                     menu_line += (max_num - 1);
601                     break;
602                 }
603
604                 case '2':
605                 case 'j':
606                 case 'J': {
607                     menu_line++;
608                     break;
609                 }
610
611                 case '4':
612                 case 'h':
613                 case 'H': {
614                     menu_line = 1;
615                     break;
616                 }
617                 case '6':
618                 case 'l':
619                 case 'L': {
620                     menu_line = max_num;
621                     break;
622                 }
623
624                 case 'x':
625                 case 'X':
626                 case '\r':
627                 case '\n': {
628                     i = menu_line - 1;
629                     ask = FALSE;
630                     break;
631                 }
632                 }
633                 if (menu_line > max_num)
634                     menu_line -= max_num;
635             }
636             /* Request redraw */
637             if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) {
638                 /* Show the list */
639                 if (!redraw || use_menu) {
640                     byte y, x = 10;
641                     int ctr;
642                     char dummy[80], dummy2[80];
643                     byte col;
644
645                     strcpy(dummy, "");
646                     redraw = TRUE;
647                     if (!use_menu)
648                         screen_save();
649
650                     for (y = 1; y < 24; y++)
651                         prt("", y, x);
652
653                         /* Print header(s) */
654 #ifdef JP
655                     prt(format("   %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
656
657 #else
658                     prt(format("   %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
659 #endif
660                     /* Print list */
661                     for (ctr = 0; ctr < max_num; ctr++) {
662                         es_ptr = &essence_info[num[ctr]];
663
664                         if (use_menu) {
665                             if (ctr == (menu_line - 1))
666                                 strcpy(dummy, _("》 ", ">  "));
667                             else
668                                 strcpy(dummy, "   ");
669
670                         }
671                         /* letter/number for power selection */
672                         else {
673                             sprintf(dummy, "%c) ", I2A(ctr));
674                         }
675
676                         strcat(dummy, es_ptr->add_name);
677
678                         col = TERM_WHITE;
679                         able[ctr] = TRUE;
680
681                         if (es_ptr->essence != -1) {
682                             strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
683                             if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value)
684                                 able[ctr] = FALSE;
685                         } else {
686                             switch (es_ptr->add) {
687                             case ESSENCE_SH_FIRE:
688                                 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
689                                 if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value)
690                                     able[ctr] = FALSE;
691                                 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
692                                     able[ctr] = FALSE;
693                                 break;
694                             case ESSENCE_SH_ELEC:
695                                 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
696                                 if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value)
697                                     able[ctr] = FALSE;
698                                 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
699                                     able[ctr] = FALSE;
700                                 break;
701                             case ESSENCE_SH_COLD:
702                                 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
703                                 if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value)
704                                     able[ctr] = FALSE;
705                                 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
706                                     able[ctr] = FALSE;
707                                 break;
708                             case ESSENCE_RESISTANCE:
709                                 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
710                                 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
711                                     able[ctr] = FALSE;
712                                 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
713                                     able[ctr] = FALSE;
714                                 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
715                                     able[ctr] = FALSE;
716                                 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value)
717                                     able[ctr] = FALSE;
718                                 break;
719                             case ESSENCE_SUSTAIN:
720                                 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
721                                 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
722                                     able[ctr] = FALSE;
723                                 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
724                                     able[ctr] = FALSE;
725                                 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
726                                     able[ctr] = FALSE;
727                                 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value)
728                                     able[ctr] = FALSE;
729                                 break;
730                             }
731                         }
732
733                         if (!able[ctr])
734                             col = TERM_RED;
735
736                         if (es_ptr->essence != -1) {
737                             sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]);
738                         } else {
739                             sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
740                         }
741
742                         c_prt(col, dummy2, ctr + 2, x);
743                     }
744                 }
745
746                 /* Hide the list */
747                 else {
748                     /* Hide list */
749                     redraw = FALSE;
750                     screen_load();
751                 }
752
753                 /* Redo asking */
754                 continue;
755             }
756
757             if (!use_menu) {
758                 /* Note verify */
759                 ask = (isupper(choice));
760
761                 /* Lowercase */
762                 if (ask)
763                     choice = (char)tolower(choice);
764
765                 /* Extract request */
766                 i = (islower(choice) ? A2I(choice) : -1);
767             }
768
769             /* Totally Illegal */
770             if ((i < 0) || (i >= max_num) || !able[i]) {
771                 bell();
772                 continue;
773             }
774
775             /* Verify it */
776             if (ask) {
777                 char tmp_val[160];
778
779                 /* Prompt */
780                 (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
781
782                 /* Belay that order */
783                 if (!get_check(tmp_val))
784                     continue;
785             }
786
787             /* Stop the loop */
788             flag = TRUE;
789         }
790         if (redraw)
791             screen_load();
792
793         if (!flag)
794             return;
795
796         repeat_push(i);
797     }
798     es_ptr = &essence_info[num[i]];
799
800     if (es_ptr->add == ESSENCE_SLAY_GLOVE)
801         tval = TV_GLOVES;
802     else if (mode == 1 || mode == 5)
803         item_tester_hook = item_tester_hook_melee_ammo;
804     else if (es_ptr->add == ESSENCE_ATTACK)
805         item_tester_hook = object_allow_enchant_weapon;
806     else if (es_ptr->add == ESSENCE_AC)
807         item_tester_hook = object_is_armour;
808     else
809         item_tester_hook = object_is_weapon_armour_ammo;
810
811     q = _("どのアイテムを改良しますか?", "Improve which item? ");
812     s = _("改良できるアイテムがありません。", "You have nothing to improve.");
813
814     o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval);
815     if (!o_ptr)
816         return;
817
818     if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(creature_ptr, o_ptr))) {
819         msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further."));
820         return;
821     }
822
823     describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
824
825     use_essence = es_ptr->value;
826     if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT))
827         use_essence = (use_essence + 9) / 10;
828     if (o_ptr->number > 1) {
829         use_essence *= o_ptr->number;
830         msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence);
831     }
832
833     if (es_ptr->essence != -1) {
834         if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
835             msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
836             return;
837         }
838         if (is_pval_flag(es_ptr->add)) {
839             if (o_ptr->pval < 0) {
840                 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
841                 return;
842             } else if (es_ptr->add == TR_BLOWS) {
843                 if (o_ptr->pval > 1) {
844                     if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? ")))
845                         return;
846                 }
847
848                 o_ptr->pval = 1;
849                 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
850             } else if (o_ptr->pval > 0) {
851                 use_essence *= o_ptr->pval;
852                 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
853             } else {
854                 char tmp[80];
855                 char tmp_val[160];
856                 PARAMETER_VALUE pval;
857                 PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value);
858
859                 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
860                 strcpy(tmp_val, "1");
861
862                 if (!get_string(tmp, tmp_val, 1))
863                     return;
864                 pval = (PARAMETER_VALUE)atoi(tmp_val);
865                 if (pval > limit)
866                     pval = limit;
867                 else if (pval < 1)
868                     pval = 1;
869                 o_ptr->pval += pval;
870                 use_essence *= pval;
871                 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
872             }
873
874             if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
875                 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
876                 return;
877             }
878         } else if (es_ptr->add == ESSENCE_SLAY_GLOVE) {
879             char tmp_val[160];
880             int val;
881             HIT_PROB get_to_h;
882             HIT_POINT get_to_d;
883
884             strcpy(tmp_val, "1");
885             if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2))
886                 return;
887             val = atoi(tmp_val);
888             if (val > creature_ptr->lev / 7 + 3)
889                 val = creature_ptr->lev / 7 + 3;
890             else if (val < 1)
891                 val = 1;
892             use_essence *= val;
893             msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
894             if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
895                 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
896                 return;
897             }
898             get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1));
899             get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1));
900             o_ptr->xtra4 = (get_to_h << 8) + get_to_d;
901             o_ptr->to_h += get_to_h;
902             o_ptr->to_d += get_to_d;
903         }
904         creature_ptr->magic_num1[es_ptr->essence] -= use_essence;
905         if (es_ptr->add == ESSENCE_ATTACK) {
906             if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5)) {
907                 msg_print(_("改良に失敗した。", "You failed to enchant."));
908                 take_turn(creature_ptr, 100);
909                 return;
910             } else {
911                 if (o_ptr->to_h < creature_ptr->lev / 5 + 5)
912                     o_ptr->to_h++;
913                 if (o_ptr->to_d < creature_ptr->lev / 5 + 5)
914                     o_ptr->to_d++;
915             }
916         } else if (es_ptr->add == ESSENCE_AC) {
917             if (o_ptr->to_a >= creature_ptr->lev / 5 + 5) {
918                 msg_print(_("改良に失敗した。", "You failed to enchant."));
919                 take_turn(creature_ptr, 100);
920                 return;
921             } else {
922                 if (o_ptr->to_a < creature_ptr->lev / 5 + 5)
923                     o_ptr->to_a++;
924             }
925         } else {
926             o_ptr->xtra3 = es_ptr->add + 1;
927         }
928     } else {
929         bool success = TRUE;
930
931         switch (es_ptr->add) {
932         case ESSENCE_SH_FIRE:
933             if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence)) {
934                 success = FALSE;
935                 break;
936             }
937             creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
938             creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
939             break;
940         case ESSENCE_SH_ELEC:
941             if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)) {
942                 success = FALSE;
943                 break;
944             }
945             creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
946             creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
947             break;
948         case ESSENCE_SH_COLD:
949             if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) {
950                 success = FALSE;
951                 break;
952             }
953             creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
954             creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
955             break;
956         case ESSENCE_RESISTANCE:
957         case ESSENCE_SUSTAIN:
958             if ((creature_ptr->magic_num1[TR_RES_ACID] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)
959                 || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) {
960                 success = FALSE;
961                 break;
962             }
963             creature_ptr->magic_num1[TR_RES_ACID] -= use_essence;
964             creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
965             creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
966             creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
967             break;
968         }
969         if (!success) {
970             msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
971             return;
972         }
973         if (es_ptr->add == ESSENCE_SUSTAIN) {
974             add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
975             add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
976             add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
977             add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
978         } else {
979             o_ptr->xtra3 = es_ptr->add + 1;
980         }
981     }
982
983     take_turn(creature_ptr, 100);
984     _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name), msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name));
985     creature_ptr->update |= (PU_COMBINE | PU_REORDER);
986     creature_ptr->window |= (PW_INVEN);
987 }
988
989 /*!
990  * @brief エッセンスを消去する
991  * @return なし
992  */
993 static void erase_essence(player_type *creature_ptr)
994 {
995     OBJECT_IDX item;
996     concptr q, s;
997     object_type *o_ptr;
998     GAME_TEXT o_name[MAX_NLEN];
999     BIT_FLAGS flgs[TR_FLAG_SIZE];
1000
1001     item_tester_hook = object_is_smith;
1002
1003     q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
1004     s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
1005
1006     o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
1007     if (!o_ptr)
1008         return;
1009
1010     describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1011     if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name)))
1012         return;
1013
1014     take_turn(creature_ptr, 100);
1015
1016     if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE) {
1017         o_ptr->to_h -= (o_ptr->xtra4 >> 8);
1018         o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
1019         o_ptr->xtra4 = 0;
1020         if (o_ptr->to_h < 0)
1021             o_ptr->to_h = 0;
1022         if (o_ptr->to_d < 0)
1023             o_ptr->to_d = 0;
1024     }
1025     o_ptr->xtra3 = 0;
1026     object_flags(creature_ptr, o_ptr, flgs);
1027     if (!(has_pval_flags(flgs)))
1028         o_ptr->pval = 0;
1029     msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
1030     creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1031     creature_ptr->window |= (PW_INVEN);
1032 }
1033
1034 /*!
1035  * @brief 鍛冶コマンドのメインルーチン
1036  * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
1037  * @return なし
1038  */
1039 void do_cmd_kaji(player_type *creature_ptr, bool only_browse)
1040 {
1041     COMMAND_CODE mode = 0;
1042     char choice;
1043
1044     COMMAND_CODE menu_line = (use_menu ? 1 : 0);
1045
1046     if (!only_browse) {
1047         if (cmd_limit_confused(creature_ptr))
1048             return;
1049         if (cmd_limit_blind(creature_ptr))
1050             return;
1051         if (cmd_limit_image(creature_ptr))
1052             return;
1053     }
1054
1055     if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5)) {
1056         if (only_browse)
1057             screen_save();
1058         do {
1059             if (!only_browse)
1060                 screen_save();
1061             if (use_menu) {
1062                 while (!mode) {
1063 #ifdef JP
1064                     prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : "  "), 2, 14);
1065                     prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : "  "), 3, 14);
1066                     prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : "  "), 4, 14);
1067                     prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : "  "), 5, 14);
1068                     prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : "  "), 6, 14);
1069                     prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
1070 #else
1071                     prt(format(" %s List essences", (menu_line == 1) ? "> " : "  "), 2, 14);
1072                     prt(format(" %s Extract essence", (menu_line == 2) ? "> " : "  "), 3, 14);
1073                     prt(format(" %s Remove essence", (menu_line == 3) ? "> " : "  "), 4, 14);
1074                     prt(format(" %s Add essence", (menu_line == 4) ? "> " : "  "), 5, 14);
1075                     prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : "  "), 6, 14);
1076                     prt(format("Choose command from menu."), 0, 0);
1077 #endif
1078                     choice = inkey();
1079                     switch (choice) {
1080                     case ESCAPE:
1081                     case 'z':
1082                     case 'Z':
1083                         screen_load();
1084                         return;
1085                     case '2':
1086                     case 'j':
1087                     case 'J':
1088                         menu_line++;
1089                         break;
1090                     case '8':
1091                     case 'k':
1092                     case 'K':
1093                         menu_line += 4;
1094                         break;
1095                     case '\r':
1096                     case '\n':
1097                     case 'x':
1098                     case 'X':
1099                         mode = menu_line;
1100                         break;
1101                     }
1102                     if (menu_line > 5)
1103                         menu_line -= 5;
1104                 }
1105             }
1106
1107             else {
1108                 while (!mode) {
1109                     prt(_("  a) エッセンス一覧", "  a) List essences"), 2, 14);
1110                     prt(_("  b) エッセンス抽出", "  b) Extract essence"), 3, 14);
1111                     prt(_("  c) エッセンス消去", "  c) Remove essence"), 4, 14);
1112                     prt(_("  d) エッセンス付加", "  d) Add essence"), 5, 14);
1113                     prt(_("  e) 武器/防具強化", "  e) Enchant weapon/armor"), 6, 14);
1114 #ifdef JP
1115                     if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
1116 #else
1117                     if (!get_com("Command :", &choice, TRUE))
1118 #endif
1119                     {
1120                         screen_load();
1121                         return;
1122                     }
1123                     switch (choice) {
1124                     case 'A':
1125                     case 'a':
1126                         mode = 1;
1127                         break;
1128                     case 'B':
1129                     case 'b':
1130                         mode = 2;
1131                         break;
1132                     case 'C':
1133                     case 'c':
1134                         mode = 3;
1135                         break;
1136                     case 'D':
1137                     case 'd':
1138                         mode = 4;
1139                         break;
1140                     case 'E':
1141                     case 'e':
1142                         mode = 5;
1143                         break;
1144                     }
1145                 }
1146             }
1147
1148             if (only_browse) {
1149                 char temp[62 * 5];
1150                 int line, j;
1151
1152                 /* Clear lines, position cursor  (really should use strlen here) */
1153                 term_erase(14, 21, 255);
1154                 term_erase(14, 20, 255);
1155                 term_erase(14, 19, 255);
1156                 term_erase(14, 18, 255);
1157                 term_erase(14, 17, 255);
1158                 term_erase(14, 16, 255);
1159
1160                 shape_buffer(kaji_tips[mode - 1], 62, temp, sizeof(temp));
1161                 for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j]))) {
1162                     prt(&temp[j], line, 15);
1163                     line++;
1164                 }
1165                 mode = 0;
1166             }
1167             if (!only_browse)
1168                 screen_load();
1169         } while (only_browse);
1170         repeat_push(mode);
1171     }
1172     switch (mode) {
1173     case 1:
1174         display_essence(creature_ptr);
1175         break;
1176     case 2:
1177         drain_essence(creature_ptr);
1178         break;
1179     case 3:
1180         erase_essence(creature_ptr);
1181         break;
1182     case 4:
1183         mode = choose_essence();
1184         if (mode == 0)
1185             break;
1186         add_essence(creature_ptr, mode);
1187         break;
1188     case 5:
1189         add_essence(creature_ptr, 10);
1190         break;
1191     }
1192 }