OSDN Git Service

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