OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / market / building-service.c
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"
6
7 /*!
8  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
9  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
10  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
11  * @param player_ptr プレーヤーへの参照ポインタ
12  * @param bldg 施設構造体の参照ポインタ
13  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
14  */
15 bool is_owner(player_type *player_ptr, building_type *bldg)
16 {
17     if (bldg->member_class[player_ptr->pclass] == BUILDING_OWNER) {
18         return TRUE;
19     }
20
21     if (bldg->member_race[player_ptr->prace] == BUILDING_OWNER) {
22         return TRUE;
23     }
24
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))) {
28         return TRUE;
29     }
30
31     return FALSE;
32 }
33
34 /*!
35  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
36  (スペルマスターの特別判定つき)
37  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
38  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
39  * @param player_ptr プレーヤーへの参照ポインタ
40  * @param bldg 施設構造体の参照ポインタ
41  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
42  * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
43  */
44 bool is_member(player_type *player_ptr, building_type *bldg)
45 {
46     if (bldg->member_class[player_ptr->pclass]) {
47         return TRUE;
48     }
49
50     if (bldg->member_race[player_ptr->prace]) {
51         return TRUE;
52     }
53
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])) {
57         return TRUE;
58     }
59
60     if (player_ptr->pclass != CLASS_SORCERER)
61         return FALSE;
62
63     for (int i = 0; i < MAX_MAGIC; i++) {
64         if (bldg->member_realm[i + 1])
65             return TRUE;
66     }
67
68     return FALSE;
69 }
70
71 /*!
72  * @brief 施設のサービス一覧を表示する / Display a building.
73  * @param player_ptr プレーヤーへの参照ポインタ
74  * @param bldg 施設構造体の参照ポインタ
75  * @return なし
76  */
77 void display_buikding_service(player_type *player_ptr, building_type *bldg)
78 {
79     char buff[20];
80     byte action_color;
81     char tmp_str[80];
82
83     term_clear();
84     sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
85     prt(tmp_str, 2, 1);
86
87     for (int i = 0; i < 8; i++) {
88         if (!bldg->letters[i])
89             continue;
90
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;
94                 buff[0] = '\0';
95             } else if (is_owner(player_ptr, bldg)) {
96                 action_color = TERM_YELLOW;
97                 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
98             } else {
99                 action_color = TERM_YELLOW;
100                 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
101             }
102
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));
105             continue;
106         }
107
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;
114                 buff[0] = '\0';
115             } else if (is_owner(player_ptr, bldg)) {
116                 action_color = TERM_YELLOW;
117                 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
118             } else {
119                 action_color = TERM_YELLOW;
120                 sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
121             }
122
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));
125             continue;
126         }
127
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]);
134         } else {
135             action_color = TERM_WHITE;
136             buff[0] = '\0';
137         }
138
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));
141     }
142
143     prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);
144 }