OSDN Git Service

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