OSDN Git Service

Merge pull request #3038 from Hourier/Change-Describe-Flavor-Return-Type-String-1
[hengbandforosx/hengbandosx.git] / src / window / main-window-equipments.cpp
1 #include "window/main-window-equipments.h"
2 #include "flavor/flavor-describer.h"
3 #include "game-option/special-options.h"
4 #include "game-option/text-display-options.h"
5 #include "inventory/inventory-describer.h"
6 #include "inventory/inventory-slot-types.h"
7 #include "inventory/inventory-util.h"
8 #include "io/input-key-requester.h"
9 #include "locale/japanese.h"
10 #include "object/item-tester-hooker.h"
11 #include "object/item-use-flags.h"
12 #include "object/object-info.h"
13 #include "player/player-status-flags.h"
14 #include "system/baseitem-info.h"
15 #include "system/item-entity.h"
16 #include "system/player-type-definition.h"
17 #include "term/gameterm.h"
18 #include "term/screen-processor.h"
19 #include "term/term-color-types.h"
20 #include "term/z-form.h"
21 #include "util/bit-flags-calculator.h"
22 #include "util/string-processor.h"
23 #include <array>
24 #include <vector>
25
26 /*!
27  * @brief メインウィンドウの右上に装備アイテムの表示させる
28  * Display the equipment.
29  * @param target_item アイテムの選択処理を行うか否か。
30  * @return 選択したアイテムのタグ
31  */
32 COMMAND_CODE show_equipment(PlayerType *player_ptr, int target_item, BIT_FLAGS mode, const ItemTester &item_tester)
33 {
34     TermOffsetSetter tos(0, std::nullopt);
35
36     COMMAND_CODE i;
37     int j, k, l;
38     ItemEntity *o_ptr;
39     char tmp_val[80];
40     COMMAND_CODE out_index[23];
41     TERM_COLOR out_color[23];
42     std::array<std::string, 23> out_desc{};
43     COMMAND_CODE target_item_label = 0;
44     TERM_LEN wid, hgt;
45     char equip_label[52 + 1];
46     int col = command_gap;
47     term_get_size(&wid, &hgt);
48     int len = wid - col - 1;
49     for (k = 0, i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
50         o_ptr = &player_ptr->inventory_list[i];
51         auto only_slot = !(player_ptr->select_ring_slot ? is_ring_slot(i) : (item_tester.okay(o_ptr) || any_bits(mode, USE_FULL)));
52         auto is_any_hand = (i == INVEN_MAIN_HAND) && can_attack_with_sub_hand(player_ptr);
53         is_any_hand |= (i == INVEN_SUB_HAND) && can_attack_with_main_hand(player_ptr);
54         auto is_two_handed = is_any_hand && has_two_handed_weapons(player_ptr);
55         only_slot &= !is_two_handed || any_bits(mode, IGNORE_BOTHHAND_SLOT);
56         if (only_slot) {
57             continue;
58         }
59
60         GAME_TEXT item_name[MAX_NLEN]{};
61         describe_flavor(player_ptr, item_name, o_ptr, 0);
62         if (is_two_handed) {
63             out_desc[k] = _("(武器を両手持ち)", "(wielding with two-hands)");
64             out_color[k] = TERM_WHITE;
65         } else {
66             out_desc[k] = item_name;
67             out_color[k] = tval_to_attr[enum2i(o_ptr->bi_key.tval()) % 128];
68         }
69
70         out_index[k] = i;
71         if (o_ptr->timeout) {
72             out_color[k] = TERM_L_DARK;
73         }
74         l = out_desc[k].length() + (2 + _(1, 3));
75
76         if (show_labels) {
77             l += (_(7, 14) + 2);
78         }
79
80         if (show_weights) {
81             l += 9;
82         }
83
84         if (show_item_graph) {
85             l += 2;
86         }
87
88         if (l > len) {
89             len = l;
90         }
91
92         k++;
93     }
94
95     col = (len > wid - _(6, 4)) ? 0 : (wid - len - 1);
96     prepare_label_string(player_ptr, equip_label, USE_EQUIP, item_tester);
97     for (j = 0; j < k; j++) {
98         i = out_index[j];
99         o_ptr = &player_ptr->inventory_list[i];
100         prt("", j + 1, col ? col - 2 : col);
101         if (use_menu && target_item) {
102             if (j == (target_item - 1)) {
103                 angband_strcpy(tmp_val, _("》", "> "), sizeof(tmp_val));
104                 target_item_label = i;
105             } else {
106                 angband_strcpy(tmp_val, "  ", sizeof(tmp_val));
107             }
108         } else if (i >= INVEN_MAIN_HAND) {
109             strnfmt(tmp_val, sizeof(tmp_val), "%c)", equip_label[i - INVEN_MAIN_HAND]);
110         } else {
111             strnfmt(tmp_val, sizeof(tmp_val), "%c)", index_to_label(i));
112         }
113
114         put_str(tmp_val, j + 1, col);
115         int cur_col = col + 3;
116         if (show_item_graph) {
117             const auto a = o_ptr->get_color();
118             const auto c = o_ptr->get_symbol();
119             term_queue_bigchar(cur_col, j + 1, a, c, 0, 0);
120             if (use_bigtile) {
121                 cur_col++;
122             }
123
124             cur_col += 2;
125         }
126
127         if (show_labels) {
128             strnfmt(tmp_val, sizeof(tmp_val), _("%-7s: ", "%-14s: "), mention_use(player_ptr, i));
129             put_str(tmp_val, j + 1, cur_col);
130             c_put_str(out_color[j], out_desc[j], j + 1, _(cur_col + 9, cur_col + 16));
131         } else {
132             c_put_str(out_color[j], out_desc[j], j + 1, cur_col);
133         }
134
135         if (!show_weights) {
136             continue;
137         }
138
139         int wgt = o_ptr->weight * o_ptr->number;
140         strnfmt(tmp_val, sizeof(tmp_val), _("%3d.%1d kg", "%3d.%d lb"), _(lb_to_kg_integer(wgt), wgt / 10), _(lb_to_kg_fraction(wgt), wgt % 10));
141         prt(tmp_val, j + 1, wid - 9);
142     }
143
144     if (j && (j < 23)) {
145         prt("", j + 1, col ? col - 2 : col);
146     }
147
148     command_gap = col;
149     return target_item_label;
150 }