2 * @brief プレイヤーの鍛冶コマンド実装
7 #include "cmd-item/cmd-smith.h"
8 #include "action/action-limited.h"
9 #include "autopick/autopick.h"
10 #include "core/asking-player.h"
11 #include "core/player-update-types.h"
12 #include "core/window-redrawer.h"
13 #include "flavor/flavor-describer.h"
14 #include "flavor/object-flavor-types.h"
15 #include "floor/floor-object.h"
16 #include "game-option/text-display-options.h"
17 #include "io/command-repeater.h"
18 #include "io/input-key-acceptor.h"
19 #include "io/input-key-requester.h"
20 #include "main/sound-of-music.h"
21 #include "mind/mind-weaponsmith.h"
22 #include "object-enchant/object-ego.h"
23 #include "object-enchant/special-object-flags.h"
24 #include "object-enchant/tr-types.h"
25 #include "object-enchant/trc-types.h"
26 #include "object-hook/hook-armor.h"
27 #include "object-hook/hook-enchant.h"
28 #include "object-hook/hook-weapon.h"
29 #include "object/item-tester-hooker.h"
30 #include "object/item-use-flags.h"
31 #include "object/object-flags.h" // todo 相互参照している.
32 #include "object/object-generator.h"
33 #include "perception/object-perception.h"
34 #include "player/player-status.h"
35 #include "term/screen-processor.h"
36 #include "term/term-color-types.h"
37 #include "util/bit-flags-calculator.h"
38 #include "util/buffer-shaper.h"
39 #include "util/int-char-converter.h"
40 #include "view/display-messages.h"
43 * エッセンス情報の構造体 / A structure for smithing
46 int add; /* TR flag number or special essence id */
47 concptr add_name; /* Name of this ability */
48 ESSENCE_IDX type; /* Menu number */
49 int essence; /* Index for carrying essences */
50 int value; /* Needed value to add this ability */
54 * エッセンス情報テーブル Smithing type data for Weapon smith
57 static essence_type essence_info[] = { { TR_STR, "腕力", 4, TR_STR, 20 }, { TR_INT, "知能", 4, TR_INT, 20 }, { TR_WIS, "賢さ", 4, TR_WIS, 20 },
58 { TR_DEX, "器用さ", 4, TR_DEX, 20 }, { TR_CON, "耐久力", 4, TR_CON, 20 }, { TR_CHR, "魅力", 4, TR_CHR, 20 },
59 { TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "隠密", 4, TR_STEALTH, 40 }, { TR_SEARCH, "探索", 4, TR_SEARCH, 15 },
60 { TR_INFRA, "赤外線視力", 4, TR_INFRA, 15 }, { TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15 }, { TR_SPEED, "スピード", 4, TR_SPEED, 12 },
61 { TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60 },
62 { TR_IMPACT, "地震発動", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20 }, { TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20 },
63 { TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20 }, { TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20 },
64 { TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15 }, { TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15 },
65 { TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15 },
66 { TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20 }, { TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20 },
67 { TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "反射", 2, TR_REFLECT, 20 }, { TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20 },
68 { TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20 }, { TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15 },
69 { TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15 }, { TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25 },
70 { TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20 }, { TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20 },
71 { TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20 }, { TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20 },
72 { TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20 }, { TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20 },
73 { TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20 }, { TR_SH_FIRE, "", 0, -2, 0 },
74 { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15 }, { TR_WARNING, "警告", 3, TR_WARNING, 20 },
75 { TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "永久光源", 3, TR_LITE_1, 15 }, { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 },
76 { TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20 }, { TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15 },
77 { TR_REGEN, "急速回復", 3, TR_REGEN, 20 }, { TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25 },
79 { TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100 }, { TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60 },
80 { TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20 }, { TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60 },
81 { TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60 },
82 { TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60 },
83 { TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60 },
84 { TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15 }, { TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60 },
85 { TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20 }, { TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60 },
86 { TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20 }, { TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60 },
87 { TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20 }, { TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60 },
89 { TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40 }, { TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40 },
90 { TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40 }, { TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40 },
91 { TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40 },
93 { ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "防御", 10, TR_ES_AC, 15 }, { ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50 },
94 { ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50 }, { ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50 },
95 { ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50 }, { ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50 }, { ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50 },
96 { ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50 }, { ESSENCE_RESISTANCE, "全耐性", 2, -1, 150 }, { ESSENCE_SUSTAIN, "装備保持", 10, -1, 10 },
97 { ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200 },
99 { -1, NULL, 0, -1, 0 } };
101 static essence_type essence_info[] = { { TR_STR, "strength", 4, TR_STR, 20 }, { TR_INT, "intelligence", 4, TR_INT, 20 }, { TR_WIS, "wisdom", 4, TR_WIS, 20 },
102 { TR_DEX, "dexterity", 4, TR_DEX, 20 }, { TR_CON, "constitution", 4, TR_CON, 20 }, { TR_CHR, "charisma", 4, TR_CHR, 20 },
103 { TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "stealth", 4, TR_STEALTH, 40 }, { TR_SEARCH, "serching", 4, TR_SEARCH, 15 },
104 { TR_INFRA, "infravision", 4, TR_INFRA, 15 }, { TR_TUNNEL, "digging", 4, TR_TUNNEL, 15 }, { TR_SPEED, "speed", 4, TR_SPEED, 12 },
105 { TR_BLOWS, "extra attack", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60 },
106 { TR_IMPACT, "quake activation", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20 },
107 { TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20 }, { TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20 },
108 { TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20 },
109 { TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15 },
110 { TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15 }, { TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15 },
111 { TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15 },
112 { TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20 }, { TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20 },
113 { TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20 }, { TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20 }, { TR_REFLECT, "reflection", 2, TR_REFLECT, 20 },
114 { TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20 }, { TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20 },
115 { TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15 }, { TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15 },
116 { TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15 }, { TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15 },
117 { TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25 }, { TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20 },
118 { TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20 }, { TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20 },
119 { TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20 }, { TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20 },
120 { TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20 }, { TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20 },
121 { TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20 }, { TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20 },
122 { TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20 }, { TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20 },
123 { TR_SH_FIRE, "", 0, -2, 0 }, { TR_SH_ELEC, "", 0, -2, 0 }, { TR_SH_COLD, "", 0, -2, 0 }, { TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15 },
124 { TR_WARNING, "warning", 3, TR_WARNING, 20 }, { TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20 }, { TR_LITE_1, "permanent light", 3, TR_LITE_1, 15 },
125 { TR_LITE_2, "", 0, -2, 0 }, { TR_LITE_3, "", 0, -2, 0 }, { TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20 },
126 { TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15 }, { TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15 },
127 { TR_REGEN, "regeneration", 3, TR_REGEN, 20 }, { TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25 },
129 { TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100 }, { TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20 },
130 { TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60 }, { TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60 },
131 { TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20 }, { TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60 },
132 { TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20 }, { TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60 },
133 { TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15 }, { TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60 }, { TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15 },
134 { TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60 }, { TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20 },
135 { TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60 }, { TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20 },
136 { TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60 }, { TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20 },
137 { TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60 },
139 { TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40 }, { TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40 },
140 { TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40 }, { TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40 },
141 { TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40 }, { TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40 },
142 { TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40 }, { TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40 },
144 { ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30 }, { ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15 },
145 { ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50 }, { ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50 },
146 { ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50 }, { ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50 },
147 { ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50 }, { ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50 }, { ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50 },
148 { ESSENCE_RESISTANCE, "resistance", 2, -1, 150 }, { ESSENCE_SUSTAIN, "elements proof", 10, -1, 10 },
149 { ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200 },
151 { -1, NULL, 0, -1, 0 } };
155 * エッセンス名テーブル / Essense names for Weapon smith
158 concptr essence_name[] = { "腕力", "知能", "賢さ", "器用さ", "耐久力", "魅力", "魔力支配", "", "隠密", "探索", "赤外線視力", "採掘", "スピード", "追加攻撃",
159 "カオス攻撃", "吸血攻撃", "動物倍打", "邪悪倍打", "不死倍打", "悪魔倍打", "オーク倍打", "トロル倍打", "巨人倍打", "竜倍打", "", "", "地震", "毒殺", "溶解",
160 "電撃", "焼棄", "凍結", "能力維持", "", "", "", "", "", "", "", "免疫", "", "", "", "", "反射", "麻痺知らず", "経験値維持", "耐酸", "耐電撃", "耐火炎",
161 "耐冷気", "耐毒", "耐恐怖", "耐閃光", "耐暗黒", "耐盲目", "耐混乱", "耐轟音", "耐破片", "耐地獄", "耐因果混乱", "耐カオス", "耐劣化", "", "", "人間倍打",
162 "", "", "反魔法", "", "", "警告", "", "", "", "浮遊", "永久光源", "可視透明", "テレパシー", "遅消化", "急速回復", "", "", "", "", "", "", "", "",
163 "テレポート", "", "", "攻撃", "防御",
169 concptr essence_name[] = { "strength", "intelligen.", "wisdom", "dexterity", "constitut.", "charisma", "magic mast.", "", "stealth", "serching", "infravision",
170 "digging", "speed", "extra atk", "chaos brand", "vampiric", "slay animal", "slay evil", "slay undead", "slay demon", "slay orc", "slay troll", "slay giant",
171 "slay dragon", "", "", "quake", "pois. brand", "acid brand", "elec. brand", "fire brand", "cold brand", "sustain", "", "", "", "", "", "", "", "immunity",
172 "", "", "", "", "reflection", "free action", "hold exp", "res. acid", "res. elec.", "res. fire", "res. cold", "res. poison", "res. fear", "res. light",
173 "res. dark", "res. blind", "res.confuse", "res. sound", "res. shard", "res. nether", "res. nexus", "res. chaos", "res. disen.", "", "", "slay human", "",
174 "", "anti magic", "", "", "warning", "", "", "", "levitation", "perm. light", "see invis.", "telepathy", "slow dige.", "regen.", "", "", "", "", "", "", "",
175 "", "teleport", "", "", "weapon enc.", "armor enc.",
180 static concptr const kaji_tips[5] = {
182 "現在持っているエッセンスの一覧を表示する。",
183 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
184 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
185 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
186 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
188 "Display essences you have.",
189 "Extract essences from an item. The item become non magical.",
190 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
191 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
192 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
197 * @brief 所持しているエッセンス一覧を表示する
200 static void display_essence(player_type *creature_ptr)
205 for (i = 1; i < 22; i++) {
208 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数", "Essence Num Essence Num Essence Num "), 1, 8);
209 for (i = 0; essence_name[i]; i++) {
210 if (!essence_name[i][0])
212 prt(format("%-11s %5d", essence_name[i], creature_ptr->magic_num1[i]), 2 + num % 21, 8 + num / 21 * 22);
215 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
223 * @param creature_ptr プレーヤーへの参照ポインタ
226 static void drain_essence(player_type *creature_ptr)
228 int drain_value[sizeof(creature_ptr->magic_num1) / sizeof(s32b)];
232 bool observe = FALSE;
233 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
234 TIME_EFFECT old_timeout;
235 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
241 OBJECT_IDX next_o_idx;
243 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
246 item_tester_hook = object_is_weapon_armour_ammo;
248 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
249 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
251 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), 0);
255 if (object_is_known(o_ptr) && !object_is_nameless(creature_ptr, o_ptr)) {
256 GAME_TEXT o_name[MAX_NLEN];
257 describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
258 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name)))
262 take_turn(creature_ptr, 100);
264 object_flags(creature_ptr, o_ptr, old_flgs);
265 if (has_flag(old_flgs, TR_KILL_DRAGON))
266 add_flag(old_flgs, TR_SLAY_DRAGON);
267 if (has_flag(old_flgs, TR_KILL_ANIMAL))
268 add_flag(old_flgs, TR_SLAY_ANIMAL);
269 if (has_flag(old_flgs, TR_KILL_EVIL))
270 add_flag(old_flgs, TR_SLAY_EVIL);
271 if (has_flag(old_flgs, TR_KILL_UNDEAD))
272 add_flag(old_flgs, TR_SLAY_UNDEAD);
273 if (has_flag(old_flgs, TR_KILL_DEMON))
274 add_flag(old_flgs, TR_SLAY_DEMON);
275 if (has_flag(old_flgs, TR_KILL_ORC))
276 add_flag(old_flgs, TR_SLAY_ORC);
277 if (has_flag(old_flgs, TR_KILL_TROLL))
278 add_flag(old_flgs, TR_SLAY_TROLL);
279 if (has_flag(old_flgs, TR_KILL_GIANT))
280 add_flag(old_flgs, TR_SLAY_GIANT);
281 if (has_flag(old_flgs, TR_KILL_HUMAN))
282 add_flag(old_flgs, TR_SLAY_HUMAN);
284 old_to_a = o_ptr->to_a;
286 old_to_h = o_ptr->to_h;
287 old_to_d = o_ptr->to_d;
290 old_pval = o_ptr->pval;
291 old_name2 = o_ptr->name2;
292 old_timeout = o_ptr->timeout;
293 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE))
295 if (has_flag(old_flgs, TR_ADD_L_CURSE))
297 if (has_flag(old_flgs, TR_ADD_H_CURSE))
299 if (has_flag(old_flgs, TR_AGGRAVATE))
301 if (has_flag(old_flgs, TR_NO_TELE))
303 if (has_flag(old_flgs, TR_DRAIN_EXP))
305 if (has_flag(old_flgs, TR_DRAIN_HP))
307 if (has_flag(old_flgs, TR_DRAIN_MANA))
309 if (has_flag(old_flgs, TR_CALL_ANIMAL))
311 if (has_flag(old_flgs, TR_CALL_DEMON))
313 if (has_flag(old_flgs, TR_CALL_DRAGON))
315 if (has_flag(old_flgs, TR_CALL_UNDEAD))
317 if (has_flag(old_flgs, TR_COWARDICE))
319 if (has_flag(old_flgs, TR_LOW_MELEE))
321 if (has_flag(old_flgs, TR_LOW_AC))
323 if (has_flag(old_flgs, TR_LOW_MAGIC))
325 if (has_flag(old_flgs, TR_FAST_DIGEST))
327 if (has_flag(old_flgs, TR_SLOW_REGEN))
329 if (has_flag(old_flgs, TR_TY_CURSE))
334 next_o_idx = o_ptr->next_o_idx;
335 marked = o_ptr->marked;
336 number = o_ptr->number;
338 object_prep(creature_ptr, o_ptr, o_ptr->k_idx);
342 o_ptr->next_o_idx = next_o_idx;
343 o_ptr->marked = marked;
344 o_ptr->number = number;
345 if (o_ptr->tval == TV_DRAG_ARMOR)
346 o_ptr->timeout = old_timeout;
347 o_ptr->ident |= (IDENT_FULL_KNOWN);
348 object_aware(creature_ptr, o_ptr);
351 object_flags(creature_ptr, o_ptr, new_flgs);
353 for (i = 0; essence_info[i].add_name; i++) {
354 essence_type *es_ptr = &essence_info[i];
355 PARAMETER_VALUE pval = 0;
357 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
358 pval = (has_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
360 if (es_ptr->add < TR_FLAG_MAX && (!has_flag(new_flgs, es_ptr->add) || pval) && has_flag(old_flgs, es_ptr->add)) {
362 drain_value[es_ptr->essence] += 10 * pval;
363 } else if (es_ptr->essence != -2) {
364 drain_value[es_ptr->essence] += 10;
365 } else if (es_ptr->add == TR_SH_FIRE) {
366 drain_value[TR_BRAND_FIRE] += 10;
367 drain_value[TR_RES_FIRE] += 10;
368 } else if (es_ptr->add == TR_SH_ELEC) {
369 drain_value[TR_BRAND_ELEC] += 10;
370 drain_value[TR_RES_ELEC] += 10;
371 } else if (es_ptr->add == TR_SH_COLD) {
372 drain_value[TR_BRAND_COLD] += 10;
373 drain_value[TR_RES_COLD] += 10;
374 } else if (es_ptr->add == TR_LITE_2) {
375 drain_value[TR_LITE_1] += 20;
376 } else if (es_ptr->add == TR_LITE_3) {
377 drain_value[TR_LITE_1] += 30;
382 if ((has_flag(old_flgs, TR_FORCE_WEAPON)) && !(has_flag(new_flgs, TR_FORCE_WEAPON))) {
383 drain_value[TR_INT] += 5;
384 drain_value[TR_WIS] += 5;
386 if ((has_flag(old_flgs, TR_VORPAL)) && !(has_flag(new_flgs, TR_VORPAL))) {
387 drain_value[TR_BRAND_POIS] += 5;
388 drain_value[TR_BRAND_ACID] += 5;
389 drain_value[TR_BRAND_ELEC] += 5;
390 drain_value[TR_BRAND_FIRE] += 5;
391 drain_value[TR_BRAND_COLD] += 5;
393 if ((has_flag(old_flgs, TR_DEC_MANA)) && !(has_flag(new_flgs, TR_DEC_MANA))) {
394 drain_value[TR_INT] += 10;
396 if ((has_flag(old_flgs, TR_XTRA_MIGHT)) && !(has_flag(new_flgs, TR_XTRA_MIGHT))) {
397 drain_value[TR_STR] += 10;
399 if ((has_flag(old_flgs, TR_XTRA_SHOTS)) && !(has_flag(new_flgs, TR_XTRA_SHOTS))) {
400 drain_value[TR_DEX] += 10;
402 if (old_name2 == EGO_2WEAPON) {
403 drain_value[TR_DEX] += 20;
405 if (object_is_weapon_ammo(o_ptr)) {
406 if (old_ds > o_ptr->ds)
407 drain_value[TR_ES_ATTACK] += (old_ds - o_ptr->ds) * 10;
409 if (old_dd > o_ptr->dd)
410 drain_value[TR_ES_ATTACK] += (old_dd - o_ptr->dd) * 10;
412 if (old_to_h > o_ptr->to_h)
413 drain_value[TR_ES_ATTACK] += (old_to_h - o_ptr->to_h) * 10;
414 if (old_to_d > o_ptr->to_d)
415 drain_value[TR_ES_ATTACK] += (old_to_d - o_ptr->to_d) * 10;
416 if (old_ac > o_ptr->ac)
417 drain_value[TR_ES_AC] += (old_ac - o_ptr->ac) * 10;
418 if (old_to_a > o_ptr->to_a)
419 drain_value[TR_ES_AC] += (old_to_a - o_ptr->to_a) * 10;
421 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) {
422 drain_value[i] *= number;
423 drain_value[i] = drain_value[i] * dec / 4;
424 drain_value[i] = MAX(drain_value[i], 0);
425 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT))
426 drain_value[i] /= 10;
427 if (drain_value[i]) {
432 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
434 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
436 for (i = 0; essence_name[i]; i++) {
437 if (!essence_name[i][0])
442 creature_ptr->magic_num1[i] += drain_value[i];
443 creature_ptr->magic_num1[i] = MIN(20000, creature_ptr->magic_num1[i]);
445 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
449 /* Apply autodestroy/inscription to the drained item */
450 autopick_alter_item(creature_ptr, item, TRUE);
451 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
452 creature_ptr->window |= (PW_INVEN);
456 * @brief 付加するエッセンスの大別を選択する
457 * @return 選んだエッセンスの大別ID
459 static COMMAND_CODE choose_essence(void)
461 COMMAND_CODE mode = 0;
463 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
466 concptr menu_name[] = { "武器属性", "耐性", "能力", "数値", "スレイ", "ESP", "その他" };
468 concptr menu_name[] = { "Brand weapon", "Resistance", "Ability", "Magic number", "Slay", "ESP", "Others" };
470 const COMMAND_CODE mode_max = 7;
472 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
480 for (i = 0; i < mode_max; i++)
482 prt(format(" %s %s", (menu_line == 1 + i) ? "》" : " ", menu_name[i]), 2 + i, 14);
483 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
485 prt(format(" %s %s", (menu_line == 1 + i) ? "> " : " ", menu_name[i]), 2 + i, 14);
486 prt("Choose from menu.", 0, 0);
504 menu_line += mode_max - 1;
513 if (menu_line > mode_max)
514 menu_line -= mode_max;
522 for (i = 0; i < mode_max; i++)
523 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
525 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE)) {
531 choice = (char)tolower(choice);
533 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
534 mode = (int)choice - 'a' + 1;
544 * @brief エッセンスを実際に付加する
545 * @param mode エッセンスの大別ID
548 static void add_essence(player_type *creature_ptr, ESSENCE_IDX mode)
560 GAME_TEXT o_name[MAX_NLEN];
562 essence_type *es_ptr;
563 bool able[22] = { 0 };
565 int menu_line = (use_menu ? 1 : 0);
567 for (i = 0; essence_info[i].add_name; i++) {
568 es_ptr = &essence_info[i];
570 if (es_ptr->type != mode)
575 if (!repeat_pull(&i) || i < 0 || i >= max_num) {
579 (void)strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
583 choice = (always_show_list || use_menu) ? ESCAPE : 1;
585 if (choice == ESCAPE)
587 else if (!get_com(out_val, &choice, FALSE))
590 if (use_menu && choice != ' ') {
600 menu_line += (max_num - 1);
633 if (menu_line > max_num)
634 menu_line -= max_num;
637 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) {
639 if (!redraw || use_menu) {
642 char dummy[80], dummy2[80];
650 for (y = 1; y < 24; y++)
653 /* Print header(s) */
655 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
658 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
661 for (ctr = 0; ctr < max_num; ctr++) {
662 es_ptr = &essence_info[num[ctr]];
665 if (ctr == (menu_line - 1))
666 strcpy(dummy, _("》 ", "> "));
671 /* letter/number for power selection */
673 sprintf(dummy, "%c) ", I2A(ctr));
676 strcat(dummy, es_ptr->add_name);
681 if (es_ptr->essence != -1) {
682 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
683 if (creature_ptr->magic_num1[es_ptr->essence] < es_ptr->value)
686 switch (es_ptr->add) {
687 case ESSENCE_SH_FIRE:
688 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
689 if (creature_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value)
691 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
694 case ESSENCE_SH_ELEC:
695 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
696 if (creature_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value)
698 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
701 case ESSENCE_SH_COLD:
702 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
703 if (creature_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value)
705 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
708 case ESSENCE_RESISTANCE:
709 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
710 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
712 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
714 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
716 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value)
719 case ESSENCE_SUSTAIN:
720 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
721 if (creature_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value)
723 if (creature_ptr->magic_num1[TR_RES_COLD] < es_ptr->value)
725 if (creature_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value)
727 if (creature_ptr->magic_num1[TR_RES_ACID] < es_ptr->value)
736 if (es_ptr->essence != -1) {
737 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)creature_ptr->magic_num1[es_ptr->essence]);
739 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
742 c_prt(col, dummy2, ctr + 2, x);
759 ask = (isupper(choice));
763 choice = (char)tolower(choice);
765 /* Extract request */
766 i = (islower(choice) ? A2I(choice) : -1);
769 /* Totally Illegal */
770 if ((i < 0) || (i >= max_num) || !able[i]) {
780 (void)strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
782 /* Belay that order */
783 if (!get_check(tmp_val))
798 es_ptr = &essence_info[num[i]];
800 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
802 else if (mode == 1 || mode == 5)
803 item_tester_hook = item_tester_hook_melee_ammo;
804 else if (es_ptr->add == ESSENCE_ATTACK)
805 item_tester_hook = object_allow_enchant_weapon;
806 else if (es_ptr->add == ESSENCE_AC)
807 item_tester_hook = object_is_armour;
809 item_tester_hook = object_is_weapon_armour_ammo;
811 q = _("どのアイテムを改良しますか?", "Improve which item? ");
812 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
814 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT), tval);
818 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(creature_ptr, o_ptr))) {
819 msg_print(_("そのアイテムはこれ以上改良できない。", "This item can not be improved any further."));
823 describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
825 use_essence = es_ptr->value;
826 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT))
827 use_essence = (use_essence + 9) / 10;
828 if (o_ptr->number > 1) {
829 use_essence *= o_ptr->number;
830 msg_format(_("%d個あるのでエッセンスは%d必要です。", "For %d items, it will take %d essences."), o_ptr->number, use_essence);
833 if (es_ptr->essence != -1) {
834 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
835 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
838 if (is_pval_flag(es_ptr->add)) {
839 if (o_ptr->pval < 0) {
840 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
842 } else if (es_ptr->add == TR_BLOWS) {
843 if (o_ptr->pval > 1) {
844 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? ")))
849 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
850 } else if (o_ptr->pval > 0) {
851 use_essence *= o_ptr->pval;
852 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
856 PARAMETER_VALUE pval;
857 PARAMETER_VALUE limit = MIN(5, creature_ptr->magic_num1[es_ptr->essence] / es_ptr->value);
859 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
860 strcpy(tmp_val, "1");
862 if (!get_string(tmp, tmp_val, 1))
864 pval = (PARAMETER_VALUE)atoi(tmp_val);
871 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
874 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
875 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
878 } else if (es_ptr->add == ESSENCE_SLAY_GLOVE) {
884 strcpy(tmp_val, "1");
885 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), creature_ptr->lev / 7 + 3), tmp_val, 2))
888 if (val > creature_ptr->lev / 7 + 3)
889 val = creature_ptr->lev / 7 + 3;
893 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
894 if (creature_ptr->magic_num1[es_ptr->essence] < use_essence) {
895 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
898 get_to_h = ((val + 1) / 2 + randint0(val / 2 + 1));
899 get_to_d = ((val + 1) / 2 + randint0(val / 2 + 1));
900 o_ptr->xtra4 = (get_to_h << 8) + get_to_d;
901 o_ptr->to_h += get_to_h;
902 o_ptr->to_d += get_to_d;
904 creature_ptr->magic_num1[es_ptr->essence] -= use_essence;
905 if (es_ptr->add == ESSENCE_ATTACK) {
906 if ((o_ptr->to_h >= creature_ptr->lev / 5 + 5) && (o_ptr->to_d >= creature_ptr->lev / 5 + 5)) {
907 msg_print(_("改良に失敗した。", "You failed to enchant."));
908 take_turn(creature_ptr, 100);
911 if (o_ptr->to_h < creature_ptr->lev / 5 + 5)
913 if (o_ptr->to_d < creature_ptr->lev / 5 + 5)
916 } else if (es_ptr->add == ESSENCE_AC) {
917 if (o_ptr->to_a >= creature_ptr->lev / 5 + 5) {
918 msg_print(_("改良に失敗した。", "You failed to enchant."));
919 take_turn(creature_ptr, 100);
922 if (o_ptr->to_a < creature_ptr->lev / 5 + 5)
926 o_ptr->xtra3 = es_ptr->add + 1;
931 switch (es_ptr->add) {
932 case ESSENCE_SH_FIRE:
933 if ((creature_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence)) {
937 creature_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
938 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
940 case ESSENCE_SH_ELEC:
941 if ((creature_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)) {
945 creature_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
946 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
948 case ESSENCE_SH_COLD:
949 if ((creature_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) {
953 creature_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
954 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
956 case ESSENCE_RESISTANCE:
957 case ESSENCE_SUSTAIN:
958 if ((creature_ptr->magic_num1[TR_RES_ACID] < use_essence) || (creature_ptr->magic_num1[TR_RES_ELEC] < use_essence)
959 || (creature_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (creature_ptr->magic_num1[TR_RES_COLD] < use_essence)) {
963 creature_ptr->magic_num1[TR_RES_ACID] -= use_essence;
964 creature_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
965 creature_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
966 creature_ptr->magic_num1[TR_RES_COLD] -= use_essence;
970 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
973 if (es_ptr->add == ESSENCE_SUSTAIN) {
974 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
975 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
976 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
977 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
979 o_ptr->xtra3 = es_ptr->add + 1;
983 take_turn(creature_ptr, 100);
984 _(msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name), msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name));
985 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
986 creature_ptr->window |= (PW_INVEN);
993 static void erase_essence(player_type *creature_ptr)
998 GAME_TEXT o_name[MAX_NLEN];
999 BIT_FLAGS flgs[TR_FLAG_SIZE];
1001 item_tester_hook = object_is_smith;
1003 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
1004 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
1006 o_ptr = choose_object(creature_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
1010 describe_flavor(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1011 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name)))
1014 take_turn(creature_ptr, 100);
1016 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE) {
1017 o_ptr->to_h -= (o_ptr->xtra4 >> 8);
1018 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
1020 if (o_ptr->to_h < 0)
1022 if (o_ptr->to_d < 0)
1026 object_flags(creature_ptr, o_ptr, flgs);
1027 if (!(has_pval_flags(flgs)))
1029 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
1030 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
1031 creature_ptr->window |= (PW_INVEN);
1035 * @brief 鍛冶コマンドのメインルーチン
1036 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
1039 void do_cmd_kaji(player_type *creature_ptr, bool only_browse)
1041 COMMAND_CODE mode = 0;
1044 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
1047 if (cmd_limit_confused(creature_ptr))
1049 if (cmd_limit_blind(creature_ptr))
1051 if (cmd_limit_image(creature_ptr))
1055 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5)) {
1064 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
1065 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
1066 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
1067 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
1068 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
1069 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
1071 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
1072 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
1073 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
1074 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
1075 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
1076 prt(format("Choose command from menu."), 0, 0);
1109 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
1110 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
1111 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
1112 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
1113 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
1115 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
1117 if (!get_com("Command :", &choice, TRUE))
1152 /* Clear lines, position cursor (really should use strlen here) */
1153 term_erase(14, 21, 255);
1154 term_erase(14, 20, 255);
1155 term_erase(14, 19, 255);
1156 term_erase(14, 18, 255);
1157 term_erase(14, 17, 255);
1158 term_erase(14, 16, 255);
1160 shape_buffer(kaji_tips[mode - 1], 62, temp, sizeof(temp));
1161 for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j]))) {
1162 prt(&temp[j], line, 15);
1169 } while (only_browse);
1174 display_essence(creature_ptr);
1177 drain_essence(creature_ptr);
1180 erase_essence(creature_ptr);
1183 mode = choose_essence();
1186 add_essence(creature_ptr, mode);
1189 add_essence(creature_ptr, 10);