OSDN Git Service

[Refactor] #40275 Separated building-service./h from building.c
authorHourier <hourier@users.sourceforge.jp>
Wed, 20 May 2020 12:12:39 +0000 (21:12 +0900)
committerHourier <hourier@users.sourceforge.jp>
Wed, 20 May 2020 12:12:39 +0000 (21:12 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/market/building-service.c [new file with mode: 0644]
src/market/building-service.h [new file with mode: 0644]
src/market/building.c

index b2cf175..74f042d 100644 (file)
     <ClCompile Include="..\..\src\market\bounty.c" />\r
     <ClCompile Include="..\..\src\market\building-quest.c" />\r
     <ClCompile Include="..\..\src\market\building-recharger.c" />\r
+    <ClCompile Include="..\..\src\market\building-service.c" />\r
     <ClCompile Include="..\..\src\mind\racial-samurai.c" />\r
     <ClCompile Include="..\..\src\mspell\mspell-floor.c" />\r
     <ClCompile Include="..\..\src\mspell\mspell-particularity.c" />\r
     <ClInclude Include="..\..\src\market\bounty.h" />\r
     <ClInclude Include="..\..\src\market\building-quest.h" />\r
     <ClInclude Include="..\..\src\market\building-recharger.h" />\r
+    <ClInclude Include="..\..\src\market\building-service.h" />\r
     <ClInclude Include="..\..\src\mind\racial-samurai.h" />\r
     <ClInclude Include="..\..\src\mspell\assign-monster-spell.h" />\r
     <ClInclude Include="..\..\src\mspell\mspell-floor.h" />\r
index d2737f7..36e0960 100644 (file)
     <ClCompile Include="..\..\src\market\building-quest.c">
       <Filter>market</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\market\building-service.c">
+      <Filter>market</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\cmd\cmd-activate.h">
     <ClInclude Include="..\..\src\market\building-quest.h">
       <Filter>market</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\market\building-service.h">
+      <Filter>market</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 9d7c4e6..11761dc 100644 (file)
@@ -74,6 +74,7 @@ hengband_SOURCES = \
        market/bounty.c market/bounty.h \
        market/building-recharger.c market/building-recharger.h \
        market/building-quest.c market/building-quest.h \
+       market/building-service.c market/building-service.h \
        \
        view/display-characteristic.c view/display-characteristic.h \
        view/display-fruit.c view/display-fruit.h \
diff --git a/src/market/building-service.c b/src/market/building-service.c
new file mode 100644 (file)
index 0000000..966644b
--- /dev/null
@@ -0,0 +1,142 @@
+#include "system/angband.h"
+#include "market/building-service.h"
+#include "term/gameterm.h"
+
+/*!
+ * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
+ * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
+ * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @param bldg 施設構造体の参照ポインタ
+ * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
+ */
+bool is_owner(player_type *player_ptr, building_type *bldg)
+{
+    if (bldg->member_class[player_ptr->pclass] == BUILDING_OWNER) {
+        return TRUE;
+    }
+
+    if (bldg->member_race[player_ptr->prace] == BUILDING_OWNER) {
+        return TRUE;
+    }
+
+    REALM_IDX realm1 = player_ptr->realm1;
+    REALM_IDX realm2 = player_ptr->realm2;
+    if ((is_magic(realm1) && (bldg->member_realm[realm1] == BUILDING_OWNER)) || (is_magic(realm2) && (bldg->member_realm[realm2] == BUILDING_OWNER))) {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*!
+ * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
+ (スペルマスターの特別判定つき)
+ * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
+ * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @param bldg 施設構造体の参照ポインタ
+ * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
+ * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
+ */
+bool is_member(player_type *player_ptr, building_type *bldg)
+{
+    if (bldg->member_class[player_ptr->pclass]) {
+        return TRUE;
+    }
+
+    if (bldg->member_race[player_ptr->prace]) {
+        return TRUE;
+    }
+
+    REALM_IDX realm1 = player_ptr->realm1;
+    REALM_IDX realm2 = player_ptr->realm2;
+    if ((is_magic(realm1) && bldg->member_realm[realm1]) || (is_magic(realm2) && bldg->member_realm[realm2])) {
+        return TRUE;
+    }
+
+    if (player_ptr->pclass != CLASS_SORCERER)
+        return FALSE;
+
+    for (int i = 0; i < MAX_MAGIC; i++) {
+        if (bldg->member_realm[i + 1])
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*!
+ * @brief 施設のサービス一覧を表示する / Display a building.
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @param bldg 施設構造体の参照ポインタ
+ * @return なし
+ */
+void display_buikding_service(player_type *player_ptr, building_type *bldg)
+{
+    char buff[20];
+    byte action_color;
+    char tmp_str[80];
+
+    Term_clear();
+    sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
+    prt(tmp_str, 2, 1);
+
+    for (int i = 0; i < 8; i++) {
+        if (!bldg->letters[i])
+            continue;
+
+        if (bldg->action_restr[i] == 0) {
+            if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (!is_owner(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
+                action_color = TERM_WHITE;
+                buff[0] = '\0';
+            } else if (is_owner(player_ptr, bldg)) {
+                action_color = TERM_YELLOW;
+                sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
+            } else {
+                action_color = TERM_YELLOW;
+                sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
+            }
+
+            sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
+            c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
+            continue;
+        }
+
+        if (bldg->action_restr[i] == 1) {
+            if (!is_member(player_ptr, bldg)) {
+                action_color = TERM_L_DARK;
+                strcpy(buff, _("(閉店)", "(closed)"));
+            } else if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) || (is_member(player_ptr, bldg) && (bldg->other_costs[i] == 0))) {
+                action_color = TERM_WHITE;
+                buff[0] = '\0';
+            } else if (is_owner(player_ptr, bldg)) {
+                action_color = TERM_YELLOW;
+                sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
+            } else {
+                action_color = TERM_YELLOW;
+                sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
+            }
+
+            sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
+            c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
+            continue;
+        }
+
+        if (!is_owner(player_ptr, bldg)) {
+            action_color = TERM_L_DARK;
+            strcpy(buff, _("(閉店)", "(closed)"));
+        } else if (bldg->member_costs[i] != 0) {
+            action_color = TERM_YELLOW;
+            sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
+        } else {
+            action_color = TERM_WHITE;
+            buff[0] = '\0';
+        }
+
+        sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
+        c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
+    }
+
+    prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);
+}
diff --git a/src/market/building-service.h b/src/market/building-service.h
new file mode 100644 (file)
index 0000000..332dbf2
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+bool is_owner(player_type *player_ptr, building_type *bldg);
+bool is_member(player_type *player_ptr, building_type *bldg);
+void display_buikding_service(player_type *player_ptr, building_type *bldg);
index d722bbf..b96d547 100644 (file)
@@ -64,6 +64,7 @@
 #include "market/bounty.h"
 #include "market/building-recharger.h"
 #include "market/building-quest.h"
+#include "market/building-service.h"
 
 building_type building[MAX_BLDG];
 
@@ -77,176 +78,6 @@ bool reinit_wilderness = FALSE;
 MONSTER_IDX today_mon;
 
 /*!
- * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
- * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
- * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param bldg 施設構造体の参照ポインタ
- * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
- */
-static bool is_owner(player_type *player_ptr, building_type *bldg)
-{
-       if (bldg->member_class[player_ptr->pclass] == BUILDING_OWNER)
-       {
-               return TRUE;
-       }
-
-       if (bldg->member_race[player_ptr->prace] == BUILDING_OWNER)
-       {
-               return TRUE;
-       }
-
-       REALM_IDX realm1 = player_ptr->realm1;
-       REALM_IDX realm2 = player_ptr->realm2;
-       if ((is_magic(realm1) && (bldg->member_realm[realm1] == BUILDING_OWNER)) ||
-               (is_magic(realm2) && (bldg->member_realm[realm2] == BUILDING_OWNER)))
-       {
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
-
-/*!
- * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
- (スペルマスターの特別判定つき)
- * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
- * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param bldg 施設構造体の参照ポインタ
- * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
- * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
- */
-static bool is_member(player_type *player_ptr, building_type *bldg)
-{
-       if (bldg->member_class[player_ptr->pclass])
-       {
-               return TRUE;
-       }
-
-       if (bldg->member_race[player_ptr->prace])
-       {
-               return TRUE;
-       }
-
-       REALM_IDX realm1 = player_ptr->realm1;
-       REALM_IDX realm2 = player_ptr->realm2;
-       if ((is_magic(realm1) && bldg->member_realm[realm1]) ||
-               (is_magic(realm2) && bldg->member_realm[realm2]))
-       {
-               return TRUE;
-       }
-
-       if (player_ptr->pclass != CLASS_SORCERER) return FALSE;
-
-       for (int i = 0; i < MAX_MAGIC; i++)
-       {
-               if (bldg->member_realm[i + 1]) return TRUE;
-       }
-
-       return FALSE;
-}
-
-
-/*!
- * @brief 施設のサービス一覧を表示する / Display a building.
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param bldg 施設構造体の参照ポインタ
- * @return なし
- */
-static void show_building(player_type *player_ptr, building_type* bldg)
-{
-       char buff[20];
-       byte action_color;
-       char tmp_str[80];
-
-       Term_clear();
-       sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
-       prt(tmp_str, 2, 1);
-
-       for (int i = 0; i < 8; i++)
-       {
-               if (!bldg->letters[i]) continue;
-
-               if (bldg->action_restr[i] == 0)
-               {
-                       if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) ||
-                               (!is_owner(player_ptr, bldg) && (bldg->other_costs[i] == 0)))
-                       {
-                               action_color = TERM_WHITE;
-                               buff[0] = '\0';
-                       }
-                       else if (is_owner(player_ptr, bldg))
-                       {
-                               action_color = TERM_YELLOW;
-                               sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
-                       }
-                       else
-                       {
-                               action_color = TERM_YELLOW;
-                               sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
-                       }
-
-                       sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
-                       c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
-                       continue;
-               }
-
-               if (bldg->action_restr[i] == 1)
-               {
-                       if (!is_member(player_ptr, bldg))
-                       {
-                               action_color = TERM_L_DARK;
-                               strcpy(buff, _("(閉店)", "(closed)"));
-                       }
-                       else if ((is_owner(player_ptr, bldg) && (bldg->member_costs[i] == 0)) ||
-                               (is_member(player_ptr, bldg) && (bldg->other_costs[i] == 0)))
-                       {
-                               action_color = TERM_WHITE;
-                               buff[0] = '\0';
-                       }
-                       else if (is_owner(player_ptr, bldg))
-                       {
-                               action_color = TERM_YELLOW;
-                               sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
-                       }
-                       else
-                       {
-                               action_color = TERM_YELLOW;
-                               sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
-                       }
-
-                       sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
-                       c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
-                       continue;
-               }
-
-               if (!is_owner(player_ptr, bldg))
-               {
-                       action_color = TERM_L_DARK;
-                       strcpy(buff, _("(閉店)", "(closed)"));
-               }
-               else if (bldg->member_costs[i] != 0)
-               {
-                       action_color = TERM_YELLOW;
-                       sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
-               }
-               else
-               {
-                       action_color = TERM_WHITE;
-                       buff[0] = '\0';
-               }
-
-               sprintf(tmp_str, " %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
-               c_put_str(action_color, tmp_str, 19 + (i / 2), 35 * (i % 2));
-       }
-
-       prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);
-}
-
-
-/*!
  * @brief 町に関するヘルプを表示する / Display town history
  * @param player_ptr プレーヤーへの参照ポインタ
  * @return なし
@@ -1634,7 +1465,7 @@ void do_cmd_bldg(player_type *player_ptr)
        command_rep = 0;
        command_new = 0;
 
-       show_building(player_ptr, bldg);
+       display_buikding_service(player_ptr, bldg);
        player_ptr->leave_bldg = FALSE;
        play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BUILD);