OSDN Git Service

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

index 339da3a..e26ca49 100644 (file)
     <ClCompile Include="..\..\src\mutation\mutation-investor-remover.c" />\r
     <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\racial-kutar.c" />\r
     <ClCompile Include="..\..\src\mind\stances-table.c" />\r
     <ClCompile Include="..\..\src\mspell\mspell-dispel.c" />\r
     <ClInclude Include="..\..\src\mutation\mutation-investor-remover.h" />\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\racial-kutar.h" />\r
     <ClInclude Include="..\..\src\mind\stances-table.h" />\r
     <ClInclude Include="..\..\src\mspell\monster-power-table.h" />\r
index 05931cd..656f0e7 100644 (file)
     <ClCompile Include="..\..\src\racial\racial-util.c">
       <Filter>racial</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\racial\class-racial-switcher.c">
+      <Filter>racial</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\racial\racial-util.h">
       <Filter>racial</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\racial\class-racial-switcher.h">
+      <Filter>racial</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 6807892..a4910a7 100644 (file)
@@ -598,6 +598,7 @@ hengband_SOURCES = \
        player-attack/blood-sucking-processor.c player-attack/blood-sucking-processor.h \
        player-attack/player-attack.c player-attack/player-attack.h \
        \
+       racial/class-racial-switcher.c racial/class-racial-switcher.h \
        racial/racial-android.c racial/racial-android.h \
        racial/racial-balrog.c racial/racial-balrog.h \
        racial/racial-draconian.c racial/racial-draconian.h \
index 2f53060..f8815ba 100644 (file)
 #include "player/player-damage.h"
 #include "player/player-race.h"
 #include "player/special-defense-types.h"
+#include "racial/class-racial-switcher.h"
 #include "racial/racial-switcher.h"
 #include "racial/racial-util.h"
-#include "realm/realm-names-table.h"
-#include "realm/realm-types.h"
 #include "status/action-setter.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
@@ -42,287 +41,7 @@ void do_cmd_racial_power(player_type *creature_ptr)
 
     rc_type tmp_rc;
     rc_type *rc_ptr = initialize_rc_type(creature_ptr, &tmp_rc);
