2 * @brief プレイヤーの鍛冶コマンド実装
7 #include "cmd-item/cmd-smith.h"
8 #include "autopick/autopick.h"
9 #include "cmd/cmd-basic.h"
10 #include "core/asking-player.h"
11 #include "core/player-update-types.h"
12 #include "core/window-redrawer.h"
13 #include "floor/floor-object.h"
14 #include "game-option/text-display-options.h"
15 #include "io/command-repeater.h"
16 #include "io/input-key-acceptor.h"
17 #include "io/input-key-requester.h"
18 #include "main/sound-of-music.h"
19 #include "mind/mind-weaponsmith.h"
20 #include "object-enchant/object-ego.h"
21 #include "object-enchant/special-object-flags.h"
22 #include "object-enchant/tr-types.h"
23 #include "object-enchant/trc-types.h"
24 #include "object-hook/hook-armor.h"
25 #include "object-hook/hook-enchant.h"
26 #include "object-hook/hook-weapon.h"
27 #include "object/item-use-flags.h"
28 #include "object/object-flags.h" // todo 相互参照している.
29 #include "object/object-flavor.h"
30 #include "object/object-generator.h"
31 #include "object/item-tester-hooker.h"
32 #include "perception/object-perception.h"
33 #include "player/player-status.h"
34 #include "term/screen-processor.h"
35 #include "term/term-color-types.h"
36 #include "util/bit-flags-calculator.h"
37 #include "util/buffer-shaper.h"
38 #include "util/int-char-converter.h"
39 #include "view/display-messages.h"
42 * エッセンス情報の構造体 / A structure for smithing
45 int add; /* TR flag number or special essence id */
46 concptr add_name; /* Name of this ability */
47 ESSENCE_IDX type; /* Menu number */
48 int essence; /* Index for carrying essences */
49 int value; /* Needed value to add this ability */
54 * エッセンス情報テーブル Smithing type data for Weapon smith
57 static essence_type essence_info[] =
59 {TR_STR, "腕力", 4, TR_STR, 20},
60 {TR_INT, "知能", 4, TR_INT, 20},
61 {TR_WIS, "賢さ", 4, TR_WIS, 20},
62 {TR_DEX, "器用さ", 4, TR_DEX, 20},
63 {TR_CON, "耐久力", 4, TR_CON, 20},
64 {TR_CHR, "魅力", 4, TR_CHR, 20},
65 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
66 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
67 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
68 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
69 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
70 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
71 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
72 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
73 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
74 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
75 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
76 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
77 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
78 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
79 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
80 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
81 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
82 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
83 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
84 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
85 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
86 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
87 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
88 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
89 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
90 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
91 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
92 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
93 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
94 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
95 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
96 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
97 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
98 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
99 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
100 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
101 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
102 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
103 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
104 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
105 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
106 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
107 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
108 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
109 {TR_SH_FIRE, "", 0, -2, 0},
110 {TR_SH_ELEC, "", 0, -2, 0},
111 {TR_SH_COLD, "", 0, -2, 0},
112 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
113 {TR_WARNING, "警告", 3, TR_WARNING, 20},
114 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
115 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
116 {TR_LITE_2, "", 0, -2, 0},
117 {TR_LITE_3, "", 0, -2, 0},
118 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
119 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
120 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
121 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
122 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
124 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
125 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
126 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
127 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
128 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
129 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
130 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
131 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
132 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
133 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
134 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
135 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
136 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
137 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
138 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
139 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
140 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
141 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
143 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
144 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
145 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
146 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
147 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
148 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
149 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
150 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
152 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
153 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
154 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
155 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
156 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
157 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
158 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
159 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
160 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
161 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
162 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
163 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
168 static essence_type essence_info[] =
170 {TR_STR, "strength", 4, TR_STR, 20},
171 {TR_INT, "intelligence", 4, TR_INT, 20},
172 {TR_WIS, "wisdom", 4, TR_WIS, 20},
173 {TR_DEX, "dexterity", 4, TR_DEX, 20},
174 {TR_CON, "constitution", 4, TR_CON, 20},
175 {TR_CHR, "charisma", 4, TR_CHR, 20},
176 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
177 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
178 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
179 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
180 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
181 {TR_SPEED, "speed", 4, TR_SPEED, 12},
182 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
183 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
184 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
185 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
186 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
187 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
188 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
189 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
190 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
191 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
192 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
193 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
194 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
195 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
196 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
197 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
198 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
199 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
200 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
201 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
202 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
203 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
204 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
205 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
206 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
207 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
208 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
209 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
210 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
211 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
212 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
213 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
214 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
215 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
216 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
217 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
218 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
219 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
220 {TR_SH_FIRE, "", 0, -2, 0},
221 {TR_SH_ELEC, "", 0, -2, 0},
222 {TR_SH_COLD, "", 0, -2, 0},
223 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
224 {TR_WARNING, "warning", 3, TR_WARNING, 20},
225 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
226 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
227 {TR_LITE_2, "", 0, -2, 0},
228 {TR_LITE_3, "", 0, -2, 0},
229 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
230 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
231 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
232 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
233 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
235 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
236 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
237 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
238 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
239 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
240 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
241 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
242 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
243 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
244 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
245 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
246 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
247 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
248 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
249 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
250 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
251 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
252 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
254 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
255 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
256 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
257 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
258 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
259 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
260 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
261 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
263 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
264 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
265 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
266 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
267 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
268 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
269 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
270 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
271 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
272 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
273 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
274 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
282 * エッセンス名テーブル / Essense names for Weapon smith
285 concptr essence_name[] =
388 concptr essence_name[] =
490 static concptr const kaji_tips[5] =
493 "現在持っているエッセンスの一覧を表示する。",
494 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
495 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
496 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
497 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
499 "Display essences you have.",
500 "Extract essences from an item. The item become non magical.",
501 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
502 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
503 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
509 * @brief 所持しているエッセンス一覧を表示する
512 static void display_essence(player_type *creature_ptr)
517 for (i = 1; i < 22; i++)
521 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
522 "Essence Num Essence Num Essence Num "), 1, 8);
523 for (i = 0; essence_name[i]; i++)
525 if (!essence_name[i][0]) continue;
526 prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22);
529 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
537 * @param creature_ptr プレーヤーへの参照ポインタ
540 static void drain_essence(player_type *creature_ptr)
542 int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)];
546 bool observe = FALSE;
547 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
548 TIME_EFFECT old_timeout;
549 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
555 OBJECT_IDX next_o_idx;
558 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
561 item_tester_hook = object_is_weapon_armour_ammo;
563 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
564 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
566 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
569 if (object_is_known(o_ptr) && !object_is_nameless(creature_ptr, o_ptr))
571 GAME_TEXT o_name[MAX_NLEN];
572 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
573 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
576 take_turn(creature_ptr, 100);
578 object_flags(creature_ptr, o_ptr, old_flgs);
579 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
580 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
581 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
582 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
583 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
584 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
585 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
586 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
587 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
589 old_to_a = o_ptr->to_a;
591 old_to_h = o_ptr->to_h;
592 old_to_d = o_ptr->to_d;
595 old_pval = o_ptr->pval;
596 old_name2 = o_ptr->name2;
597 old_timeout = o_ptr->timeout;
598 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
599 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
600 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
601 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
602 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
603 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
604 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
605 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
606 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
607 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
608 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
609 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
610 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
611 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
612 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
613 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
614 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
615 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
616 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
620 next_o_idx = o_ptr->next_o_idx;
621 marked = o_ptr->marked;
622 weight = o_ptr->weight;
623 number = o_ptr->number;
625 object_prep(creature_ptr, o_ptr, o_ptr->k_idx);
629 o_ptr->next_o_idx = next_o_idx;
630 o_ptr->marked = marked;
631 o_ptr->number = number;
632 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
633 if (item >= 0) creature_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight * number);
634 o_ptr->ident |= (IDENT_FULL_KNOWN);
635 object_aware(creature_ptr, o_ptr);
638 object_flags(creature_ptr, o_ptr, new_flgs);
640 for (i = 0; essence_info[i].add_name; i++)
642 essence_type *es_ptr = &essence_info[i];
643 PARAMETER_VALUE pval = 0;
645 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
646 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
648 if (es_ptr->add < TR_FLAG_MAX &&
649 (!have_flag(new_flgs, es_ptr->add) || pval) &&
650 have_flag(old_flgs, es_ptr->add))
654 drain_value[es_ptr->essence] += 10 * pval;
656 else if (es_ptr->essence != -2)
658 drain_value[es_ptr->essence] += 10;
660 else if (es_ptr->add == TR_SH_FIRE)
662 drain_value[TR_BRAND_FIRE] += 10;
663 drain_value[TR_RES_FIRE] += 10;
665 else if (es_ptr->add == TR_SH_ELEC)
667 drain_value[TR_BRAND_ELEC] += 10;
668 drain_value[TR_RES_ELEC] += 10;
670 else if (es_ptr->add == TR_SH_COLD)
672 drain_value[TR_BRAND_COLD] += 10;
673 drain_value[TR_RES_COLD] += 10;
675 else if (es_ptr->add == TR_LITE_2)
677 drain_value[TR_LITE_1] += 20;
679 else if (es_ptr->add == TR_LITE_3)
681 drain_value[TR_LITE_1] += 30;
686 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
688 drain_value[TR_INT] += 5;
689 drain_value[TR_WIS] += 5;
691 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
693 drain_value[TR_BRAND_POIS] += 5;
694 drain_value[TR_BRAND_ACID] += 5;
695 drain_value[TR_BRAND_ELEC] += 5;
696 drain_value[TR_BRAND_FIRE] += 5;
697 drain_value[TR_BRAND_COLD] += 5;
699 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
701 drain_value[TR_INT] += 10;
703 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
705 drain_value[TR_STR] += 10;
707 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
709 drain_value[TR_DEX] += 10;
711 if (old_name2 == EGO_2WEAPON)
713 drain_value[TR_DEX] += 20;
715 if (object_is_weapon_ammo(o_ptr))
717 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10;
719 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10;
721 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10;
722 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10;
723 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10;
724 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10;
726 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
728 drain_value[i] *= number;
729 drain_value[i] = drain_value[i] * dec / 4;
730 drain_value[i] = MAX(drain_value[i], 0);
731 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
739 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
743 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
745 for (i = 0; essence_name[i]; i++)
747 if (!essence_name[i][0]) continue;
748 if (!drain_value[i]) continue;
750 creature_ptr->magic_num1[i] += drain_value[i];
751 creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]);
753 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
757 /* Apply autodestroy/inscription to the drained item */
758 autopick_alter_item(creature_ptr, item, TRUE);
759 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
760 creature_ptr->window |= (PW_INVEN);
764 * @brief 付加するエッセンスの大別を選択する
765 * @return 選んだエッセンスの大別ID
767 static COMMAND_CODE choose_essence(void)
769 COMMAND_CODE mode = 0;
771 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
774 concptr menu_name[] = {
784 concptr menu_name[] = {
794 const COMMAND_CODE mode_max = 7;
796 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
806 for (i = 0; i < mode_max; i++)
808 prt(format(" %s %s", (menu_line == 1 + i) ? "》" : " ", menu_name[i]), 2 + i, 14);
809 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
811 prt(format(" %s %s", (menu_line == 1 + i) ? "> " : " ", menu_name[i]), 2 + i, 14);
812 prt("Choose from menu.", 0, 0);
831 menu_line += mode_max - 1;
840 if (menu_line > mode_max) menu_line -= mode_max;
851 for (i = 0; i < mode_max; i++)
852 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
854 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
860 if (isupper(choice)) choice = (char)tolower(choice);
862 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
863 mode = (int)choice - 'a' + 1;
873 * @brief エッセンスを実際に付加する
874 * @param mode エッセンスの大別ID
877 static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode)
889 GAME_TEXT o_name[MAX_NLEN];
891 essence_type *es_ptr;
892 bool able[22] = { 0 };
894 int menu_line = (use_menu ? 1 : 0);
896 for (i = 0; essence_info[i].add_name; i++)
898 es_ptr = &essence_info[i];
900 if (es_ptr->type != mode) continue;
904 if (!repeat_pull(&i) || i < 0 || i >= max_num)
909 (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
910 if (use_menu) screen_save();
912 choice = (always_show_list || use_menu) ? ESCAPE : 1;
915 if (choice == ESCAPE) choice = ' ';
916 else if (!get_com(out_val, &choice, FALSE))break;
918 if (use_menu && choice != ' ')
932 menu_line += (max_num - 1);
969 if (menu_line > max_num) menu_line -= max_num;
972 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
975 if (!redraw || use_menu)
979 char dummy[80], dummy2[80];
984 if (!use_menu) screen_save();
986 for (y = 1; y < 24; y++)
989 /* Print header(s) */
991 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
994 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
997 for (ctr = 0; ctr < max_num; ctr++)
999 es_ptr = &essence_info[num[ctr]];
1003 if (ctr == (menu_line - 1))
1004 strcpy(dummy, _("》 ", "> "));
1005 else strcpy(dummy, " ");
1008 /* letter/number for power selection */
1011 sprintf(dummy, "%c) ", I2A(ctr));
1014 strcat(dummy, es_ptr->add_name);
1019 if (es_ptr->essence != -1)
1021 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
1022 if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
1026 switch (es_ptr->add)
1028 case ESSENCE_SH_FIRE:
1029 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
1030 if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
1031 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1033 case ESSENCE_SH_ELEC:
1034 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
1035 if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
1036 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1038 case ESSENCE_SH_COLD:
1039 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
1040 if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
1041 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1043 case ESSENCE_RESISTANCE:
1044 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
1045 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1046 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1047 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1048 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
1050 case ESSENCE_SUSTAIN:
1051 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
1052 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1053 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1054 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1055 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
1060 if (!able[ctr]) col = TERM_RED;
1062 if (es_ptr->essence != -1)
1064 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]);
1068 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
1071 c_prt(col, dummy2, ctr + 2, x);
1090 ask = (isupper(choice));
1093 if (ask) choice = (char)tolower(choice);
1095 /* Extract request */
1096 i = (islower(choice) ? A2I(choice) : -1);
1099 /* Totally Illegal */
1100 if ((i < 0) || (i >= max_num) || !able[i])
1112 (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
1114 /* Belay that order */
1115 if (!get_check(tmp_val)) continue;
1121 if (redraw) screen_load();
1127 es_ptr = &essence_info[num[i]];
1129 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
1131 else if (mode == 1 || mode == 5)
1132 item_tester_hook = item_tester_hook_melee_ammo;
1133 else if (es_ptr->add == ESSENCE_ATTACK)
1134 item_tester_hook = object_allow_enchant_weapon;
1135 else if (es_ptr->add == ESSENCE_AC)
1136 item_tester_hook = object_is_armour;
1138 item_tester_hook = object_is_weapon_armour_ammo;
1140 q = _("どのアイテムを改良しますか?", "Improve which item? ");
1141 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
1143 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval);
1146 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(creature_ptr, o_ptr)))
1148 msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further."));
1152 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1154 use_essence = es_ptr->value;
1155 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence + 9) / 10;
1156 if (o_ptr->number > 1)
1158 use_essence *= o_ptr->number;
1159 msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence);
1162 if (es_ptr->essence != -1)
1164 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1166 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1169 if (is_pval_flag(es_ptr->add))
1171 if (o_ptr->pval < 0)
1173 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
1176 else if (es_ptr->add == TR_BLOWS)
1178 if (o_ptr->pval > 1)
1180 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
1184 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1186 else if (o_ptr->pval > 0)
1188 use_essence *= o_ptr->pval;
1189 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1195 PARAMETER_VALUE pval;
1196 PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value);
1198 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
1199 strcpy(tmp_val, "1");
1201 if (!get_string(tmp, tmp_val, 1)) return;
1202 pval = (PARAMETER_VALUE)atoi(tmp_val);
1203 if (pval > limit) pval = limit;
1204 else if (pval < 1) pval = 1;
1205 o_ptr->pval += pval;
1206 use_essence *= pval;
1207 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1210 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1212 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1216 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
1223 strcpy(tmp_val, "1");
1224 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2)) return;
1225 val = atoi(tmp_val);
1226 if (val > creature_ptr->lev / 7 + 3) val = creature_ptr->lev / 7 + 3;
1227 else if (val < 1) val = 1;
1229 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1230 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1232 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1235 get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1));
1236 get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1));
1237 o_ptr->xtra4 = (get_to_h << 8) + get_to_d;
1238 o_ptr->to_h += get_to_h;
1239 o_ptr->to_d += get_to_d;
1241 creature_ptr->magic_num1[es_ptr->essence] -= use_essence;
1242 if (es_ptr->add == ESSENCE_ATTACK)
1244 if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5))
1246 msg_print(_("改良に失敗した。", "You failed to enchant."));
1247 take_turn(creature_ptr, 100);
1252 if (o_ptr->to_h < creature_ptr->lev / 5 + 5) o_ptr->to_h++;
1253 if (o_ptr->to_d < creature_ptr->lev / 5 + 5) o_ptr->to_d++;
1256 else if (es_ptr->add == ESSENCE_AC)
1258 if (o_ptr->to_a >= creature_ptr->lev / 5 + 5)
1260 msg_print(_("改良に失敗した。", "You failed to enchant."));
1261 take_turn(creature_ptr, 100);
1266 if (o_ptr->to_a < creature_ptr->lev / 5 + 5) o_ptr->to_a++;
1271 o_ptr->xtra3 = es_ptr->add + 1;
1276 bool success = TRUE;
1278 switch (es_ptr->add)
1280 case ESSENCE_SH_FIRE:
1281 if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence))
1286 creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
1287 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
1289 case ESSENCE_SH_ELEC:
1290 if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence))
1295 creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
1296 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
1298 case ESSENCE_SH_COLD:
1299 if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence))
1304 creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
1305 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
1307 case ESSENCE_RESISTANCE:
1308 case ESSENCE_SUSTAIN:
1309 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))
1314 creature_ptr->magic_num1[TR_RES_ACID] -= use_essence;
1315 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
1316 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
1317 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
1322 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1325 if (es_ptr->add == ESSENCE_SUSTAIN)
1327 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1328 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1329 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1330 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1334 o_ptr->xtra3 = es_ptr->add + 1;
1338 take_turn(creature_ptr, 100);
1339 _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name),
1340 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name));
1341 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1342 creature_ptr->window |= (PW_INVEN);
1349 static void erase_essence(player_type *creature_ptr)
1354 GAME_TEXT o_name[MAX_NLEN];
1355 BIT_FLAGS flgs[TR_FLAG_SIZE];
1357 item_tester_hook = object_is_smith;
1359 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
1360 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
1362 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
1365 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1366 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
1368 take_turn(creature_ptr, 100);
1370 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
1372 o_ptr->to_h -= (o_ptr->xtra4 >> 8);
1373 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
1375 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
1376 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
1379 object_flags(creature_ptr, o_ptr, flgs);
1380 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
1381 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
1382 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1383 creature_ptr->window |= (PW_INVEN);
1387 * @brief 鍛冶コマンドのメインルーチン
1388 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
1391 void do_cmd_kaji(player_type *creature_ptr, bool only_browse)
1393 COMMAND_CODE mode = 0;
1396 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
1400 if (cmd_limit_confused(creature_ptr)) return;
1401 if (cmd_limit_blind(creature_ptr)) return;
1402 if (cmd_limit_image(creature_ptr)) return;
1405 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
1407 if (only_browse) screen_save();
1409 if (!only_browse) screen_save();
1415 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
1416 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
1417 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
1418 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
1419 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
1420 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
1422 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
1423 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
1424 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
1425 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
1426 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
1427 prt(format("Choose command from menu."), 0, 0);
1454 if (menu_line > 5) menu_line -= 5;
1462 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
1463 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
1464 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
1465 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
1466 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
1468 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
1470 if (!get_com("Command :", &choice, TRUE))
1507 /* Clear lines, position cursor (really should use strlen here) */
1508 Term_erase(14, 21, 255);
1509 Term_erase(14, 20, 255);
1510 Term_erase(14, 19, 255);
1511 Term_erase(14, 18, 255);
1512 Term_erase(14, 17, 255);
1513 Term_erase(14, 16, 255);
1515 shape_buffer(kaji_tips[mode - 1], 62, temp, sizeof(temp));
1516 for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j])))
1518 prt(&temp[j], line, 15);
1523 if (!only_browse) screen_load();
1524 } while (only_browse);
1529 case 1: display_essence(creature_ptr); break;
1530 case 2: drain_essence(creature_ptr); break;
1531 case 3: erase_essence(creature_ptr); break;
1533 mode = choose_essence();
1536 add_essence(creature_ptr, mode);
1538 case 5: add_essence(creature_ptr, 10); break;