1 #include "market/building-service.h"
2 #include "cmd-building/cmd-building.h"
3 #include "realm/realm-names-table.h"
4 #include "term/screen-processor.h"
5 #include "term/term-color-types.h"
8 * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
9 * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
10 * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
11 * @param player_ptr プレーヤーへの参照ポインタ
12 * @param bldg 施設構造体の参照ポインタ
13 * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
15 bool is_owner(player_type *player_ptr, building_type *bldg)
17 if (bldg->member_class[player_ptr->pclass] == BUILDING_OWNER) {
21 if (bldg->member_race[player_ptr->prace] == BUILDING_OWNER) {
25 REALM_IDX realm1 = player_ptr->realm1;
26 REALM_IDX realm2 = player_ptr->realm2;
27 if ((is_magic(realm1) && (bldg->member_realm[realm1] == BUILDING_OWNER)) || (is_magic(realm2) && (bldg->member_realm[realm2] == BUILDING_OWNER))) {
35 * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
37 * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
38 * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
39 * @param player_ptr プレーヤーへの参照ポインタ
40 * @param bldg 施設構造体の参照ポインタ
41 * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
42 * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
44 bool is_member(player_type *player_ptr, building_type *bldg)
46 if (bldg->member_class[player_ptr->pclass]) {
50 if (bldg->member_race[player_ptr->prace]) {
54 REALM_IDX realm1 = player_ptr->realm1;
55 REALM_IDX realm2 = player_ptr->realm2;
56 if ((is_magic(realm1) && bldg->member_realm[realm1]) || (is_magic(realm2) && bldg->member_realm[realm2])) {
60 if (player_ptr->pclass != CLASS_SORCERER)
63 for (int i = 0; i < MAX_MAGIC; i++) {
64 if (bldg->member_realm[i + 1])
72 * @brief 施設のサービス一覧を表示する / Display a building.
73 * @param player_ptr プレーヤーへの参照ポインタ
74 * @param bldg 施設構造体の参照ポインタ
77 void display_buikding_service(player_type *player_ptr, building_type *bldg)
84 sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
87 for (int i = 0; i < 8; i++) {
88 if (!bldg->letters[i])
91 if (bldg->action_restr[i] == 0) {
92 if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (!is_owner(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
93 action_color = TERM_WHITE;
95 } else if (is_owner(player_ptr, bldg)) {
96 action_color = TERM_YELLOW;
97 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
99 action_color = TERM_YELLOW;
100 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
103 sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
104 c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
108 if (bldg->action_restr[i] == 1) {
109 if (!is_member(player_ptr, bldg)) {
110 action_color = TERM_L_DARK;
111 strcpy(buff, _("(閉店)", "(closed)"));
112 } else if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (is_member(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
113 action_color = TERM_WHITE;
115 } else if (is_owner(player_ptr, bldg)) {
116 action_color = TERM_YELLOW;
117 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
119 action_color = TERM_YELLOW;
120 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
123 sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
124 c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
128 if (!is_owner(player_ptr, bldg)) {
129 action_color = TERM_L_DARK;
130 strcpy(buff, _("(閉店)", "(closed)"));
131 } else if (bldg->member_costs[i] != 0) {
132 action_color = TERM_YELLOW;
133 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
135 action_color = TERM_WHITE;
139 sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
140 c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
143 prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);