OSDN Git Service

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