OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / market / building-craft-weapon.c
1 #include "market/building-craft-weapon.h"
2 #include "art-definition/art-sword-types.h"
3 #include "combat/attack-accuracy.h"
4 #include "combat/shoot.h"
5 #include "core/player-update-types.h"
6 #include "core/stuff-handler.h"
7 #include "flavor/flavor-describer.h"
8 #include "flavor/object-flavor-types.h"
9 #include "floor/floor-object.h"
10 #include "inventory/inventory-slot-types.h"
11 #include "io/input-key-acceptor.h"
12 #include "market/building-util.h"
13 #include "object-enchant/tr-types.h"
14 #include "object-hook/hook-weapon.h"
15 #include "object/item-tester-hooker.h"
16 #include "object/item-use-flags.h"
17 #include "object/object-flags.h"
18 #include "object/object-generator.h"
19 #include "realm/realm-hex-numbers.h"
20 #include "spell-realm/spells-hex.h"
21 #include "sv-definition/sv-weapon-types.h"
22 #include "term/screen-processor.h"
23 #include "term/term-color-types.h"
24 #include "util/bit-flags-calculator.h"
25 #include "view/display-messages.h"
26 #include "world/world.h"
27
28 /*!
29  * @brief 攻撃時スレイによるダメージ期待値修正計算 / critical happens at i / 10000
30  * @param dam 基本ダメージ
31  * @param mult スレイ倍率(掛け算部分)
32  * @param div スレイ倍率(割り算部分)
33  * @param force 理力特別計算フラグ
34  * @return ダメージ期待値
35  */
36 static HIT_POINT calc_slaydam(HIT_POINT dam, int mult, int div, bool force)
37 {
38     int tmp;
39     if (force) {
40         tmp = dam * 60;
41         tmp *= mult * 3;
42         tmp /= div * 2;
43         tmp += dam * 60 * 2;
44         tmp /= 60;
45         return tmp;
46     }
47
48     tmp = dam * 60;
49     tmp *= mult;
50     tmp /= div;
51     tmp /= 60;
52     return tmp;
53 }
54
55 /*!
56  * @brief 攻撃時の期待値計算(スレイ→重量クリティカル→切れ味効果)
57  * @param player_ptr プレーヤーへの参照ポインタ
58  * @param dam 基本ダメージ
59  * @param mult スレイ倍率(掛け算部分)
60  * @param div スレイ倍率(割り算部分)
61  * @param force 理力特別計算フラグ
62  * @param weight 重量
63  * @param plus 武器ダメージ修正
64  * @param meichuu 命中値
65  * @param dokubari 毒針処理か否か
66  * @param vorpal_mult 切れ味倍率(掛け算部分)
67  * @param vorpal_div 切れ味倍率(割り算部分)
68  * @return ダメージ期待値
69  */
70 static u32b calc_expect_dice(
71     player_type *owner_ptr, u32b dam, int mult, int div, bool force, WEIGHT weight, int plus, s16b meichuu, bool dokubari, int vorpal_mult, int vorpal_div)
72 {
73     dam = calc_slaydam(dam, mult, div, force);
74     dam = calc_expect_crit(owner_ptr, weight, plus, dam, meichuu, dokubari);
75     dam = calc_slaydam(dam, vorpal_mult, vorpal_div, FALSE);
76     return dam;
77 }
78
79 /*!
80  * @brief 武器の各条件毎のダメージ期待値を表示する。
81  * @param r 表示行
82  * @param c 表示列
83  * @param mindice ダイス部分最小値
84  * @param maxdice ダイス部分最大値
85  * @param blows 攻撃回数
86  * @param dam_bonus ダメージ修正値
87  * @param attr 条件内容
88  * @param color 条件内容の表示色
89  * @details
90  * Display the damage figure of an object\n
91  * (used by compare_weapon_aux)\n
92  * \n
93  * Only accurate for the current weapon, because it includes\n
94  * the current +dam of the player.\n
95  * @return なし
96  */
97 static void show_weapon_dmg(int r, int c, int mindice, int maxdice, int blows, int dam_bonus, concptr attr, byte color)
98 {
99     c_put_str(color, attr, r, c);
100     GAME_TEXT tmp_str[80];
101     int mindam = blows * (mindice + dam_bonus);
102     int maxdam = blows * (maxdice + dam_bonus);
103     sprintf(tmp_str, _("1ターン: %d-%d ダメージ", "Attack: %d-%d damage"), mindam, maxdam);
104     put_str(tmp_str, r, c + 8);
105 }
106
107 /*!
108  * @brief 武器一つ毎のダメージ情報を表示する。
109  * @param o_ptr オブジェクトの構造体の参照ポインタ。
110  * @param col 表示する行の上端
111  * @param r 表示する列の左端
112  * @details
113  * Show the damage figures for the various monster types\n
114  * \n
115  * Only accurate for the current weapon, because it includes\n
116  * the current number of blows for the player.\n
117  * @return なし
118  */
119 static void compare_weapon_aux(player_type *owner_ptr, object_type *o_ptr, int col, int r)
120 {
121     BIT_FLAGS flgs[TR_FLAG_SIZE];
122     int blow = owner_ptr->num_blow[0];
123     bool force = FALSE;
124     bool dokubari = FALSE;
125
126     int eff_dd = o_ptr->dd + owner_ptr->to_dd[0];
127     int eff_ds = o_ptr->ds + owner_ptr->to_ds[0];
128
129     int mindice = eff_dd;
130     int maxdice = eff_ds * eff_dd;
131     int mindam = 0;
132     int maxdam = 0;
133     int vorpal_mult = 1;
134     int vorpal_div = 1;
135     int dmg_bonus = o_ptr->to_d + owner_ptr->to_d[0];
136
137     object_flags(owner_ptr, o_ptr, flgs);
138     if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE))
139         dokubari = TRUE;
140
141     mindam = calc_expect_crit(owner_ptr, o_ptr->weight, o_ptr->to_h, mindice, owner_ptr->to_h[0], dokubari);
142     maxdam = calc_expect_crit(owner_ptr, o_ptr->weight, o_ptr->to_h, maxdice, owner_ptr->to_h[0], dokubari);
143     show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("会心:", "Critical:"), TERM_L_RED);
144     if ((have_flag(flgs, TR_VORPAL) || hex_spelling(owner_ptr, HEX_RUNESWORD))) {
145         if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) {
146             vorpal_mult = 5;
147             vorpal_div = 3;
148         } else {
149             vorpal_mult = 11;
150             vorpal_div = 9;
151         }
152
153         mindam = calc_expect_dice(owner_ptr, mindice, 1, 1, FALSE, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
154         maxdam = calc_expect_dice(owner_ptr, maxdice, 1, 1, FALSE, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
155         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("切れ味:", "Vorpal:"), TERM_L_RED);
156     }
157
158     if ((owner_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (owner_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) {
159         force = TRUE;
160
161         mindam = calc_expect_dice(owner_ptr, mindice, 1, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
162         maxdam = calc_expect_dice(owner_ptr, maxdice, 1, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
163         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("理力:", "Force  :"), TERM_L_BLUE);
164     }
165
166     if (have_flag(flgs, TR_KILL_ANIMAL)) {
167         mindam = calc_expect_dice(owner_ptr, mindice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
168         maxdam = calc_expect_dice(owner_ptr, maxdice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
169         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("動物:", "Animals:"), TERM_YELLOW);
170     } else if (have_flag(flgs, TR_SLAY_ANIMAL)) {
171         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
172         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
173         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("動物:", "Animals:"), TERM_YELLOW);
174     }
175
176     if (have_flag(flgs, TR_KILL_EVIL)) {
177         mindam = calc_expect_dice(owner_ptr, mindice, 7, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
178         maxdam = calc_expect_dice(owner_ptr, maxdice, 7, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
179         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("邪悪:", "Evil:"), TERM_YELLOW);
180     } else if (have_flag(flgs, TR_SLAY_EVIL)) {
181         mindam = calc_expect_dice(owner_ptr, mindice, 2, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
182         maxdam = calc_expect_dice(owner_ptr, maxdice, 2, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
183         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("邪悪:", "Evil:"), TERM_YELLOW);
184     }
185
186     if (have_flag(flgs, TR_KILL_HUMAN)) {
187         mindam = calc_expect_dice(owner_ptr, mindice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
188         maxdam = calc_expect_dice(owner_ptr, maxdice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
189         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("人間:", "Human:"), TERM_YELLOW);
190     } else if (have_flag(flgs, TR_SLAY_HUMAN)) {
191         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
192         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
193         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("人間:", "Human:"), TERM_YELLOW);
194     }
195
196     if (have_flag(flgs, TR_KILL_UNDEAD)) {
197         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
198         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
199         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("不死:", "Undead:"), TERM_YELLOW);
200     } else if (have_flag(flgs, TR_SLAY_UNDEAD)) {
201         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
202         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
203         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("不死:", "Undead:"), TERM_YELLOW);
204     }
205
206     if (have_flag(flgs, TR_KILL_DEMON)) {
207         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
208         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
209         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("悪魔:", "Demons:"), TERM_YELLOW);
210     } else if (have_flag(flgs, TR_SLAY_DEMON)) {
211         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
212         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
213         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("悪魔:", "Demons:"), TERM_YELLOW);
214     }
215
216     if (have_flag(flgs, TR_KILL_ORC)) {
217         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
218         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
219         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("オーク:", "Orcs:"), TERM_YELLOW);
220     } else if (have_flag(flgs, TR_SLAY_ORC)) {
221         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
222         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
223         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("オーク:", "Orcs:"), TERM_YELLOW);
224     }
225
226     if (have_flag(flgs, TR_KILL_TROLL)) {
227         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
228         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
229         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("トロル:", "Trolls:"), TERM_YELLOW);
230     } else if (have_flag(flgs, TR_SLAY_TROLL)) {
231         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
232         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
233         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("トロル:", "Trolls:"), TERM_YELLOW);
234     }
235
236     if (have_flag(flgs, TR_KILL_GIANT)) {
237         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
238         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
239         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("巨人:", "Giants:"), TERM_YELLOW);
240     } else if (have_flag(flgs, TR_SLAY_GIANT)) {
241         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
242         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
243         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("巨人:", "Giants:"), TERM_YELLOW);
244     }
245
246     if (have_flag(flgs, TR_KILL_DRAGON)) {
247         mindam = calc_expect_dice(owner_ptr, mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
248         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
249         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("竜:", "Dragons:"), TERM_YELLOW);
250     } else if (have_flag(flgs, TR_SLAY_DRAGON)) {
251         mindam = calc_expect_dice(owner_ptr, mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
252         maxdam = calc_expect_dice(owner_ptr, maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
253         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("竜:", "Dragons:"), TERM_YELLOW);
254     }
255
256     if (have_flag(flgs, TR_BRAND_ACID)) {
257         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
258         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
259         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("酸属性:", "Acid:"), TERM_RED);
260     }
261
262     if (have_flag(flgs, TR_BRAND_ELEC)) {
263         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
264         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
265         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("電属性:", "Elec:"), TERM_RED);
266     }
267
268     if (have_flag(flgs, TR_BRAND_FIRE)) {
269         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
270         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
271         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("炎属性:", "Fire:"), TERM_RED);
272     }
273
274     if (have_flag(flgs, TR_BRAND_COLD)) {
275         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
276         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
277         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("冷属性:", "Cold:"), TERM_RED);
278     }
279
280     if (have_flag(flgs, TR_BRAND_POIS)) {
281         mindam = calc_expect_dice(owner_ptr, mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
282         maxdam = calc_expect_dice(owner_ptr, maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
283         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("毒属性:", "Poison:"), TERM_RED);
284     }
285 }
286
287 /*!
288  * @brief 武器匠における武器一つ毎の完全情報を表示する。
289  * @param player_type プレーヤーへの参照ポインタ
290  * @param o_ptr オブジェクトの構造体の参照ポインタ。
291  * @param row 表示する列の左端
292  * @param col 表示する行の上端
293  * @details
294  * Displays all info about a weapon
295  *
296  * Only accurate for the current weapon, because it includes
297  * various info about the player's +to_dam and number of blows.
298  * @return なし
299  */
300 static void list_weapon(player_type *player_ptr, object_type *o_ptr, TERM_LEN row, TERM_LEN col)
301 {
302     GAME_TEXT o_name[MAX_NLEN];
303     GAME_TEXT tmp_str[80];
304
305     DICE_NUMBER eff_dd = o_ptr->dd + player_ptr->to_dd[0];
306     DICE_SID eff_ds = o_ptr->ds + player_ptr->to_ds[0];
307     HIT_RELIABILITY reli = player_ptr->skill_thn + (player_ptr->to_h[0] + o_ptr->to_h) * BTH_PLUS_ADJ;
308
309     describe_flavor(player_ptr, o_name, o_ptr, OD_NAME_ONLY);
310     c_put_str(TERM_YELLOW, o_name, row, col);
311     sprintf(tmp_str, _("攻撃回数: %d", "Number of Blows: %d"), player_ptr->num_blow[0]);
312     put_str(tmp_str, row + 1, col);
313
314     sprintf(tmp_str, _("命中率:  0  50 100 150 200 (敵のAC)", "To Hit:  0  50 100 150 200 (AC)"));
315     put_str(tmp_str, row + 2, col);
316     sprintf(tmp_str, "        %2d  %2d  %2d  %2d  %2d (%%)", (int)hit_chance(player_ptr, reli, 0), (int)hit_chance(player_ptr, reli, 50),
317         (int)hit_chance(player_ptr, reli, 100), (int)hit_chance(player_ptr, reli, 150), (int)hit_chance(player_ptr, reli, 200));
318     put_str(tmp_str, row + 3, col);
319     c_put_str(TERM_YELLOW, _("可能なダメージ:", "Possible Damage:"), row + 5, col);
320
321     sprintf(tmp_str, _("攻撃一回につき %d-%d", "One Strike: %d-%d damage"), (int)(eff_dd + o_ptr->to_d + player_ptr->to_d[0]),
322         (int)(eff_ds * eff_dd + o_ptr->to_d + player_ptr->to_d[0]));
323     put_str(tmp_str, row + 6, col + 1);
324
325     sprintf(tmp_str, _("1ターンにつき %d-%d", "One Attack: %d-%d damage"), (int)(player_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + player_ptr->to_d[0])),
326         (int)(player_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + player_ptr->to_d[0])));
327     put_str(tmp_str, row + 7, col + 1);
328 }
329
330 /*!
331  * @brief 武器匠鑑定1回分(オブジェクト2種)の処理。/ Compare weapons
332  * @details
333  * Copies the weapons to compare into the weapon-slot and\n
334  * compares the values for both weapons.\n
335  * 武器1つだけで比較をしないなら費用は半額になる。
336  * @param bcost 基本鑑定費用
337  * @return 最終的にかかった費用
338  */
339 PRICE compare_weapons(player_type *customer_ptr, PRICE bcost)
340 {
341     object_type *o_ptr[2];
342     object_type orig_weapon;
343     object_type *i_ptr;
344     TERM_LEN row = 2;
345     TERM_LEN wid = 38, mgn = 2;
346     bool old_character_xtra = current_world_ptr->character_xtra;
347     char ch;
348     PRICE total = 0;
349     PRICE cost = 0; /* First time no price */
350
351     screen_save();
352     clear_bldg(0, 22);
353     i_ptr = &customer_ptr->inventory_list[INVEN_RARM];
354     object_copy(&orig_weapon, i_ptr);
355
356     item_tester_hook = item_tester_hook_orthodox_melee_weapons;
357     concptr q = _("第一の武器は?", "What is your first weapon? ");
358     concptr s = _("比べるものがありません。", "You have nothing to compare.");
359
360     OBJECT_IDX item;
361     o_ptr[0] = choose_object(customer_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
362     if (!o_ptr[0]) {
363         screen_load();
364         return 0;
365     }
366
367     int n = 1;
368     total = bcost;
369
370     while (TRUE) {
371         clear_bldg(0, 22);
372         item_tester_hook = item_tester_hook_orthodox_melee_weapons;
373         current_world_ptr->character_xtra = TRUE;
374         for (int i = 0; i < n; i++) {
375             int col = (wid * i + mgn);
376             if (o_ptr[i] != i_ptr)
377                 object_copy(i_ptr, o_ptr[i]);
378
379             customer_ptr->update |= PU_BONUS;
380             handle_stuff(customer_ptr);
381
382             list_weapon(customer_ptr, o_ptr[i], row, col);
383             compare_weapon_aux(customer_ptr, o_ptr[i], col, row + 8);
384             object_copy(i_ptr, &orig_weapon);
385         }
386
387         customer_ptr->update |= PU_BONUS;
388         handle_stuff(customer_ptr);
389
390         current_world_ptr->character_xtra = old_character_xtra;
391 #ifdef JP
392         put_str(format("[ 比較対象: 's'で変更 ($%d) ]", cost), 1, (wid + mgn));
393         put_str("(一番高いダメージが適用されます。複数の倍打効果は足し算されません。)", row + 4, 0);
394         prt("現在の技量から判断すると、あなたの武器は以下のような威力を発揮します:", 0, 0);
395 #else
396         put_str(format("[ 's' Select secondary weapon($%d) ]", cost), 1, (wid + mgn));
397         put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
398         prt("Based on your current abilities, here is what your weapons will do", 0, 0);
399 #endif
400
401         flush();
402         ch = inkey();
403         if (ch != 's')
404             break;
405
406         if (total + cost > customer_ptr->au) {
407             msg_print(_("お金が足りません!", "You don't have enough money!"));
408             msg_print(NULL);
409             continue;
410         }
411
412         q = _("第二の武器は?", "What is your second weapon? ");
413         s = _("比べるものがありません。", "You have nothing to compare.");
414         OBJECT_IDX item2;
415         o_ptr[1] = choose_object(customer_ptr, &item2, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
416         if (!o_ptr[1])
417             continue;
418
419         total += cost;
420         cost = bcost / 2;
421         n = 2;
422     }
423
424     screen_load();
425     return total;
426 }