OSDN Git Service

[Refactor] #39962 files.c からpermanent-resistances.c/h を分離 / Separated permanent-resis...
authorHourier <hourier@users.sourceforge.jp>
Mon, 24 Feb 2020 12:12:52 +0000 (21:12 +0900)
committerHourier <hourier@users.sourceforge.jp>
Mon, 24 Feb 2020 12:12:52 +0000 (21:12 +0900)
Hengband_vcs2017/Hengband/Hengband.vcxproj
Hengband_vcs2017/Hengband/Hengband.vcxproj.filters
src/files.c
src/player/permanent-resistances.c [new file with mode: 0644]
src/player/permanent-resistances.h [new file with mode: 0644]

index 012741b..cc924eb 100644 (file)
     <ClCompile Include="..\..\src\player-sex.c" />\r
     <ClCompile Include="..\..\src\player-skill.c" />\r
     <ClCompile Include="..\..\src\player-status.c" />\r
+    <ClCompile Include="..\..\src\player\permanent-resistances.c" />\r
     <ClCompile Include="..\..\src\quest.c" />\r
     <ClCompile Include="..\..\src\realm-craft.c" />\r
     <ClCompile Include="..\..\src\realm-crusade.c" />\r
     <ClInclude Include="..\..\src\monster-dist-offsets.h" />\r
     <ClInclude Include="..\..\src\object-flavor.h" />\r
     <ClInclude Include="..\..\src\player-inventory.h" />\r
+    <ClInclude Include="..\..\src\player\permanent-resistances.h" />\r
     <ClInclude Include="..\..\src\signal-handlers.h" />\r
     <ClInclude Include="..\..\src\uid-checker.h" />\r
     <ClInclude Include="..\..\src\view\display-util.h" />\r
index b611fa0..b6fe92d 100644 (file)
     <ClCompile Include="..\..\src\character-dump.c">
       <Filter>io</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\player\permanent-resistances.c">
+      <Filter>player</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\gamevalue.h" />
     <ClInclude Include="..\..\src\character-dump.h">
       <Filter>io</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\player\permanent-resistances.h">
+      <Filter>player</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 68414be..b2966cc 100644 (file)
@@ -18,6 +18,7 @@
 #include "view/display-util.h"
 #include "view/status-first-page.h"
 #include "uid-checker.h"
+#include "player/permanent-resistances.h"
 #include "files.h"
 #include "core.h"
 
