OSDN Git Service

[Refactor] #40014 Separated summon-checker.c/h from monster2.c
authorHourier <hourier@users.sourceforge.jp>
Tue, 9 Jun 2020 12:47:23 +0000 (21:47 +0900)
committerHourier <hourier@users.sourceforge.jp>
Tue, 9 Jun 2020 12:47:23 +0000 (21:47 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/monster/monster2.c
src/mspell/summon-checker.c [new file with mode: 0644]
src/mspell/summon-checker.h [new file with mode: 0644]

index 372e149..55f71b6 100644 (file)
     <ClCompile Include="..\..\src\monster-lore\lore-store.c" />\r
     <ClCompile Include="..\..\src\monster-lore\monster-lore.c" />\r
     <ClCompile Include="..\..\src\monster\monster-util.c" />\r
+    <ClCompile Include="..\..\src\mspell\summon-checker.c" />\r
     <ClCompile Include="..\..\src\object-enchant\activation-info-table.c" />\r
     <ClCompile Include="..\..\src\object-enchant\dragon-breaths-table.c" />\r
     <ClCompile Include="..\..\src\object\object-flags.c" />\r
     <ClInclude Include="..\..\src\monster\monster2.h" />\r
     <ClInclude Include="..\..\src\monster\place-monster-types.h" />\r
     <ClInclude Include="..\..\src\monster\smart-learn-types.h" />\r
+    <ClInclude Include="..\..\src\mspell\summon-checker.h" />\r
     <ClInclude Include="..\..\src\object-enchant\activation-info-table.h" />\r
     <ClInclude Include="..\..\src\object-enchant\dragon-breaths-table.h" />\r
     <ClInclude Include="..\..\src\object-enchant\random-art-bias-types.h" />\r
index d077a59..0595b60 100644 (file)
     <ClCompile Include="..\..\src\monster-lore\lore-store.c">
       <Filter>monster-lore</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\mspell\summon-checker.c">
+      <Filter>mspell</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\cmd\cmd-basic.h">
     <ClInclude Include="..\..\src\monster-lore\lore-store.h">
       <Filter>monster-lore</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mspell\summon-checker.h">
+      <Filter>mspell</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 0e49a8d..96815de 100644 (file)
@@ -336,8 +336,9 @@ hengband_SOURCES = \
        mspell/mspell-ball.c mspell/mspell-ball.h \
        mspell/mspell-bolt.c mspell/mspell-bolt.h \
        mspell/mspell-floor.c mspell/mspell-floor.h \
-       mspell/mspell-status.c mspell/mspell-status.h \
        mspell/mspell-special.c mspell/mspell-special.h \
+       mspell/mspell-status.c mspell/mspell-status.h \
+       mspell/mspell-summon-checker.c mspell/mspell-summon-checker.h \
        mspell/mspell-particularity.c mspell/mspell-particularity.h \
        \
        mutation/mutation.c mutation/mutation.h \
index d333127..758370a 100644 (file)
@@ -44,6 +44,7 @@
 #include "monster/place-monster-types.h"
 #include "monster/smart-learn-types.h"
 #include "mspell/monster-spell.h"
+#include "mspell/summon-checker.h"
 #include "object/object-flavor.h"
 #include "object/object-generator.h"
 #include "object/warning.h"
@@ -412,276 +413,6 @@ static bool summon_unique_okay = FALSE;
 
 
 /*!
- * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
- * @param player_ptr プレーヤーへの参照ポインタ
- * @return 召喚条件が一致するならtrue
- * @details
- */
-static bool summon_specific_aux(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
-{
-       monster_race *r_ptr = &r_info[r_idx];
-       bool is_match = FALSE;
-
-       switch (summon_specific_type)
-       {
-       case SUMMON_ANT:
-       {
-               is_match = (r_ptr->d_char == 'a');
-               break;
-       }
-       case SUMMON_SPIDER:
-       {
-               is_match = (r_ptr->d_char == 'S');
-               break;
-       }
-       case SUMMON_HOUND:
-       {
-               is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
-               break;
-       }
-       case SUMMON_HYDRA:
-       {
-               is_match = (r_ptr->d_char == 'M');
-               break;
-       }
-       case SUMMON_ANGEL:
-       {
-               is_match = (r_ptr->d_char == 'A' && ((r_ptr->flags3 & RF3_EVIL) || (r_ptr->flags3 & RF3_GOOD)));
-               break;
-       }
-       case SUMMON_DEMON:
-       {
-               is_match = (r_ptr->flags3 & RF3_DEMON);
-               break;
-       }
-       case SUMMON_UNDEAD:
-       {
-               is_match = (r_ptr->flags3 & RF3_UNDEAD);
-               break;
-       }
-       case SUMMON_DRAGON:
-       {
-               is_match = (r_ptr->flags3 & RF3_DRAGON);
-               break;
-       }
-       case SUMMON_HI_UNDEAD:
-       {
-               is_match = ((r_ptr->d_char == 'L') ||
-                       (r_ptr->d_char == 'V') ||
-                       (r_ptr->d_char == 'W'));
-               break;
-       }
-       case SUMMON_HI_DRAGON:
-       {
-               is_match = (r_ptr->d_char == 'D');
-               break;
-       }
-       case SUMMON_HI_DEMON:
-       {
-               is_match = (((r_ptr->d_char == 'U') ||
-                       (r_ptr->d_char == 'H') ||
-                       (r_ptr->d_char == 'B')) &&
-                       (r_ptr->flags3 & RF3_DEMON)) ? TRUE : FALSE;
-               break;
-       }
-       case SUMMON_AMBERITES:
-       {
-               is_match = (r_ptr->flags3 & (RF3_AMBERITE)) ? TRUE : FALSE;
-               break;
-       }
-       case SUMMON_UNIQUE:
-       {
-               is_match = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
-               break;
-       }
-       case SUMMON_MOLD:
-       {
-               is_match = (r_ptr->d_char == 'm');
-               break;
-       }
-       case SUMMON_BAT:
-       {
-               is_match = (r_ptr->d_char == 'b');
-               break;
-       }
-       case SUMMON_QUYLTHULG:
-       {
-               is_match = (r_ptr->d_char == 'Q');
-               break;
-       }
-       case SUMMON_COIN_MIMIC:
-       {
-               is_match = (r_ptr->d_char == '$');
-               break;
-       }
-       case SUMMON_MIMIC:
-       {
-               is_match = ((r_ptr->d_char == '!') ||
-                       (r_ptr->d_char == '?') ||
-                       (r_ptr->d_char == '=') ||
-                       (r_ptr->d_char == '$') ||
-                       (r_ptr->d_char == '|'));
-               break;
-       }
-       case SUMMON_GOLEM:
-       {
-               is_match = (r_ptr->d_char == 'g');
-               break;
-       }
-       case SUMMON_CYBER:
-       {
-               is_match = ((r_ptr->d_char == 'U') &&
-                       (r_ptr->flags4 & RF4_ROCKET));
-               break;
-       }
-       case SUMMON_KIN:
-       {
-               SYMBOL_CODE summon_kin_type;
-               if (summoner_idx)
-               {
-                       summon_kin_type = r_info[summoner_idx].d_char;
-               }
-               else
-               {
-                       summon_kin_type = get_summon_symbol_from_player(player_ptr);
-               }
-
-               is_match = ((r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE));
-               break;
-       }
-       case SUMMON_DAWN:
-       {
-               is_match = (r_idx == MON_DAWN);
-               break;
-       }
-       case SUMMON_ANIMAL:
-       {
-               is_match = (r_ptr->flags3 & (RF3_ANIMAL));
-               break;
-       }
-       case SUMMON_ANIMAL_RANGER:
-       {
-               is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) &&
-                       (my_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) &&
-                       !(r_ptr->flags3 & (RF3_DRAGON)) &&
-                       !(r_ptr->flags3 & (RF3_EVIL)) &&
-                       !(r_ptr->flags3 & (RF3_UNDEAD)) &&
-                       !(r_ptr->flags3 & (RF3_DEMON)) &&
-                       !(r_ptr->flags2 & (RF2_MULTIPLY)) &&
-                       !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
-               break;
-       }
-       case SUMMON_HI_DRAGON_LIVING:
-       {
-               is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
-               break;
-       }
-       case SUMMON_LIVING:
-       {
-               is_match = monster_living(r_idx);
-               break;
-       }
-       case SUMMON_PHANTOM:
-       {
-               is_match = (r_idx == MON_PHANTOM_B || r_idx == MON_PHANTOM_W);
-               break;
-       }
-       case SUMMON_BLUE_HORROR:
-       {
-               is_match = (r_idx == MON_BLUE_HORROR);
-               break;
-       }
-       case SUMMON_ELEMENTAL:
-       {
-               is_match = (r_ptr->d_char == 'E');
-               break;
-       }
-       case SUMMON_VORTEX:
-       {
-               is_match = (r_ptr->d_char == 'v');
-               break;
-       }
-       case SUMMON_HYBRID:
-       {
-               is_match = (r_ptr->d_char == 'H');
-               break;
-       }
-       case SUMMON_BIRD:
-       {
-               is_match = (r_ptr->d_char == 'B');
-               break;
-       }
-       case SUMMON_KAMIKAZE:
-       {
-               int i;
-               for (i = 0; i < 4; i++)
-                       if (r_ptr->blow[i].method == RBM_EXPLODE) is_match = TRUE;
-               break;
-       }
-       case SUMMON_KAMIKAZE_LIVING:
-       {
-               int i;
-
-               for (i = 0; i < 4; i++)
-                       if (r_ptr->blow[i].method == RBM_EXPLODE) is_match = TRUE;
-               is_match = (is_match && monster_living(r_idx));
-               break;
-       }
-       case SUMMON_MANES:
-       {
-               is_match = (r_idx == MON_MANES);
-               break;
-       }
-       case SUMMON_LOUSE:
-       {
-               is_match = (r_idx == MON_LOUSE);
-               break;
-       }
-       case SUMMON_GUARDIANS:
-       {
-               is_match = (r_ptr->flags7 & RF7_GUARDIAN);
-               break;
-       }
-       case SUMMON_KNIGHTS:
-       {
-               is_match = ((r_idx == MON_NOV_PALADIN) ||
-                       (r_idx == MON_NOV_PALADIN_G) ||
-                       (r_idx == MON_PALADIN) ||
-                       (r_idx == MON_W_KNIGHT) ||
-                       (r_idx == MON_ULTRA_PALADIN) ||
-                       (r_idx == MON_KNI_TEMPLAR));
-               break;
-       }
-       case SUMMON_EAGLES:
-       {
-               is_match = (r_ptr->d_char == 'B' &&
-                       (r_ptr->flags8 & RF8_WILD_MOUNTAIN) &&
-                       (r_ptr->flags8 & RF8_WILD_ONLY));
-               break;
-       }
-       case SUMMON_PIRANHAS:
-       {
-               is_match = (r_idx == MON_PIRANHA);
-               break;
-       }
-       case SUMMON_ARMAGE_GOOD:
-       {
-               is_match = (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_GOOD));
-               break;
-       }
-       case SUMMON_ARMAGE_EVIL:
-       {
-               is_match = ((r_ptr->flags3 & RF3_DEMON) ||
-                       (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_EVIL)));
-               break;
-       }
-       }
-
-       return is_match;
-}
-
-
-/*!
  * @brief 生成モンスター種族を1種生成テーブルから選択する
  * @param player_ptr プレーヤーへの参照ポインタ
  * @param level 生成階
@@ -2510,7 +2241,7 @@ static bool summon_specific_okay(MONRACE_IDX r_idx)
 
        if ((r_ptr->flags7 & RF7_CHAMELEON) && (d_info[p_ptr->dungeon_idx].flags1 & DF1_CHAMELEON)) return TRUE;
 
-       return (summon_specific_aux(p_ptr, m_ptr->r_idx, r_idx));
+       return (check_summon_specific(p_ptr, m_ptr->r_idx, r_idx));
 }
 
 
diff --git a/src/mspell/summon-checker.c b/src/mspell/summon-checker.c
new file mode 100644 (file)
index 0000000..51d7547
--- /dev/null
@@ -0,0 +1,214 @@
+#include "mspell/summon-checker.h"
+#include "monster-race/monster-race-hook.h"
+#include "monster-race/race-flags1.h"
+#include "monster-race/race-flags2.h"
+#include "monster-race/race-flags3.h"
+#include "monster-race/race-flags4.h"
+#include "monster-race/race-flags7.h"
+#include "monster-race/race-flags8.h"
+#include "monster-race/race-indice-types.h"
+#include "monster/monster-util.h"
+#include "spell/spells-summon.h"
+
+/*!
+ * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @return 召喚条件が一致するならtrue
+ * @details
+ */
+bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
+{
+    monster_race *r_ptr = &r_info[r_idx];
+    bool is_match = FALSE;
+
+    switch (summon_specific_type) {
+    case SUMMON_ANT: {
+        is_match = (r_ptr->d_char == 'a');
+        break;
+    }
+    case SUMMON_SPIDER: {
+        is_match = (r_ptr->d_char == 'S');
+        break;
+    }
+    case SUMMON_HOUND: {
+        is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
+        break;
+    }
+    case SUMMON_HYDRA: {
+        is_match = (r_ptr->d_char == 'M');
+        break;
+    }
+    case SUMMON_ANGEL: {
+        is_match = (r_ptr->d_char == 'A' && ((r_ptr->flags3 & RF3_EVIL) || (r_ptr->flags3 & RF3_GOOD)));
+        break;
+    }
+    case SUMMON_DEMON: {
+        is_match = (r_ptr->flags3 & RF3_DEMON);
+        break;
+    }
+    case SUMMON_UNDEAD: {
+        is_match = (r_ptr->flags3 & RF3_UNDEAD);
+        break;
+    }
+    case SUMMON_DRAGON: {
+        is_match = (r_ptr->flags3 & RF3_DRAGON);
+        break;
+    }
+    case SUMMON_HI_UNDEAD: {
+        is_match = ((r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W'));
+        break;
+    }
+    case SUMMON_HI_DRAGON: {
+        is_match = (r_ptr->d_char == 'D');
+        break;
+    }
+    case SUMMON_HI_DEMON: {
+        is_match = (((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && (r_ptr->flags3 & RF3_DEMON)) ? TRUE : FALSE;
+        break;
+    }
+    case SUMMON_AMBERITES: {
+        is_match = (r_ptr->flags3 & (RF3_AMBERITE)) ? TRUE : FALSE;
+        break;
+    }
+    case SUMMON_UNIQUE: {
+        is_match = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
+        break;
+    }
+    case SUMMON_MOLD: {
+        is_match = (r_ptr->d_char == 'm');
+        break;
+    }
+    case SUMMON_BAT: {
+        is_match = (r_ptr->d_char == 'b');
+        break;
+    }
+    case SUMMON_QUYLTHULG: {
+        is_match = (r_ptr->d_char == 'Q');
+        break;
+    }
+    case SUMMON_COIN_MIMIC: {
+        is_match = (r_ptr->d_char == '$');
+        break;
+    }
+    case SUMMON_MIMIC: {
+        is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
+        break;
+    }
+    case SUMMON_GOLEM: {
+        is_match = (r_ptr->d_char == 'g');
+        break;
+    }
+    case SUMMON_CYBER: {
+        is_match = ((r_ptr->d_char == 'U') && (r_ptr->flags4 & RF4_ROCKET));
+        break;
+    }
+    case SUMMON_KIN: {
+        SYMBOL_CODE summon_kin_type;
+        if (summoner_idx) {
+            summon_kin_type = r_info[summoner_idx].d_char;
+        } else {
+            summon_kin_type = get_summon_symbol_from_player(player_ptr);
+        }
+
+        is_match = ((r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE));
+        break;
+    }
+    case SUMMON_DAWN: {
+        is_match = (r_idx == MON_DAWN);
+        break;
+    }
+    case SUMMON_ANIMAL: {
+        is_match = (r_ptr->flags3 & (RF3_ANIMAL));
+        break;
+    }
+    case SUMMON_ANIMAL_RANGER: {
+        is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (my_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
+            && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
+            && !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
+        break;
+    }
+    case SUMMON_HI_DRAGON_LIVING: {
+        is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
+        break;
+    }
+    case SUMMON_LIVING: {
+        is_match = monster_living(r_idx);
+        break;
+    }
+    case SUMMON_PHANTOM: {
+        is_match = (r_idx == MON_PHANTOM_B || r_idx == MON_PHANTOM_W);
+        break;
+    }
+    case SUMMON_BLUE_HORROR: {
+        is_match = (r_idx == MON_BLUE_HORROR);
+        break;
+    }
+    case SUMMON_ELEMENTAL: {
+        is_match = (r_ptr->d_char == 'E');
+        break;
+    }
+    case SUMMON_VORTEX: {
+        is_match = (r_ptr->d_char == 'v');
+        break;
+    }
+    case SUMMON_HYBRID: {
+        is_match = (r_ptr->d_char == 'H');
+        break;
+    }
+    case SUMMON_BIRD: {
+        is_match = (r_ptr->d_char == 'B');
+        break;
+    }
+    case SUMMON_KAMIKAZE: {
+        int i;
+        for (i = 0; i < 4; i++)
+            if (r_ptr->blow[i].method == RBM_EXPLODE)
+                is_match = TRUE;
+        break;
+    }
+    case SUMMON_KAMIKAZE_LIVING: {
+        int i;
+
+        for (i = 0; i < 4; i++)
+            if (r_ptr->blow[i].method == RBM_EXPLODE)
+                is_match = TRUE;
+        is_match = (is_match && monster_living(r_idx));
+        break;
+    }
+    case SUMMON_MANES: {
+        is_match = (r_idx == MON_MANES);
+        break;
+    }
+    case SUMMON_LOUSE: {
+        is_match = (r_idx == MON_LOUSE);
+        break;
+    }
+    case SUMMON_GUARDIANS: {
+        is_match = (r_ptr->flags7 & RF7_GUARDIAN);
+        break;
+    }
+    case SUMMON_KNIGHTS: {
+        is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
+            || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
+        break;
+    }
+    case SUMMON_EAGLES: {
+        is_match = (r_ptr->d_char == 'B' && (r_ptr->flags8 & RF8_WILD_MOUNTAIN) && (r_ptr->flags8 & RF8_WILD_ONLY));
+        break;
+    }
+    case SUMMON_PIRANHAS: {
+        is_match = (r_idx == MON_PIRANHA);
+        break;
+    }
+    case SUMMON_ARMAGE_GOOD: {
+        is_match = (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_GOOD));
+        break;
+    }
+    case SUMMON_ARMAGE_EVIL: {
+        is_match = ((r_ptr->flags3 & RF3_DEMON) || (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_EVIL)));
+        break;
+    }
+    }
+
+    return is_match;
+}
diff --git a/src/mspell/summon-checker.h b/src/mspell/summon-checker.h
new file mode 100644 (file)
index 0000000..25b668c
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+#include "system/angband.h"
+
+bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx);