2 * @brief プレイヤーの鍛冶コマンド実装
7 #include "cmd-item/cmd-smith.h"
8 #include "autopick/autopick.h"
9 #include "cmd/cmd-basic.h"
10 #include "game-option/text-display-options.h"
11 #include "inventory/player-inventory.h"
12 #include "object-enchant/object-ego.h"
13 #include "object-enchant/special-object-flags.h"
14 #include "object-enchant/tr-types.h"
15 #include "object-enchant/trc-types.h"
16 #include "object/item-use-flags.h"
17 #include "object/object-flags.h" // todo 相互参照している.
18 #include "object/object-flavor.h"
19 #include "object/object-generator.h"
20 #include "object/object-hook.h"
21 #include "perception/object-perception.h"
22 #include "player/player-status.h"
23 #include "term/term-color-types.h"
24 #include "util/util.h"
25 #include "view/display-main-window.h"
28 * エッセンス情報の構造体 / A structure for smithing
31 int add; /* TR flag number or special essence id */
32 concptr add_name; /* Name of this ability */
33 ESSENCE_IDX type; /* Menu number */
34 int essence; /* Index for carrying essences */
35 int value; /* Needed value to add this ability */
40 * エッセンス情報テーブル Smithing type data for Weapon smith
43 static essence_type essence_info[] =
45 {TR_STR, "腕力", 4, TR_STR, 20},
46 {TR_INT, "知能", 4, TR_INT, 20},
47 {TR_WIS, "賢さ", 4, TR_WIS, 20},
48 {TR_DEX, "器用さ", 4, TR_DEX, 20},
49 {TR_CON, "耐久力", 4, TR_CON, 20},
50 {TR_CHR, "魅力", 4, TR_CHR, 20},
51 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
52 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
53 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
54 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
55 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
56 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
57 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
58 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
59 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
60 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
61 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
62 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
63 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
64 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
65 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
66 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
67 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
68 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
69 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
70 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
71 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
72 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
73 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
74 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
75 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
76 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
77 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
78 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
79 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
80 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
81 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
82 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
83 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
84 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
85 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
86 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
87 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
88 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
89 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
90 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
91 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
92 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
93 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
94 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
95 {TR_SH_FIRE, "", 0, -2, 0},
96 {TR_SH_ELEC, "", 0, -2, 0},
97 {TR_SH_COLD, "", 0, -2, 0},
98 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
99 {TR_WARNING, "警告", 3, TR_WARNING, 20},
100 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
101 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
102 {TR_LITE_2, "", 0, -2, 0},
103 {TR_LITE_3, "", 0, -2, 0},
104 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
105 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
106 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
107 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
108 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
110 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
111 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
112 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
113 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
114 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
115 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
116 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
117 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
118 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
119 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
120 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
121 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
122 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
123 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
124 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
125 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
126 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
127 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
129 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
130 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
131 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
132 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
133 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
134 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
135 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
136 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
138 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
139 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
140 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
141 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
142 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
143 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
144 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
145 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
146 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
147 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
148 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
149 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
154 static essence_type essence_info[] =
156 {TR_STR, "strength", 4, TR_STR, 20},
157 {TR_INT, "intelligence", 4, TR_INT, 20},
158 {TR_WIS, "wisdom", 4, TR_WIS, 20},
159 {TR_DEX, "dexterity", 4, TR_DEX, 20},
160 {TR_CON, "constitution", 4, TR_CON, 20},
161 {TR_CHR, "charisma", 4, TR_CHR, 20},
162 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
163 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
164 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
165 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
166 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
167 {TR_SPEED, "speed", 4, TR_SPEED, 12},
168 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
169 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
170 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
171 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
172 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
173 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
174 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
175 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
176 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
177 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
178 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
179 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
180 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
181 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
182 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
183 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
184 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
185 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
186 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
187 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
188 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
189 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
190 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
191 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
192 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
193 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
194 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
195 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
196 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
197 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
198 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
199 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
200 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
201 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
202 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
203 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
204 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
205 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
206 {TR_SH_FIRE, "", 0, -2, 0},
207 {TR_SH_ELEC, "", 0, -2, 0},
208 {TR_SH_COLD, "", 0, -2, 0},
209 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
210 {TR_WARNING, "warning", 3, TR_WARNING, 20},
211 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
212 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
213 {TR_LITE_2, "", 0, -2, 0},
214 {TR_LITE_3, "", 0, -2, 0},
215 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
216 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
217 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
218 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
219 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
221 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
222 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
223 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
224 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
225 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
226 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
227 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
228 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
229 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
230 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
231 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
232 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
233 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
234 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
235 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
236 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
237 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
238 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
240 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
241 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
242 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
243 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
244 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
245 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
246 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
247 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
249 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
250 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
251 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
252 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
253 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
254 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
255 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
256 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
257 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
258 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
259 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
260 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
268 * エッセンス名テーブル / Essense names for Weapon smith
271 concptr essence_name[] =
374 concptr essence_name[] =
476 static concptr const kaji_tips[5] =
479 "現在持っているエッセンスの一覧を表示する。",
480 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
481 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
482 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
483 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
485 "Display essences you have.",
486 "Extract essences from an item. The item become non magical.",
487 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
488 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
489 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
495 * @brief 所持しているエッセンス一覧を表示する
498 static void display_essence(player_type *creature_ptr)
503 for (i = 1; i < 22; i++)
507 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
508 "Essence Num Essence Num Essence Num "), 1, 8);
509 for (i = 0; essence_name[i]; i++)
511 if (!essence_name[i][0]) continue;
512 prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22);
515 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
523 * @param creature_ptr プレーヤーへの参照ポインタ
526 static void drain_essence(player_type *creature_ptr)
528 int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)];
532 bool observe = FALSE;
533 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
534 TIME_EFFECT old_timeout;
535 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
541 OBJECT_IDX next_o_idx;
544 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
547 item_tester_hook = object_is_weapon_armour_ammo;
549 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
550 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
552 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
555 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
557 GAME_TEXT o_name[MAX_NLEN];
558 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
559 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
562 take_turn(creature_ptr, 100);
564 object_flags(o_ptr, old_flgs);
565 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
566 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
567 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
568 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
569 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
570 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
571 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
572 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
573 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
575 old_to_a = o_ptr->to_a;
577 old_to_h = o_ptr->to_h;
578 old_to_d = o_ptr->to_d;
581 old_pval = o_ptr->pval;
582 old_name2 = o_ptr->name2;
583 old_timeout = o_ptr->timeout;
584 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
585 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
586 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
587 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
588 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
589 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
590 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
591 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
592 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
593 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
594 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
595 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
596 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
597 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
598 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
599 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
600 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
601 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
602 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
606 next_o_idx = o_ptr->next_o_idx;
607 marked = o_ptr->marked;
608 weight = o_ptr->weight;
609 number = o_ptr->number;
611 object_prep(o_ptr, o_ptr->k_idx);
615 o_ptr->next_o_idx = next_o_idx;
616 o_ptr->marked = marked;
617 o_ptr->number = number;
618 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
619 if (item >= 0) creature_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight * number);
620 o_ptr->ident |= (IDENT_FULL_KNOWN);
621 object_aware(creature_ptr, o_ptr);
624 object_flags(o_ptr, new_flgs);
626 for (i = 0; essence_info[i].add_name; i++)
628 essence_type *es_ptr = &essence_info[i];
629 PARAMETER_VALUE pval = 0;
631 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
632 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
634 if (es_ptr->add < TR_FLAG_MAX &&
635 (!have_flag(new_flgs, es_ptr->add) || pval) &&
636 have_flag(old_flgs, es_ptr->add))
640 drain_value[es_ptr->essence] += 10 * pval;
642 else if (es_ptr->essence != -2)
644 drain_value[es_ptr->essence] += 10;
646 else if (es_ptr->add == TR_SH_FIRE)
648 drain_value[TR_BRAND_FIRE] += 10;
649 drain_value[TR_RES_FIRE] += 10;
651 else if (es_ptr->add == TR_SH_ELEC)
653 drain_value[TR_BRAND_ELEC] += 10;
654 drain_value[TR_RES_ELEC] += 10;
656 else if (es_ptr->add == TR_SH_COLD)
658 drain_value[TR_BRAND_COLD] += 10;
659 drain_value[TR_RES_COLD] += 10;
661 else if (es_ptr->add == TR_LITE_2)
663 drain_value[TR_LITE_1] += 20;
665 else if (es_ptr->add == TR_LITE_3)
667 drain_value[TR_LITE_1] += 30;
672 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
674 drain_value[TR_INT] += 5;
675 drain_value[TR_WIS] += 5;
677 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
679 drain_value[TR_BRAND_POIS] += 5;
680 drain_value[TR_BRAND_ACID] += 5;
681 drain_value[TR_BRAND_ELEC] += 5;
682 drain_value[TR_BRAND_FIRE] += 5;
683 drain_value[TR_BRAND_COLD] += 5;
685 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
687 drain_value[TR_INT] += 10;
689 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
691 drain_value[TR_STR] += 10;
693 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
695 drain_value[TR_DEX] += 10;
697 if (old_name2 == EGO_2WEAPON)
699 drain_value[TR_DEX] += 20;
701 if (object_is_weapon_ammo(o_ptr))
703 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10;
705 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10;
707 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10;
708 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10;
709 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10;
710 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10;
712 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
714 drain_value[i] *= number;
715 drain_value[i] = drain_value[i] * dec / 4;
716 drain_value[i] = MAX(drain_value[i], 0);
717 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
725 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
729 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
731 for (i = 0; essence_name[i]; i++)
733 if (!essence_name[i][0]) continue;
734 if (!drain_value[i]) continue;
736 creature_ptr->magic_num1[i] += drain_value[i];
737 creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]);
739 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
743 /* Apply autodestroy/inscription to the drained item */
744 autopick_alter_item(creature_ptr, item, TRUE);
745 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
746 creature_ptr->window |= (PW_INVEN);
750 * @brief 付加するエッセンスの大別を選択する
751 * @return 選んだエッセンスの大別ID
753 static COMMAND_CODE choose_essence(void)
755 COMMAND_CODE mode = 0;
757 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
760 concptr menu_name[] = {
770 concptr menu_name[] = {
780 const COMMAND_CODE mode_max = 7;
782 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
792 for (i = 0; i < mode_max; i++)
794 prt(format(" %s %s", (menu_line == 1 + i) ? "》" : " ", menu_name[i]), 2 + i, 14);
795 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
797 prt(format(" %s %s", (menu_line == 1 + i) ? "> " : " ", menu_name[i]), 2 + i, 14);
798 prt("Choose from menu.", 0, 0);
817 menu_line += mode_max - 1;
826 if (menu_line > mode_max) menu_line -= mode_max;
837 for (i = 0; i < mode_max; i++)
838 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
840 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
846 if (isupper(choice)) choice = (char)tolower(choice);
848 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
849 mode = (int)choice - 'a' + 1;
859 * @brief エッセンスを実際に付加する
860 * @param mode エッセンスの大別ID
863 static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode)
875 GAME_TEXT o_name[MAX_NLEN];
877 essence_type *es_ptr;
878 bool able[22] = { 0 };
880 int menu_line = (use_menu ? 1 : 0);
882 for (i = 0; essence_info[i].add_name; i++)
884 es_ptr = &essence_info[i];
886 if (es_ptr->type != mode) continue;
890 if (!repeat_pull(&i) || i < 0 || i >= max_num)
895 (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
896 if (use_menu) screen_save();
898 choice = (always_show_list || use_menu) ? ESCAPE : 1;
901 if (choice == ESCAPE) choice = ' ';
902 else if (!get_com(out_val, &choice, FALSE))break;
904 if (use_menu && choice != ' ')
918 menu_line += (max_num - 1);
955 if (menu_line > max_num) menu_line -= max_num;
958 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
961 if (!redraw || use_menu)
965 char dummy[80], dummy2[80];
970 if (!use_menu) screen_save();
972 for (y = 1; y < 24; y++)
975 /* Print header(s) */
977 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
980 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
983 for (ctr = 0; ctr < max_num; ctr++)
985 es_ptr = &essence_info[num[ctr]];
989 if (ctr == (menu_line - 1))
990 strcpy(dummy, _("》 ", "> "));
991 else strcpy(dummy, " ");
994 /* letter/number for power selection */
997 sprintf(dummy, "%c) ", I2A(ctr));
1000 strcat(dummy, es_ptr->add_name);
1005 if (es_ptr->essence != -1)
1007 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
1008 if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
1012 switch (es_ptr->add)
1014 case ESSENCE_SH_FIRE:
1015 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
1016 if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
1017 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1019 case ESSENCE_SH_ELEC:
1020 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
1021 if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
1022 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1024 case ESSENCE_SH_COLD:
1025 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
1026 if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
1027 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1029 case ESSENCE_RESISTANCE:
1030 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
1031 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1032 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1033 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1034 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
1036 case ESSENCE_SUSTAIN:
1037 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
1038 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
1039 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
1040 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
1041 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
1046 if (!able[ctr]) col = TERM_RED;
1048 if (es_ptr->essence != -1)
1050 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]);
1054 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
1057 c_prt(col, dummy2, ctr + 2, x);
1076 ask = (isupper(choice));
1079 if (ask) choice = (char)tolower(choice);
1081 /* Extract request */
1082 i = (islower(choice) ? A2I(choice) : -1);
1085 /* Totally Illegal */
1086 if ((i < 0) || (i >= max_num) || !able[i])
1098 (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
1100 /* Belay that order */
1101 if (!get_check(tmp_val)) continue;
1107 if (redraw) screen_load();
1113 es_ptr = &essence_info[num[i]];
1115 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
1117 else if (mode == 1 || mode == 5)
1118 item_tester_hook = item_tester_hook_melee_ammo;
1119 else if (es_ptr->add == ESSENCE_ATTACK)
1120 item_tester_hook = object_allow_enchant_weapon;
1121 else if (es_ptr->add == ESSENCE_AC)
1122 item_tester_hook = object_is_armour;
1124 item_tester_hook = object_is_weapon_armour_ammo;
1126 q = _("どのアイテムを改良しますか?", "Improve which item? ");
1127 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
1129 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval);
1132 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
1134 msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further."));
1138 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1140 use_essence = es_ptr->value;
1141 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence + 9) / 10;
1142 if (o_ptr->number > 1)
1144 use_essence *= o_ptr->number;
1145 msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence);
1148 if (es_ptr->essence != -1)
1150 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1152 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1155 if (is_pval_flag(es_ptr->add))
1157 if (o_ptr->pval < 0)
1159 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
1162 else if (es_ptr->add == TR_BLOWS)
1164 if (o_ptr->pval > 1)
1166 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
1170 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1172 else if (o_ptr->pval > 0)
1174 use_essence *= o_ptr->pval;
1175 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1181 PARAMETER_VALUE pval;
1182 PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value);
1184 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
1185 strcpy(tmp_val, "1");
1187 if (!get_string(tmp, tmp_val, 1)) return;
1188 pval = (PARAMETER_VALUE)atoi(tmp_val);
1189 if (pval > limit) pval = limit;
1190 else if (pval < 1) pval = 1;
1191 o_ptr->pval += pval;
1192 use_essence *= pval;
1193 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1196 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1198 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1202 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
1209 strcpy(tmp_val, "1");
1210 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2)) return;
1211 val = atoi(tmp_val);
1212 if (val > creature_ptr->lev / 7 + 3) val = creature_ptr->lev / 7 + 3;
1213 else if (val < 1) val = 1;
1215 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
1216 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence)
1218 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1221 get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1));
1222 get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1));
1223 o_ptr->xtra4 = (get_to_h << 8) + get_to_d;
1224 o_ptr->to_h += get_to_h;
1225 o_ptr->to_d += get_to_d;
1227 creature_ptr->magic_num1[es_ptr->essence] -= use_essence;
1228 if (es_ptr->add == ESSENCE_ATTACK)
1230 if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5))
1232 msg_print(_("改良に失敗した。", "You failed to enchant."));
1233 take_turn(creature_ptr, 100);
1238 if (o_ptr->to_h < creature_ptr->lev / 5 + 5) o_ptr->to_h++;
1239 if (o_ptr->to_d < creature_ptr->lev / 5 + 5) o_ptr->to_d++;
1242 else if (es_ptr->add == ESSENCE_AC)
1244 if (o_ptr->to_a >= creature_ptr->lev / 5 + 5)
1246 msg_print(_("改良に失敗した。", "You failed to enchant."));
1247 take_turn(creature_ptr, 100);
1252 if (o_ptr->to_a < creature_ptr->lev / 5 + 5) o_ptr->to_a++;
1257 o_ptr->xtra3 = es_ptr->add + 1;
1262 bool success = TRUE;
1264 switch (es_ptr->add)
1266 case ESSENCE_SH_FIRE:
1267 if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence))
1272 creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
1273 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
1275 case ESSENCE_SH_ELEC:
1276 if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence))
1281 creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
1282 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
1284 case ESSENCE_SH_COLD:
1285 if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence))
1290 creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
1291 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
1293 case ESSENCE_RESISTANCE:
1294 case ESSENCE_SUSTAIN:
1295 if ((creature_ptr->magic_num1[TR_RES_ACID] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence))
1300 creature_ptr->magic_num1[TR_RES_ACID] -= use_essence;
1301 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
1302 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
1303 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
1308 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
1311 if (es_ptr->add == ESSENCE_SUSTAIN)
1313 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
1314 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
1315 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
1316 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
1320 o_ptr->xtra3 = es_ptr->add + 1;
1324 take_turn(creature_ptr, 100);
1325 _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name),
1326 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name));
1327 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1328 creature_ptr->window |= (PW_INVEN);
1335 static void erase_essence(player_type *creature_ptr)
1340 GAME_TEXT o_name[MAX_NLEN];
1341 BIT_FLAGS flgs[TR_FLAG_SIZE];
1343 item_tester_hook = object_is_smith;
1345 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
1346 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
1348 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
1351 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1352 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
1354 take_turn(creature_ptr, 100);
1356 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
1358 o_ptr->to_h -= (o_ptr->xtra4 >> 8);
1359 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
1361 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
1362 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
1365 object_flags(o_ptr, flgs);
1366 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
1367 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
1368 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1369 creature_ptr->window |= (PW_INVEN);
1373 * @brief 鍛冶コマンドのメインルーチン
1374 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
1377 void do_cmd_kaji(player_type *creature_ptr, bool only_browse)
1379 COMMAND_CODE mode = 0;
1382 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
1386 if (cmd_limit_confused(creature_ptr)) return;
1387 if (cmd_limit_blind(creature_ptr)) return;
1388 if (cmd_limit_image(creature_ptr)) return;
1391 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
1393 if (only_browse) screen_save();
1395 if (!only_browse) screen_save();
1401 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
1402 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
1403 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
1404 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
1405 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
1406 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
1408 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
1409 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
1410 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
1411 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
1412 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
1413 prt(format("Choose command from menu."), 0, 0);
1440 if (menu_line > 5) menu_line -= 5;
1448 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
1449 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
1450 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
1451 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
1452 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
1454 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
1456 if (!get_com("Command :", &choice, TRUE))
1493 /* Clear lines, position cursor (really should use strlen here) */
1494 Term_erase(14, 21, 255);
1495 Term_erase(14, 20, 255);
1496 Term_erase(14, 19, 255);
1497 Term_erase(14, 18, 255);
1498 Term_erase(14, 17, 255);
1499 Term_erase(14, 16, 255);
1501 roff_to_buf(kaji_tips[mode - 1], 62, temp, sizeof(temp));
1502 for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j])))
1504 prt(&temp[j], line, 15);
1509 if (!only_browse) screen_load();
1510 } while (only_browse);
1515 case 1: display_essence(creature_ptr); break;
1516 case 2: drain_essence(creature_ptr); break;
1517 case 3: erase_essence(creature_ptr); break;
1519 mode = choose_essence();
1522 add_essence(creature_ptr, mode);
1524 case 5: add_essence(creature_ptr, 10); break;