-    switch (creature_ptr->pclass) {
-    case CLASS_WARRIOR:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("剣の舞い", "Sword Dancing"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
-        rc_ptr->power_desc[rc_ptr->num].cost = 75;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 35;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_HIGH_MAGE:
-        if (creature_ptr->realm1 == REALM_HEX) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("詠唱をやめる", "Stop spell casting"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-            rc_ptr->power_desc[rc_ptr->num].cost = 0;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-            rc_ptr->power_desc[rc_ptr->num].fail = 0;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
-            break;
-        }
-        /* Fall through */
-    case CLASS_MAGE:
-    case CLASS_SORCERER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力食い", "Eat Magic"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 1;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_PRIEST:
-        if (is_good_realm(creature_ptr->realm1)) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("武器祝福", "Bless Weapon"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 35;
-            rc_ptr->power_desc[rc_ptr->num].cost = 70;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 50;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        } else {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("召魂", "Evocation"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 42;
-            rc_ptr->power_desc[rc_ptr->num].cost = 40;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 35;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        }
-
-        break;
-    case CLASS_ROGUE:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヒット&アウェイ", "Hit and Away"));
-        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_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 14;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_RANGER:
-    case CLASS_SNIPER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("モンスター調査", "Probe Monster"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        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 = -3;
-        break;
-    case CLASS_PALADIN:
-        if (is_good_realm(creature_ptr->realm1)) {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ホーリー・ランス", "Holy Lance"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-            rc_ptr->power_desc[rc_ptr->num].cost = 30;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 30;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        } else {
-            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヘル・ランス", "Hell Lance"));
-            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-            rc_ptr->power_desc[rc_ptr->num].cost = 30;
-            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-            rc_ptr->power_desc[rc_ptr->num].fail = 30;
-            rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        }
-
-        break;
-    case CLASS_WARRIOR_MAGE:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変換: HP→MP", "Convert HP to SP"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        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 = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変換: MP→HP", "Convert SP to HP"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        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 = -4;
-        break;
-    case CLASS_CHAOS_WARRIOR:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("幻惑の光", "Confusing Light"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
-        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 = 25;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_MONK:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("構える", "Assume a Stance"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("百裂拳", "Double Attack"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 30;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_MINDCRAFTER:
-    case CLASS_FORCETRAINER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("明鏡止水", "Clear Mind"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_TOURIST:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("写真撮影", "Take a Photograph"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("真・鑑定", "Identify True"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_IMITATOR:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("倍返し", "Double Revenge"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 100;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 30;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_BEASTMASTER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("生物支配", "Dominate a Living Thing"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 3) / 4;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("真・生物支配", "Dominate Living Things"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 20) / 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_ARCHER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("弾/矢の製造", "Create Ammo"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_MAGIC_EATER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力の取り込み", "Absorb Magic"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("強力発動", "Powerful Activation"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10 + (rc_ptr->lvl - 10) / 2;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_BARD:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("歌を止める", "Stop Singing"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_RED_MAGE:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("連続魔", "Double Magic"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 48;
-        rc_ptr->power_desc[rc_ptr->num].cost = 20;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_SAMURAI:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("気合いため", "Concentration"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("型", "Assume a Stance"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_BLUE_MAGE:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ラーニング", "Learning"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_CAVALRY:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("荒馬ならし", "Rodeo"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
-        rc_ptr->power_desc[rc_ptr->num].fail = 10;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_BERSERKER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("帰還", "Recall"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_MIRROR_MASTER:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("鏡割り", "Break Mirrors"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("静水", "Mirror Concentration"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -4;
-        break;
-    case CLASS_SMITH:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("目利き", "Judgment"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 15;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
-        rc_ptr->power_desc[rc_ptr->num].fail = 20;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    case CLASS_NINJA:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("速駆け", "Quick Walk"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
-        rc_ptr->power_desc[rc_ptr->num].cost = 0;
-        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
-        rc_ptr->power_desc[rc_ptr->num].fail = 0;
-        rc_ptr->power_desc[rc_ptr->num++].number = -3;
-        break;
-    default:
-        strcpy(rc_ptr->power_desc[0].racial_name, _("(なし)", "(none)"));
-        break;
-    }
-
+    switch_class_racial(creature_ptr, rc_ptr);
     if (creature_ptr->mimic_form) {
         switch (creature_ptr->mimic_form) {
         case MIMIC_DEMON:
diff --git a/src/racial/class-racial-switcher.c b/src/racial/class-racial-switcher.c
new file mode 100644 (file)
index 0000000..3201e95
--- /dev/null
@@ -0,0 +1,288 @@
+#include "racial/class-racial-switcher.h"
+#include "racial/racial-util.h"
+#include "realm/realm-names-table.h"
+#include "realm/realm-types.h"
+
+void switch_class_racial(player_type *creature_ptr, rc_type *rc_ptr)
+{
+    switch (creature_ptr->pclass) {
+    case CLASS_WARRIOR:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("剣の舞い", "Sword Dancing"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
+        rc_ptr->power_desc[rc_ptr->num].cost = 75;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 35;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_HIGH_MAGE:
+        if (creature_ptr->realm1 == REALM_HEX) {
+            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("詠唱をやめる", "Stop spell casting"));
+            rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+            rc_ptr->power_desc[rc_ptr->num].cost = 0;
+            rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+            rc_ptr->power_desc[rc_ptr->num].fail = 0;
+            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+            break;
+        }
+        /* Fall through */
+    case CLASS_MAGE:
+    case CLASS_SORCERER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力食い", "Eat Magic"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 1;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 25;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_PRIEST:
+        if (is_good_realm(creature_ptr->realm1)) {
+            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("武器祝福", "Bless Weapon"));
+            rc_ptr->power_desc[rc_ptr->num].min_level = 35;
+            rc_ptr->power_desc[rc_ptr->num].cost = 70;
+            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+            rc_ptr->power_desc[rc_ptr->num].fail = 50;
+            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        } else {
+            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("召魂", "Evocation"));
+            rc_ptr->power_desc[rc_ptr->num].min_level = 42;
+            rc_ptr->power_desc[rc_ptr->num].cost = 40;
+            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+            rc_ptr->power_desc[rc_ptr->num].fail = 35;
+            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        }
+
+        break;
+    case CLASS_ROGUE:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヒット&アウェイ", "Hit and Away"));
+        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_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 14;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_RANGER:
+    case CLASS_SNIPER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("モンスター調査", "Probe Monster"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
+        rc_ptr->power_desc[rc_ptr->num].cost = 20;
+        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 = -3;
+        break;
+    case CLASS_PALADIN:
+        if (is_good_realm(creature_ptr->realm1)) {
+            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ホーリー・ランス", "Holy Lance"));
+            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+            rc_ptr->power_desc[rc_ptr->num].cost = 30;
+            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+            rc_ptr->power_desc[rc_ptr->num].fail = 30;
+            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        } else {
+            strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ヘル・ランス", "Hell Lance"));
+            rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+            rc_ptr->power_desc[rc_ptr->num].cost = 30;
+            rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+            rc_ptr->power_desc[rc_ptr->num].fail = 30;
+            rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        }
+
+        break;
+    case CLASS_WARRIOR_MAGE:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変換: HP→MP", "Convert HP to SP"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        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 = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("変換: MP→HP", "Convert SP to HP"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        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 = -4;
+        break;
+    case CLASS_CHAOS_WARRIOR:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("幻惑の光", "Confusing Light"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 40;
+        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 = 25;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_MONK:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("構える", "Assume a Stance"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("百裂拳", "Double Attack"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+        rc_ptr->power_desc[rc_ptr->num].cost = 30;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 20;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_MINDCRAFTER:
+    case CLASS_FORCETRAINER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("明鏡止水", "Clear Mind"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 15;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_TOURIST:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("写真撮影", "Take a Photograph"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("真・鑑定", "Identify True"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 20;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 20;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_IMITATOR:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("倍返し", "Double Revenge"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+        rc_ptr->power_desc[rc_ptr->num].cost = 100;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 30;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_BEASTMASTER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("生物支配", "Dominate a Living Thing"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 3) / 4;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("真・生物支配", "Dominate Living Things"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+        rc_ptr->power_desc[rc_ptr->num].cost = (creature_ptr->lev + 20) / 2;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_ARCHER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("弾/矢の製造", "Create Ammo"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_MAGIC_EATER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("魔力の取り込み", "Absorb Magic"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("強力発動", "Powerful Activation"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 10 + (rc_ptr->lvl - 10) / 2;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_BARD:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("歌を止める", "Stop Singing"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_CHR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_RED_MAGE:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("連続魔", "Double Magic"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 48;
+        rc_ptr->power_desc[rc_ptr->num].cost = 20;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_SAMURAI:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("気合いため", "Concentration"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("型", "Assume a Stance"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 25;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_BLUE_MAGE:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("ラーニング", "Learning"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_CAVALRY:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("荒馬ならし", "Rodeo"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_STR;
+        rc_ptr->power_desc[rc_ptr->num].fail = 10;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_BERSERKER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("帰還", "Recall"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 10;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 20;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_MIRROR_MASTER:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("鏡割り", "Break Mirrors"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 1;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("静水", "Mirror Concentration"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 30;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 20;
+        rc_ptr->power_desc[rc_ptr->num++].number = -4;
+        break;
+    case CLASS_SMITH:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("目利き", "Judgment"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
+        rc_ptr->power_desc[rc_ptr->num].cost = 15;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_INT;
+        rc_ptr->power_desc[rc_ptr->num].fail = 20;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    case CLASS_NINJA:
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("速駆け", "Quick Walk"));
+        rc_ptr->power_desc[rc_ptr->num].min_level = 20;
+        rc_ptr->power_desc[rc_ptr->num].cost = 0;
+        rc_ptr->power_desc[rc_ptr->num].stat = A_DEX;
+        rc_ptr->power_desc[rc_ptr->num].fail = 0;
+        rc_ptr->power_desc[rc_ptr->num++].number = -3;
+        break;
+    default:
+        strcpy(rc_ptr->power_desc[0].racial_name, _("(なし)", "(none)"));
+        break;
+    }
+}
diff --git a/src/racial/class-racial-switcher.h b/src/racial/class-racial-switcher.h
new file mode 100644 (file)
index 0000000..6aeadcc
--- /dev/null
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "system/angband.h"
+
+typedef struct rc_type rc_type;
+void switch_class_racial(player_type *creature_ptr, rc_type *rc_ptr);