OSDN Git Service

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