OSDN Git Service

Merge pull request #1774 from habu1010/feature/refactor-weapon-skill-table
[hengbandforosx/hengbandosx.git] / src / view / display-characteristic.cpp
1 /*!
2  * @brief キャラクタの特性を表示する
3  * @date 2020/02/25
4  * @author Hourier
5  * @details
6  * Arranged by iks 2021/04/23
7  */
8
9 #include "display-characteristic.h"
10 #include "flavor/flavor-util.h"
11 #include "inventory/inventory-slot-types.h"
12 #include "object-enchant/special-object-flags.h"
13 #include "object-enchant/tr-types.h"
14 #include "object-enchant/trc-types.h"
15 #include "object/object-flags.h"
16 #include "perception/object-perception.h"
17 #include "player/permanent-resistances.h"
18 #include "player/race-resistances.h"
19 #include "player/temporary-resistances.h"
20 #include "system/object-type-definition.h"
21 #include "system/player-type-definition.h"
22 #include "term/screen-processor.h"
23 #include "term/term-color-types.h"
24 #include "util/bit-flags-calculator.h"
25 #include <array>
26 #include <string>
27 #include <unordered_map>
28
29 struct all_player_flags {
30     TrFlags player_flags{};
31     TrFlags tim_player_flags{};
32     TrFlags player_imm{};
33     TrFlags tim_player_imm{};
34     TrFlags player_vuln{};
35     TrFlags known_obj_imm{};
36     TrFlags riding_flags{};
37     TrFlags riding_negative_flags{};
38 };
39
40 /*!
41  * @brief 特徴状況構造体
42  */
43 struct char_stat {
44     bool has_imm{}; //!< 免疫を持つ
45     bool has_res{}; //!< 耐性を持つ
46     bool has_tim{}; //!< 一時付加されている
47     bool has_vul{}; //!< 弱点を持つ
48     bool has_rid{}; //!< 乗馬に関係する
49     std::vector<std::string> syms; //!< 表示するシンボル
50 };
51
52 /*!
53  * @brief 上位の属性フラグへの変換辞書
54  */
55 static std::unordered_map<tr_type, tr_type> flag_to_greater_flag = {
56     { TR_RES_ACID, TR_IM_ACID },
57     { TR_RES_COLD, TR_IM_COLD },
58     { TR_RES_ELEC, TR_IM_ELEC },
59     { TR_RES_FIRE, TR_IM_FIRE },
60     { TR_RES_DARK, TR_IM_DARK },
61     { TR_SLAY_EVIL, TR_KILL_EVIL },
62     { TR_SLAY_GOOD, TR_KILL_GOOD },
63     { TR_SLAY_HUMAN, TR_KILL_HUMAN },
64     { TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
65     { TR_SLAY_DRAGON, TR_KILL_DRAGON },
66     { TR_SLAY_ORC, TR_KILL_ORC },
67     { TR_SLAY_TROLL, TR_KILL_TROLL },
68     { TR_SLAY_GIANT, TR_KILL_GIANT },
69     { TR_SLAY_DEMON, TR_KILL_DEMON },
70     { TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
71 };
72
73 /*!
74  * @brief 下位の属性フラグへの変換辞書
75  */
76 static std::unordered_map<tr_type, tr_type> flag_to_lesser_flag = {
77     { TR_RES_ACID, TR_VUL_ACID },
78     { TR_RES_COLD, TR_VUL_COLD },
79     { TR_RES_ELEC, TR_VUL_ELEC },
80     { TR_RES_FIRE, TR_VUL_FIRE },
81     { TR_RES_LITE, TR_VUL_LITE },
82 };
83
84 /*!
85  * pbrief 光源扱いするフラグ一覧
86  */
87 static std::array<tr_type, 6> lite_flags = {
88     TR_LITE_1,
89     TR_LITE_2,
90     TR_LITE_3,
91     TR_LITE_M1,
92     TR_LITE_M2,
93     TR_LITE_M3,
94 };
95
96 /*!
97  * @brief 装備品の呪い状況文字列を作成する
98  * @param player_ptr プレイヤー情報への参照ポインタ
99  * @param flag 判定する特性フラグ
100  * @param f プレイヤーの特性情報への参照ポインタ
101  * @param mode 参照モード(DP_WP)
102  * @param char_stat その行の特性の状況(参照渡し)
103  * その行の表示色用の判定も行う
104  */
105 static void process_cursed_equipment_characteristics(player_type *player_ptr, uint16_t mode, char_stat &char_stat)
106 {
107     int max_i = (mode & DP_WP) ? INVEN_BOW + 1 : INVEN_TOTAL;
108     for (int i = INVEN_MAIN_HAND; i < max_i; i++) {
109         auto *o_ptr = &player_ptr->inventory_list[i];
110         auto is_known = o_ptr->is_known();
111         auto is_sensed = is_known || o_ptr->ident & IDENT_SENSE;
112         auto flags = object_flags_known(o_ptr);
113
114         if (flags.has(TR_ADD_L_CURSE) || flags.has(TR_ADD_H_CURSE)) {
115             if (is_known) {
116                 char_stat.syms.emplace_back("+");
117                 char_stat.has_res = true;
118                 continue;
119             }
120         }
121
122         if (o_ptr->curse_flags.has(TRC::PERMA_CURSE)) {
123             if (is_known) {
124                 char_stat.syms.emplace_back("*");
125                 char_stat.has_imm = true;
126                 continue;
127             }
128         }
129
130         if (o_ptr->curse_flags.has_any_of({ TRC::CURSED, TRC::HEAVY_CURSE, TRC::PERMA_CURSE })) {
131             if (is_sensed) {
132                 char_stat.syms.emplace_back("+");
133                 char_stat.has_res = true;
134                 continue;
135             }
136         }
137
138         char_stat.syms.emplace_back(".");
139     }
140
141     char_stat.syms.emplace_back(".");
142 }
143
144 /*!
145  * @brief 装備品の光源状況文字列を作成する
146  * @param player_ptr プレイヤー情報への参照ポインタ
147  * @param flag 判定する特性フラグ
148  * @param f プレイヤーの特性情報への参照ポインタ
149  * @param mode 参照モード(DP_WP)
150  * @param char_stat その行の特性の状況(参照渡し)
151  * @details
152  * その行の表示色用の判定も行う
153  */
154 static void process_light_equipment_characteristics(player_type *player_ptr, all_player_flags *f, uint16_t mode, char_stat &char_stat)
155 {
156     int max_i = (mode & DP_WP) ? INVEN_BOW + 1 : INVEN_TOTAL;
157     for (int i = INVEN_MAIN_HAND; i < max_i; i++) {
158         auto *o_ptr = &player_ptr->inventory_list[i];
159         auto flags = object_flags_known(o_ptr);
160
161         auto b = false;
162         for (auto flg : lite_flags) {
163             if (flags.has(flg)) {
164                 b = true;
165                 break;
166             }
167         }
168         if (b) {
169             char_stat.syms.emplace_back("+");
170             char_stat.has_res = true;
171             continue;
172         }
173
174         char_stat.syms.emplace_back(".");
175     }
176
177     for (auto flg : lite_flags) {
178         if (f->tim_player_flags.has(flg)) {
179             char_stat.syms.emplace_back("#");
180             char_stat.has_tim = true;
181             return;
182         }
183         if (f->player_flags.has(flg)) {
184             char_stat.syms.emplace_back("+");
185             char_stat.has_res = true;
186             return;
187         }
188     }
189
190     char_stat.syms.emplace_back(".");
191 }
192
193 /*!
194  * @brief 装備品の状況文字列を作成する
195  * @param player_ptr プレイヤー情報への参照ポインタ
196  * @param flag 判定する特性フラグ
197  * @param f プレイヤーの特性情報への参照ポインタ
198  * @param mode 参照モード(DP_WP)
199  * @param char_stat その行の特性の状況(参照渡し)
200  * @details
201  * その行の表示色用の判定も行う
202  */
203 static void process_inventory_characteristic(player_type *player_ptr, tr_type flag, all_player_flags *f, uint16_t mode, char_stat &char_stat)
204 {
205     int max_i = (mode & DP_WP) ? INVEN_BOW + 1 : INVEN_TOTAL;
206     for (int i = INVEN_MAIN_HAND; i < max_i; i++) {
207         auto *o_ptr = &player_ptr->inventory_list[i];
208         auto flags = object_flags_known(o_ptr);
209
210         auto f_imm = flag_to_greater_flag.find(flag);
211         if (f_imm != flag_to_greater_flag.end()) {
212             if (flags.has(f_imm->second)) {
213                 char_stat.syms.emplace_back("*");
214                 char_stat.has_imm = true;
215                 continue;
216             }
217         }
218
219         auto b_vul = false;
220         auto f_vul = flag_to_lesser_flag.find(flag);
221         if (f_vul != flag_to_lesser_flag.end()) {
222             if (flags.has(f_vul->second)) {
223                 char_stat.has_vul = true;
224                 b_vul = true;
225             }
226         }
227
228         if (flags.has(flag)) {
229             char_stat.syms.emplace_back(b_vul ? "-" : "+");
230             char_stat.has_res = true;
231             continue;
232         }
233
234         char_stat.syms.emplace_back(b_vul ? "v" : ".");
235     }
236
237     if (f->player_imm.has(flag) || f->tim_player_imm.has(flag)) {
238         char_stat.syms.emplace_back("*");
239         char_stat.has_imm = true;
240     } else if (f->tim_player_flags.has(flag)) {
241         char_stat.syms.emplace_back("#");
242         char_stat.has_tim = true;
243     } else {
244         auto b_vul = f->player_vuln.has(flag);
245         if (f->player_flags.has(flag)) {
246             char_stat.syms.emplace_back(b_vul ? "-" : "+");
247             char_stat.has_res = true;
248         } else {
249             char_stat.syms.emplace_back(".");
250             if (b_vul)
251                 char_stat.has_vul = true;
252         }
253     }
254 }
255
256 /*!
257  * @brief プレイヤーの特性フラグ一種表示を処理するメインルーチン
258  * @param player_ptr プレイヤーへの参照ポインタ
259  * @param row コンソール表示位置の左上行
260  * @param col コンソール表示位置の左上列
261  * @param header コンソール上で表示する特性名
262  * @param flag1 参照する特性ID
263  * @param f プレイヤーの特性情報構造体
264  * @param mode 表示オプション
265  */
266 static void process_one_characteristic(player_type *player_ptr, TERM_LEN row, TERM_LEN col, std::string_view header, tr_type flag, all_player_flags *f, uint16_t mode)
267 {
268     char_stat char_stat;
269
270     if (f->riding_flags.has(flag))
271         char_stat.has_rid = true;
272     if (f->riding_negative_flags.has(flag)) {
273         char_stat.has_rid = true;
274         char_stat.has_vul = true;
275     }
276
277     if (mode & DP_LITE)
278         process_light_equipment_characteristics(player_ptr, f, mode, char_stat);
279     else if (mode & DP_CURSE)
280         process_cursed_equipment_characteristics(player_ptr, mode, char_stat);
281     else
282         process_inventory_characteristic(player_ptr, flag, f, mode, char_stat);
283
284     if (char_stat.has_vul && !char_stat.has_imm && !char_stat.has_res && !char_stat.has_tim)
285         char_stat.syms.emplace_back("v");
286
287     auto row_clr = char_stat.has_rid ? TERM_L_GREEN : TERM_WHITE;
288     if (!char_stat.has_imm) {
289         if (char_stat.has_res && char_stat.has_tim)
290             row_clr = char_stat.has_vul ? TERM_YELLOW : row_clr;
291         else if (char_stat.has_res || char_stat.has_tim)
292             row_clr = char_stat.has_vul ? TERM_ORANGE : row_clr;
293         else if (char_stat.has_vul)
294             row_clr = TERM_RED;
295         else
296             row_clr = TERM_L_DARK;
297     }
298
299     c_put_str(row_clr, header.data(), row, col);
300     col += header.length() + 1;
301
302     for (auto s : char_stat.syms) {
303         auto clr = row_clr;
304         if (s == "#")
305             clr = char_stat.has_vul && !char_stat.has_imm ? TERM_ORANGE : TERM_YELLOW;
306         if (s == "-" && !char_stat.has_imm)
307             clr = TERM_ORANGE;
308         if (s == "." && (!char_stat.has_imm && !char_stat.has_vul))
309             clr = TERM_L_DARK;
310         c_put_str(clr, s.c_str(), row, col++);
311     }
312 }
313
314 /*!
315  * @brief プレイヤーの基本耐性を表示する
316  * @param player_ptr プレイヤーへの参照ポインタ
317  * @param display_player_equippy 表示へのコールバック
318  * @param f 特性フラグへの参照ポインタ
319  */
320 static void display_basic_resistance_info(
321     player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
322 {
323     TERM_LEN row = 12;
324     TERM_LEN col = 1;
325     (*display_player_equippy)(player_ptr, row - 2, col + 8, 0);
326     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 8);
327
328     process_one_characteristic(player_ptr, row++, col, _("耐酸  :", "Acid  :"), TR_RES_ACID, f, 0);
329     process_one_characteristic(player_ptr, row++, col, _("耐電撃:", "Elec  :"), TR_RES_ELEC, f, 0);
330     process_one_characteristic(player_ptr, row++, col, _("耐火炎:", "Fire  :"), TR_RES_FIRE, f, 0);
331     process_one_characteristic(player_ptr, row++, col, _("耐冷気:", "Cold  :"), TR_RES_COLD, f, 0);
332     process_one_characteristic(player_ptr, row++, col, _("耐毒  :", "Poison:"), TR_RES_POIS, f, 0);
333     process_one_characteristic(player_ptr, row++, col, _("耐閃光:", "Light :"), TR_RES_LITE, f, 0);
334     process_one_characteristic(player_ptr, row++, col, _("耐暗黒:", "Dark  :"), TR_RES_DARK, f, 0);
335     process_one_characteristic(player_ptr, row++, col, _("耐破片:", "Shard :"), TR_RES_SHARDS, f, 0);
336     process_one_characteristic(player_ptr, row++, col, _("耐盲目:", "Blind :"), TR_RES_BLIND, f, 0);
337     process_one_characteristic(player_ptr, row++, col, _("耐混乱:", "Conf  :"), TR_RES_CONF, f, 0);
338 }
339
340 /*!
341  * @brief プレイヤーの上位耐性を表示する
342  * @param player_ptr プレイヤーへの参照ポインタ
343  * @param display_player_equippy 表示へのコールバック
344  * @param f 特性フラグへの参照ポインタ
345  */
346 static void display_advanced_resistance_info(
347     player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
348 {
349     TERM_LEN row = 12;
350     TERM_LEN col = 26;
351     (*display_player_equippy)(player_ptr, row - 2, col + 8, 0);
352     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 8);
353
354     process_one_characteristic(player_ptr, row++, col, _("耐轟音:", "Sound :"), TR_RES_SOUND, f, 0);
355     process_one_characteristic(player_ptr, row++, col, _("耐地獄:", "Nether:"), TR_RES_NETHER, f, 0);
356     process_one_characteristic(player_ptr, row++, col, _("耐因混:", "Nexus :"), TR_RES_NEXUS, f, 0);
357     process_one_characteristic(player_ptr, row++, col, _("耐カオ:", "Chaos :"), TR_RES_CHAOS, f, 0);
358     process_one_characteristic(player_ptr, row++, col, _("耐劣化:", "Disnch:"), TR_RES_DISEN, f, 0);
359     process_one_characteristic(player_ptr, row++, col, _("耐時間:", "Time  :"), TR_RES_TIME, f, 0);
360     process_one_characteristic(player_ptr, row++, col, _("耐水  :", "Water :"), TR_RES_WATER, f, 0);
361     process_one_characteristic(player_ptr, row++, col, _("耐恐怖:", "Fear  :"), TR_RES_FEAR, f, 0);
362     process_one_characteristic(player_ptr, row++, col, _("耐呪力:", "ResCur:"), TR_RES_CURSE, f, 0);
363 }
364
365 /*!
366  * @brief プレイヤーのその他耐性を表示する
367  * @param player_ptr プレイヤーへの参照ポインタ
368  * @param display_player_equippy 表示へのコールバック
369  * @param f 特性フラグへの参照ポインタ
370  */
371 static void display_other_resistance_info(
372     player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
373 {
374     TERM_LEN row = 12;
375     TERM_LEN col = 51;
376     (*display_player_equippy)(player_ptr, row - 2, col + 12, 0);
377     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 12);
378
379     process_one_characteristic(player_ptr, row++, col, _("加速      :", "Speed     :"), TR_SPEED, f, 0);
380     process_one_characteristic(player_ptr, row++, col, _("耐麻痺    :", "FreeAction:"), TR_FREE_ACT, f, 0);
381     process_one_characteristic(player_ptr, row++, col, _("透明体視認:", "SeeInvisi.:"), TR_SEE_INVIS, f, 0);
382     process_one_characteristic(player_ptr, row++, col, _("経験値保持:", "Hold Exp  :"), TR_HOLD_EXP, f, 0);
383     process_one_characteristic(player_ptr, row++, col, _("警告      :", "Warning   :"), TR_WARNING, f, 0);
384     process_one_characteristic(player_ptr, row++, col, _("遅消化    :", "SlowDigest:"), TR_SLOW_DIGEST, f, 0);
385     process_one_characteristic(player_ptr, row++, col, _("急回復    :", "Regene.   :"), TR_REGEN, f, 0);
386     process_one_characteristic(player_ptr, row++, col, _("浮遊      :", "Levitation:"), TR_LEVITATION, f, 0);
387     process_one_characteristic(player_ptr, row++, col, _("反射      :", "Reflct    :"), TR_REFLECT, f, 0);
388     process_one_characteristic(player_ptr, row++, col, _("呪い      :", "Cursed    :"), TR_FLAG_MAX, f, DP_CURSE);
389 }
390
391 /*!
392  * @brief プレイヤーの特性フラグを集計する
393  * @param player_ptr プレイヤーへの参照ポインタ
394  * @todo 将来的には装備系とまとめたいが、乗馬による特性変化や一時能力変化等の扱いがあるので据え置き。
395  */
396  all_player_flags get_player_state_flags(player_type *player_ptr)
397 {
398     all_player_flags f;
399     player_flags(player_ptr, f.player_flags);
400     tim_player_flags(player_ptr, f.tim_player_flags);
401     player_immunity(player_ptr, f.player_imm);
402     tim_player_immunity(player_ptr, f.tim_player_imm);
403     known_obj_immunity(player_ptr, f.known_obj_imm);
404     player_vulnerability_flags(player_ptr, f.player_vuln);
405     riding_flags(player_ptr, f.riding_flags, f.riding_negative_flags);
406     return f;
407 }
408
409 /*!
410  * @brief プレイヤーの特性フラグ一覧表示1
411  * @param player_ptr プレイヤーへの参照ポインタ
412  * @param display_player_equippy 表示へのコールバック
413  * Special display, part 1
414  */
415 void display_player_flag_info_1(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16))
416 {
417     all_player_flags f = get_player_state_flags(player_ptr);
418
419     display_basic_resistance_info(player_ptr, display_player_equippy, &f);
420     display_advanced_resistance_info(player_ptr, display_player_equippy, &f);
421     display_other_resistance_info(player_ptr, display_player_equippy, &f);
422 }
423
424 /*!
425  * @brief スレイ系の特性フラグを表示する
426  * @param player_ptr プレイヤーへの参照ポインタ
427  * @param display_player_equippy 表示へのコールバック
428  * @param f 特性フラグへの参照ポインタ
429  */
430 static void display_slay_info(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
431 {
432     TERM_LEN row = 3;
433     TERM_LEN col = 1;
434     (*display_player_equippy)(player_ptr, row - 2, col + 14, DP_WP);
435     c_put_str(TERM_WHITE, "abc@", row - 1, col + 14);
436
437     process_one_characteristic(player_ptr, row++, col, _("邪悪    倍打:", "Slay Evil   :"), TR_SLAY_EVIL, f, DP_WP);
438     process_one_characteristic(player_ptr, row++, col, _("善良    倍打:", "Slay Good   :"), TR_SLAY_GOOD, f, DP_WP);
439     process_one_characteristic(player_ptr, row++, col, _("不死    倍打:", "Slay Undead :"), TR_SLAY_UNDEAD, f, DP_WP);
440     process_one_characteristic(player_ptr, row++, col, _("デーモン倍打:", "Slay Demon  :"), TR_SLAY_DEMON, f, DP_WP);
441     process_one_characteristic(player_ptr, row++, col, _("ドラゴン倍打:", "Slay Dragon :"), TR_SLAY_DRAGON, f, DP_WP);
442     process_one_characteristic(player_ptr, row++, col, _("人間    倍打:", "Slay Human  :"), TR_SLAY_HUMAN, f, DP_WP);
443     process_one_characteristic(player_ptr, row++, col, _("動物    倍打:", "Slay Animal :"), TR_SLAY_ANIMAL, f, DP_WP);
444     process_one_characteristic(player_ptr, row++, col, _("オーク  倍打:", "Slay Orc    :"), TR_SLAY_ORC, f, DP_WP);
445     process_one_characteristic(player_ptr, row++, col, _("トロル  倍打:", "Slay Troll  :"), TR_SLAY_TROLL, f, DP_WP);
446     process_one_characteristic(player_ptr, row++, col, _("巨人    倍打:", "Slay Giant  :"), TR_SLAY_GIANT, f, DP_WP);
447 }
448
449 /*!
450  * @brief ブランド系の特性フラグを表示する
451  * @param player_ptr プレイヤーへの参照ポインタ
452  * @param display_player_equippy 表示へのコールバック
453  * @param f 特性フラグへの参照ポインタ
454  */
455 static void display_brand_info(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
456 {
457     TERM_LEN row = 3;
458     TERM_LEN col = 1;
459     (*display_player_equippy)(player_ptr, row - 2, col + 14, DP_WP);
460     c_put_str(TERM_WHITE, "abc@", row - 1, col + 14);
461     process_one_characteristic(player_ptr, row++, col, _("溶解        :", "Acid Brand  :"), TR_BRAND_ACID, f, DP_WP);
462     process_one_characteristic(player_ptr, row++, col, _("電撃        :", "Elec Brand  :"), TR_BRAND_ELEC, f, DP_WP);
463     process_one_characteristic(player_ptr, row++, col, _("焼棄        :", "Fire Brand  :"), TR_BRAND_FIRE, f, DP_WP);
464     process_one_characteristic(player_ptr, row++, col, _("凍結        :", "Cold Brand  :"), TR_BRAND_COLD, f, DP_WP);
465     process_one_characteristic(player_ptr, row++, col, _("毒殺        :", "Poison Brand:"), TR_BRAND_POIS, f, DP_WP);
466     process_one_characteristic(player_ptr, row++, col, _("切れ味      :", "Sharpness   :"), TR_VORPAL, f, DP_WP);
467     process_one_characteristic(player_ptr, row++, col, _("強撃        :", "Impactive   :"), TR_IMPACT, f, DP_WP);
468     process_one_characteristic(player_ptr, row++, col, _("地震        :", "Quake       :"), TR_EARTHQUAKE, f, DP_WP);
469     process_one_characteristic(player_ptr, row++, col, _("吸血        :", "Vampiric    :"), TR_VAMPIRIC, f, DP_WP);
470     process_one_characteristic(player_ptr, row++, col, _("カオス効果  :", "Chaotic     :"), TR_CHAOTIC, f, DP_WP);
471     process_one_characteristic(player_ptr, row++, col, _("魔術効果    :", "Magic Brand :"), TR_BRAND_MAGIC, f, DP_WP);
472     process_one_characteristic(player_ptr, row++, col, _("理力        :", "Force Weapon:"), TR_FORCE_WEAPON, f, DP_WP);
473     process_one_characteristic(player_ptr, row++, col, _("乗馬        :", "For Riding  :"), TR_RIDING, f, DP_WP);
474     process_one_characteristic(player_ptr, row++, col, _("補助        :", "Supportive  :"), TR_SUPPORTIVE, f, DP_WP);
475 }
476
477 /*!
478  * @brief その他の特性フラグを表示する
479  * @param player_ptr プレイヤーへの参照ポインタ
480  * @param display_player_equippy 表示へのコールバック
481  * @param f 特性フラグへの参照ポインタ
482  */
483 static void display_tval_misc_info(
484     player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
485 {
486     TERM_LEN row = 3;
487     TERM_LEN col = 49;
488     (*display_player_equippy)(player_ptr, row - 2, col + 14, 0);
489     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 14);
490
491     process_one_characteristic(player_ptr, row++, col, _("追加攻撃    :", "Add Blows   :"), TR_BLOWS, f, 0);
492     process_one_characteristic(player_ptr, row++, col, _("採掘        :", "Add Tunnel  :"), TR_TUNNEL, f, 0);
493     process_one_characteristic(player_ptr, row++, col, _("赤外線視力  :", "Add Infra   :"), TR_INFRA, f, 0);
494     process_one_characteristic(player_ptr, row++, col, _("魔法道具支配:", "Add Device  :"), TR_MAGIC_MASTERY, f, 0);
495     process_one_characteristic(player_ptr, row++, col, _("隠密        :", "Add Stealth :"), TR_STEALTH, f, 0);
496     process_one_characteristic(player_ptr, row++, col, _("探索        :", "Add Search  :"), TR_SEARCH, f, 0);
497     row++;
498     process_one_characteristic(player_ptr, row++, col, _("追加射撃    :", "Extra Shots :"), TR_XTRA_SHOTS, f, 0);
499     process_one_characteristic(player_ptr, row++, col, _("投擲        :", "Throw       :"), TR_THROW, f, 0);
500     process_one_characteristic(player_ptr, row++, col, _("祝福        :", "Blessed     :"), TR_BLESSED, f, 0);
501     process_one_characteristic(player_ptr, row++, col, _("永遠光源    :", "Perm Lite   :"), TR_LITE_1, f, DP_LITE);
502     process_one_characteristic(player_ptr, row++, col, _("消費魔力減少:", "Econom. Mana:"), TR_DEC_MANA, f, 0);
503     process_one_characteristic(player_ptr, row++, col, _("魔法難度減少:", "Easy Spell  :"), TR_EASY_SPELL, f, 0);
504     process_one_characteristic(player_ptr, row++, col, _("発動        :", "Activate    :"), TR_ACTIVATE, f, 0);
505     process_one_characteristic(player_ptr, row++, col, _("反魔法      :", "Anti Magic  :"), TR_NO_MAGIC, f, 0);
506 }
507
508 /*!
509  * @brief ESPの特性フラグを表示する
510  * @param player_ptr プレイヤーへの参照ポインタ
511  * @param display_player_equippy 表示へのコールバック
512  * @param f 特性フラグへの参照ポインタ
513  */
514 static void display_esc_info(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
515 {
516     TERM_LEN row = 3;
517     TERM_LEN col = 21;
518     (*display_player_equippy)(player_ptr, row - 2, col + 13, 0);
519     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 13);
520     process_one_characteristic(player_ptr, row++, col, _("テレパシー :", "Telepathy  :"), TR_TELEPATHY, f, 0);
521     process_one_characteristic(player_ptr, row++, col, _("邪悪    ESP:", "ESP Evil   :"), TR_ESP_EVIL, f, 0);
522     process_one_characteristic(player_ptr, row++, col, _("無生物  ESP:", "ESP Noliv. :"), TR_ESP_NONLIVING, f, 0);
523     process_one_characteristic(player_ptr, row++, col, _("善良    ESP:", "ESP Good   :"), TR_ESP_GOOD, f, 0);
524     process_one_characteristic(player_ptr, row++, col, _("不死    ESP:", "ESP Undead :"), TR_ESP_UNDEAD, f, 0);
525     process_one_characteristic(player_ptr, row++, col, _("デーモンESP:", "ESP Demon  :"), TR_ESP_DEMON, f, 0);
526     process_one_characteristic(player_ptr, row++, col, _("ドラゴンESP:", "ESP Dragon :"), TR_ESP_DRAGON, f, 0);
527     process_one_characteristic(player_ptr, row++, col, _("人間    ESP:", "ESP Human  :"), TR_ESP_HUMAN, f, 0);
528     process_one_characteristic(player_ptr, row++, col, _("動物    ESP:", "ESP Animal :"), TR_ESP_ANIMAL, f, 0);
529     process_one_characteristic(player_ptr, row++, col, _("オーク  ESP:", "ESP Orc    :"), TR_ESP_ORC, f, 0);
530     process_one_characteristic(player_ptr, row++, col, _("トロル  ESP:", "ESP Troll  :"), TR_ESP_TROLL, f, 0);
531     process_one_characteristic(player_ptr, row++, col, _("巨人    ESP:", "ESP Giant  :"), TR_ESP_GIANT, f, 0);
532     process_one_characteristic(player_ptr, row++, col, _("ユニークESP:", "ESP Unique :"), TR_ESP_UNIQUE, f, 0);
533 }
534
535
536 /*!
537  * @brief ESP/能力維持の特性フラグを表示する
538  * @param player_ptr プレイヤーへの参照ポインタ
539  * @param display_player_equippy 表示へのコールバック
540  * @param f 特性フラグへの参照ポインタ
541  */
542 static void display_stustain_aura_info(
543     player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
544 {
545     TERM_LEN row = 3;
546     TERM_LEN col = 21;
547     (*display_player_equippy)(player_ptr, row - 2, col + 12, 0);
548     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 12);
549
550     process_one_characteristic(player_ptr, row++, col, _("腕力  維持:", "Sust Str  :"), TR_SUST_STR, f, 0);
551     process_one_characteristic(player_ptr, row++, col, _("知力  維持:", "Sust Int  :"), TR_SUST_INT, f, 0);
552     process_one_characteristic(player_ptr, row++, col, _("賢さ  維持:", "Sust Wis  :"), TR_SUST_WIS, f, 0);
553     process_one_characteristic(player_ptr, row++, col, _("器用  維持:", "Sust Dex  :"), TR_SUST_DEX, f, 0);
554     process_one_characteristic(player_ptr, row++, col, _("耐久力維持:", "Sust Con  :"), TR_SUST_CON, f, 0);
555     process_one_characteristic(player_ptr, row++, col, _("魅力  維持:", "Sust Chr  :"), TR_SUST_CHR, f, 0);
556     row++;
557     process_one_characteristic(player_ptr, row++, col, _("火炎オーラ:", "Aura Fire :"), TR_SH_FIRE, f, 0);
558     process_one_characteristic(player_ptr, row++, col, _("電気オーラ:", "Aura Elec :"), TR_SH_ELEC, f, 0);
559     process_one_characteristic(player_ptr, row++, col, _("冷気オーラ:", "Aura Cold :"), TR_SH_COLD, f, 0);
560     process_one_characteristic(player_ptr, row++, col, _("射撃無効  :", "Invl Arrow:"), TR_INVULN_ARROW, f, 0);
561 }
562
563 /*!
564  * @brief その他の特性フラグを表示する
565  * @param player_ptr プレイヤーへの参照ポインタ
566  * @param display_player_equippy 表示へのコールバック
567  * @param f 特性フラグへの参照ポインタ
568  */
569 static void display_curse_info(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
570 {
571     TERM_LEN row = 3;
572     TERM_LEN col = 49;
573     (*display_player_equippy)(player_ptr, row - 2, col + 14, 0);
574     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 14);
575
576     process_one_characteristic(player_ptr, row++, col, _("太古の怨念  :", "TY Curse    :"), TR_TY_CURSE, f, 0);
577     process_one_characteristic(player_ptr, row++, col, _("反感        :", "Aggravate   :"), TR_AGGRAVATE, f, 0);
578     process_one_characteristic(player_ptr, row++, col, _("弱い呪い増殖:", "Add Curse   :"), TR_ADD_L_CURSE, f, 0);
579     process_one_characteristic(player_ptr, row++, col, _("強い呪い増殖:", "AddHeavyCur.:"), TR_ADD_H_CURSE, f, 0);
580     process_one_characteristic(player_ptr, row++, col, _("経験値減少  :", "Drain Exp   :"), TR_DRAIN_EXP, f, 0);
581     process_one_characteristic(player_ptr, row++, col, _("体力吸収    :", "Drain HP    :"), TR_DRAIN_HP, f, 0);
582     process_one_characteristic(player_ptr, row++, col, _("魔力吸収    :", "Drain Mana  :"), TR_DRAIN_MANA, f, 0);
583     process_one_characteristic(player_ptr, row++, col, _("反テレポート:", "No Teleport :"), TR_NO_TELE, f, 0);
584     process_one_characteristic(player_ptr, row++, col, _("魔法防御半減:", "Vuln. Magic :"), TR_DOWN_SAVING, f, 0);
585     process_one_characteristic(player_ptr, row++, col, _("速消化      :", "Fast Digest :"), TR_FAST_DIGEST, f, 0);
586     process_one_characteristic(player_ptr, row++, col, _("回復力低下  :", "Slow Regen  :"), TR_SLOW_REGEN, f, 0);
587     process_one_characteristic(player_ptr, row++, col, _("恐怖発生    :", "Cowardice   :"), TR_COWARDICE, f, 0);
588     process_one_characteristic(player_ptr, row++, col, _("魔法難度増加:", "Dfclt. Spell:"), TR_HARD_SPELL, f, 0);
589     process_one_characteristic(player_ptr, row++, col, _("打撃力低下  :", "Low Melee   :"), TR_LOW_MELEE, f, 0);
590     process_one_characteristic(player_ptr, row++, col, _("AC低下      :", "Low AC      :"), TR_LOW_AC, f, 0);
591     process_one_characteristic(player_ptr, row++, col, _("狂戦士化    :", "Berserk Rage:"), TR_BERS_RAGE, f, 0);
592 }
593
594 /*!
595  * @brief プレイヤーの特性フラグ一覧表示2
596  * @param player_ptr プレイヤーへの参照ポインタ
597  * Special display, part 2
598  */
599 void display_player_flag_info_2(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16))
600 {
601     /* Extract flags and store */
602     all_player_flags f = get_player_state_flags(player_ptr);
603
604     display_slay_info(player_ptr, display_player_equippy, &f);
605     display_esc_info(player_ptr, display_player_equippy, &f);
606     display_tval_misc_info(player_ptr, display_player_equippy, &f);
607 }
608
609 /*!
610  * @brief プレイヤーの特性フラグ一覧表示3
611  * @param player_ptr プレイヤーへの参照ポインタ
612  * Special display, part 3
613  */
614 void display_player_flag_info_3(player_type *player_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16))
615 {
616     /* Extract flags and store */
617     all_player_flags f = get_player_state_flags(player_ptr);
618
619     display_brand_info(player_ptr, display_player_equippy, &f);
620     display_stustain_aura_info(player_ptr, display_player_equippy, &f);
621     display_curse_info(player_ptr, display_player_equippy, &f);
622 }