OSDN Git Service

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