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"
13 * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
14 * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
15 * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
16 * @param player_ptr プレイヤーへの参照ポインタ
17 * @param bldg 施設構造体の参照ポインタ
18 * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
20 bool is_owner(PlayerType *player_ptr, building_type *bldg)
22 if (bldg->member_class[enum2i(player_ptr->pclass)] == BUILDING_OWNER) {
26 if (bldg->member_race[enum2i(player_ptr->prace)] == BUILDING_OWNER) {
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))) {
40 * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
42 * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
43 * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
44 * @param player_ptr プレイヤーへの参照ポインタ
45 * @param bldg 施設構造体の参照ポインタ
46 * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
47 * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
49 bool is_member(PlayerType *player_ptr, building_type *bldg)
51 if (static_cast<bool>(bldg->member_class[enum2i(player_ptr->pclass)])) {
55 if (static_cast<bool>(bldg->member_race[enum2i(player_ptr->prace)])) {
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])) {
65 if (!PlayerClass(player_ptr).equals(PlayerClassType::SORCERER)) {
69 for (int i = 0; i < MAX_MAGIC; i++) {
70 if (bldg->member_realm[i + 1]) {
79 * @brief 施設のサービス一覧を表示する / Display a building.
80 * @param player_ptr プレイヤーへの参照ポインタ
81 * @param bldg 施設構造体の参照ポインタ
83 void display_buikding_service(PlayerType *player_ptr, building_type *bldg)
88 prt(format("%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name), 2, 1);
90 for (int i = 0; i < 8; i++) {
91 if (!bldg->letters[i]) {
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]);
103 action_color = TERM_YELLOW;
104 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
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));
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]);
121 action_color = TERM_YELLOW;
122 buff = format(_("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
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));
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]);
136 action_color = TERM_WHITE;
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));
142 prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);