OSDN Git Service

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