OSDN Git Service

[Refactor] #40575 Separated mutation-racial-selector.c/h from cmd-racial.c
authorHourier <hourier@users.sourceforge.jp>
Fri, 7 Aug 2020 10:34:04 +0000 (19:34 +0900)
committerHourier <hourier@users.sourceforge.jp>
Fri, 7 Aug 2020 10:34:04 +0000 (19:34 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/cmd-action/cmd-racial.c
src/racial/mutation-racial-selector.c [new file with mode: 0644]
src/racial/mutation-racial-selector.h [new file with mode: 0644]

index 99a56f6..af34d0e 100644 (file)
     <ClCompile Include="..\..\src\object-use\read-execution.c" />\r
     <ClCompile Include="..\..\src\player\player-status-flags.c" />\r
     <ClCompile Include="..\..\src\racial\class-racial-switcher.c" />\r
+    <ClCompile Include="..\..\src\racial\mutation-racial-selector.c" />\r
     <ClCompile Include="..\..\src\racial\racial-kutar.c" />\r
     <ClCompile Include="..\..\src\mind\stances-table.c" />\r
     <ClCompile Include="..\..\src\mspell\mspell-dispel.c" />\r
     <ClInclude Include="..\..\src\object-use\read-execution.h" />\r
     <ClInclude Include="..\..\src\player\player-status-flags.h" />\r
     <ClInclude Include="..\..\src\racial\class-racial-switcher.h" />\r
+    <ClInclude Include="..\..\src\racial\mutation-racial-selector.h" />\r
     <ClInclude Include="..\..\src\racial\race-racial-switcher.h" />\r
     <ClInclude Include="..\..\src\racial\racial-kutar.h" />\r
     <ClInclude Include="..\..\src\mind\stances-table.h" />\r
index 0910c0c..7be3c77 100644 (file)
     <ClCompile Include="..\..\src\racial\race-racial-switcher.c">
       <Filter>racial</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\racial\mutation-racial-selector.c">
+      <Filter>racial</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\racial\race-racial-switcher.h">
       <Filter>racial</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\racial\mutation-racial-selector.h">
+      <Filter>racial</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index f02f81d..f9461a1 100644 (file)
@@ -599,6 +599,7 @@ hengband_SOURCES = \
        player-attack/player-attack.c player-attack/player-attack.h \
        \
        racial/class-racial-switcher.c racial/class-racial-switcher.h \
+       racial/mutation-racial-selector.c racial/mutation-racial-selector.h \
        racial/race-racial-switcher.c racial/race-racial-switcher.h \
        racial/racial-android.c racial/racial-android.h \
        racial/racial-balrog.c racial/racial-balrog.h \
index 1d3fe29..4067f36 100644 (file)
@@ -14,6 +14,7 @@
 #include "player/player-damage.h"
 #include "player/special-defense-types.h"
 #include "racial/class-racial-switcher.h"
+#include "racial/mutation-racial-selector.h"
 #include "racial/race-racial-switcher.h"
 #include "racial/racial-switcher.h"
 #include "racial/racial-util.h"
@@ -47,296 +48,7 @@ void do_cmd_racial_power(player_type *creature_ptr)
     else
         switch_race_racial(creature_ptr, rc_ptr);
 
-    if (creature_ptr->muta1) {
-        if (creature_ptr->muta1 & MUT1_SPIT_ACID) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("酸の唾", "Spit Acid"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-            rc_ptr->power_desc[rc_ptr->num].cost = 9;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SPIT_ACID;
-        }
-
-        if (creature_ptr->muta1 & MUT1_BR_FIRE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("炎のブレス", "Fire Breath"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-            rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BR_FIRE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_HYPN_GAZE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("催眠睨み", "Hypnotic Gaze"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_HYPN_GAZE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_TELEKINES) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("念動力", "Telekinesis"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 9;
-            rc_ptr->power_desc[rc_ptr->num].cost = 9;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_TELEKINES;
-        }
-
-        if (creature_ptr->muta1 & MUT1_VTELEPORT) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("テレポート", "Teleport"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-            rc_ptr->power_desc[rc_ptr->num].cost = 7;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_VTELEPORT;
-        }
-
-        if (creature_ptr->muta1 & MUT1_MIND_BLST) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("精神攻撃", "Mind Blast"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-            rc_ptr->power_desc[rc_ptr->num].cost = 3;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_MIND_BLST;
-        }
-
-        if (creature_ptr->muta1 & MUT1_RADIATION) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("放射能", "Emit Radiation"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-            rc_ptr->power_desc[rc_ptr->num].cost = 15;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RADIATION;
-        }
-
-        if (creature_ptr->muta1 & MUT1_VAMPIRISM) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("吸血", "Vampiric Drain"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-            rc_ptr->power_desc[rc_ptr->num].cost = (1 + (rc_ptr->lvl / 3));
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 9;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_VAMPIRISM;
-        }
-
-        if (creature_ptr->muta1 & MUT1_SMELL_MET) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("金属嗅覚", "Smell Metal"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-            rc_ptr->power_desc[rc_ptr->num].cost = 2;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 12;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SMELL_MET;
-        }
-
-        if (creature_ptr->muta1 & MUT1_SMELL_MON) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("敵臭嗅覚", "Smell Monsters"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-            rc_ptr->power_desc[rc_ptr->num].cost = 4;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SMELL_MON;
-        }
-
-        if (creature_ptr->muta1 & MUT1_BLINK) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ショート・テレポート", "Blink"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-            rc_ptr->power_desc[rc_ptr->num].cost = 3;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 12;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BLINK;
-        }
-
-        if (creature_ptr->muta1 & MUT1_EAT_ROCK) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("岩食い", "Eat Rock"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EAT_ROCK;
-        }
-
-        if (creature_ptr->muta1 & MUT1_SWAP_POS) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("位置交換", "Swap Position"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-            rc_ptr->power_desc[rc_ptr->num].fail = 16;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SWAP_POS;
-        }
-
-        if (creature_ptr->muta1 & MUT1_SHRIEK) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("叫び", "Shriek"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-            rc_ptr->power_desc[rc_ptr->num].cost = 14;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 16;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SHRIEK;
-        }
-
-        if (creature_ptr->muta1 & MUT1_ILLUMINE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("照明", "Illuminate"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 3;
-            rc_ptr->power_desc[rc_ptr->num].cost = 2;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 10;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_ILLUMINE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_DET_CURSE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("呪い感知", "Detect Curses"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-            rc_ptr->power_desc[rc_ptr->num].cost = 14;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_DET_CURSE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_BERSERK) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("狂戦士化", "Berserk"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 8;
-            rc_ptr->power_desc[rc_ptr->num].cost = 8;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BERSERK;
-        }
-
-        if (creature_ptr->muta1 & MUT1_POLYMORPH) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変身", "Polymorph"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 18;
-            rc_ptr->power_desc[rc_ptr->num].cost = 20;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_POLYMORPH;
-        }
-
-        if (creature_ptr->muta1 & MUT1_MIDAS_TCH) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ミダスの手", "Midas Touch"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-            rc_ptr->power_desc[rc_ptr->num].cost = 5;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 12;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_MIDAS_TCH;
-        }
-
-        if (creature_ptr->muta1 & MUT1_GROW_MOLD) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("カビ発生", "Grow Mold"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-            rc_ptr->power_desc[rc_ptr->num].cost = 6;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_GROW_MOLD;
-        }
-
-        if (creature_ptr->muta1 & MUT1_RESIST) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("エレメント耐性", "Resist Elements"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 12;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RESIST;
-        }
-
-        if (creature_ptr->muta1 & MUT1_EARTHQUAKE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("地震", "Earthquake"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 16;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EARTHQUAKE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_EAT_MAGIC) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力食い", "Eat Magic"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 17;
-            rc_ptr->power_desc[rc_ptr->num].cost = 1;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EAT_MAGIC;
-        }
-
-        if (creature_ptr->muta1 & MUT1_WEIGH_MAG) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力感知", "Weigh Magic"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 6;
-            rc_ptr->power_desc[rc_ptr->num].cost = 6;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 10;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_WEIGH_MAG;
-        }
-
-        if (creature_ptr->muta1 & MUT1_STERILITY) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("増殖阻止", "Sterilize"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 12;
-            rc_ptr->power_desc[rc_ptr->num].cost = 23;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 15;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_STERILITY;
-        }
-
-        if (creature_ptr->muta1 & MUT1_HIT_AND_AWAY) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヒット&アウェイ", "Panic Hit"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-            rc_ptr->power_desc[rc_ptr->num].cost = 12;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-            rc_ptr->power_desc[rc_ptr->num].fail = 14;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_HIT_AND_AWAY;
-        }
-
-        if (creature_ptr->muta1 & MUT1_DAZZLE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("眩惑", "Dazzle"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-            rc_ptr->power_desc[rc_ptr->num].cost = 15;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 8;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_DAZZLE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_LASER_EYE) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("レーザー・アイ", "Laser Eye"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 7;
-            rc_ptr->power_desc[rc_ptr->num].cost = 10;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 9;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_LASER_EYE;
-        }
-
-        if (creature_ptr->muta1 & MUT1_RECALL) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("帰還", "Recall"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 17;
-            rc_ptr->power_desc[rc_ptr->num].cost = 50;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 16;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RECALL;
-        }
-
-        if (creature_ptr->muta1 & MUT1_BANISH) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("邪悪消滅", "Banish Evil"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-            rc_ptr->power_desc[rc_ptr->num].cost = 25;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 18;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BANISH;
-        }
-
-        if (creature_ptr->muta1 & MUT1_COLD_TOUCH) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("凍結の手", "Cold Touch"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 2;
-            rc_ptr->power_desc[rc_ptr->num].cost = 2;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
-            rc_ptr->power_desc[rc_ptr->num].fail = 11;
-            rc_ptr->power_desc[rc_ptr->num++].number = MUT1_COLD_TOUCH;
-        }
-
-        if (creature_ptr->muta1 & MUT1_LAUNCHER) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("アイテム投げ", "Throw Object"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-            rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-            rc_ptr->power_desc[rc_ptr->num].fail = 6;
-            rc_ptr->power_desc[rc_ptr->num++].number = 3;
-        }
-    }
-
+    select_mutation_racial(creature_ptr, rc_ptr);
     rc_ptr->flag = FALSE;
     rc_ptr->redraw = FALSE;
 
diff --git a/src/racial/mutation-racial-selector.c b/src/racial/mutation-racial-selector.c
new file mode 100644 (file)
index 0000000..6f323dd
--- /dev/null
@@ -0,0 +1,297 @@
+#include "racial/mutation-racial-selector.h"
+#include "mutation/mutation-flag-types.h"
+#include "racial/racial-util.h"
+
+void select_mutation_racial(player_type *creature_ptr, rc_type *rc_ptr)
+{
+    if (creature_ptr->muta1 == 0)
+        return;
+
+    if (creature_ptr->muta1 & MUT1_SPIT_ACID) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("酸の唾", "Spit Acid"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
+        rc_ptr->power_desc[rc_ptr->num].cost = 9;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SPIT_ACID;
+    }
+
+    if (creature_ptr->muta1 & MUT1_BR_FIRE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("炎のブレス", "Fire Breath"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
+        rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 18;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BR_FIRE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_HYPN_GAZE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("催眠睨み", "Hypnotic Gaze"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 18;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_HYPN_GAZE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_TELEKINES) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("念動力", "Telekinesis"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 9;
+        rc_ptr->power_desc[rc_ptr->num].cost = 9;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_TELEKINES;
+    }
+
+    if (creature_ptr->muta1 & MUT1_VTELEPORT) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("テレポート", "Teleport"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
+        rc_ptr->power_desc[rc_ptr->num].cost = 7;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_VTELEPORT;
+    }
+
+    if (creature_ptr->muta1 & MUT1_MIND_BLST) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("精神攻撃", "Mind Blast"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
+        rc_ptr->power_desc[rc_ptr->num].cost = 3;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_MIND_BLST;
+    }
+
+    if (creature_ptr->muta1 & MUT1_RADIATION) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("放射能", "Emit Radiation"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
+        rc_ptr->power_desc[rc_ptr->num].cost = 15;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RADIATION;
+    }
+
+    if (creature_ptr->muta1 & MUT1_VAMPIRISM) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("吸血", "Vampiric Drain"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
+        rc_ptr->power_desc[rc_ptr->num].cost = (1 + (rc_ptr->lvl / 3));
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 9;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_VAMPIRISM;
+    }
+
+    if (creature_ptr->muta1 & MUT1_SMELL_MET) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("金属嗅覚", "Smell Metal"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
+        rc_ptr->power_desc[rc_ptr->num].cost = 2;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 12;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SMELL_MET;
+    }
+
+    if (creature_ptr->muta1 & MUT1_SMELL_MON) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("敵臭嗅覚", "Smell Monsters"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
+        rc_ptr->power_desc[rc_ptr->num].cost = 4;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SMELL_MON;
+    }
+
+    if (creature_ptr->muta1 & MUT1_BLINK) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ショート・テレポート", "Blink"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
+        rc_ptr->power_desc[rc_ptr->num].cost = 3;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 12;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BLINK;
+    }
+
+    if (creature_ptr->muta1 & MUT1_EAT_ROCK) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("岩食い", "Eat Rock"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 18;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EAT_ROCK;
+    }
+
+    if (creature_ptr->muta1 & MUT1_SWAP_POS) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("位置交換", "Swap Position"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 16;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SWAP_POS;
+    }
+
+    if (creature_ptr->muta1 & MUT1_SHRIEK) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("叫び", "Shriek"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
+        rc_ptr->power_desc[rc_ptr->num].cost = 14;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 16;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_SHRIEK;
+    }
+
+    if (creature_ptr->muta1 & MUT1_ILLUMINE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("照明", "Illuminate"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 3;
+        rc_ptr->power_desc[rc_ptr->num].cost = 2;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_ILLUMINE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_DET_CURSE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("呪い感知", "Detect Curses"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
+        rc_ptr->power_desc[rc_ptr->num].cost = 14;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_DET_CURSE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_BERSERK) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("狂戦士化", "Berserk"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 8;
+        rc_ptr->power_desc[rc_ptr->num].cost = 8;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BERSERK;
+    }
+
+    if (creature_ptr->muta1 & MUT1_POLYMORPH) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変身", "Polymorph"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 18;
+        rc_ptr->power_desc[rc_ptr->num].cost = 20;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 18;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_POLYMORPH;
+    }
+
+    if (creature_ptr->muta1 & MUT1_MIDAS_TCH) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ミダスの手", "Midas Touch"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 5;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 12;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_MIDAS_TCH;
+    }
+
+    if (creature_ptr->muta1 & MUT1_GROW_MOLD) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("カビ発生", "Grow Mold"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 6;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_GROW_MOLD;
+    }
+
+    if (creature_ptr->muta1 & MUT1_RESIST) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("エレメント耐性", "Resist Elements"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 12;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RESIST;
+    }
+
+    if (creature_ptr->muta1 & MUT1_EARTHQUAKE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("地震", "Earthquake"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 16;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EARTHQUAKE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_EAT_MAGIC) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力食い", "Eat Magic"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 17;
+        rc_ptr->power_desc[rc_ptr->num].cost = 1;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_EAT_MAGIC;
+    }
+
+    if (creature_ptr->muta1 & MUT1_WEIGH_MAG) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力感知", "Weigh Magic"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 6;
+        rc_ptr->power_desc[rc_ptr->num].cost = 6;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_WEIGH_MAG;
+    }
+
+    if (creature_ptr->muta1 & MUT1_STERILITY) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("増殖阻止", "Sterilize"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 12;
+        rc_ptr->power_desc[rc_ptr->num].cost = 23;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_STERILITY;
+    }
+
+    if (creature_ptr->muta1 & MUT1_HIT_AND_AWAY) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヒット&アウェイ", "Panic Hit"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 12;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_HIT_AND_AWAY;
+    }
+
+    if (creature_ptr->muta1 & MUT1_DAZZLE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("眩惑", "Dazzle"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
+        rc_ptr->power_desc[rc_ptr->num].cost = 15;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 8;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_DAZZLE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_LASER_EYE) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("レーザー・アイ", "Laser Eye"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 7;
+        rc_ptr->power_desc[rc_ptr->num].cost = 10;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 9;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_LASER_EYE;
+    }
+
+    if (creature_ptr->muta1 & MUT1_RECALL) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("帰還", "Recall"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 17;
+        rc_ptr->power_desc[rc_ptr->num].cost = 50;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 16;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_RECALL;
+    }
+
+    if (creature_ptr->muta1 & MUT1_BANISH) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("邪悪消滅", "Banish Evil"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 25;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 18;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_BANISH;
+    }
+
+    if (creature_ptr->muta1 & MUT1_COLD_TOUCH) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("凍結の手", "Cold Touch"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 2;
+        rc_ptr->power_desc[rc_ptr->num].cost = 2;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CON;
+        rc_ptr->power_desc[rc_ptr->num].fail = 11;
+        rc_ptr->power_desc[rc_ptr->num++].number = MUT1_COLD_TOUCH;
+    }
+
+    if (creature_ptr->muta1 & MUT1_LAUNCHER) {
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("アイテム投げ", "Throw Object"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = rc_ptr->lvl;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 6;
+        rc_ptr->power_desc[rc_ptr->num++].number = 3;
+    }
+}
diff --git a/src/racial/mutation-racial-selector.h b/src/racial/mutation-racial-selector.h
new file mode 100644 (file)
index 0000000..e009954
--- /dev/null
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "system/angband.h"
+
+typedef struct rc_type rc_type;
+void select_mutation_racial(player_type *creature_ptr, rc_type *rc_ptr);