OSDN Git Service

[Refactor] #40647 Separated race-ability-info.c/h from self-info.c
authorHourier <hourier@users.sourceforge.jp>
Fri, 21 Aug 2020 02:10:25 +0000 (11:10 +0900)
committerHourier <hourier@users.sourceforge.jp>
Fri, 21 Aug 2020 02:10:39 +0000 (11:10 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/player-info/race-ability-info.c [new file with mode: 0644]
src/player-info/race-ability-info.h [new file with mode: 0644]
src/player-info/self-info.c

index de58dd0..cafd261 100644 (file)
     <ClCompile Include="..\..\src\object-activation\activation-resistance.c" />\r
     <ClCompile Include="..\..\src\object-activation\activation-teleport.c" />\r
     <ClCompile Include="..\..\src\object-activation\activation-util.c" />\r
+    <ClCompile Include="..\..\src\player-info\race-ability-info.c" />\r
     <ClCompile Include="..\..\src\player-info\self-info-util.c" />\r
     <ClCompile Include="..\..\src\room\vault-builder.c" />\r
     <ClCompile Include="..\..\src\specific-object\blade-turner.c" />\r
     <ClInclude Include="..\..\src\object-activation\activation-teleport.h" />\r
     <ClInclude Include="..\..\src\object-activation\activation-util.h" />\r
     <ClInclude Include="..\..\src\player-info\base-status-types.h" />\r
+    <ClInclude Include="..\..\src\player-info\race-ability-info.h" />\r
     <ClInclude Include="..\..\src\player-info\self-info-util.h" />\r
     <ClInclude Include="..\..\src\room\vault-builder.h" />\r
     <ClInclude Include="..\..\src\specific-object\blade-turner.h" />\r
index 56fd9cd..26eb593 100644 (file)
     <ClCompile Include="..\..\src\player-info\avatar.c">
       <Filter>player-info</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\player-info\race-ability-info.c">
+      <Filter>player-info</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\player-info\base-status-types.h">
       <Filter>player-info</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\player-info\race-ability-info.h">
+      <Filter>player-info</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 13a28dc..c90244d 100644 (file)
@@ -632,6 +632,7 @@ hengband_SOURCES = \
        \
        player-info/avatar.h player-info/avatar.c \
        player-info/base-status-types.h \
+       player-info/race-ability-info.c player-info/race-ability-info.h \
        player-info/self-info.c player-info/self-info.h \
        player-info/self-info-util.c player-info/self-info-util.h \
        \
diff --git a/src/player-info/race-ability-info.c b/src/player-info/race-ability-info.c
new file mode 100644 (file)
index 0000000..fc87d54
--- /dev/null
@@ -0,0 +1,192 @@
+#include "player-info/race-ability-info.h"
+#include "player-info/self-info-util.h"
+
+void set_race_ability_info(player_type *creature_ptr, self_info_type *si_ptr)
+{
+    switch (creature_ptr->prace) {
+    case RACE_NIBELUNG:
+    case RACE_DWARF:
+        if (creature_ptr->lev > 4)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Íã©\82Æ\83h\83A\82Æ\8aK\92i\82ð\8a´\92m\82Å\82«\82é\81B(5 MP)", "You can find traps, doors and stairs (cost 5).");
+
+        break;
+    case RACE_HOBBIT:
+        if (creature_ptr->lev > 14)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\90H\97¿\82ð\90\90¬\82Å\82«\82é\81B(10 MP)", "You can produce food (cost 10).");
+
+        break;
+    case RACE_GNOME:
+        if (creature_ptr->lev > 4) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í\94Í\88Í %d \88È\93à\82É\83e\83\8c\83|\81[\83g\82Å\82«\82é\81B(%d MP)", "You can teleport, range %d (cost %d)."), (1 + creature_ptr->lev),
+                (5 + (creature_ptr->lev / 5)));
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_HALF_ORC:
+        if (creature_ptr->lev > 2)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8b°\95|\82ð\8f\9c\8b\8e\82Å\82«\82é\81B(5 MP)", "You can remove fear (cost 5).");
+
+        break;
+    case RACE_HALF_TROLL:
+        if (creature_ptr->lev > 9)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8b\96\\89»\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(12 MP) ", "You can enter a berserk fury (cost 12).");
+
+        break;
+    case RACE_AMBERITE:
+        if (creature_ptr->lev > 29)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\83V\83\83\83h\83E\83V\83t\83g\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(50 MP)", "You can Shift Shadows (cost 50).");
+
+        if (creature_ptr->lev > 39)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\81u\83p\83^\81[\83\93\81v\82ð\90S\82É\95`\82¢\82Ä\95à\82­\82±\82Æ\82ª\82Å\82«\82é\81B(75 MP)", "You can mentally Walk the Pattern (cost 75).");
+
+        break;
+    case RACE_BARBARIAN:
+        if (creature_ptr->lev > 7)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8b\96\\89»\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(10 MP) ", "You can enter a berserk fury (cost 10).");
+
+        break;
+    case RACE_HALF_OGRE:
+        if (creature_ptr->lev > 24)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\94\9a\94­\82Ì\83\8b\81[\83\93\82ð\8ed\8a|\82¯\82é\82±\82Æ\82ª\82Å\82«\82é\81B(35 MP)", "You can set an Explosive Rune (cost 35).");
+
+        break;
+    case RACE_HALF_GIANT:
+        if (creature_ptr->lev > 19)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\90Î\82Ì\95Ç\82ð\89ó\82·\82±\82Æ\82ª\82Å\82«\82é\81B(10 MP)", "You can break stone walls (cost 10).");
+
+        break;
+    case RACE_HALF_TITAN:
+        if (creature_ptr->lev > 34)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\83\82\83\93\83X\83^\81[\82ð\83X\83L\83\83\83\93\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(20 MP)", "You can probe monsters (cost 20).");
+
+        break;
+    case RACE_CYCLOPS:
+        if (creature_ptr->lev > 19) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\8aâ\90Î\82ð\93\8a\82°\82é\82±\82Æ\82ª\82Å\82«\82é\81B(15 MP)", "You can throw a boulder, dam. %d (cost 15)."),
+                3 * creature_ptr->lev);
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_YEEK:
+        if (creature_ptr->lev > 14)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8b°\95|\82ð\8cÄ\82Ñ\8bN\82±\82·\8b©\82Ñ\90º\82ð\94­\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(15 MP)", "You can make a terrifying scream (cost 15).");
+
+        break;
+    case RACE_KLACKON:
+        if (creature_ptr->lev > 8) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\8e_\82ð\90\81\82«\82©\82¯\82é\82±\82Æ\82ª\82Å\82«\82é\81B(9 MP)", "You can spit acid, dam. %d (cost 9)."), creature_ptr->lev);
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_KOBOLD:
+        if (creature_ptr->lev > 11) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\93Å\96î\82ð\93\8a\82°\82é\82±\82Æ\82ª\82Å\82«\82é\81B(8 MP)", "You can throw a dart of poison, dam. %d (cost 8)."),
+                creature_ptr->lev);
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_DARK_ELF:
+        if (creature_ptr->lev > 1) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83}\83W\83b\83N\81E\83~\83T\83C\83\8b\82Ì\8eô\95\82ð\8eg\82¦\82é\81B(2 MP)", "You can cast a Magic Missile, dam %d (cost 2)."),
+                (3 + ((creature_ptr->lev - 1) / 5)));
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_DRACONIAN:
+        sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83u\83\8c\83X\82ð\93f\82­\82±\82Æ\82ª\82Å\82«\82é\81B(%d MP)", "You can breathe, dam. %d (cost %d)."), 2 * creature_ptr->lev,
+            creature_ptr->lev);
+        si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        break;
+    case RACE_MIND_FLAYER:
+        if (creature_ptr->lev > 14)
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\90¸\90_\8dU\8c\82\82ð\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(12 MP)", "You can mind blast your enemies, dam %d (cost 12)."),
+                creature_ptr->lev);
+
+        si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        break;
+    case RACE_IMP:
+        if (creature_ptr->lev > 29) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83t\83@\83C\83A\81E\83{\81[\83\8b\82Ì\8eô\95\82ð\8eg\82¦\82é\81B(15 MP)", "You can cast a Fire Ball, dam. %d (cost 15)."),
+                creature_ptr->lev);
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+            break;
+        }
+
+        if (creature_ptr->lev > 8) {
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83t\83@\83C\83A\81E\83{\83\8b\83g\82Ì\8eô\95\82ð\8eg\82¦\82é\81B(15 MP)", "You can cast a Fire Bolt, dam. %d (cost 15)."),
+                creature_ptr->lev);
+            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        }
+
+        break;
+    case RACE_GOLEM:
+        if (creature_ptr->lev > 19)
+            si_ptr->info[si_ptr->line++]
+                = _("\82 \82È\82½\82Í d20+30 \83^\81[\83\93\82Ì\8aÔ\94§\82ð\90Î\82É\95Ï\89»\82³\82¹\82ç\82ê\82é\81B(15 MP)", "You can turn your skin to stone, dur d20+30 (cost 15).");
+
+        break;
+    case RACE_ZOMBIE:
+    case RACE_SKELETON:
+        if (creature_ptr->lev > 29)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8e¸\82Á\82½\8co\8c±\92l\82ð\89ñ\95\9c\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B(30 MP)", "You can restore lost experience (cost 30).");
+
+        break;
+    case RACE_VAMPIRE:
+        if (creature_ptr->lev <= 1)
+            break;
+
+        sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í\93G\82©\82ç %d-%d HP \82Ì\90\96½\97Í\82ð\8bz\8eû\82Å\82«\82é\81B(%d MP)", "You can steal life from a foe, dam. %d-%d (cost %d)."),
+            creature_ptr->lev + MAX(1, creature_ptr->lev / 10), creature_ptr->lev + creature_ptr->lev * MAX(1, creature_ptr->lev / 10),
+            1 + (creature_ptr->lev / 3));
+        si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        break;
+    case RACE_SPECTRE:
+        if (creature_ptr->lev > 3)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í\8b\83\82«\8b©\82ñ\82Å\93G\82ð\8b°\95|\82³\82¹\82é\82±\82Æ\82ª\82Å\82«\82é\81B(3 MP)", "You can wail to terrify your enemies (cost 3).");
+
+        break;
+    case RACE_SPRITE:
+        if (creature_ptr->lev > 11)
+            si_ptr->info[si_ptr->line++]
+                = _("\82 \82È\82½\82Í\93G\82ð\96°\82ç\82¹\82é\96\82\96@\82Ì\95²\82ð\93\8a\82°\82é\82±\82Æ\82ª\82Å\82«\82é\81B(12 MP)", "You can throw magical dust which induces sleep (cost 12).");
+
+        break;
+    case RACE_BALROG:
+        sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\92n\8d\96\82©\89Î\89\8a\82Ì\83u\83\8c\83X\82ð\93f\82­\82±\82Æ\82ª\82Å\82«\82é\81B(%d MP)", "You can breathe nether, dam. %d (cost %d)."),
+            3 * creature_ptr->lev, 10 + creature_ptr->lev / 3);
+        si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        break;
+    case RACE_KUTAR:
+        if (creature_ptr->lev > 19)
+            si_ptr->info[si_ptr->line++] = _("\82 \82È\82½\82Í d20+30 \83^\81[\83\93\82Ì\8aÔ\89¡\82É\90L\82Ñ\82é\82±\82Æ\82ª\82Å\82«\82é\81B(15 MP)", "You can expand horizontally, dur d20+30 (cost 15).");
+
+        break;
+    case RACE_ANDROID:
+        if (creature_ptr->lev < 10)
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83\8c\83C\83K\83\93\82ð\8c\82\82Â\82±\82Æ\82ª\82Å\82«\82é\81B(7 MP)", "You can fire a ray gun with damage %d (cost 7)."),
+                (creature_ptr->lev + 1) / 2);
+        else if (creature_ptr->lev < 25)
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83u\83\89\83X\83^\81[\82ð\8c\82\82Â\82±\82Æ\82ª\82Å\82«\82é\81B(13 MP)", "You can fire a blaster with damage %d (cost 13)."),
+                creature_ptr->lev);
+        else if (creature_ptr->lev < 35)
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83o\83Y\81[\83J\82ð\8c\82\82Â\82±\82Æ\82ª\82Å\82«\82é\81B(26 MP)", "You can fire a bazooka with damage %d (cost 26)."),
+                creature_ptr->lev * 2);
+        else if (creature_ptr->lev < 45)
+            sprintf(si_ptr->plev_buf,
+                _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83r\81[\83\80\83L\83\83\83m\83\93\82ð\8c\82\82Â\82±\82Æ\82ª\82Å\82«\82é\81B(40 MP)", "You can fire a beam cannon with damage %d (cost 40)."),
+                creature_ptr->lev * 2);
+        else
+            sprintf(si_ptr->plev_buf, _("\82 \82È\82½\82Í %d \83_\83\81\81[\83W\82Ì\83\8d\83P\83b\83g\82ð\8c\82\82Â\82±\82Æ\82ª\82Å\82«\82é\81B(60 MP)", "You can fire a rocket with damage %d (cost 60)."),
+                creature_ptr->lev * 5);
+
+        si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
+        break;
+    default:
+        break;
+    }
+}
diff --git a/src/player-info/race-ability-info.h b/src/player-info/race-ability-info.h
new file mode 100644 (file)
index 0000000..6c861d8
--- /dev/null
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "system/angband.h"
+
+typedef struct self_info_type self_info_type;
+void set_race_ability_info(player_type *creature_ptr, self_info_type *si_ptr);
index a1abd02..a73e622 100644 (file)
@@ -21,6 +21,7 @@
 #include "object-enchant/trc-types.h"
 #include "object/object-flags.h"
 #include "player-info/avatar.h"
+#include "player-info/race-ability-info.h"
 #include "player-info/self-info-util.h"
 #include "player/attack-defense-types.h"
 #include "player/player-class.h"
@@ -200,199 +201,11 @@ void self_knowledge(player_type *creature_ptr)
     display_max_base_status(creature_ptr, si_ptr);
     display_virtue(creature_ptr, si_ptr);
     si_ptr->info[si_ptr->line++] = "";
-    if (creature_ptr->mimic_form) {
+    if (creature_ptr->mimic_form)
         display_mimic_race_ability(creature_ptr, si_ptr);
-    } else {
-        switch (creature_ptr->prace) {
-        case RACE_NIBELUNG:
-        case RACE_DWARF:
-            if (creature_ptr->lev > 4)
-                si_ptr->info[si_ptr->line++] = _("あなたは罠とドアと階段を感知できる。(5 MP)", "You can find traps, doors and stairs (cost 5).");
-
-            break;
-        case RACE_HOBBIT:
-            if (creature_ptr->lev > 14)
-                si_ptr->info[si_ptr->line++] = _("あなたは食料を生成できる。(10 MP)", "You can produce food (cost 10).");
-
-            break;
-        case RACE_GNOME:
-            if (creature_ptr->lev > 4) {
-                sprintf(si_ptr->plev_buf, _("あなたは範囲 %d 以内にテレポートできる。(%d MP)", "You can teleport, range %d (cost %d)."),
-                    (1 + creature_ptr->lev), (5 + (creature_ptr->lev / 5)));
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_HALF_ORC:
-            if (creature_ptr->lev > 2)
-                si_ptr->info[si_ptr->line++] = _("あなたは恐怖を除去できる。(5 MP)", "You can remove fear (cost 5).");
-
-            break;
-        case RACE_HALF_TROLL:
-            if (creature_ptr->lev > 9)
-                si_ptr->info[si_ptr->line++] = _("あなたは狂暴化することができる。(12 MP) ", "You can enter a berserk fury (cost 12).");
-
-            break;
-        case RACE_AMBERITE:
-            if (creature_ptr->lev > 29)
-                si_ptr->info[si_ptr->line++] = _("あなたはシャドウシフトすることができる。(50 MP)", "You can Shift Shadows (cost 50).");
-
-            if (creature_ptr->lev > 39)
-                si_ptr->info[si_ptr->line++] = _("あなたは「パターン」を心に描いて歩くことができる。(75 MP)", "You can mentally Walk the Pattern (cost 75).");
-
-            break;
-        case RACE_BARBARIAN:
-            if (creature_ptr->lev > 7)
-                si_ptr->info[si_ptr->line++] = _("あなたは狂暴化することができる。(10 MP) ", "You can enter a berserk fury (cost 10).");
-
-            break;
-        case RACE_HALF_OGRE:
-            if (creature_ptr->lev > 24)
-                si_ptr->info[si_ptr->line++] = _("あなたは爆発のルーンを仕掛けることができる。(35 MP)", "You can set an Explosive Rune (cost 35).");
-
-            break;
-        case RACE_HALF_GIANT:
-            if (creature_ptr->lev > 19)
-                si_ptr->info[si_ptr->line++] = _("あなたは石の壁を壊すことができる。(10 MP)", "You can break stone walls (cost 10).");
-
-            break;
-        case RACE_HALF_TITAN:
-            if (creature_ptr->lev > 34)
-                si_ptr->info[si_ptr->line++] = _("あなたはモンスターをスキャンすることができる。(20 MP)", "You can probe monsters (cost 20).");
-
-            break;
-        case RACE_CYCLOPS:
-            if (creature_ptr->lev > 19) {
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージの岩石を投げることができる。(15 MP)", "You can throw a boulder, dam. %d (cost 15)."),
-                    3 * creature_ptr->lev);
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_YEEK:
-            if (creature_ptr->lev > 14)
-                si_ptr->info[si_ptr->line++] = _("あなたは恐怖を呼び起こす叫び声を発することができる。(15 MP)", "You can make a terrifying scream (cost 15).");
-
-            break;
-        case RACE_KLACKON:
-            if (creature_ptr->lev > 8) {
-                sprintf(
-                    si_ptr->plev_buf, _("あなたは %d ダメージの酸を吹きかけることができる。(9 MP)", "You can spit acid, dam. %d (cost 9)."), creature_ptr->lev);
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_KOBOLD:
-            if (creature_ptr->lev > 11) {
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージの毒矢を投げることができる。(8 MP)", "You can throw a dart of poison, dam. %d (cost 8)."),
-                    creature_ptr->lev);
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_DARK_ELF:
-            if (creature_ptr->lev > 1) {
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのマジック・ミサイルの呪文を使える。(2 MP)", "You can cast a Magic Missile, dam %d (cost 2)."),
-                    (3 + ((creature_ptr->lev - 1) / 5)));
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_DRACONIAN:
-            sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのブレスを吐くことができる。(%d MP)", "You can breathe, dam. %d (cost %d)."),
-                2 * creature_ptr->lev, creature_ptr->lev);
-            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            break;
-        case RACE_MIND_FLAYER:
-            if (creature_ptr->lev > 14)
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージの精神攻撃をすることができる。(12 MP)", "You can mind blast your enemies, dam %d (cost 12)."),
-                    creature_ptr->lev);
-
-            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            break;
-        case RACE_IMP:
-            if (creature_ptr->lev > 29) {
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのファイア・ボールの呪文を使える。(15 MP)", "You can cast a Fire Ball, dam. %d (cost 15)."),
-                    creature_ptr->lev);
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-                break;
-            }
-
-            if (creature_ptr->lev > 8) {
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのファイア・ボルトの呪文を使える。(15 MP)", "You can cast a Fire Bolt, dam. %d (cost 15)."),
-                    creature_ptr->lev);
-                si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            }
-
-            break;
-        case RACE_GOLEM:
-            if (creature_ptr->lev > 19)
-                si_ptr->info[si_ptr->line++]
-                    = _("あなたは d20+30 ターンの間肌を石に変化させられる。(15 MP)", "You can turn your skin to stone, dur d20+30 (cost 15).");
-
-            break;
-        case RACE_ZOMBIE:
-        case RACE_SKELETON:
-            if (creature_ptr->lev > 29)
-                si_ptr->info[si_ptr->line++] = _("あなたは失った経験値を回復することができる。(30 MP)", "You can restore lost experience (cost 30).");
-
-            break;
-        case RACE_VAMPIRE:
-            if (creature_ptr->lev <= 1)
-                break;
-
-            sprintf(si_ptr->plev_buf, _("あなたは敵から %d-%d HP の生命力を吸収できる。(%d MP)", "You can steal life from a foe, dam. %d-%d (cost %d)."),
-                creature_ptr->lev + MAX(1, creature_ptr->lev / 10), creature_ptr->lev + creature_ptr->lev * MAX(1, creature_ptr->lev / 10),
-                1 + (creature_ptr->lev / 3));
-            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            break;
-        case RACE_SPECTRE:
-            if (creature_ptr->lev > 3)
-                si_ptr->info[si_ptr->line++] = _("あなたは泣き叫んで敵を恐怖させることができる。(3 MP)", "You can wail to terrify your enemies (cost 3).");
-
-            break;
-        case RACE_SPRITE:
-            if (creature_ptr->lev > 11)
-                si_ptr->info[si_ptr->line++]
-                    = _("あなたは敵を眠らせる魔法の粉を投げることができる。(12 MP)", "You can throw magical dust which induces sleep (cost 12).");
-
-            break;
-        case RACE_BALROG:
-            sprintf(si_ptr->plev_buf, _("あなたは %d ダメージの地獄か火炎のブレスを吐くことができる。(%d MP)", "You can breathe nether, dam. %d (cost %d)."),
-                3 * creature_ptr->lev, 10 + creature_ptr->lev / 3);
-            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            break;
-        case RACE_KUTAR:
-            if (creature_ptr->lev > 19)
-                si_ptr->info[si_ptr->line++]
-                    = _("あなたは d20+30 ターンの間横に伸びることができる。(15 MP)", "You can expand horizontally, dur d20+30 (cost 15).");
-
-            break;
-        case RACE_ANDROID:
-            if (creature_ptr->lev < 10)
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのレイガンを撃つことができる。(7 MP)", "You can fire a ray gun with damage %d (cost 7)."),
-                    (creature_ptr->lev + 1) / 2);
-            else if (creature_ptr->lev < 25)
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのブラスターを撃つことができる。(13 MP)", "You can fire a blaster with damage %d (cost 13)."),
-                    creature_ptr->lev);
-            else if (creature_ptr->lev < 35)
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのバズーカを撃つことができる。(26 MP)", "You can fire a bazooka with damage %d (cost 26)."),
-                    creature_ptr->lev * 2);
-            else if (creature_ptr->lev < 45)
-                sprintf(si_ptr->plev_buf,
-                    _("あなたは %d ダメージのビームキャノンを撃つことができる。(40 MP)", "You can fire a beam cannon with damage %d (cost 40)."),
-                    creature_ptr->lev * 2);
-            else
-                sprintf(si_ptr->plev_buf, _("あなたは %d ダメージのロケットを撃つことができる。(60 MP)", "You can fire a rocket with damage %d (cost 60)."),
-                    creature_ptr->lev * 5);
-
-            si_ptr->info[si_ptr->line++] = si_ptr->plev_buf;
-            break;
-        default:
-            break;
-        }
-    }
-
+    else
+        set_race_ability_info(creature_ptr, si_ptr);
+    
     switch (creature_ptr->pclass) {
     case CLASS_WARRIOR:
         if (creature_ptr->lev > 39) {