OSDN Git Service

bc68da8171fdba1ee1df3b286bc65a4301a08e9b
[hengbandforosx/hengbandosx.git] / src / view / display-characteristic.c
1 /*!
2  * @brief キャラクタの特性を表示する
3  * @date 2020/02/25
4  * @author Hourier
5  */
6
7 #include "display-characteristic.h"
8 #include "flavor/flavor-util.h"
9 #include "inventory/inventory-slot-types.h"
10 #include "object-enchant/tr-types.h"
11 #include "object-enchant/trc-types.h"
12 #include "object/object-flags.h"
13 #include "player/permanent-resistances.h"
14 #include "player/race-resistances.h"
15 #include "player/temporary-resistances.h"
16 #include "term/screen-processor.h"
17 #include "term/term-color-types.h"
18 #include "util/bit-flags-calculator.h"
19
20 typedef struct {
21     BIT_FLAGS player_flags[TR_FLAG_SIZE];
22     BIT_FLAGS tim_player_flags[TR_FLAG_SIZE];
23     BIT_FLAGS player_imm[TR_FLAG_SIZE];
24     BIT_FLAGS tim_player_imm[TR_FLAG_SIZE];
25     BIT_FLAGS player_vuln[TR_FLAG_SIZE];
26     BIT_FLAGS known_obj_imm[TR_FLAG_SIZE];
27     BIT_FLAGS riding_flags[TR_FLAG_SIZE];
28     BIT_FLAGS riding_negative_flags[TR_FLAG_SIZE];
29 } all_player_flags;
30
31 /*!
32  * @brief 呪われた装備の表示色を変更する
33  * @param mode 表示オプション
34  * @param row 行数
35  * @param col 列数
36  * @param flags 装備品へのフラグ群
37  * @param header_color 耐性等のパラメータ名 の色
38  * @param o_ptr 装備品への参照ポインタ
39  * @return 与えられた装備が呪われていればTRUE
40  */
41 static bool decide_cursed_equipment_color(u16b mode, TERM_LEN row, TERM_LEN *col, BIT_FLAGS *flags, byte *header_color, object_type *o_ptr)
42 {
43     if ((mode & DP_CURSE) == 0)
44         return FALSE;
45
46     if (has_flag(flags, TR_ADD_L_CURSE) || has_flag(flags, TR_ADD_H_CURSE)) {
47         c_put_str(TERM_L_DARK, "+", row, *col);
48         *header_color = TERM_WHITE;
49     }
50
51     if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE)) {
52         c_put_str(TERM_WHITE, "+", row, *col);
53         *header_color = TERM_WHITE;
54     }
55
56     if (o_ptr->curse_flags & TRC_PERMA_CURSE) {
57         c_put_str(TERM_WHITE, "*", row, *col);
58         *header_color = TERM_WHITE;
59     }
60
61     (*col)++;
62     return TRUE;
63 }
64
65 /*!
66  * @brief 装備品の光源範囲増加/減少で表示色を変える
67  * @param row 行数
68  * @param col 列数
69  * @param flag1 参照する特性ID
70  * @param flags 装備品へのフラグ群
71  * @param header_color 耐性等のパラメータ名 の色
72  * @return 装備品が光源範囲に影響を及ぼすならばTRUE、そうでないならFALSE
73  */
74 static bool decide_light_equipment_color(TERM_LEN row, TERM_LEN *col, int flag1, BIT_FLAGS *flags, byte *header_color)
75 {
76     if (flag1 != TR_LITE_1)
77         return FALSE;
78
79     if (has_dark_flag(flags)) {
80         c_put_str(TERM_L_DARK, "+", row, *col);
81         *header_color = TERM_WHITE;
82     } else if (has_lite_flag(flags)) {
83         c_put_str(TERM_WHITE, "+", row, *col);
84         *header_color = TERM_WHITE;
85     }
86
87     (*col)++;
88     return TRUE;
89 }
90
91 /*!
92  * @brief プレーヤーの弱点に応じて表示色を変える
93  * @param mode 表示オプション
94  * @param row 行数
95  * @param col 列数
96  * @param flag1 参照する特性ID
97  * @param flags 装備品へのフラグ群
98  * @param header_color 耐性等のパラメータ名 の色
99  * @param vuln プレーヤーの弱点
100  * @return なし
101  */
102 static void decide_vulnerability_color(u16b mode, TERM_LEN row, TERM_LEN *col, int flag1, BIT_FLAGS *flags, byte *header_color, bool vuln, bool riding)
103 {
104     byte color = (riding ? TERM_L_GREEN : TERM_WHITE);
105     color = (vuln ? TERM_RED : color);
106     if (has_flag(flags, flag1)) {
107         c_put_str(color, (mode & DP_IMM) ? "*" : "+", row, *col);
108         *header_color = TERM_WHITE;
109     }
110
111     (*col)++;
112 }
113
114 /*!
115  * @brief 装備品を走査し、状況に応じて耐性等の表示色を変える
116  * @param creature_ptr プレーヤーへの参照ポインタ
117  * @param mode 表示オプション
118  * @param row 行数
119  * @param col 列数
120  * @param flag1 参照する特性ID
121  * @param header_color 耐性等のパラメータ名 の色
122  * @param vuln プレーヤーの弱点
123  * @return なし
124  * @details
125  * max_i changes only when weapon flags need only two column
126  */
127 static void decide_colors(player_type *creature_ptr, u16b mode, TERM_LEN row, TERM_LEN *col, int flag1, byte *header_color, bool vuln, bool riding)
128 {
129     int max_i = (mode & DP_WP) ? INVEN_SUB_HAND + 1 : INVEN_TOTAL;
130     for (inventory_slot_type i = INVEN_MAIN_HAND; i < max_i; i++) {
131         BIT_FLAGS flags[TR_FLAG_SIZE];
132         object_type *o_ptr;
133         o_ptr = &creature_ptr->inventory_list[i];
134         object_flags_known(creature_ptr, o_ptr, flags);
135         if (!(mode & DP_IMM)) {
136             byte color = (riding ? TERM_L_GREEN : TERM_SLATE);
137             color = (vuln ? TERM_RED : color);
138
139             c_put_str(color, ".", row, *col);
140         }
141
142         if (decide_cursed_equipment_color(mode, row, col, flags, header_color, o_ptr))
143             continue;
144         if (decide_light_equipment_color(row, col, flag1, flags, header_color))
145             continue;
146
147         decide_vulnerability_color(mode, row, col, flag1, flags, header_color, vuln, riding);
148     }
149 }
150
151 /*!
152  * @brief プレイヤーの特性フラグ一種を表示する
153  * @param row コンソール表示位置の左上行
154  * @param col コンソール表示位置の左上列
155  * @param header コンソール上で表示する特性名
156  * @param header_color 耐性等のパラメータ名 の色
157  * @param header_col 「耐性等のパラメータ名 の色」の元々の位置
158  * @param flag1 参照する特性ID
159  * @param vuln プレーヤーの弱点
160  * @param f プレイヤーの特性情報構造体
161  * @return なし
162  */
163 static void display_one_characteristic(
164     TERM_LEN row, TERM_LEN col, concptr header, byte header_color, int header_col, int flag1, bool vuln, bool riding, all_player_flags *f)
165 {
166     byte color = (riding ? TERM_L_GREEN : TERM_SLATE);
167     color = (vuln ? TERM_RED : color);
168     c_put_str(color, ".", row, col);
169
170     if (has_flag(f->player_flags, flag1)) {
171         color = (riding ? TERM_L_GREEN : TERM_WHITE);
172         color = (vuln ? TERM_RED : color);
173         c_put_str(color, "+", row, col);
174         header_color = riding ? color : TERM_WHITE;
175     }
176
177     if (has_flag(f->tim_player_flags, flag1)) {
178         c_put_str((byte)(vuln ? TERM_ORANGE : TERM_YELLOW), "#", row, col);
179         header_color = TERM_WHITE;
180     }
181
182     if (has_flag(f->tim_player_imm, flag1)) {
183         c_put_str(TERM_YELLOW, "*", row, col);
184         header_color = TERM_WHITE;
185     }
186
187     if (has_flag(f->player_imm, flag1)) {
188         c_put_str(TERM_WHITE, "*", row, col);
189         header_color = TERM_WHITE;
190     }
191
192     if (riding && !vuln) {
193         c_put_str(TERM_L_GREEN, "+", row, col + 1);
194         header_color = TERM_L_GREEN;
195     }
196     if (riding && vuln) {
197         c_put_str(TERM_RED, "-", row, col + 1);
198         header_color = TERM_RED;
199     }
200     if (!riding && vuln) {
201         c_put_str(TERM_RED, "v", row, col + 1);
202     }
203
204     c_put_str(header_color, header, row, header_col);
205 }
206
207 /*!
208  * @brief プレイヤーの特性フラグ一種表示を処理するメインルーチン
209  * @param creature_ptr プレーヤーへの参照ポインタ
210  * @param row コンソール表示位置の左上行
211  * @param col コンソール表示位置の左上列
212  * @param header コンソール上で表示する特性名
213  * @param flag1 参照する特性ID
214  * @param f プレイヤーの特性情報構造体
215  * @param mode 表示オプション
216  * @return なし
217  */
218 static void process_one_characteristic(player_type *creature_ptr, TERM_LEN row, TERM_LEN col, concptr header, int flag1, all_player_flags *f, u16b mode)
219 {
220     byte header_color = TERM_L_DARK;
221     int header_col = col;
222     bool vuln = FALSE;
223     bool riding = FALSE;
224     if (has_flag(f->player_vuln, flag1) && !(has_flag(f->known_obj_imm, flag1) || has_flag(f->player_imm, flag1) || has_flag(f->tim_player_imm, flag1))) {
225         vuln = TRUE;
226     }
227     if (has_flag(f->riding_flags, flag1)) {
228         riding = TRUE;
229     }
230     if (has_flag(f->riding_negative_flags, flag1)) {
231         riding = TRUE;
232         vuln = TRUE;
233     }
234
235     col += strlen(header) + 1;
236     decide_colors(creature_ptr, mode, row, &col, flag1, &header_color, vuln, riding);
237     if (mode & DP_IMM) {
238         if (header_color != TERM_L_DARK) {
239             c_put_str(header_color, header, row, header_col);
240         }
241
242         return;
243     }
244
245     display_one_characteristic(row, col, header, header_color, header_col, flag1, vuln, riding, f);
246 }
247
248 /*!
249  * @brief プレーヤーの基本耐性を表示する
250  * @param creature_ptr プレーヤーへの参照ポインタ
251  * @param display_player_equippy 表示へのコールバック
252  * @param f 特性フラグへの参照ポインタ
253  * @return なし
254  */
255 static void display_basic_resistance_info(
256     player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
257 {
258     TERM_LEN row = 12;
259     TERM_LEN col = 1;
260     (*display_player_equippy)(creature_ptr, row - 2, col + 8, 0);
261     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 8);
262
263     process_one_characteristic(creature_ptr, row + 0, col, _("耐酸  :", "Acid  :"), TR_RES_ACID, f, 0);
264     process_one_characteristic(creature_ptr, row + 0, col, _("耐酸  :", "Acid  :"), TR_IM_ACID, f, DP_IMM);
265     process_one_characteristic(creature_ptr, row + 1, col, _("耐電撃:", "Elec  :"), TR_RES_ELEC, f, 0);
266     process_one_characteristic(creature_ptr, row + 1, col, _("耐電撃:", "Elec  :"), TR_IM_ELEC, f, DP_IMM);
267     process_one_characteristic(creature_ptr, row + 2, col, _("耐火炎:", "Fire  :"), TR_RES_FIRE, f, 0);
268     process_one_characteristic(creature_ptr, row + 2, col, _("耐火炎:", "Fire  :"), TR_IM_FIRE, f, DP_IMM);
269     process_one_characteristic(creature_ptr, row + 3, col, _("耐冷気:", "Cold  :"), TR_RES_COLD, f, 0);
270     process_one_characteristic(creature_ptr, row + 3, col, _("耐冷気:", "Cold  :"), TR_IM_COLD, f, DP_IMM);
271     process_one_characteristic(creature_ptr, row + 4, col, _("耐毒  :", "Poison:"), TR_RES_POIS, f, 0);
272     process_one_characteristic(creature_ptr, row + 5, col, _("耐閃光:", "Light :"), TR_RES_LITE, f, 0);
273     process_one_characteristic(creature_ptr, row + 6, col, _("耐暗黒:", "Dark  :"), TR_RES_DARK, f, 0);
274     process_one_characteristic(creature_ptr, row + 7, col, _("耐破片:", "Shard :"), TR_RES_SHARDS, f, 0);
275     process_one_characteristic(creature_ptr, row + 8, col, _("耐盲目:", "Blind :"), TR_RES_BLIND, f, 0);
276     process_one_characteristic(creature_ptr, row + 9, col, _("耐混乱:", "Conf  :"), TR_RES_CONF, f, 0);
277 }
278
279 /*!
280  * @brief プレーヤーの上位耐性を表示する
281  * @param creature_ptr プレーヤーへの参照ポインタ
282  * @param display_player_equippy 表示へのコールバック
283  * @param f 特性フラグへの参照ポインタ
284  * @return なし
285  */
286 static void display_advanced_resistance_info(
287     player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
288 {
289     TERM_LEN row = 12;
290     TERM_LEN col = 26;
291     (*display_player_equippy)(creature_ptr, row - 2, col + 8, 0);
292     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 8);
293
294     process_one_characteristic(creature_ptr, row + 0, col, _("耐轟音:", "Sound :"), TR_RES_SOUND, f, 0);
295     process_one_characteristic(creature_ptr, row + 1, col, _("耐地獄:", "Nether:"), TR_RES_NETHER, f, 0);
296     process_one_characteristic(creature_ptr, row + 2, col, _("耐因混:", "Nexus :"), TR_RES_NEXUS, f, 0);
297     process_one_characteristic(creature_ptr, row + 3, col, _("耐カオ:", "Chaos :"), TR_RES_CHAOS, f, 0);
298     process_one_characteristic(creature_ptr, row + 4, col, _("耐劣化:", "Disnch:"), TR_RES_DISEN, f, 0);
299     process_one_characteristic(creature_ptr, row + 5, col, _("耐恐怖:", "Fear  :"), TR_RES_FEAR, f, 0);
300     process_one_characteristic(creature_ptr, row + 6, col, _("反射  :", "Reflct:"), TR_REFLECT, f, 0);
301     process_one_characteristic(creature_ptr, row + 7, col, _("火炎オ:", "AuFire:"), TR_SH_FIRE, f, 0);
302     process_one_characteristic(creature_ptr, row + 8, col, _("電気オ:", "AuElec:"), TR_SH_ELEC, f, 0);
303     process_one_characteristic(creature_ptr, row + 9, col, _("冷気オ:", "AuCold:"), TR_SH_COLD, f, 0);
304 }
305
306 /*!
307  * @brief プレーヤーのその他耐性を表示する
308  * @param creature_ptr プレーヤーへの参照ポインタ
309  * @param display_player_equippy 表示へのコールバック
310  * @param f 特性フラグへの参照ポインタ
311  * @return なし
312  */
313 static void display_other_resistance_info(
314     player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
315 {
316     TERM_LEN row = 12;
317     TERM_LEN col = 51;
318     (*display_player_equippy)(creature_ptr, row - 2, col + 12, 0);
319     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 12);
320
321     process_one_characteristic(creature_ptr, row + 0, col, _("加速      :", "Speed     :"), TR_SPEED, f, 0);
322     process_one_characteristic(creature_ptr, row + 1, col, _("耐麻痺    :", "FreeAction:"), TR_FREE_ACT, f, 0);
323     process_one_characteristic(creature_ptr, row + 2, col, _("透明体視認:", "SeeInvisi.:"), TR_SEE_INVIS, f, 0);
324     process_one_characteristic(creature_ptr, row + 3, col, _("経験値保持:", "Hold Exp  :"), TR_HOLD_EXP, f, 0);
325     process_one_characteristic(creature_ptr, row + 4, col, _("警告      :", "Warning   :"), TR_WARNING, f, 0);
326     process_one_characteristic(creature_ptr, row + 5, col, _("遅消化    :", "SlowDigest:"), TR_SLOW_DIGEST, f, 0);
327     process_one_characteristic(creature_ptr, row + 6, col, _("急回復    :", "Regene.   :"), TR_REGEN, f, 0);
328     process_one_characteristic(creature_ptr, row + 7, col, _("浮遊      :", "Levitation:"), TR_LEVITATION, f, 0);
329     process_one_characteristic(creature_ptr, row + 8, col, _("永遠光源  :", "Perm Lite :"), TR_LITE_1, f, 0);
330     process_one_characteristic(creature_ptr, row + 9, col, _("呪い      :", "Cursed    :"), 0, f, DP_CURSE);
331 }
332
333  all_player_flags get_player_state_flags(player_type *creature_ptr)
334 {
335     all_player_flags f;
336     player_flags(creature_ptr, f.player_flags);
337     tim_player_flags(creature_ptr, f.tim_player_flags);
338     player_immunity(creature_ptr, f.player_imm);
339     tim_player_immunity(creature_ptr, f.tim_player_imm);
340     known_obj_immunity(creature_ptr, f.known_obj_imm);
341     player_vulnerability_flags(creature_ptr, f.player_vuln);
342     riding_flags(creature_ptr, f.riding_flags, f.riding_negative_flags);
343     return f;
344 }
345
346 /*!
347  * @brief プレイヤーの特性フラグ一覧表示1
348  * @param creature_ptr プレーヤーへの参照ポインタ
349  * @param display_player_equippy 表示へのコールバック
350  * Special display, part 1
351  * @return なし
352  */
353 void display_player_flag_info_1(player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16))
354 {
355     all_player_flags f = get_player_state_flags(creature_ptr);
356
357     display_basic_resistance_info(creature_ptr, display_player_equippy, &f);
358     display_advanced_resistance_info(creature_ptr, display_player_equippy, &f);
359     display_other_resistance_info(creature_ptr, display_player_equippy, &f);
360 }
361
362 /*!
363  * @brief スレイ系の特性フラグを表示する
364  * @param creature_ptr プレーヤーへの参照ポインタ
365  * @param display_player_equippy 表示へのコールバック
366  * @param f 特性フラグへの参照ポインタ
367  * @return なし
368  */
369 static void display_slay_info(player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
370 {
371     TERM_LEN row = 3;
372     TERM_LEN col = 1;
373     (*display_player_equippy)(creature_ptr, row - 2, col + 12, DP_WP);
374     c_put_str(TERM_WHITE, "ab@", row - 1, col + 12);
375
376     process_one_characteristic(creature_ptr, row + 0, col, _("邪悪 倍打 :", "Slay Evil :"), TR_SLAY_EVIL, f, DP_WP);
377     process_one_characteristic(creature_ptr, row + 0, col, _("邪悪 倍打 :", "Slay Evil :"), TR_KILL_EVIL, f, (DP_WP | DP_IMM));
378     process_one_characteristic(creature_ptr, row + 1, col, _("不死 倍打 :", "Slay Und. :"), TR_SLAY_UNDEAD, f, DP_WP);
379     process_one_characteristic(creature_ptr, row + 1, col, _("不死 倍打 :", "Slay Und. :"), TR_KILL_UNDEAD, f, (DP_WP | DP_IMM));
380     process_one_characteristic(creature_ptr, row + 2, col, _("悪魔 倍打 :", "Slay Demon:"), TR_SLAY_DEMON, f, DP_WP);
381     process_one_characteristic(creature_ptr, row + 2, col, _("悪魔 倍打 :", "Slay Demon:"), TR_KILL_DEMON, f, (DP_WP | DP_IMM));
382     process_one_characteristic(creature_ptr, row + 3, col, _("龍 倍打   :", "Slay Drag.:"), TR_SLAY_DRAGON, f, DP_WP);
383     process_one_characteristic(creature_ptr, row + 3, col, _("龍 倍打   :", "Slay Drag.:"), TR_KILL_DRAGON, f, (DP_WP | DP_IMM));
384     process_one_characteristic(creature_ptr, row + 4, col, _("人間 倍打 :", "Slay Human:"), TR_SLAY_HUMAN, f, DP_WP);
385     process_one_characteristic(creature_ptr, row + 4, col, _("人間 倍打 :", "Slay Human:"), TR_KILL_HUMAN, f, (DP_WP | DP_IMM));
386     process_one_characteristic(creature_ptr, row + 5, col, _("動物 倍打 :", "Slay Anim.:"), TR_SLAY_ANIMAL, f, DP_WP);
387     process_one_characteristic(creature_ptr, row + 5, col, _("動物 倍打 :", "Slay Anim.:"), TR_KILL_ANIMAL, f, (DP_WP | DP_IMM));
388     process_one_characteristic(creature_ptr, row + 6, col, _("オーク倍打:", "Slay Orc  :"), TR_SLAY_ORC, f, DP_WP);
389     process_one_characteristic(creature_ptr, row + 6, col, _("オーク倍打:", "Slay Orc  :"), TR_KILL_ORC, f, (DP_WP | DP_IMM));
390     process_one_characteristic(creature_ptr, row + 7, col, _("トロル倍打:", "Slay Troll:"), TR_SLAY_TROLL, f, DP_WP);
391     process_one_characteristic(creature_ptr, row + 7, col, _("トロル倍打:", "Slay Troll:"), TR_KILL_TROLL, f, (DP_WP | DP_IMM));
392     process_one_characteristic(creature_ptr, row + 8, col, _("巨人 倍打 :", "Slay Giant:"), TR_SLAY_GIANT, f, DP_WP);
393     process_one_characteristic(creature_ptr, row + 8, col, _("巨人 倍打 :", "Slay Giant:"), TR_KILL_GIANT, f, (DP_WP | DP_IMM));
394     process_one_characteristic(creature_ptr, row + 9, col, _("溶解      :", "Acid Brand:"), TR_BRAND_ACID, f, DP_WP);
395     process_one_characteristic(creature_ptr, row + 10, col, _("電撃      :", "Elec Brand:"), TR_BRAND_ELEC, f, DP_WP);
396     process_one_characteristic(creature_ptr, row + 11, col, _("焼棄      :", "Fire Brand:"), TR_BRAND_FIRE, f, DP_WP);
397     process_one_characteristic(creature_ptr, row + 12, col, _("凍結      :", "Cold Brand:"), TR_BRAND_COLD, f, DP_WP);
398     process_one_characteristic(creature_ptr, row + 13, col, _("毒殺      :", "Poison Brd:"), TR_BRAND_POIS, f, DP_WP);
399     process_one_characteristic(creature_ptr, row + 14, col, _("切れ味    :", "Sharpness :"), TR_VORPAL, f, DP_WP);
400     process_one_characteristic(creature_ptr, row + 15, col, _("地震      :", "Quake     :"), TR_IMPACT, f, DP_WP);
401     process_one_characteristic(creature_ptr, row + 16, col, _("吸血      :", "Vampiric  :"), TR_VAMPIRIC, f, DP_WP);
402     process_one_characteristic(creature_ptr, row + 17, col, _("カオス効果:", "Chaotic   :"), TR_CHAOTIC, f, DP_WP);
403     process_one_characteristic(creature_ptr, row + 18, col, _("理力      :", "Force Wep.:"), TR_FORCE_WEAPON, f, DP_WP);
404 }
405
406 /*!
407  * @brief ESP/能力維持の特性フラグを表示する
408  * @param creature_ptr プレーヤーへの参照ポインタ
409  * @param display_player_equippy 表示へのコールバック
410  * @param f 特性フラグへの参照ポインタ
411  * @return なし
412  */
413 static void display_esp_sustenance_info(
414     player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
415 {
416     TERM_LEN row = 3;
417     TERM_LEN col = 1 + 12 + 7; // 20
418     (*display_player_equippy)(creature_ptr, row - 2, col + 13, 0);
419     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 13);
420
421     process_one_characteristic(creature_ptr, row + 0, col, _("テレパシー :", "Telepathy  :"), TR_TELEPATHY, f, 0);
422     process_one_characteristic(creature_ptr, row + 1, col, _("邪悪ESP    :", "ESP Evil   :"), TR_ESP_EVIL, f, 0);
423     process_one_characteristic(creature_ptr, row + 2, col, _("無生物ESP  :", "ESP Noliv. :"), TR_ESP_NONLIVING, f, 0);
424     process_one_characteristic(creature_ptr, row + 3, col, _("善良ESP    :", "ESP Good   :"), TR_ESP_GOOD, f, 0);
425     process_one_characteristic(creature_ptr, row + 4, col, _("不死ESP    :", "ESP Undead :"), TR_ESP_UNDEAD, f, 0);
426     process_one_characteristic(creature_ptr, row + 5, col, _("悪魔ESP    :", "ESP Demon  :"), TR_ESP_DEMON, f, 0);
427     process_one_characteristic(creature_ptr, row + 6, col, _("龍ESP      :", "ESP Dragon :"), TR_ESP_DRAGON, f, 0);
428     process_one_characteristic(creature_ptr, row + 7, col, _("人間ESP    :", "ESP Human  :"), TR_ESP_HUMAN, f, 0);
429     process_one_characteristic(creature_ptr, row + 8, col, _("動物ESP    :", "ESP Animal :"), TR_ESP_ANIMAL, f, 0);
430     process_one_characteristic(creature_ptr, row + 9, col, _("オークESP  :", "ESP Orc    :"), TR_ESP_ORC, f, 0);
431     process_one_characteristic(creature_ptr, row + 10, col, _("トロルESP  :", "ESP Troll  :"), TR_ESP_TROLL, f, 0);
432     process_one_characteristic(creature_ptr, row + 11, col, _("巨人ESP    :", "ESP Giant  :"), TR_ESP_GIANT, f, 0);
433     process_one_characteristic(creature_ptr, row + 12, col, _("ユニークESP:", "ESP Unique :"), TR_ESP_UNIQUE, f, 0);
434     process_one_characteristic(creature_ptr, row + 13, col, _("腕力維持   :", "Sust Str   :"), TR_SUST_STR, f, 0);
435     process_one_characteristic(creature_ptr, row + 14, col, _("知力維持   :", "Sust Int   :"), TR_SUST_INT, f, 0);
436     process_one_characteristic(creature_ptr, row + 15, col, _("賢さ維持   :", "Sust Wis   :"), TR_SUST_WIS, f, 0);
437     process_one_characteristic(creature_ptr, row + 16, col, _("器用維持   :", "Sust Dex   :"), TR_SUST_DEX, f, 0);
438     process_one_characteristic(creature_ptr, row + 17, col, _("耐久維持   :", "Sust Con   :"), TR_SUST_CON, f, 0);
439     process_one_characteristic(creature_ptr, row + 18, col, _("魅力維持   :", "Sust Chr   :"), TR_SUST_CHR, f, 0);
440 }
441
442 /*!
443  * @brief その他の特性フラグを表示する
444  * @param creature_ptr プレーヤーへの参照ポインタ
445  * @param display_player_equippy 表示へのコールバック
446  * @param f 特性フラグへの参照ポインタ
447  * @return なし
448  */
449 static void display_other_info(player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16), all_player_flags *f)
450 {
451     TERM_LEN row = 3;
452     TERM_LEN col = 20 + 12 + 17;
453     (*display_player_equippy)(creature_ptr, row - 2, col + 14, 0);
454     c_put_str(TERM_WHITE, "abcdefghijkl@", row - 1, col + 14);
455
456     process_one_characteristic(creature_ptr, row + 0, col, _("追加攻撃    :", "Add Blows   :"), TR_BLOWS, f, 0);
457     process_one_characteristic(creature_ptr, row + 1, col, _("採掘        :", "Add Tunnel  :"), TR_TUNNEL, f, 0);
458     process_one_characteristic(creature_ptr, row + 2, col, _("赤外線視力  :", "Add Infra   :"), TR_INFRA, f, 0);
459     process_one_characteristic(creature_ptr, row + 3, col, _("魔法道具支配:", "Add Device  :"), TR_MAGIC_MASTERY, f, 0);
460     process_one_characteristic(creature_ptr, row + 4, col, _("隠密        :", "Add Stealth :"), TR_STEALTH, f, 0);
461     process_one_characteristic(creature_ptr, row + 5, col, _("探索        :", "Add Search  :"), TR_SEARCH, f, 0);
462
463     process_one_characteristic(creature_ptr, row + 7, col, _("乗馬        :", "Riding      :"), TR_RIDING, f, 0);
464     process_one_characteristic(creature_ptr, row + 8, col, _("投擲        :", "Throw       :"), TR_THROW, f, 0);
465     process_one_characteristic(creature_ptr, row + 9, col, _("祝福        :", "Blessed     :"), TR_BLESSED, f, 0);
466     process_one_characteristic(creature_ptr, row + 10, col, _("反テレポート:", "No Teleport :"), TR_NO_TELE, f, 0);
467     process_one_characteristic(creature_ptr, row + 11, col, _("反魔法      :", "Anti Magic  :"), TR_NO_MAGIC, f, 0);
468     process_one_characteristic(creature_ptr, row + 12, col, _("消費魔力減少:", "Econom. Mana:"), TR_DEC_MANA, f, 0);
469
470     process_one_characteristic(creature_ptr, row + 14, col, _("経験値減少  :", "Drain Exp   :"), TR_DRAIN_EXP, f, 0);
471     process_one_characteristic(creature_ptr, row + 15, col, _("乱テレポート:", "Rnd.Teleport:"), TR_TELEPORT, f, 0);
472     process_one_characteristic(creature_ptr, row + 16, col, _("反感        :", "Aggravate   :"), TR_AGGRAVATE, f, 0);
473     process_one_characteristic(creature_ptr, row + 17, col, _("太古の怨念  :", "TY Curse    :"), TR_TY_CURSE, f, 0);
474 }
475
476 /*!
477  * @brief プレイヤーの特性フラグ一覧表示2
478  * @param creature_ptr プレーヤーへの参照ポインタ
479  * Special display, part 2
480  * @return なし
481  */
482 void display_player_flag_info_2(player_type *creature_ptr, void (*display_player_equippy)(player_type *, TERM_LEN, TERM_LEN, BIT_FLAGS16))
483 {
484     /* Extract flags and store */
485     all_player_flags f = get_player_state_flags(creature_ptr);
486
487     display_slay_info(creature_ptr, display_player_equippy, &f);
488     display_esp_sustenance_info(creature_ptr, display_player_equippy, &f);
489     display_other_info(creature_ptr, display_player_equippy, &f);
490 }