OSDN Git Service

[Refactor] #3733 optional 型の値取得処理 value() を撤廃した その3
[hengbandforosx/hengbandosx.git] / src / market / building-service.cpp
1 #include "market/building-service.h"
2 #include "cmd-building/cmd-building.h"
3 #include "player-base/player-class.h"
4 #include "realm/realm-names-table.h"
5 #include "system/building-type-definition.h"
6 #include "system/player-type-definition.h"
7 #include "term/screen-processor.h"
8 #include "term/term-color-types.h"
9 #include "term/z-form.h"
10 #include "util/enum-converter.h"
11
12 /*!
13  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
14  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
15  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
16  * @param player_ptr プレイヤーへの参照ポインタ
17  * @param bldg 施設構造体の参照ポインタ
18  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
19  */
20 bool is_owner(PlayerType *player_ptr, building_type *bldg)
21 {
22     if (bldg->member_class[enum2i(player_ptr->pclass)] == BUILDING_OWNER) {
23         return true;
24     }
25
26     if (bldg->member_race[enum2i(player_ptr->prace)] == BUILDING_OWNER) {
27         return true;
28     }
29
30     int16_t realm1 = player_ptr->realm1;
31     int16_t realm2 = player_ptr->realm2;
32     if ((is_magic(realm1) && (bldg->member_realm[realm1] == BUILDING_OWNER)) || (is_magic(realm2) && (bldg->member_realm[realm2] == BUILDING_OWNER))) {
33         return true;
34     }
35
36     return false;
37 }
38
39 /*!
40  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
41  (スペルマスターの特別判定つき)
42  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
43  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
44  * @param player_ptr プレイヤーへの参照ポインタ
45  * @param bldg 施設構造体の参照ポインタ
46  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
47  * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
48  */
49 bool is_member(PlayerType *player_ptr, building_type *bldg)
50 {
51     if (static_cast<bool>(bldg->member_class[enum2i(player_ptr->pclass)])) {
52         return true;
53     }
54
55     if (static_cast<bool>(bldg->member_race[enum2i(player_ptr->prace)])) {
56         return true;
57     }
58
59     int16_t realm1 = player_ptr->realm1;
60     int16_t realm2 = player_ptr->realm2;
61     if ((is_magic(realm1) && bldg->member_realm[realm1]) || (is_magic(realm2) && bldg->member_realm[realm2])) {
62         return true;
63     }
64
65     if (!PlayerClass(player_ptr).equals(PlayerClassType::SORCERER)) {
66         return false;
67     }
68
69     for (int i = 0; i < MAX_MAGIC; i++) {
70         if (bldg->member_realm[i + 1]) {
71             return true;
72         }
73     }
74
75     return false;
76 }
77
78 /*!
79  * @brief 施設のサービス一覧を表示する / Display a building.
80  * @param player_ptr プレイヤーへの参照ポインタ
81  * @param bldg 施設構造体の参照ポインタ
82  */
83 void display_buikding_service(PlayerType *player_ptr, building_type *bldg)
84 {
85     byte action_color;
86
87     term_clear();
88     prt(format("%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name), 2, 1);
89
90     for (int i = 0; i < 8; i++) {
91         if (!bldg->letters[i]) {
92             continue;
93         }
94
95         std::string buff;
96         if (bldg->action_restr[i] == 0) {
97             if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (!is_owner(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
98                 action_color = TERM_WHITE;
99             } else if (is_owner(player_ptr, bldg)) {
100                 action_color = TERM_YELLOW;
101                 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
102             } else {
103                 action_color = TERM_YELLOW;
104                 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
105             }
106
107             c_put_str(action_color, format(" %c) %s %s", bldg->letters[i], bldg->act_names[i], buff.data()), 19 + (i / 2), 35 * (i % 2));
108             continue;
109         }
110
111         if (bldg->action_restr[i] == 1) {
112             if (!is_member(player_ptr, bldg)) {
113                 action_color = TERM_L_DARK;
114                 buff = _("(閉店)", "(closed)");
115             } else if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (is_member(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
116                 action_color = TERM_WHITE;
117             } else if (is_owner(player_ptr, bldg)) {
118                 action_color = TERM_YELLOW;
119                 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
120             } else {
121                 action_color = TERM_YELLOW;
122                 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
123             }
124
125             c_put_str(action_color, format(" %c) %s %s", bldg->letters[i], bldg->act_names[i], buff.data()), 19 + (i / 2), 35 * (i % 2));
126             continue;
127         }
128
129         if (!is_owner(player_ptr, bldg)) {
130             action_color = TERM_L_DARK;
131             buff = _("(閉店)", "(closed)");
132         } else if (bldg->member_costs[i] != 0) {
133             action_color = TERM_YELLOW;
134             buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
135         } else {
136             action_color = TERM_WHITE;
137         }
138
139         c_put_str(action_color, format(" %c) %s %s", bldg->letters[i], bldg->act_names[i], buff.data()), 19 + (i / 2), 35 * (i % 2));
140     }
141
142     prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);
143 }