OSDN Git Service

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