@@ -1211,459 +1212,6 @@ static void display_player_middle(player_type *creature_ptr)
 
 
 /*!
- * @brief プレイヤーの職業、種族に応じた耐性フラグを返す
- * Prints ratings on certain abilities
- * @param creature_ptr 参照元クリーチャーポインタ
- * @param flgs フラグを保管する配列
- * @return なし
- * @details
- * Obtain the "flags" for the player as if he was an item
- * @todo
- * xtra1.c周りと多重実装になっているのを何とかする
- */
-static void player_flags(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
-{
-       for (int i = 0; i < TR_FLAG_SIZE; i++)
-               flgs[i] = 0L;
-
-       switch (creature_ptr->pclass)
-       {
-       case CLASS_WARRIOR:
-               if (creature_ptr->lev > 44)
-                       add_flag(flgs, TR_REGEN);
-       case CLASS_SAMURAI:
-               if (creature_ptr->lev > 29)
-                       add_flag(flgs, TR_RES_FEAR);
-               break;
-       case CLASS_PALADIN:
-               if (creature_ptr->lev > 39)
-                       add_flag(flgs, TR_RES_FEAR);
-               break;
-       case CLASS_CHAOS_WARRIOR:
-               if (creature_ptr->lev > 29)
-                       add_flag(flgs, TR_RES_CHAOS);
-               if (creature_ptr->lev > 39)
-                       add_flag(flgs, TR_RES_FEAR);
-               break;
-       case CLASS_MONK:
-       case CLASS_FORCETRAINER:
-               if ((creature_ptr->lev > 9) && !heavy_armor(creature_ptr))
-                       add_flag(flgs, TR_SPEED);
-               if ((creature_ptr->lev > 24) && !heavy_armor(creature_ptr))
-                       add_flag(flgs, TR_FREE_ACT);
-               break;
-       case CLASS_NINJA:
-               if (heavy_armor(creature_ptr))
-                       add_flag(flgs, TR_SPEED);
-               else
-               {
-                       if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || creature_ptr->migite) &&
-                               (!creature_ptr->inventory_list[INVEN_LARM].k_idx || creature_ptr->hidarite))
-                               add_flag(flgs, TR_SPEED);
-                       if (creature_ptr->lev > 24)
-                               add_flag(flgs, TR_FREE_ACT);
-               }
-
-               add_flag(flgs, TR_SLOW_DIGEST);
-               add_flag(flgs, TR_RES_FEAR);
-               if (creature_ptr->lev > 19) add_flag(flgs, TR_RES_POIS);
-               if (creature_ptr->lev > 24) add_flag(flgs, TR_SUST_DEX);
-               if (creature_ptr->lev > 29) add_flag(flgs, TR_SEE_INVIS);
-               break;
-       case CLASS_MINDCRAFTER:
-               if (creature_ptr->lev > 9)
-                       add_flag(flgs, TR_RES_FEAR);
-               if (creature_ptr->lev > 19)
-                       add_flag(flgs, TR_SUST_WIS);
-               if (creature_ptr->lev > 29)
-                       add_flag(flgs, TR_RES_CONF);
-               if (creature_ptr->lev > 39)
-                       add_flag(flgs, TR_TELEPATHY);
-               break;
-       case CLASS_BARD:
-               add_flag(flgs, TR_RES_SOUND);
-               break;
-       case CLASS_BERSERKER:
-               add_flag(flgs, TR_SUST_STR);
-               add_flag(flgs, TR_SUST_DEX);
-               add_flag(flgs, TR_SUST_CON);
-               add_flag(flgs, TR_REGEN);
-               add_flag(flgs, TR_FREE_ACT);
-               add_flag(flgs, TR_SPEED);
-               if (creature_ptr->lev > 39) add_flag(flgs, TR_REFLECT);
-               break;
-       case CLASS_MIRROR_MASTER:
-               if (creature_ptr->lev > 39)add_flag(flgs, TR_REFLECT);
-               break;
-       default:
-               break;
-       }
-
-       /* Races */
-       if (creature_ptr->mimic_form)
-       {
-               switch (creature_ptr->mimic_form)
-               {
-               case MIMIC_DEMON:
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_CHAOS);
-                       add_flag(flgs, TR_RES_NETHER);
-                       add_flag(flgs, TR_RES_FIRE);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_SPEED);
-                       break;
-               case MIMIC_DEMON_LORD:
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_CHAOS);
-                       add_flag(flgs, TR_RES_NETHER);
-                       add_flag(flgs, TR_RES_FIRE);
-                       add_flag(flgs, TR_RES_COLD);
-                       add_flag(flgs, TR_RES_ELEC);
-                       add_flag(flgs, TR_RES_ACID);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_RES_CONF);
-                       add_flag(flgs, TR_RES_DISEN);
-                       add_flag(flgs, TR_RES_NEXUS);
-                       add_flag(flgs, TR_RES_FEAR);
-                       add_flag(flgs, TR_IM_FIRE);
-                       add_flag(flgs, TR_SH_FIRE);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_TELEPATHY);
-                       add_flag(flgs, TR_LEVITATION);
-                       add_flag(flgs, TR_SPEED);
-                       break;
-               case MIMIC_VAMPIRE:
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_DARK);
-                       add_flag(flgs, TR_RES_NETHER);
-                       if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_RES_COLD);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_SPEED);
-                       break;
-               }
-       }
-       else
-       {
-               switch (creature_ptr->prace)
-               {
-               case RACE_ELF:
-                       add_flag(flgs, TR_RES_LITE);
-                       break;
-               case RACE_HOBBIT:
-                       add_flag(flgs, TR_HOLD_EXP);
-                       break;
-               case RACE_GNOME:
-                       add_flag(flgs, TR_FREE_ACT);
-                       break;
-               case RACE_DWARF:
-                       add_flag(flgs, TR_RES_BLIND);
-                       break;
-               case RACE_HALF_ORC:
-                       add_flag(flgs, TR_RES_DARK);
-                       break;
-               case RACE_HALF_TROLL:
-                       add_flag(flgs, TR_SUST_STR);
-                       if (creature_ptr->lev <= 14) break;
-
-                       add_flag(flgs, TR_REGEN);
-                       if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_BERSERKER))
-                       {
-                               add_flag(flgs, TR_SLOW_DIGEST);
-                               /*
-                                * Let's not make Regeneration a disadvantage
-                                * for the poor warriors who can never learn
-                                * a spell that satisfies hunger (actually
-                                * neither can rogues, but half-trolls are not
-                                * supposed to play rogues)
-                                */
-                       }
-
-                       break;
-               case RACE_AMBERITE:
-                       add_flag(flgs, TR_SUST_CON);
-                       add_flag(flgs, TR_REGEN);
-                       break;
-               case RACE_HIGH_ELF:
-                       add_flag(flgs, TR_RES_LITE);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       break;
-               case RACE_BARBARIAN:
-                       add_flag(flgs, TR_RES_FEAR);
-                       break;
-               case RACE_HALF_OGRE:
-                       add_flag(flgs, TR_SUST_STR);
-                       add_flag(flgs, TR_RES_DARK);
-                       break;
-               case RACE_HALF_GIANT:
-                       add_flag(flgs, TR_RES_SHARDS);
-                       add_flag(flgs, TR_SUST_STR);
-                       break;
-               case RACE_HALF_TITAN:
-                       add_flag(flgs, TR_RES_CHAOS);
-                       break;
-               case RACE_CYCLOPS:
-                       add_flag(flgs, TR_RES_SOUND);
-                       break;
-               case RACE_YEEK:
-                       add_flag(flgs, TR_RES_ACID);
-                       if (creature_ptr->lev > 19)
-                               add_flag(flgs, TR_IM_ACID);
-                       break;
-               case RACE_KLACKON:
-                       add_flag(flgs, TR_RES_CONF);
-                       add_flag(flgs, TR_RES_ACID);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_SPEED);
-                       break;
-               case RACE_KOBOLD:
-                       add_flag(flgs, TR_RES_POIS);
-                       break;
-               case RACE_NIBELUNG:
-                       add_flag(flgs, TR_RES_DISEN);
-                       add_flag(flgs, TR_RES_DARK);
-                       break;
-               case RACE_DARK_ELF:
-                       add_flag(flgs, TR_RES_DARK);
-                       if (creature_ptr->lev > 19)
-                               add_flag(flgs, TR_SEE_INVIS);
-                       break;
-               case RACE_DRACONIAN:
-                       add_flag(flgs, TR_LEVITATION);
-                       if (creature_ptr->lev > 4)
-                               add_flag(flgs, TR_RES_FIRE);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_RES_COLD);
-                       if (creature_ptr->lev > 14)
-                               add_flag(flgs, TR_RES_ACID);
-                       if (creature_ptr->lev > 19)
-                               add_flag(flgs, TR_RES_ELEC);
-                       if (creature_ptr->lev > 34)
-                               add_flag(flgs, TR_RES_POIS);
-                       break;
-               case RACE_MIND_FLAYER:
-                       add_flag(flgs, TR_SUST_INT);
-                       add_flag(flgs, TR_SUST_WIS);
-                       if (creature_ptr->lev > 14)
-                               add_flag(flgs, TR_SEE_INVIS);
-                       if (creature_ptr->lev > 29)
-                               add_flag(flgs, TR_TELEPATHY);
-                       break;
-               case RACE_IMP:
-                       add_flag(flgs, TR_RES_FIRE);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_SEE_INVIS);
-                       break;
-               case RACE_GOLEM:
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_FREE_ACT);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_SLOW_DIGEST);
-                       if (creature_ptr->lev > 34)
-                               add_flag(flgs, TR_HOLD_EXP);
-                       break;
-               case RACE_SKELETON:
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_RES_SHARDS);
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_POIS);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_RES_COLD);
-                       break;
-               case RACE_ZOMBIE:
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_NETHER);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_SLOW_DIGEST);
-                       if (creature_ptr->lev > 4)
-                               add_flag(flgs, TR_RES_COLD);
-                       break;
-               case RACE_VAMPIRE:
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_DARK);
-                       add_flag(flgs, TR_RES_NETHER);
-                       if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_RES_COLD);
-                       break;
-               case RACE_SPECTRE:
-                       add_flag(flgs, TR_LEVITATION);
-                       add_flag(flgs, TR_FREE_ACT);
-                       add_flag(flgs, TR_RES_COLD);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       add_flag(flgs, TR_HOLD_EXP);
-                       add_flag(flgs, TR_RES_NETHER);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_SLOW_DIGEST);
-                       if (creature_ptr->lev > 34)
-                               add_flag(flgs, TR_TELEPATHY);
-                       break;
-               case RACE_SPRITE:
-                       add_flag(flgs, TR_RES_LITE);
-                       add_flag(flgs, TR_LEVITATION);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_SPEED);
-                       break;
-               case RACE_BEASTMAN:
-                       add_flag(flgs, TR_RES_SOUND);
-                       add_flag(flgs, TR_RES_CONF);
-                       break;
-               case RACE_ANGEL:
-                       add_flag(flgs, TR_LEVITATION);
-                       add_flag(flgs, TR_SEE_INVIS);
-                       break;
-               case RACE_DEMON:
-                       add_flag(flgs, TR_RES_FIRE);
-                       add_flag(flgs, TR_RES_NETHER);
-                       add_flag(flgs, TR_HOLD_EXP);
-                       if (creature_ptr->lev > 9)
-                               add_flag(flgs, TR_SEE_INVIS);
-                       break;
-               case RACE_DUNADAN:
-                       add_flag(flgs, TR_SUST_CON);
-                       break;
-               case RACE_S_FAIRY:
-                       add_flag(flgs, TR_LEVITATION);
-                       break;
-               case RACE_KUTAR:
-                       add_flag(flgs, TR_RES_CONF);
-                       break;
-               case RACE_ANDROID:
-                       add_flag(flgs, TR_FREE_ACT);
-                       add_flag(flgs, TR_RES_POIS);
-                       add_flag(flgs, TR_SLOW_DIGEST);
-                       add_flag(flgs, TR_HOLD_EXP);
-                       break;
-               default:
-                       break;
-               }
-       }
-
-       if (creature_ptr->muta3)
-       {
-               if (creature_ptr->muta3 & MUT3_FLESH_ROT)
-               {
-                       remove_flag(flgs, TR_REGEN);
-               }
-
-               if ((creature_ptr->muta3 & MUT3_XTRA_FAT) ||
-                       (creature_ptr->muta3 & MUT3_XTRA_LEGS) ||
-                       (creature_ptr->muta3 & MUT3_SHORT_LEG))
-               {
-                       add_flag(flgs, TR_SPEED);
-               }
-
-               if (creature_ptr->muta3  & MUT3_ELEC_TOUC)
-               {
-                       add_flag(flgs, TR_SH_ELEC);
-               }
-
-               if (creature_ptr->muta3 & MUT3_FIRE_BODY)
-               {
-                       add_flag(flgs, TR_SH_FIRE);
-                       add_flag(flgs, TR_LITE_1);
-               }
-
-               if (creature_ptr->muta3 & MUT3_WINGS)
-               {
-                       add_flag(flgs, TR_LEVITATION);
-               }
-
-               if (creature_ptr->muta3 & MUT3_FEARLESS)
-               {
-                       add_flag(flgs, TR_RES_FEAR);
-               }
-
-               if (creature_ptr->muta3 & MUT3_REGEN)
-               {
-                       add_flag(flgs, TR_REGEN);
-               }
-
-               if (creature_ptr->muta3 & MUT3_ESP)
-               {
-                       add_flag(flgs, TR_TELEPATHY);
-               }
-
-               if (creature_ptr->muta3 & MUT3_MOTION)
-               {
-                       add_flag(flgs, TR_FREE_ACT);
-               }
-       }
-
-       if (creature_ptr->pseikaku == SEIKAKU_SEXY)
-               add_flag(flgs, TR_AGGRAVATE);
-       if (creature_ptr->pseikaku == SEIKAKU_CHARGEMAN)
-               add_flag(flgs, TR_RES_CONF);
-       if (creature_ptr->pseikaku == SEIKAKU_MUNCHKIN)
-       {
-               add_flag(flgs, TR_RES_BLIND);
-               add_flag(flgs, TR_RES_CONF);
-               add_flag(flgs, TR_HOLD_EXP);
-               if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
-               if (creature_ptr->lev > 9)
-                       add_flag(flgs, TR_SPEED);
-       }
-
-       if (creature_ptr->special_defense & KATA_FUUJIN)
-               add_flag(flgs, TR_REFLECT);
-
-       if (creature_ptr->special_defense & KAMAE_GENBU)
-               add_flag(flgs, TR_REFLECT);
-
-       if (creature_ptr->special_defense & KAMAE_SUZAKU)
-               add_flag(flgs, TR_LEVITATION);
-
-       if (creature_ptr->special_defense & KAMAE_SEIRYU)
-       {
-               add_flag(flgs, TR_RES_FIRE);
-               add_flag(flgs, TR_RES_COLD);
-               add_flag(flgs, TR_RES_ACID);
-               add_flag(flgs, TR_RES_ELEC);
-               add_flag(flgs, TR_RES_POIS);
-               add_flag(flgs, TR_LEVITATION);
-               add_flag(flgs, TR_SH_FIRE);
-               add_flag(flgs, TR_SH_ELEC);
-               add_flag(flgs, TR_SH_COLD);
-       }
-
-       if (creature_ptr->special_defense & KATA_MUSOU)
-       {
-               add_flag(flgs, TR_RES_FEAR);
-               add_flag(flgs, TR_RES_LITE);
-               add_flag(flgs, TR_RES_DARK);
-               add_flag(flgs, TR_RES_BLIND);
-               add_flag(flgs, TR_RES_CONF);
-               add_flag(flgs, TR_RES_SOUND);
-               add_flag(flgs, TR_RES_SHARDS);
-               add_flag(flgs, TR_RES_NETHER);
-               add_flag(flgs, TR_RES_NEXUS);
-               add_flag(flgs, TR_RES_CHAOS);
-               add_flag(flgs, TR_RES_DISEN);
-               add_flag(flgs, TR_REFLECT);
-               add_flag(flgs, TR_HOLD_EXP);
-               add_flag(flgs, TR_FREE_ACT);
-               add_flag(flgs, TR_SH_FIRE);
-               add_flag(flgs, TR_SH_ELEC);
-               add_flag(flgs, TR_SH_COLD);
-               add_flag(flgs, TR_LEVITATION);
-               add_flag(flgs, TR_LITE_1);
-               add_flag(flgs, TR_SEE_INVIS);
-               add_flag(flgs, TR_TELEPATHY);
-               add_flag(flgs, TR_SLOW_DIGEST);
-               add_flag(flgs, TR_REGEN);
-               add_flag(flgs, TR_SUST_STR);
-               add_flag(flgs, TR_SUST_INT);
-               add_flag(flgs, TR_SUST_WIS);
-               add_flag(flgs, TR_SUST_DEX);
-               add_flag(flgs, TR_SUST_CON);
-               add_flag(flgs, TR_SUST_CHR);
-       }
-}
-
-
-/*!
  * @brief プレイヤーの一時的魔法効果による耐性を返す
  * Prints ratings on certain abilities
  * @param creature_ptr プレーヤーへの参照ポインタ
diff --git a/src/player/permanent-resistances.c b/src/player/permanent-resistances.c
new file mode 100644 (file)
index 0000000..77299ed
--- /dev/null
@@ -0,0 +1,454 @@
+#include "permanent-resistances.h"
+#include "player-personality.h"
+
+/*!
+ * @brief プレイヤーの職業、種族に応じた耐性フラグを返す
+ * Prints ratings on certain abilities
+ * @param creature_ptr 参照元クリーチャーポインタ
+ * @param flgs フラグを保管する配列
+ * @return なし
+ * @details
+ * Obtain the "flags" for the player as if he was an item
+ * @todo
+ * xtra1.c周りと多重実装になっているのを何とかする
+ */
+void player_flags(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
+{
+       for (int i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
+
+       switch (creature_ptr->pclass)
+       {
+       case CLASS_WARRIOR:
+               if (creature_ptr->lev > 44)
+                       add_flag(flgs, TR_REGEN);
+       case CLASS_SAMURAI:
+               if (creature_ptr->lev > 29)
+                       add_flag(flgs, TR_RES_FEAR);
+               break;
+       case CLASS_PALADIN:
+               if (creature_ptr->lev > 39)
+                       add_flag(flgs, TR_RES_FEAR);
+               break;
+       case CLASS_CHAOS_WARRIOR:
+               if (creature_ptr->lev > 29)
+                       add_flag(flgs, TR_RES_CHAOS);
+               if (creature_ptr->lev > 39)
+                       add_flag(flgs, TR_RES_FEAR);
+               break;
+       case CLASS_MONK:
+       case CLASS_FORCETRAINER:
+               if ((creature_ptr->lev > 9) && !heavy_armor(creature_ptr))
+                       add_flag(flgs, TR_SPEED);
+               if ((creature_ptr->lev > 24) && !heavy_armor(creature_ptr))
+                       add_flag(flgs, TR_FREE_ACT);
+               break;
+       case CLASS_NINJA:
+               if (heavy_armor(creature_ptr))
+                       add_flag(flgs, TR_SPEED);
+               else
+               {
+                       if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || creature_ptr->migite) &&
+                               (!creature_ptr->inventory_list[INVEN_LARM].k_idx || creature_ptr->hidarite))
+                               add_flag(flgs, TR_SPEED);
+                       if (creature_ptr->lev > 24)
+                               add_flag(flgs, TR_FREE_ACT);
+               }
+
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_RES_FEAR);
+               if (creature_ptr->lev > 19) add_flag(flgs, TR_RES_POIS);
+               if (creature_ptr->lev > 24) add_flag(flgs, TR_SUST_DEX);
+               if (creature_ptr->lev > 29) add_flag(flgs, TR_SEE_INVIS);
+               break;
+       case CLASS_MINDCRAFTER:
+               if (creature_ptr->lev > 9)
+                       add_flag(flgs, TR_RES_FEAR);
+               if (creature_ptr->lev > 19)
+                       add_flag(flgs, TR_SUST_WIS);
+               if (creature_ptr->lev > 29)
+                       add_flag(flgs, TR_RES_CONF);
+               if (creature_ptr->lev > 39)
+                       add_flag(flgs, TR_TELEPATHY);
+               break;
+       case CLASS_BARD:
+               add_flag(flgs, TR_RES_SOUND);
+               break;
+       case CLASS_BERSERKER:
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_SUST_DEX);
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_REGEN);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_SPEED);
+               if (creature_ptr->lev > 39) add_flag(flgs, TR_REFLECT);
+               break;
+       case CLASS_MIRROR_MASTER:
+               if (creature_ptr->lev > 39)add_flag(flgs, TR_REFLECT);
+               break;
+       default:
+               break;
+       }
+
+       /* Races */
+       if (creature_ptr->mimic_form)
+       {
+               switch (creature_ptr->mimic_form)
+               {
+               case MIMIC_DEMON:
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_CHAOS);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_FIRE);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_SPEED);
+                       break;
+               case MIMIC_DEMON_LORD:
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_CHAOS);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_FIRE);
+                       add_flag(flgs, TR_RES_COLD);
+                       add_flag(flgs, TR_RES_ELEC);
+                       add_flag(flgs, TR_RES_ACID);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_RES_CONF);
+                       add_flag(flgs, TR_RES_DISEN);
+                       add_flag(flgs, TR_RES_NEXUS);
+                       add_flag(flgs, TR_RES_FEAR);
+                       add_flag(flgs, TR_IM_FIRE);
+                       add_flag(flgs, TR_SH_FIRE);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_TELEPATHY);
+                       add_flag(flgs, TR_LEVITATION);
+                       add_flag(flgs, TR_SPEED);
+                       break;
+               case MIMIC_VAMPIRE:
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_DARK);
+                       add_flag(flgs, TR_RES_NETHER);
+                       if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_RES_COLD);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_SPEED);
+                       break;
+               }
+       }
+       else
+       {
+               switch (creature_ptr->prace)
+               {
+               case RACE_ELF:
+                       add_flag(flgs, TR_RES_LITE);
+                       break;
+               case RACE_HOBBIT:
+                       add_flag(flgs, TR_HOLD_EXP);
+                       break;
+               case RACE_GNOME:
+                       add_flag(flgs, TR_FREE_ACT);
+                       break;
+               case RACE_DWARF:
+                       add_flag(flgs, TR_RES_BLIND);
+                       break;
+               case RACE_HALF_ORC:
+                       add_flag(flgs, TR_RES_DARK);
+                       break;
+               case RACE_HALF_TROLL:
+                       add_flag(flgs, TR_SUST_STR);
+                       if (creature_ptr->lev <= 14) break;
+
+                       add_flag(flgs, TR_REGEN);
+                       if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_BERSERKER))
+                       {
+                               add_flag(flgs, TR_SLOW_DIGEST);
+                               /*
+                                * Let's not make Regeneration a disadvantage
+                                * for the poor warriors who can never learn
+                                * a spell that satisfies hunger (actually
+                                * neither can rogues, but half-trolls are not
+                                * supposed to play rogues)
+                                */
+                       }
+
+                       break;
+               case RACE_AMBERITE:
+                       add_flag(flgs, TR_SUST_CON);
+                       add_flag(flgs, TR_REGEN);
+                       break;
+               case RACE_HIGH_ELF:
+                       add_flag(flgs, TR_RES_LITE);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       break;
+               case RACE_BARBARIAN:
+                       add_flag(flgs, TR_RES_FEAR);
+                       break;
+               case RACE_HALF_OGRE:
+                       add_flag(flgs, TR_SUST_STR);
+                       add_flag(flgs, TR_RES_DARK);
+                       break;
+               case RACE_HALF_GIANT:
+                       add_flag(flgs, TR_RES_SHARDS);
+                       add_flag(flgs, TR_SUST_STR);
+                       break;
+               case RACE_HALF_TITAN:
+                       add_flag(flgs, TR_RES_CHAOS);
+                       break;
+               case RACE_CYCLOPS:
+                       add_flag(flgs, TR_RES_SOUND);
+                       break;
+               case RACE_YEEK:
+                       add_flag(flgs, TR_RES_ACID);
+                       if (creature_ptr->lev > 19)
+                               add_flag(flgs, TR_IM_ACID);
+                       break;
+               case RACE_KLACKON:
+                       add_flag(flgs, TR_RES_CONF);
+                       add_flag(flgs, TR_RES_ACID);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_SPEED);
+                       break;
+               case RACE_KOBOLD:
+                       add_flag(flgs, TR_RES_POIS);
+                       break;
+               case RACE_NIBELUNG:
+                       add_flag(flgs, TR_RES_DISEN);
+                       add_flag(flgs, TR_RES_DARK);
+                       break;
+               case RACE_DARK_ELF:
+                       add_flag(flgs, TR_RES_DARK);
+                       if (creature_ptr->lev > 19)
+                               add_flag(flgs, TR_SEE_INVIS);
+                       break;
+               case RACE_DRACONIAN:
+                       add_flag(flgs, TR_LEVITATION);
+                       if (creature_ptr->lev > 4)
+                               add_flag(flgs, TR_RES_FIRE);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_RES_COLD);
+                       if (creature_ptr->lev > 14)
+                               add_flag(flgs, TR_RES_ACID);
+                       if (creature_ptr->lev > 19)
+                               add_flag(flgs, TR_RES_ELEC);
+                       if (creature_ptr->lev > 34)
+                               add_flag(flgs, TR_RES_POIS);
+                       break;
+               case RACE_MIND_FLAYER:
+                       add_flag(flgs, TR_SUST_INT);
+                       add_flag(flgs, TR_SUST_WIS);
+                       if (creature_ptr->lev > 14)
+                               add_flag(flgs, TR_SEE_INVIS);
+                       if (creature_ptr->lev > 29)
+                               add_flag(flgs, TR_TELEPATHY);
+                       break;
+               case RACE_IMP:
+                       add_flag(flgs, TR_RES_FIRE);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_SEE_INVIS);
+                       break;
+               case RACE_GOLEM:
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_FREE_ACT);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_SLOW_DIGEST);
+                       if (creature_ptr->lev > 34)
+                               add_flag(flgs, TR_HOLD_EXP);
+                       break;
+               case RACE_SKELETON:
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_RES_SHARDS);
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_POIS);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_RES_COLD);
+                       break;
+               case RACE_ZOMBIE:
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_SLOW_DIGEST);
+                       if (creature_ptr->lev > 4)
+                               add_flag(flgs, TR_RES_COLD);
+                       break;
+               case RACE_VAMPIRE:
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_DARK);
+                       add_flag(flgs, TR_RES_NETHER);
+                       if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_RES_COLD);
+                       break;
+               case RACE_SPECTRE:
+                       add_flag(flgs, TR_LEVITATION);
+                       add_flag(flgs, TR_FREE_ACT);
+                       add_flag(flgs, TR_RES_COLD);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_HOLD_EXP);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_SLOW_DIGEST);
+                       if (creature_ptr->lev > 34)
+                               add_flag(flgs, TR_TELEPATHY);
+                       break;
+               case RACE_SPRITE:
+                       add_flag(flgs, TR_RES_LITE);
+                       add_flag(flgs, TR_LEVITATION);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_SPEED);
+                       break;
+               case RACE_BEASTMAN:
+                       add_flag(flgs, TR_RES_SOUND);
+                       add_flag(flgs, TR_RES_CONF);
+                       break;
+               case RACE_ANGEL:
+                       add_flag(flgs, TR_LEVITATION);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       break;
+               case RACE_DEMON:
+                       add_flag(flgs, TR_RES_FIRE);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_HOLD_EXP);
+                       if (creature_ptr->lev > 9)
+                               add_flag(flgs, TR_SEE_INVIS);
+                       break;
+               case RACE_DUNADAN:
+                       add_flag(flgs, TR_SUST_CON);
+                       break;
+               case RACE_S_FAIRY:
+                       add_flag(flgs, TR_LEVITATION);
+                       break;
+               case RACE_KUTAR:
+                       add_flag(flgs, TR_RES_CONF);
+                       break;
+               case RACE_ANDROID:
+                       add_flag(flgs, TR_FREE_ACT);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_SLOW_DIGEST);
+                       add_flag(flgs, TR_HOLD_EXP);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       if (creature_ptr->muta3)
+       {
+               if (creature_ptr->muta3 & MUT3_FLESH_ROT)
+               {
+                       remove_flag(flgs, TR_REGEN);
+               }
+
+               if ((creature_ptr->muta3 & MUT3_XTRA_FAT) ||
+                       (creature_ptr->muta3 & MUT3_XTRA_LEGS) ||
+                       (creature_ptr->muta3 & MUT3_SHORT_LEG))
+               {
+                       add_flag(flgs, TR_SPEED);
+               }
+
+               if (creature_ptr->muta3  & MUT3_ELEC_TOUC)
+               {
+                       add_flag(flgs, TR_SH_ELEC);
+               }
+
+               if (creature_ptr->muta3 & MUT3_FIRE_BODY)
+               {
+                       add_flag(flgs, TR_SH_FIRE);
+                       add_flag(flgs, TR_LITE_1);
+               }
+
+               if (creature_ptr->muta3 & MUT3_WINGS)
+               {
+                       add_flag(flgs, TR_LEVITATION);
+               }
+
+               if (creature_ptr->muta3 & MUT3_FEARLESS)
+               {
+                       add_flag(flgs, TR_RES_FEAR);
+               }
+
+               if (creature_ptr->muta3 & MUT3_REGEN)
+               {
+                       add_flag(flgs, TR_REGEN);
+               }
+
+               if (creature_ptr->muta3 & MUT3_ESP)
+               {
+                       add_flag(flgs, TR_TELEPATHY);
+               }
+
+               if (creature_ptr->muta3 & MUT3_MOTION)
+               {
+                       add_flag(flgs, TR_FREE_ACT);
+               }
+       }
+
+       if (creature_ptr->pseikaku == SEIKAKU_SEXY)
+               add_flag(flgs, TR_AGGRAVATE);
+       if (creature_ptr->pseikaku == SEIKAKU_CHARGEMAN)
+               add_flag(flgs, TR_RES_CONF);
+       if (creature_ptr->pseikaku == SEIKAKU_MUNCHKIN)
+       {
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_HOLD_EXP);
+               if (creature_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE_1);
+               if (creature_ptr->lev > 9)
+                       add_flag(flgs, TR_SPEED);
+       }
+
+       if (creature_ptr->special_defense & KATA_FUUJIN)
+               add_flag(flgs, TR_REFLECT);
+
+       if (creature_ptr->special_defense & KAMAE_GENBU)
+               add_flag(flgs, TR_REFLECT);
+
+       if (creature_ptr->special_defense & KAMAE_SUZAKU)
+               add_flag(flgs, TR_LEVITATION);
+
+       if (creature_ptr->special_defense & KAMAE_SEIRYU)
+       {
+               add_flag(flgs, TR_RES_FIRE);
+               add_flag(flgs, TR_RES_COLD);
+               add_flag(flgs, TR_RES_ACID);
+               add_flag(flgs, TR_RES_ELEC);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_LEVITATION);
+               add_flag(flgs, TR_SH_FIRE);
+               add_flag(flgs, TR_SH_ELEC);
+               add_flag(flgs, TR_SH_COLD);
+       }
+
+       if (creature_ptr->special_defense & KATA_MUSOU)
+       {
+               add_flag(flgs, TR_RES_FEAR);
+               add_flag(flgs, TR_RES_LITE);
+               add_flag(flgs, TR_RES_DARK);
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_RES_SOUND);
+               add_flag(flgs, TR_RES_SHARDS);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_RES_NEXUS);
+               add_flag(flgs, TR_RES_CHAOS);
+               add_flag(flgs, TR_RES_DISEN);
+               add_flag(flgs, TR_REFLECT);
+               add_flag(flgs, TR_HOLD_EXP);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_SH_FIRE);
+               add_flag(flgs, TR_SH_ELEC);
+               add_flag(flgs, TR_SH_COLD);
+               add_flag(flgs, TR_LEVITATION);
+               add_flag(flgs, TR_LITE_1);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_TELEPATHY);
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_REGEN);
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_SUST_INT);
+               add_flag(flgs, TR_SUST_WIS);
+               add_flag(flgs, TR_SUST_DEX);
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_SUST_CHR);
+       }
+}
diff --git a/src/player/permanent-resistances.h b/src/player/permanent-resistances.h
new file mode 100644 (file)
index 0000000..c58580f
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+#include "angband.h"
+
+void player_flags(player_type *creature_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE]);