OSDN Git Service

[Refactor] #40571 Moved targeting.c/h from io/ to target/
authorHourier <hourier@users.sourceforge.jp>
Fri, 24 Jul 2020 06:30:40 +0000 (15:30 +0900)
committerHourier <hourier@users.sourceforge.jp>
Fri, 24 Jul 2020 06:31:30 +0000 (15:31 +0900)
81 files changed:
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/blue-magic/blue-magic-ball-bolt.c
src/blue-magic/blue-magic-breath.c
src/blue-magic/blue-magic-caster.c
src/blue-magic/blue-magic-spirit-curse.c
src/blue-magic/blue-magic-status.c
src/cmd-action/cmd-mane.c
src/cmd-action/cmd-move.c
src/cmd-action/cmd-open-close.c
src/cmd-action/cmd-others.c
src/cmd-action/cmd-pet.c
src/cmd-action/cmd-travel.c
src/cmd-action/cmd-tunnel.c
src/cmd-item/cmd-activate.c
src/cmd-item/cmd-item.c
src/cmd-item/cmd-magiceat.c
src/cmd-item/cmd-throw.c
src/cmd-item/cmd-zaprod.c
src/cmd-item/cmd-zapwand.c
src/combat/shoot.c
src/core/disturbance.c
src/core/game-play.c
src/dungeon/dungeon-processor.c
src/floor/floor.c
src/inventory/player-inventory.c
src/io/cursor.c
src/io/screen-util.c
src/mind/mind-force-trainer.c
src/mind/mind-mirror-master.c
src/mind/mind-ninja.c
src/mind/mind-switcher.c
src/mind/mind-warrior.c
src/mind/monk-attack.c
src/monster-floor/monster-remover.c
src/monster/monster-compaction.c
src/mspell/mspell-attack.c
src/mspell/mspell-checker.c
src/mspell/mspell-judgement.c
src/mspell/mspell-lite.c
src/mutation/mutation-processor.c
src/mutation/mutation-techniques.c
src/mutation/mutation.c
src/pet/pet-fall-off.c
src/player/player-move.c
src/racial/racial-android.c
src/racial/racial-balrog.c
src/racial/racial-draconian.c
src/racial/racial-switcher.c
src/racial/racial-vampire.c
src/realm/realm-arcane.c
src/realm/realm-chaos.c
src/realm/realm-crusade.c
src/realm/realm-death.c
src/realm/realm-demon.c
src/realm/realm-hex.c
src/realm/realm-hissatsu.c
src/realm/realm-life.c
src/realm/realm-nature.c
src/realm/realm-song.c
src/realm/realm-sorcery.c
src/realm/realm-trump.c
src/specific-object/death-crimson.c
src/spell-kind/spells-fetcher.c
src/spell-kind/spells-launcher.c
src/spell-kind/spells-lite.c
src/spell-kind/spells-polymorph.c
src/spell-kind/spells-random.c
src/spell-kind/spells-teleport.c
src/spell-kind/spells-world.c
src/spell-realm/spells-crusade.c
src/spell-realm/spells-trump.c
src/spell/process-effect.c
src/spell/spells-object.c
src/spell/spells-status.c
src/target/targeting.c [moved from src/io/targeting.c with 99% similarity]
src/target/targeting.h [moved from src/io/targeting.h with 100% similarity]
src/window/display-sub-windows.c
src/wizard/wizard-special-process.c
src/wizard/wizard-spells.c

index ab8c815..290c639 100644 (file)
     <ClCompile Include="..\..\src\view\status-first-page.c" />\r
     <ClCompile Include="..\..\src\store\store.c" />\r
     <ClCompile Include="..\..\src\floor\floor-streams.c" />\r
-    <ClCompile Include="..\..\src\io\targeting.c" />\r
+    <ClCompile Include="..\..\src\target\targeting.c" />\r
     <ClCompile Include="..\..\src\term\gameterm.c" />\r
     <ClCompile Include="..\..\src\grid\trap.c" />\r
     <ClCompile Include="..\..\src\io\screen-util.c" />\r
     <ClInclude Include="..\..\src\floor\floor-streams.h" />\r
     <ClInclude Include="..\..\src\spell\range-calc.h" />\r
     <ClInclude Include="..\..\src\store\store.h" />\r
-    <ClInclude Include="..\..\src\io\targeting.h" />\r
+    <ClInclude Include="..\..\src\target\targeting.h" />\r
     <ClInclude Include="..\..\src\term\gameterm.h" />\r
     <ClInclude Include="..\..\src\grid\trap.h" />\r
     <ClInclude Include="..\..\src\system\alloc-entry-definition.h" />\r
index b98d652..093677d 100644 (file)
     <ClCompile Include="..\..\src\player\patron.c">
       <Filter>player</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\io\targeting.c">
-      <Filter>io</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\player\selfinfo.c">
       <Filter>player</Filter>
     </ClCompile>
     <ClCompile Include="..\..\src\room\rooms-builder.c">
       <Filter>room</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\target\targeting.c">
+      <Filter>target</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\player\patron.h">
       <Filter>player</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\io\targeting.h">
-      <Filter>io</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\player\selfinfo.h">
       <Filter>player</Filter>
     </ClInclude>
     <ClInclude Include="..\..\src\room\rooms-builder.h">
       <Filter>room</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\target\targeting.h">
+      <Filter>target</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
     <Filter Include="blue-magic">
       <UniqueIdentifier>{6b429e6d-e548-430e-9413-8bc2e0bda1ed}</UniqueIdentifier>
     </Filter>
+    <Filter Include="target">
+      <UniqueIdentifier>{1789a1b0-5c89-4dfc-a4ba-1c3b711705b5}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\angband.rc" />
index 5433abc..70c4a53 100644 (file)
@@ -289,7 +289,6 @@ hengband_SOURCES = \
        io/screen-util.c io/screen-util.h \
        io/signal-handlers.c io/signal-handlers.h \
        io/store-key-processor.c io/store-key-processor.h \
-       io/targeting.c io/targeting.h \
        io/tokenizer.c io/tokenizer.h \
        io/uid-checker.c io/uid-checker.h \
        io/write-diary.c io/write-diary.h \
@@ -731,6 +730,8 @@ hengband_SOURCES = \
        system/system-variables.c system/system-variables.h \
        system/gamevalue.h \
        \
+       target/targeting.c target/targeting.h \
+       \
        term/gameterm.c term/gameterm.h \
        term/screen-processor.c term/screen-processor.h \
        term/term-color-types.h \
@@ -810,8 +811,8 @@ COMPILE = $(srcdir)/gcc-wrap $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        -Imonster-floor -Imonster-race -Ilore -Imspell -Imutation -Iobject \
        -Iobject-enchant -Iobject-hook -Iobject-use -Ipet -Iplayer -Iplayer-attack \
        -Iracial -Irealm -Iroom -Isave -Ispecific-object -Ispell -Ispell-kind \
-       -Ispell-realm -Istatus -Isv-definition -Isystem -Iterm -Iutil -Iview \
-       -Iwindow -Iwizard -Iworld
+       -Ispell-realm -Istatus -Isv-definition -Isystem -Itarget -Iterm -Iutil \
+       -Iview -Iwindow -Iwizard -Iworld
 
 install-exec-hook:
 if SET_GID
index 2a8ba25..1f48b66 100644 (file)
@@ -1,10 +1,10 @@
 #include "blue-magic/blue-magic-ball-bolt.h"
 #include "blue-magic/blue-magic-util.h"
-#include "io/targeting.h"
 #include "mspell/mspell-damage-calculator.h"
 #include "mspell/mspell-type.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool cast_blue_ball_acid(player_type *caster_ptr, bmc_type *bmc_ptr)
index a40d99b..77e2110 100644 (file)
@@ -1,11 +1,11 @@
 #include "blue-magic/blue-magic-breath.h"
 #include "blue-magic/blue-magic-util.h"
-#include "io/targeting.h"
 #include "mind/mind-blue-mage.h"
 #include "mspell/mspell-damage-calculator.h"
 #include "mspell/mspell-type.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool cast_blue_breath_acid(player_type *caster_ptr, bmc_type *bmc_ptr)
index 84ec00e..7377f1a 100644 (file)
@@ -10,7 +10,6 @@
 #include "floor/cave.h"
 #include "floor/floor.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
 #include "monster-race/race-flags1.h"
@@ -30,6 +29,7 @@
 #include "status/body-improvement.h"
 #include "status/buff-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 static bool cast_blue_dispel(player_type *caster_ptr)
index 70c580d..cbe4d1f 100644 (file)
@@ -1,10 +1,10 @@
 #include "blue-magic/blue-magic-spirit-curse.h"
 #include "blue-magic/blue-magic-util.h"
-#include "io/targeting.h"
 #include "mspell/mspell-damage-calculator.h"
 #include "mspell/mspell-type.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool cast_blue_drain_mana(player_type *caster_ptr, bmc_type *bmc_ptr)
index f59a1f2..8d5c689 100644 (file)
@@ -1,7 +1,7 @@
 #include "blue-magic/blue-magic-status.h"
 #include "blue-magic/blue-magic-util.h"
-#include "io/targeting.h"
 #include "spell/spells-status.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool cast_blue_scare(player_type *caster_ptr, bmc_type *bmc_ptr)
index cfd807f..805f115 100644 (file)
@@ -22,7 +22,6 @@
 #include "game-option/disturbance-options.h"
 #include "game-option/text-display-options.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/mind-mage.h"
@@ -51,6 +50,7 @@
 #include "status/body-improvement.h"
 #include "status/buff-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
index 36320ff..943f360 100644 (file)
@@ -20,7 +20,6 @@
 #include "grid/grid.h"
 #include "info-reader/fixed-map-parser.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "mind/mind-ninja.h"
 #include "player/attack-defense-types.h"
@@ -31,6 +30,7 @@
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
 #include "system/system-variables.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index cb3c57b..89feba3 100644 (file)
@@ -11,7 +11,6 @@
 #include "inventory/inventory-object.h"
 #include "inventory/inventory-slot-types.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "player/attack-defense-types.h"
 #include "player/special-defense-types.h"
 #include "specific-object/chest.h"
@@ -19,6 +18,7 @@
 #include "status/experience.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index 56b3fb7..496689c 100644 (file)
@@ -22,7 +22,6 @@
 #include "grid/grid.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "main/music-definitions-table.h"
 #include "main/sound-of-music.h"
@@ -31,6 +30,7 @@
 #include "player/special-defense-types.h"
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index 5f4ee6a..c6351fc 100644 (file)
@@ -19,7 +19,6 @@
 #include "io/cursor.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "main/sound-of-music.h"
 #include "monster-floor/monster-object.h"
@@ -43,6 +42,7 @@
 #include "player/special-defense-types.h"
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "util/int-char-converter.h"
index 972ab15..3eb7ba6 100644 (file)
@@ -4,9 +4,9 @@
 #include "floor/cave.h"
 #include "grid/feature.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "player/player-move.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 #include "util/bit-flags-calculator.h"
 
index 6be6c37..6ec4dd6 100644 (file)
@@ -7,11 +7,11 @@
 #include "grid/feature.h"
 #include "grid/grid.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "player/attack-defense-types.h"
 #include "player/special-defense-types.h"
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index 3bda1a2..1b67315 100644 (file)
@@ -26,7 +26,6 @@
 #include "game-option/special-options.h"
 #include "grid/feature-flag-types.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "monster-floor/monster-generator.h"
@@ -97,6 +96,7 @@
 #include "sv-definition/sv-ring-types.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "util/quarks.h"
index 2591c72..6ee50f4 100644 (file)
@@ -44,7 +44,6 @@
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/snipe-types.h"
@@ -85,6 +84,7 @@
 #include "status/experience.h"
 #include "status/shape-changer.h"
 #include "sv-definition/sv-lite-types.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
 #include "util/quarks.h"
index 26207f1..de2296b 100644 (file)
@@ -62,7 +62,6 @@
 #include "io/command-repeater.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "object/object-kind-hook.h"
@@ -73,6 +72,7 @@
 #include "player/player-class.h"
 #include "player/player-status.h"
 #include "spell/spell-info.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
 #include "util/buffer-shaper.h"
index 8b52146..a2f2c8f 100644 (file)
@@ -22,7 +22,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "io/cursor.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "monster-floor/monster-death.h"
@@ -50,6 +49,7 @@
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index 7000427..c3cf6f2 100644 (file)
@@ -5,7 +5,6 @@
 #include "floor/floor-object.h"
 #include "floor/floor.h"
 #include "game-option/disturbance-options.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "object-enchant/special-object-flags.h"
@@ -38,6 +37,7 @@
 #include "status/shape-changer.h"
 #include "sv-definition/sv-other-types.h"
 #include "sv-definition/sv-rod-types.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "view/display-messages.h"
 
index 672eaae..cf43ed6 100644 (file)
@@ -7,7 +7,6 @@
 #include "game-option/disturbance-options.h"
 #include "game-option/input-options.h"
 #include "inventory/player-inventory.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "object-enchant/special-object-flags.h"
@@ -32,6 +31,7 @@
 #include "status/action-setter.h"
 #include "status/experience.h"
 #include "sv-definition/sv-wand-types.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "view/display-messages.h"
 #include "view/object-describer.h"
index cd3e348..917ee45 100644 (file)
@@ -19,7 +19,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "io/cursor.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/mind-sniper.h"
@@ -55,6 +54,7 @@
 #include "sv-definition/sv-bow-types.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "wizard/wizard-messages.h"
index 3745a72..98c17fe 100644 (file)
@@ -5,9 +5,9 @@
 #include "game-option/disturbance-options.h"
 #include "game-option/map-screen-options.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "player/attack-defense-types.h"
 #include "status/action-setter.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 
 /*
index 3e30b0f..40cb7f4 100644 (file)
@@ -48,7 +48,6 @@
 #include "io/read-pref-file.h"
 #include "io/screen-util.h"
 #include "io/signal-handlers.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "load/load.h"
 #include "main/sound-of-music.h"
@@ -77,6 +76,7 @@
 #include "system/angband-version.h"
 #include "system/floor-type-definition.h"
 #include "system/system-variables.h"
+#include "target/targeting.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
 #include "util/angband-files.h"
index b1a1a1c..455d2f5 100644 (file)
@@ -17,7 +17,6 @@
 #include "game-option/play-record-options.h"
 #include "io/cursor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "market/arena.h"
 #include "mind/mind-ninja.h"
@@ -31,6 +30,7 @@
 #include "realm/realm-song-numbers.h"
 #include "realm/realm-song.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 #include "world/world-turn-processor.h"
 #include "world/world.h"
index 2c57e37..84f0c0b 100644 (file)
@@ -15,7 +15,6 @@
 #include "game-option/map-screen-options.h"
 #include "grid/grid.h"
 #include "grid/trap.h"
-#include "io/targeting.h"
 #include "mind/mind-ninja.h"
 #include "monster-floor/monster-generator.h"
 #include "monster-floor/monster-remover.h"
@@ -31,6 +30,7 @@
 #include "room/door-definition.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world-object.h"
index f944da7..371ef18 100644 (file)
@@ -19,7 +19,6 @@
 #include "grid/grid.h"
 #include "inventory/inventory-object.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "object/item-tester-hooker.h"
@@ -29,6 +28,7 @@
 #include "player/player-move.h"
 #include "spell-kind/spells-perception.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 #include "world/world.h"
 #ifdef JP
index 5d81a1d..9c66529 100644 (file)
@@ -11,8 +11,8 @@
 #include "grid/feature.h"
 #include "grid/grid.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/term-color-types.h"
 #include "view/display-map.h"
 #include "window/main-window-util.h"
index bcfb571..909873e 100644 (file)
 #include "grid/grid.h"
 #include "io/cursor.h"
 #include "io/input-key-acceptor.h"
-#include "io/targeting.h"
 #include "monster/monster-update.h"
 #include "player/mimic-info-table.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
 #include "util/bit-flags-calculator.h"
index 173847e..84a999d 100644 (file)
@@ -9,7 +9,6 @@
 #include "floor/geometry.h"
 #include "game-option/disturbance-options.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags7.h"
 #include "monster/monster-describer.h"
@@ -18,6 +17,7 @@
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 908c09d..7e920d8 100644 (file)
 #include "grid/feature.h"
 #include "io/cursor.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "spell-kind/spells-sight.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell/process-effect.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/gameterm.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index 2be1a10..ccc18e1 100644 (file)
@@ -11,7 +11,6 @@
 #include "game-option/disturbance-options.h"
 #include "grid/feature.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
 #include "monster-race/race-indice-types.h"
@@ -26,6 +25,7 @@
 #include "spell-kind/spells-teleport.h"
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index 184f5ef..97176da 100644 (file)
@@ -39,7 +39,6 @@
 #include "io/command-repeater.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/mind-force-trainer.h"
 #include "mind/mind-ninja.h"
 #include "mind/mind-warrior.h"
 #include "monster-floor/monster-summon.h"
-#include "monster/monster-status.h"
 #include "monster-floor/place-monster-types.h"
+#include "monster/monster-status.h"
 #include "player-attack/player-attack.h"
 #include "player/avatar.h"
 #include "player/player-class.h"
 #include "player/player-damage.h"
 #include "player/player-move.h"
 #include "player/special-defense-types.h"
-#include "spell/process-effect.h"
 #include "spell-kind/earthquake.h"
 #include "spell-kind/spells-detection.h"
 #include "spell-kind/spells-fetcher.h"
 #include "spell-kind/spells-lite.h"
 #include "spell-kind/spells-perception.h"
 #include "spell-kind/spells-sight.h"
-#include "spell-kind/spells-world.h"
-#include "spell/spells-status.h"
-#include "spell/spells-summon.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell-kind/spells-world.h"
+#include "spell/process-effect.h"
 #include "spell/spell-types.h"
+#include "spell/spells-status.h"
+#include "spell/spells-summon.h"
 #include "status/bad-status-setter.h"
 #include "status/base-status.h"
 #include "status/body-improvement.h"
 #include "status/sight-setter.h"
 #include "status/temporary-resistance.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/buffer-shaper.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
 
 /*! 特殊技能の一覧テーブル */
-mind_power const mind_powers[5] =
-{
-  {
-    {
-      /* Level gained,  cost,  %fail,  name */
+mind_power const mind_powers[5] = {
+    { {
+/* Level gained,  cost,  %fail,  name */
 #ifdef JP
-      { 1,   1,  15, "霊視"},
-      { 2,   1,  20, "神経攻撃"},
-      { 3,   2,  25, "次元の瞬き"},
-      { 7,   6,  35, "虚空の幻影"},
-      { 9,   7,  50, "精神支配"},
-      { 11,  7,  30, "念動衝撃弾"},
-      { 13, 12,  50, "鎧化"},
-      { 15, 12,  60, "サイコメトリー"},
-      { 18, 10,  45, "精神波動"},
-      { 23, 15,  50, "アドレナリン・ドーピング"},
-      { 26, 28,  60, "テレキネシス"},
-      { 28, 10,  40, "サイキック・ドレイン"},
-      { 35, 35,  75, "光の剣"},
-      { 45,150,  85, "完全な世界"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 1, 1, 15, "霊視" },
+        { 2, 1, 20, "神経攻撃" },
+        { 3, 2, 25, "次元の瞬き" },
+        { 7, 6, 35, "虚空の幻影" },
+        { 9, 7, 50, "精神支配" },
+        { 11, 7, 30, "念動衝撃弾" },
+        { 13, 12, 50, "鎧化" },
+        { 15, 12, 60, "サイコメトリー" },
+        { 18, 10, 45, "精神波動" },
+        { 23, 15, 50, "アドレナリン・ドーピング" },
+        { 26, 28, 60, "テレキネシス" },
+        { 28, 10, 40, "サイキック・ドレイン" },
+        { 35, 35, 75, "光の剣" },
+        { 45, 150, 85, "完全な世界" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #else
-      { 1,   1,  15, "Precognition"},
-      { 2,   1,  20, "Neural Blast"},
-      { 3,   2,  25, "Minor Displacement"},
-      { 7,   6,  35, "Major Displacement"},
-      { 9,   7,  50, "Domination"},
-      { 11,  7,  30, "Pulverise"},
-      { 13, 12,  50, "Character Armour"},
-      { 15, 12,  60, "Psychometry" },
-      { 18, 10,  45, "Mind Wave" },
-      { 23, 15,  50, "Adrenaline Channeling"},
-      { 26, 28,  60, "Telekinesis"},
-      { 28, 10,  40, "Psychic Drain"},
-      { 35, 35,  75, "Psycho-Spear"},
-      { 45,150,  85, "The World"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 1, 1, 15, "Precognition" },
+        { 2, 1, 20, "Neural Blast" },
+        { 3, 2, 25, "Minor Displacement" },
+        { 7, 6, 35, "Major Displacement" },
+        { 9, 7, 50, "Domination" },
+        { 11, 7, 30, "Pulverise" },
+        { 13, 12, 50, "Character Armour" },
+        { 15, 12, 60, "Psychometry" },
+        { 18, 10, 45, "Mind Wave" },
+        { 23, 15, 50, "Adrenaline Channeling" },
+        { 26, 28, 60, "Telekinesis" },
+        { 28, 10, 40, "Psychic Drain" },
+        { 35, 35, 75, "Psycho-Spear" },
+        { 45, 150, 85, "The World" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #endif
-      
-    }
-  },
-  
-  {
-    {
-      /* Level gained,  cost,  %fail,  name */
+
+    } },
+
+    { {
+/* Level gained,  cost,  %fail,  name */
 #ifdef JP
-      { 1,   1,  15, "小龍"},
-      { 3,   3,  30, "閃光"},
-      { 5,   6,  35, "舞空術"},
-      { 8,   5,  40, "カメハメ波"},
-      { 10,  7,  45, "対魔法防御"},
-      { 13,  5,  60, "練気"},
-      { 17, 17,  50, "纏闘気"},
-      { 20, 20,  50, "衝波"},
-      { 23, 18,  55, "彗龍"},
-      { 25, 30,  70, "いてつく波動"},
-      { 28, 26,  50, "幻霊召喚"},
-      { 32, 35,  65, "煉獄火炎"},
-      { 38, 42,  75, "超カメハメ波"},
-      { 44, 50,  80, "光速移動"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 1, 1, 15, "小龍" },
+        { 3, 3, 30, "閃光" },
+        { 5, 6, 35, "舞空術" },
+        { 8, 5, 40, "カメハメ波" },
+        { 10, 7, 45, "対魔法防御" },
+        { 13, 5, 60, "練気" },
+        { 17, 17, 50, "纏闘気" },
+        { 20, 20, 50, "衝波" },
+        { 23, 18, 55, "彗龍" },
+        { 25, 30, 70, "いてつく波動" },
+        { 28, 26, 50, "幻霊召喚" },
+        { 32, 35, 65, "煉獄火炎" },
+        { 38, 42, 75, "超カメハメ波" },
+        { 44, 50, 80, "光速移動" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #else
-      { 1,   1,  15, "Small Force Ball"},
-      { 3,   3,  30, "Flash Light"},
-      { 5,   6,  35, "Flying Technique"},
-      { 8,   5,  40, "Kamehameha"},
-      { 10,  7,  45, "Magic Resistance"},
-      { 13,  5,  60, "Improve Force"},
-      { 17, 17,  50, "Aura of Force"},
-      { 20, 20,  50, "Shock Power"},
-      { 23, 18,  55, "Large Force Ball"},
-      { 25, 30,  70, "Dispel Magic"},
-      { 28, 26,  50, "Summon Ghost"},
-      { 32, 35,  65, "Exploding Frame"},
-      { 38, 42,  75, "Super Kamehameha"},
-      { 44, 50,  80, "Light Speed"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 1, 1, 15, "Small Force Ball" },
+        { 3, 3, 30, "Flash Light" },
+        { 5, 6, 35, "Flying Technique" },
+        { 8, 5, 40, "Kamehameha" },
+        { 10, 7, 45, "Magic Resistance" },
+        { 13, 5, 60, "Improve Force" },
+        { 17, 17, 50, "Aura of Force" },
+        { 20, 20, 50, "Shock Power" },
+        { 23, 18, 55, "Large Force Ball" },
+        { 25, 30, 70, "Dispel Magic" },
+        { 28, 26, 50, "Summon Ghost" },
+        { 32, 35, 65, "Exploding Frame" },
+        { 38, 42, 75, "Super Kamehameha" },
+        { 44, 50, 80, "Light Speed" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #endif
-      
-    }
-  },
-  
-  {
-    {
-      /* Level gained,  cost,  %fail,  name */
+
+    } },
+
+    { {
+/* Level gained,  cost,  %fail,  name */
 #ifdef JP
-      {  8,  5,  40, "殺気感知"},
-      { 15, 20,   0, "突撃"},
-      { 20, 15,   0, "トラップ粉砕"},
-      { 25, 20,  60, "地震"},
-      { 30, 80,  75, "皆殺し"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 8, 5, 40, "殺気感知" },
+        { 15, 20, 0, "突撃" },
+        { 20, 15, 0, "トラップ粉砕" },
+        { 25, 20, 60, "地震" },
+        { 30, 80, 75, "皆殺し" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #else
-      {  8,  5,  40, "Detect Atmosphere of Menace"},
-      { 15, 20,   0, "Charge"},
-      { 20, 15,   0, "Smash a Trap"},
-      { 25, 20,  60, "Quake"},
-      { 30, 80,  75, "Massacre"},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
-      { 99,  0,   0, ""},
+        { 8, 5, 40, "Detect Atmosphere of Menace" },
+        { 15, 20, 0, "Charge" },
+        { 20, 15, 0, "Smash a Trap" },
+        { 25, 20, 60, "Quake" },
+        { 30, 80, 75, "Massacre" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
+        { 99, 0, 0, "" },
 #endif
-      
-    }
-  },
 
-  {
-    {
-      /* Level gained,  cost,  %fail,  name */
+    } },
+
+    { {
+/* Level gained,  cost,  %fail,  name */
 #ifdef JP
-      { 1,   1,  15, "真見の鏡"},
-      { 1,   2,  40, "鏡生成"},
-      { 2,   2,  20, "光のしずく"},
-      { 3,   2,  20, "歪んだ鏡"},
-      { 5,   3,  35, "閃光鏡"},
-      { 6,   5,  35, "彷える鏡"},
-
-      { 10,  5,  30, "微塵隠れ"},
-      { 12, 12,  30, "追放の鏡"},
-      { 15, 15,  30, "鏡砕き"},
-      { 19, 13,  30, "催眠鏡"},
-      { 23, 18,  50, "シーカーレイ"},
-
-      { 25, 20,  40, "鏡の封印"},
-      { 27, 30,  60, "水鏡の盾"},
-      { 29, 30,  60, "スーパーレイ"},
-      { 31, 35,  60, "幻惑の光"},
-      { 33, 50,  80, "鏡の国"},
-
-      { 36, 30,  80, "鏡抜け"},
-      { 38, 40,  70, "帰還の鏡"},
-      { 40, 50,  55, "影分身"},
-      { 43, 55,  70, "封魔結界"},
-      { 46, 70,  75, "ラフノールの鏡"},
+        { 1, 1, 15, "真見の鏡" },
+        { 1, 2, 40, "鏡生成" },
+        { 2, 2, 20, "光のしずく" },
+        { 3, 2, 20, "歪んだ鏡" },
+        { 5, 3, 35, "閃光鏡" },
+        { 6, 5, 35, "彷える鏡" },
+
+        { 10, 5, 30, "微塵隠れ" },
+        { 12, 12, 30, "追放の鏡" },
+        { 15, 15, 30, "鏡砕き" },
+        { 19, 13, 30, "催眠鏡" },
+        { 23, 18, 50, "シーカーレイ" },
+
+        { 25, 20, 40, "鏡の封印" },
+        { 27, 30, 60, "水鏡の盾" },
+        { 29, 30, 60, "スーパーレイ" },
+        { 31, 35, 60, "幻惑の光" },
+        { 33, 50, 80, "鏡の国" },
+
+        { 36, 30, 80, "鏡抜け" },
+        { 38, 40, 70, "帰還の鏡" },
+        { 40, 50, 55, "影分身" },
+        { 43, 55, 70, "封魔結界" },
+        { 46, 70, 75, "ラフノールの鏡" },
 #else
-      { 1,   1,  15, "Mirror of Seeing"},
-      { 1,   2,  40, "Making a Mirror"},
-      { 2,   2,  20, "Drip of Light"},
-      { 3,   2,  20, "Warped Mirror"},
-      { 5,   3,  35, "Mirror of Light"},
-      { 6,   5,  35, "Mirror of Wandering"},
-
-      { 10,  5,  30, "Robe of Dust"},
-      { 12, 12,  30, "Banishing Mirror"},
-      { 15, 15,  30, "Mirror Clashing"},
-      { 19, 13,  30, "Mirror Sleeping"},
-      { 23, 18,  50, "Seeker Ray"},
-
-      { 25, 20,  40, "Seal of Mirror"},
-      { 27, 30,  60, "Shield of Water"},
-      { 29, 30,  60, "Super Ray"},
-      { 31, 35,  60, "Illusion Light"},
-      { 33, 50,  80, "Mirror Shift"},
-
-      { 36, 30,  80, "Mirror Tunnel"},
-      { 38, 40,  70, "Mirror of Recall"},
-      { 40, 50,  55, "Multi-Shadow"},
-      { 43, 55,  70, "Binding Field"},
-      { 46, 70,  75, "Mirror of Ruffnor"},
+        { 1, 1, 15, "Mirror of Seeing" },
+        { 1, 2, 40, "Making a Mirror" },
+        { 2, 2, 20, "Drip of Light" },
+        { 3, 2, 20, "Warped Mirror" },
+        { 5, 3, 35, "Mirror of Light" },
+        { 6, 5, 35, "Mirror of Wandering" },
+
+        { 10, 5, 30, "Robe of Dust" },
+        { 12, 12, 30, "Banishing Mirror" },
+        { 15, 15, 30, "Mirror Clashing" },
+        { 19, 13, 30, "Mirror Sleeping" },
+        { 23, 18, 50, "Seeker Ray" },
+
+        { 25, 20, 40, "Seal of Mirror" },
+        { 27, 30, 60, "Shield of Water" },
+        { 29, 30, 60, "Super Ray" },
+        { 31, 35, 60, "Illusion Light" },
+        { 33, 50, 80, "Mirror Shift" },
+
+        { 36, 30, 80, "Mirror Tunnel" },
+        { 38, 40, 70, "Mirror of Recall" },
+        { 40, 50, 55, "Multi-Shadow" },
+        { 43, 55, 70, "Binding Field" },
+        { 46, 70, 75, "Mirror of Ruffnor" },
 #endif
-      
-    }
-  },
-  
-  {
-    {
-      /* Level gained,  cost,  %fail,  name */
+
+    } },
+
+    { {
+/* Level gained,  cost,  %fail,  name */
 #ifdef JP
-      {  1,  1,  20, "暗闇生成"},
-      {  2,  2,  25, "周辺調査"},
-      {  3,  3,  25, "葉隠れ"},
-      {  5,  3,  30, "変わり身"},
-      {  7,  8,  35, "高飛び"},
-      {  8, 10,  35, "一撃離脱"},
-      { 10, 10,  40, "金縛り"},
-      { 12, 12,  70, "古の口伝"},
-      { 15, 10,  50, "浮雲"},
-      { 17, 12,  45, "火遁"},
-      { 18, 20,  40, "入身"},
-      { 20,  5,  50, "八方手裏剣"},
-      { 22, 15,  55, "鎖鎌"},
-      { 25, 32,  60, "煙玉"},
-      { 28, 32,  60, "転身"},
-      { 30, 30,  70, "爆発の紋章"},
-      { 32, 40,  40, "土遁"},
-      { 34, 35,  50, "霧隠れ"},
-      { 38, 40,  60, "煉獄火炎"},
-      { 41, 50,  55, "分身"},
-      { 99,  0,   0, ""},
+        { 1, 1, 20, "暗闇生成" },
+        { 2, 2, 25, "周辺調査" },
+        { 3, 3, 25, "葉隠れ" },
+        { 5, 3, 30, "変わり身" },
+        { 7, 8, 35, "高飛び" },
+        { 8, 10, 35, "一撃離脱" },
+        { 10, 10, 40, "金縛り" },
+        { 12, 12, 70, "古の口伝" },
+        { 15, 10, 50, "浮雲" },
+        { 17, 12, 45, "火遁" },
+        { 18, 20, 40, "入身" },
+        { 20, 5, 50, "八方手裏剣" },
+        { 22, 15, 55, "鎖鎌" },
+        { 25, 32, 60, "煙玉" },
+        { 28, 32, 60, "転身" },
+        { 30, 30, 70, "爆発の紋章" },
+        { 32, 40, 40, "土遁" },
+        { 34, 35, 50, "霧隠れ" },
+        { 38, 40, 60, "煉獄火炎" },
+        { 41, 50, 55, "分身" },
+        { 99, 0, 0, "" },
 #else
-      {  1,  1,  20, "Create Darkness"},
-      {  2,  2,  25, "Detect Near"},
-      {  3,  3,  25, "Hide in Leafs"},
-      {  5,  3,  30, "Kawarimi"},
-      {  7,  8,  35, "Absconding"},
-      {  8, 10,  35, "Hit and Away"},
-      { 10, 10,  40, "Bind Monster"},
-      { 12, 12,  70, "Ancient Knowledge"},
-      { 15, 10,  50, "Floating"},
-      { 17, 12,  45, "Hide in Flame"},
-      { 18, 20,  40, "Nyusin"},
-      { 20,  5,  50, "Syuriken Spreading"},
-      { 22, 15,  55, "Chain Hook"},
-      { 25, 32,  60, "Smoke Ball"},
-      { 28, 32,  60, "Swap Position"},
-      { 30, 30,  70, "Glyph of Explosion"},
-      { 32, 40,  40, "Hide in Mud"},
-      { 34, 35,  50, "Hide in Mist"},
-      { 38, 40,  60, "Rengoku-Kaen"},
-      { 41, 50,  55, "Bunshin"},
-      { 99,  0,   0, ""},
+        { 1, 1, 20, "Create Darkness" },
+        { 2, 2, 25, "Detect Near" },
+        { 3, 3, 25, "Hide in Leafs" },
+        { 5, 3, 30, "Kawarimi" },
+        { 7, 8, 35, "Absconding" },
+        { 8, 10, 35, "Hit and Away" },
+        { 10, 10, 40, "Bind Monster" },
+        { 12, 12, 70, "Ancient Knowledge" },
+        { 15, 10, 50, "Floating" },
+        { 17, 12, 45, "Hide in Flame" },
+        { 18, 20, 40, "Nyusin" },
+        { 20, 5, 50, "Syuriken Spreading" },
+        { 22, 15, 55, "Chain Hook" },
+        { 25, 32, 60, "Smoke Ball" },
+        { 28, 32, 60, "Swap Position" },
+        { 30, 30, 70, "Glyph of Explosion" },
+        { 32, 40, 40, "Hide in Mud" },
+        { 34, 35, 50, "Hide in Mist" },
+        { 38, 40, 60, "Rengoku-Kaen" },
+        { 41, 50, 55, "Bunshin" },
+        { 99, 0, 0, "" },
 #endif
-      
-    }
-  },
+
+    } },
 };
 
 /*! 特殊能力の解説文字列 */
-static concptr const mind_tips[5][MAX_MIND_POWERS] =
-{
+static concptr const mind_tips[5][MAX_MIND_POWERS] = {
 #ifdef JP
-{
-       "近くの全ての見えるモンスターを感知する。レベル5で罠/扉、15で透明なモンスター、30で財宝とアイテムを感知できるようになる。レベル20で周辺の地形を感知し、45でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。レベル25で一定時間テレパシーを得る。",
-       "精神攻撃のビームまたは球を放つ。",
-       "近距離のテレポートをする。",
-       "遠距離のテレポートをする。",
-       "レベル30未満で、モンスターを朦朧か混乱か恐怖させる球を放つ。レベル30以上で視界内の全てのモンスターを魅了する。抵抗されると無効。",
-       "テレキネシスの球を放つ。",
-       "一定時間、ACを上昇させる。レベルが上がると、酸、炎、冷気、電撃、毒の耐性も得られる。",
-       "レベル25未満で、アイテムの雰囲気を知る。レベル25以上で、アイテムを鑑定する。",
-       "レベル25未満で、自分を中心とした精神攻撃の球を発生させる。レベル25以上で、視界内の全てのモンスターに対して精神攻撃を行う。",
-       "恐怖と朦朧から回復し、ヒーロー気分かつ加速状態でなければHPが少し回復する。さらに、一定時間ヒーロー気分になり、加速する。",
-       "アイテムを自分の足元へ移動させる。",
-       "精神攻撃の球を放つ。モンスターに命中すると、0~1.5ターン消費する。抵抗されなければ、MPが回復する。",
-       "無傷球をも切り裂く純粋なエネルギーのビームを放つ。",
-       "時を止める。全MPを消費し、消費したMPに応じて長く時を止めていられる。",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "ごく小さい気の球を放つ。",
-       "光源が照らしている範囲か部屋全体を永久に明るくする。",
-       "一定時間、空中に浮けるようになる。",
-       "射程の短い気のビームを放つ。",
-       "一定時間、魔法防御能力を上昇させる。",
-       "気を練る。気を練ると術の威力は上がり、持続時間は長くなる。練った気は時間とともに拡散する。練りすぎると暴走する危険がある。",
-       "一定時間、攻撃してきた全てのモンスターを傷つけるオーラを纏う。",
-       "隣りのモンスターに対して気をぶつけ、吹きとばす。",
-       "大きな気の球を放つ。",
-       "モンスター1体にかかった魔法を解除する。",
-       "1体の幽霊を召喚する。",
-       "自分を中心とした超巨大な炎の球を発生させる。",
-       "射程の長い、強力な気のビームを放つ。",
-       "しばらくの間、非常に速く動くことができる。",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "近くの思考することができるモンスターを感知する。",
-       "攻撃した後、反対側に抜ける。",
-       "トラップにかかるが、そのトラップを破壊する。",
-       "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
-       "全方向に向かって攻撃する。",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "近くの全てのモンスターを感知する。レベル15で透明なモンスターを感知する。レベル25で一定時間テレパシーを得る。レベル35で周辺の地形を感知する。全ての効果は、鏡の上でないとレベル4だけ余計に必要になる。",
-       "自分のいる床の上に鏡を生成する。",
-       "閃光の矢を放つ。レベル10以上では鏡の上で使うとビームになる。",
-       "近距離のテレポートをする。",
-       "自分の周囲や、 自分のいる部屋全体を明るくする。",
-       "遠距離のテレポートをする。",
-       "一定時間、鏡のオーラが付く。攻撃を受けると破片のダメージで反撃し、さらに鏡の上にいた場合近距離のテレポートをする。",
-       "モンスターをテレポートさせるビームを放つ。抵抗されると無効。",
-       "破片の球を放つ。",
-       "全ての鏡の周りに眠りの球を発生させる。",
-       "ターゲットに向かって魔力のビームを放つ。鏡に命中すると、その鏡を破壊し、別の鏡に向かって反射する。",
-       "鏡の上のモンスターを消し去る。",
-       "一定時間、ACを上昇させる。レベル32で反射が付く。レベル40で魔法防御が上がる。",
-       "ターゲットに向かって強力な魔力のビームを放つ。鏡に命中すると、その鏡を破壊し、8方向に魔力のビームを発生させる。",
-       "視界内のモンスターを減速させ、朦朧とさせ、混乱させ、恐怖させ、麻痺させる。鏡の上で使うと威力が高い。",
-       "フロアを作り変える。鏡の上でしか使えない。",
-       "短距離内の指定した場所にテレポートする。",
-       "地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
-       "全ての攻撃が、1/2の確率で無効になる。",
-       "視界内の2つの鏡とプレイヤーを頂点とする三角形の領域に、魔力の結界を発生させる。",
-       "一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
-},
-{
-       "半径3以内かその部屋を暗くする。",
-       "近くの全ての見えるモンスターを感知する。レベル5で罠/扉/階段、レベル15でアイテムを感知できるようになる。レベル45でその階全体の地形と全てのアイテムを感知する。",
-       "近距離のテレポートをする。",
-       "攻撃を受けた瞬間にテレポートをするようになる。失敗するとその攻撃のダメージを受ける。テレポートに失敗することもある。",
-       "遠距離のテレポートをする。",
-       "攻撃してすぐにテレポートする。",
-       "敵1体の動きを封じる。ユニークモンスター相手の場合又は抵抗された場合には無効。",
-       "アイテムを識別する。",
-       "一定時間、浮遊能力を得る。",
-       "自分を中心とした火の球を発生させ、テレポートする。さらに、一定時間炎に対する耐性を得る。装備による耐性に累積する。",
-       "素早く相手に近寄り攻撃する。",
-       "ランダムな方向に8回くさびを投げる。",
-       "敵を1体自分の近くに引き寄せる。",
-       "ダメージのない混乱の球を放つ。",
-       "1体のモンスターと位置を交換する。",
-       "自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
-       "一定時間、半物質化し壁を通り抜けられるようになる。さらに、一定時間酸への耐性を得る。装備による耐性に累積する。",
-       "自分を中心とした超巨大な毒、衰弱、混乱の球を発生させ、テレポートする。",
-       "ランダムな方向に何回か炎か地獄かプラズマのビームを放つ。",
-       "全ての攻撃が、1/2の確率で無効になる。",
-       "",
-},
+    {
+        "近くの全ての見えるモンスターを感知する。レベル5で罠/"
+        "扉、15で透明なモンスター、30で財宝とアイテムを感知できるようになる。レベル20で周辺の地形を感知し、45でその階全体を永久に照らし、ダンジョン内のすべての"
+        "アイテムを感知する。レベル25で一定時間テレパシーを得る。",
+        "精神攻撃のビームまたは球を放つ。",
+        "近距離のテレポートをする。",
+        "遠距離のテレポートをする。",
+        "レベル30未満で、モンスターを朦朧か混乱か恐怖させる球を放つ。レベル30以上で視界内の全てのモンスターを魅了する。抵抗されると無効。",
+        "テレキネシスの球を放つ。",
+        "一定時間、ACを上昇させる。レベルが上がると、酸、炎、冷気、電撃、毒の耐性も得られる。",
+        "レベル25未満で、アイテムの雰囲気を知る。レベル25以上で、アイテムを鑑定する。",
+        "レベル25未満で、自分を中心とした精神攻撃の球を発生させる。レベル25以上で、視界内の全てのモンスターに対して精神攻撃を行う。",
+        "恐怖と朦朧から回復し、ヒーロー気分かつ加速状態でなければHPが少し回復する。さらに、一定時間ヒーロー気分になり、加速する。",
+        "アイテムを自分の足元へ移動させる。",
+        "精神攻撃の球を放つ。モンスターに命中すると、0~1.5ターン消費する。抵抗されなければ、MPが回復する。",
+        "無傷球をも切り裂く純粋なエネルギーのビームを放つ。",
+        "時を止める。全MPを消費し、消費したMPに応じて長く時を止めていられる。",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "ごく小さい気の球を放つ。",
+        "光源が照らしている範囲か部屋全体を永久に明るくする。",
+        "一定時間、空中に浮けるようになる。",
+        "射程の短い気のビームを放つ。",
+        "一定時間、魔法防御能力を上昇させる。",
+        "気を練る。気を練ると術の威力は上がり、持続時間は長くなる。練った気は時間とともに拡散する。練りすぎると暴走する危険がある。",
+        "一定時間、攻撃してきた全てのモンスターを傷つけるオーラを纏う。",
+        "隣りのモンスターに対して気をぶつけ、吹きとばす。",
+        "大きな気の球を放つ。",
+        "モンスター1体にかかった魔法を解除する。",
+        "1体の幽霊を召喚する。",
+        "自分を中心とした超巨大な炎の球を発生させる。",
+        "射程の長い、強力な気のビームを放つ。",
+        "しばらくの間、非常に速く動くことができる。",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "近くの思考することができるモンスターを感知する。",
+        "攻撃した後、反対側に抜ける。",
+        "トラップにかかるが、そのトラップを破壊する。",
+        "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
+        "全方向に向かって攻撃する。",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "近くの全てのモンスターを感知する。レベル15で透明なモンスターを感知する。レベル25で一定時間テレパシーを得る。レベル35で周辺の地形を感知する。全ての効果"
+        "は、鏡の上でないとレベル4だけ余計に必要になる。",
+        "自分のいる床の上に鏡を生成する。",
+        "閃光の矢を放つ。レベル10以上では鏡の上で使うとビームになる。",
+        "近距離のテレポートをする。",
+        "自分の周囲や、 自分のいる部屋全体を明るくする。",
+        "遠距離のテレポートをする。",
+        "一定時間、鏡のオーラが付く。攻撃を受けると破片のダメージで反撃し、さらに鏡の上にいた場合近距離のテレポートをする。",
+        "モンスターをテレポートさせるビームを放つ。抵抗されると無効。",
+        "破片の球を放つ。",
+        "全ての鏡の周りに眠りの球を発生させる。",
+        "ターゲットに向かって魔力のビームを放つ。鏡に命中すると、その鏡を破壊し、別の鏡に向かって反射する。",
+        "鏡の上のモンスターを消し去る。",
+        "一定時間、ACを上昇させる。レベル32で反射が付く。レベル40で魔法防御が上がる。",
+        "ターゲットに向かって強力な魔力のビームを放つ。鏡に命中すると、その鏡を破壊し、8方向に魔力のビームを発生させる。",
+        "視界内のモンスターを減速させ、朦朧とさせ、混乱させ、恐怖させ、麻痺させる。鏡の上で使うと威力が高い。",
+        "フロアを作り変える。鏡の上でしか使えない。",
+        "短距離内の指定した場所にテレポートする。",
+        "地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
+        "全ての攻撃が、1/2の確率で無効になる。",
+        "視界内の2つの鏡とプレイヤーを頂点とする三角形の領域に、魔力の結界を発生させる。",
+        "一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
+    },
+    {
+        "半径3以内かその部屋を暗くする。",
+        "近くの全ての見えるモンスターを感知する。レベル5で罠/扉/"
+        "階段、レベル15でアイテムを感知できるようになる。レベル45でその階全体の地形と全てのアイテムを感知する。",
+        "近距離のテレポートをする。",
+        "攻撃を受けた瞬間にテレポートをするようになる。失敗するとその攻撃のダメージを受ける。テレポートに失敗することもある。",
+        "遠距離のテレポートをする。",
+        "攻撃してすぐにテレポートする。",
+        "敵1体の動きを封じる。ユニークモンスター相手の場合又は抵抗された場合には無効。",
+        "アイテムを識別する。",
+        "一定時間、浮遊能力を得る。",
+        "自分を中心とした火の球を発生させ、テレポートする。さらに、一定時間炎に対する耐性を得る。装備による耐性に累積する。",
+        "素早く相手に近寄り攻撃する。",
+        "ランダムな方向に8回くさびを投げる。",
+        "敵を1体自分の近くに引き寄せる。",
+        "ダメージのない混乱の球を放つ。",
+        "1体のモンスターと位置を交換する。",
+        "自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
+        "一定時間、半物質化し壁を通り抜けられるようになる。さらに、一定時間酸への耐性を得る。装備による耐性に累積する。",
+        "自分を中心とした超巨大な毒、衰弱、混乱の球を発生させ、テレポートする。",
+        "ランダムな方向に何回か炎か地獄かプラズマのビームを放つ。",
+        "全ての攻撃が、1/2の確率で無効になる。",
+        "",
+    },
 #else
-{
-       "Detects visible monsters in your vicinity. Detects traps and doors at level 5, invisible monsters at level 15, and items at level 30. Gives telepathy at level 25. Magically maps the surroundings at level 20. Lights and reveals the whole level at level 45.",
-       "Fires a beam or ball which inflicts PSI damage.",
-       "Teleports you a short distance.",
-       "Teleports you a long distance.",
-       "Stuns, confuses or scares a monster. Or attempts to charm all monsters in sight at level 30.",
-       "Fires a ball which hurts monsters with telekinesis.",
-       "Gives stone skin and some resistance to elements for a while. As your level increases, more resistances are given.",
-       "Gives feeling of an item. Or identifies an item at level 25.",
-       "Generates a ball centered on you which inflicts PSI damage on a monster or, at level 25 and higher, inflicts PSI damage on all monsters.",
-       "Removes fear and being stunned. Gives heroism and speed. Heals HP a little unless you already have heroism and a temporary speed boost.",
-       "Pulls a distant item close to you.",
-       "Fires a ball which damages. When not resisted, you gain SP. You will be occupied for 0 to 1.5 turns after casting as your mind recovers.",
-       "Fires a beam of pure energy which penetrates invulnerability barriers.",
-       "Stops time. Consumes all of your SP. The more SP consumed, the longer the duration of the spell.",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "Fires a very small energy ball.",
-       "Lights up nearby area and the inside of a room permanently.",
-       "Gives levitation a while.",
-       "Fires a short energy beam.",
-       "Gives magic resistance for a while.",
-       "Increases your spirit energy temporarily. More spirit energy will boost the effect or duration of your force abilities. Too much spirit energy can result in an explosion.",
-       "Envelops you with a temporary aura that damages any monster which hits you in melee.",
-       "Damages an adjacent monster and blows it away.",
-       "Fires a large energy ball.",
-       "Dispels all magics which are affecting a monster.",
-       "Summons ghosts.",
-       "Generates a huge ball of flame centered on you.",
-       "Fires a long, powerful energy beam.",
-       "Gives extremely fast speed.",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "Detects all monsters except the mindless in your vicinity.",
-       "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked.",
-       "Sets off a trap, then destroys that trap.",
-       "Shakes dungeon structure, and results in random swapping of floors and walls.",
-       "Attacks all adjacent monsters.",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-},
-{
-       "Detects visible monsters in your vicinity. Detects invisible monsters at level 15. Gives telepathy at level 25. Magically maps the surroundings at level 35. All of the effects need 4 more levels unless on a mirror.",
-       "Makes a mirror under you.",
-       "Fires bolt of light. At level ten or higher, the bolt will be a beam of light if you are on a mirror.",
-       "Teleports you a short distance.",
-       "Lights up nearby area and the inside of a room permanently.",
-       "Teleports you a long distance.",
-       "Gives a temporary aura of mirror shards. The aura damages any monster that hits you in melee. If you are on a mirror, the aura will teleport you a short distance if a monster hits you in melee.",
-       "Teleports all monsters on the line away unless resisted.",
-       "Fires a ball of shards.",
-       "Causes any mirror to lull to sleep monsters close to the mirror.",
-       "Fires a beam of mana. If the beam hits a mirror, it breaks that mirror and bounces toward another mirror.",
-       "Eliminates a monster on a mirror from current dungeon level.",
-       "Gives a bonus to AC. Gives reflection at level 32. Gives magic resistance at level 40.",
-       "Fires a powerful beam of mana. If the beam hits a mirror, it breaks that mirror and fires 8 beams of mana to 8 different directions from that point.",
-       "Attempts to slow, stun, confuse, scare, freeze all monsters in sight. Gets more power on a mirror.",
-       "Recreates current dungeon level. Can only be used on a mirror.",
-       "Teleports you to a given location.",
-       "Recalls player from dungeon to town or from town to the deepest level of dungeon.",
-       "Completely protects you from any attacks at one in two chance.",
-       "Generates a magical triangle which damages all monsters in the area. The vertices of the triangle are you and two mirrors in sight.",
-       "Generates a barrier which completely protects you from almost all damage. Takes a few of your turns when the barrier breaks or duration time is exceeded.",
-},
+    {
+        "Detects visible monsters in your vicinity. Detects traps and doors at level 5, invisible monsters at level 15, and items at level 30. Gives telepathy "
+        "at level 25. Magically maps the surroundings at level 20. Lights and reveals the whole level at level 45.",
+        "Fires a beam or ball which inflicts PSI damage.",
+        "Teleports you a short distance.",
+        "Teleports you a long distance.",
+        "Stuns, confuses or scares a monster. Or attempts to charm all monsters in sight at level 30.",
+        "Fires a ball which hurts monsters with telekinesis.",
+        "Gives stone skin and some resistance to elements for a while. As your level increases, more resistances are given.",
+        "Gives feeling of an item. Or identifies an item at level 25.",
+        "Generates a ball centered on you which inflicts PSI damage on a monster or, at level 25 and higher, inflicts PSI damage on all monsters.",
+        "Removes fear and being stunned. Gives heroism and speed. Heals HP a little unless you already have heroism and a temporary speed boost.",
+        "Pulls a distant item close to you.",
+        "Fires a ball which damages. When not resisted, you gain SP. You will be occupied for 0 to 1.5 turns after casting as your mind recovers.",
+        "Fires a beam of pure energy which penetrates invulnerability barriers.",
+        "Stops time. Consumes all of your SP. The more SP consumed, the longer the duration of the spell.",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "Fires a very small energy ball.",
+        "Lights up nearby area and the inside of a room permanently.",
+        "Gives levitation a while.",
+        "Fires a short energy beam.",
+        "Gives magic resistance for a while.",
+        "Increases your spirit energy temporarily. More spirit energy will boost the effect or duration of your force abilities. Too much spirit energy can "
+        "result in an explosion.",
+        "Envelops you with a temporary aura that damages any monster which hits you in melee.",
+        "Damages an adjacent monster and blows it away.",
+        "Fires a large energy ball.",
+        "Dispels all magics which are affecting a monster.",
+        "Summons ghosts.",
+        "Generates a huge ball of flame centered on you.",
+        "Fires a long, powerful energy beam.",
+        "Gives extremely fast speed.",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "Detects all monsters except the mindless in your vicinity.",
+        "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked.",
+        "Sets off a trap, then destroys that trap.",
+        "Shakes dungeon structure, and results in random swapping of floors and walls.",
+        "Attacks all adjacent monsters.",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+    },
+    {
+        "Detects visible monsters in your vicinity. Detects invisible monsters at level 15. Gives telepathy at level 25. Magically maps the surroundings at "
+        "level 35. All of the effects need 4 more levels unless on a mirror.",
+        "Makes a mirror under you.",
+        "Fires bolt of light. At level ten or higher, the bolt will be a beam of light if you are on a mirror.",
+        "Teleports you a short distance.",
+        "Lights up nearby area and the inside of a room permanently.",
+        "Teleports you a long distance.",
+        "Gives a temporary aura of mirror shards. The aura damages any monster that hits you in melee. If you are on a mirror, the aura will teleport you a "
+        "short distance if a monster hits you in melee.",
+        "Teleports all monsters on the line away unless resisted.",
+        "Fires a ball of shards.",
+        "Causes any mirror to lull to sleep monsters close to the mirror.",
+        "Fires a beam of mana. If the beam hits a mirror, it breaks that mirror and bounces toward another mirror.",
+        "Eliminates a monster on a mirror from current dungeon level.",
+        "Gives a bonus to AC. Gives reflection at level 32. Gives magic resistance at level 40.",
+        "Fires a powerful beam of mana. If the beam hits a mirror, it breaks that mirror and fires 8 beams of mana to 8 different directions from that point.",
+        "Attempts to slow, stun, confuse, scare, freeze all monsters in sight. Gets more power on a mirror.",
+        "Recreates current dungeon level. Can only be used on a mirror.",
+        "Teleports you to a given location.",
+        "Recalls player from dungeon to town or from town to the deepest level of dungeon.",
+        "Completely protects you from any attacks at one in two chance.",
+        "Generates a magical triangle which damages all monsters in the area. The vertices of the triangle are you and two mirrors in sight.",
+        "Generates a barrier which completely protects you from almost all damage. Takes a few of your turns when the barrier breaks or duration time is "
+        "exceeded.",
+    },
 
-{
-       "Darkens nearby area and inside of a room.",
-       "Detects visible monsters in your vicinity. Detects traps, doors and stairs at level 5. Detects items at level 15. Lights and reveals the whole level at level 45.",
-       "Teleports you a short distance.",
-       "Teleports you as you receive an attack. Might be able to teleport just before receiving damage at higher levels.",
-       "Teleports you a long distance.",
-       "Attacks an adjacent monster and teleports you away immediately after the attack.",
-       "Attempts to freeze a monster.",
-       "Identifies an item.",
-       "Gives levitation for a while.",
-       "Generates a fire ball and immediately teleports you away. Gives resistance to fire for a while. This resistance can be added to that from equipment for more powerful resistance.",
-       "Steps close to a monster and attacks at a time.",
-       "Shoots 8 iron Spikes in 8 random directions.",
-       "Teleports a monster to a place adjacent to you.",
-       "Releases a confusion ball which doesn't inflict any damage.",
-       "Causes you and a targeted monster to exchange positions.",
-       "Sets a glyph under you. The glyph will explode when a monster moves on it.",
-       "Makes you ethereal for a period of time. While ethereal, you can pass through walls and are resistant to acid. The resistance can be added to that from equipment for more powerful resistance.",
-       "Generates huge balls of poison, drain life and confusion. Then immediately teleports you away.",
-       "Fires some number of beams of fire, nether or plasma in random directions.",
-       "Creates shadows of yourself which gives you the ability to completely evade any attacks at one in two chance for a while.",
-       "",
-},
+    {
+        "Darkens nearby area and inside of a room.",
+        "Detects visible monsters in your vicinity. Detects traps, doors and stairs at level 5. Detects items at level 15. Lights and reveals the whole level "
+        "at level 45.",
+        "Teleports you a short distance.",
+        "Teleports you as you receive an attack. Might be able to teleport just before receiving damage at higher levels.",
+        "Teleports you a long distance.",
+        "Attacks an adjacent monster and teleports you away immediately after the attack.",
+        "Attempts to freeze a monster.",
+        "Identifies an item.",
+        "Gives levitation for a while.",
+        "Generates a fire ball and immediately teleports you away. Gives resistance to fire for a while. This resistance can be added to that from equipment "
+        "for more powerful resistance.",
+        "Steps close to a monster and attacks at a time.",
+        "Shoots 8 iron Spikes in 8 random directions.",
+        "Teleports a monster to a place adjacent to you.",
+        "Releases a confusion ball which doesn't inflict any damage.",
+        "Causes you and a targeted monster to exchange positions.",
+        "Sets a glyph under you. The glyph will explode when a monster moves on it.",
+        "Makes you ethereal for a period of time. While ethereal, you can pass through walls and are resistant to acid. The resistance can be added to that "
+        "from equipment for more powerful resistance.",
+        "Generates huge balls of poison, drain life and confusion. Then immediately teleports you away.",
+        "Fires some number of beams of fire, nether or plasma in random directions.",
+        "Creates shadows of yourself which gives you the ability to completely evade any attacks at one in two chance for a while.",
+        "",
+    },
 #endif
 };
 
@@ -604,116 +603,223 @@ static concptr const mind_tips[5][MAX_MIND_POWERS] =
  */
 void mindcraft_info(player_type *caster_ptr, char *p, int use_mind, int power)
 {
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       strcpy(p, "");
-
-       switch (use_mind)
-       {
-       case MIND_MINDCRAFTER:
-               switch (power)
-               {
-               case 0:  break;
-               case 1:  sprintf(p, " %s%dd%d", KWD_DAM, 3 + ((plev - 1) / 4), 3 + plev/15); break;
-               case 2:  sprintf(p, " %s10", KWD_SPHERE); break;
-               case 3:  sprintf(p, " %s%d", KWD_SPHERE, plev * 5);  break;
-               case 4:  break;
-               case 5: sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));  break;
-               case 6:  sprintf(p, " %s%d", KWD_DURATION, plev);  break;
-               case 7:  break;
-               case 8:  sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), KWD_DAM, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1))); break;
-               case 9:  sprintf(p, " %s10+d%d", KWD_DURATION, plev * 3 / 2);  break;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    strcpy(p, "");
+
+    switch (use_mind) {
+    case MIND_MINDCRAFTER:
+        switch (power) {
+        case 0:
+            break;
+        case 1:
+            sprintf(p, " %s%dd%d", KWD_DAM, 3 + ((plev - 1) / 4), 3 + plev / 15);
+            break;
+        case 2:
+            sprintf(p, " %s10", KWD_SPHERE);
+            break;
+        case 3:
+            sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
+            break;
+        case 4:
+            break;
+        case 5:
+            sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
+            break;
+        case 6:
+            sprintf(p, " %s%d", KWD_DURATION, plev);
+            break;
+        case 7:
+            break;
+        case 8:
+            sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), KWD_DAM, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1)));
+            break;
+        case 9:
+            sprintf(p, " %s10+d%d", KWD_DURATION, plev * 3 / 2);
+            break;
 #ifdef JP
-               case 10: sprintf(p, " 最大重量:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15));  break;
+        case 10:
+            sprintf(p, " 最大重量:%d.%dkg", lbtokg1(plev * 15), lbtokg2(plev * 15));
+            break;
 #else
-               case 10: sprintf(p, " max wgt %d", plev * 15);  break;
+        case 10:
+            sprintf(p, " max wgt %d", plev * 15);
+            break;
 #endif
-               case 11: sprintf(p, " %s%dd6", KWD_DAM, plev / 2);  break;
-               case 12: sprintf(p, " %sd%d+%d", KWD_DAM, plev * 3, plev * 3); break;
-               case 13: sprintf(p, _(" 行動:%ld回", " %ld acts."), (long int)(caster_ptr->csp + 100-caster_ptr->energy_need - 50)/100); break;
-               }
-               break;
-       case MIND_KI:
-       {
-               int boost = get_current_ki(caster_ptr);
-
-               if (heavy_armor(caster_ptr)) boost /= 2;
-
-               switch (power)
-               {
-               case 0:  sprintf(p, " %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5) + boost / 12); break;
-               case 1:  break;
-               case 2:  sprintf(p, " %s%d+d30", KWD_DURATION, 30 + boost / 5); break;
-               case 3:  sprintf(p, " %s%dd5", KWD_DAM, 5 + ((plev - 1) / 5) + boost / 10); break;
-               case 4:  sprintf(p, " %s%d+d20", KWD_DURATION, 20 + boost / 5); break;
-               case 5:  break;
-               case 6:  sprintf(p, " %s%d+d%d", KWD_DURATION, 15 + boost / 7, plev / 2); break;
-               case 7:  sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4) + boost / 12); break;
-               case 8:  sprintf(p, " %s10d6+%d", KWD_DAM, plev * 3 / 2 + boost * 3 / 5); break;
-               case 9:  break;
-               case 10: sprintf(p, _(" 最大%d体", " max %d"), 1+boost/100); break;
-               case 11: sprintf(p, " %s%d", KWD_DAM, 100 + plev + boost); break;
-               case 12: sprintf(p, " %s%dd15", KWD_DAM, 10 + plev / 2 + boost * 3 / 10); break;
-               case 13: sprintf(p, _(" 行動:%d+d16回", " %d+d16 acts"), 16+boost/20); break;
-               }
-               break;
-       }
-       case MIND_MIRROR_MASTER:
-       {
-               switch (power)
-               {
-               case 0:  break;
-               case 1:  break;
-               case 2:  sprintf(p, " %s%dd4", KWD_DAM,  3 + ((plev - 1) / 5) ); break;
-               case 3:  sprintf(p, " %s10", KWD_SPHERE); break;
-               case 4:  break;
-               case 5:  sprintf(p, " %s%d", KWD_SPHERE, plev *5); break;
-               case 6:  sprintf(p, " %s20+d20", KWD_DURATION);  break;
-               case 7:  break;
-               case 8:  sprintf(p, " %s%dd8", KWD_DAM, 8+((plev -5)/4) ); break;
-               case 9:  break;
-               case 10: sprintf(p, " %s%dd8", KWD_DAM, 11+(plev-5)/4 ); break;
-               case 11: break;
-               case 12: sprintf(p, " %s20+d20", KWD_DURATION);  break;
-               case 13: sprintf(p, " %s150+d%d", KWD_DAM, plev*2 ); break;
-               case 14: break;
-               case 15: break;
-               case 16: sprintf(p, " %s%d", KWD_SPHERE, plev/2 +10); break;
-               case 17: break;
-               case 18: sprintf(p, " %s6+d6", KWD_DURATION);  break;
-               case 19: sprintf(p, " %s%d", KWD_DAM, plev*11+5 ); break;
-               case 20: sprintf(p, " %s4+d4", KWD_DURATION);  break;
-               }
-               break;
-       }
-       case MIND_NINJUTSU:
-       {
-               switch (power)
-               {
-               case 0:  break;
-               case 1:  break;
-               case 2:  sprintf(p, " %s10", KWD_SPHERE); break;
-               case 3:  break;
-               case 4:  sprintf(p, " %s%d", KWD_SPHERE , plev *5); break;
-               case 5:  sprintf(p, " %s30", KWD_SPHERE); break;
-               case 6:  break;
-               case 7:  break;
-               case 8:  sprintf(p, " %s20+d20", KWD_DURATION);  break;
-               case 9:  sprintf(p, " %s%d", KWD_DAM, (50+plev)/2 ); break;
-               case 10: break;
-               case 11: break;
-               case 12: break;
-               case 13: break;
-               case 14: break;
-               case 15: break;
-               case 16: sprintf(p, " %s%d+d%d", KWD_DURATION, plev/2, plev/2);  break;
-               case 17: sprintf(p, " %s%d*3", KWD_DAM, (75+plev*2/3)/2 ); break;
-               case 18: sprintf(p, " %s%dd10", KWD_DAM, 6+plev/8 ); break;
-               case 19: sprintf(p, " %s6+d6", KWD_DURATION);  break;
-               }
-               break;
-       }
-       }
+        case 11:
+            sprintf(p, " %s%dd6", KWD_DAM, plev / 2);
+            break;
+        case 12:
+            sprintf(p, " %sd%d+%d", KWD_DAM, plev * 3, plev * 3);
+            break;
+        case 13:
+            sprintf(p, _(" 行動:%ld回", " %ld acts."), (long int)(caster_ptr->csp + 100 - caster_ptr->energy_need - 50) / 100);
+            break;
+        }
+        break;
+    case MIND_KI: {
+        int boost = get_current_ki(caster_ptr);
+
+        if (heavy_armor(caster_ptr))
+            boost /= 2;
+
+        switch (power) {
+        case 0:
+            sprintf(p, " %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5) + boost / 12);
+            break;
+        case 1:
+            break;
+        case 2:
+            sprintf(p, " %s%d+d30", KWD_DURATION, 30 + boost / 5);
+            break;
+        case 3:
+            sprintf(p, " %s%dd5", KWD_DAM, 5 + ((plev - 1) / 5) + boost / 10);
+            break;
+        case 4:
+            sprintf(p, " %s%d+d20", KWD_DURATION, 20 + boost / 5);
+            break;
+        case 5:
+            break;
+        case 6:
+            sprintf(p, " %s%d+d%d", KWD_DURATION, 15 + boost / 7, plev / 2);
+            break;
+        case 7:
+            sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4) + boost / 12);
+            break;
+        case 8:
+            sprintf(p, " %s10d6+%d", KWD_DAM, plev * 3 / 2 + boost * 3 / 5);
+            break;
+        case 9:
+            break;
+        case 10:
+            sprintf(p, _(" 最大%d体", " max %d"), 1 + boost / 100);
+            break;
+        case 11:
+            sprintf(p, " %s%d", KWD_DAM, 100 + plev + boost);
+            break;
+        case 12:
+            sprintf(p, " %s%dd15", KWD_DAM, 10 + plev / 2 + boost * 3 / 10);
+            break;
+        case 13:
+            sprintf(p, _(" 行動:%d+d16回", " %d+d16 acts"), 16 + boost / 20);
+            break;
+        }
+        break;
+    }
+    case MIND_MIRROR_MASTER: {
+        switch (power) {
+        case 0:
+            break;
+        case 1:
+            break;
+        case 2:
+            sprintf(p, " %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5));
+            break;
+        case 3:
+            sprintf(p, " %s10", KWD_SPHERE);
+            break;
+        case 4:
+            break;
+        case 5:
+            sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
+            break;
+        case 6:
+            sprintf(p, " %s20+d20", KWD_DURATION);
+            break;
+        case 7:
+            break;
+        case 8:
+            sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
+            break;
+        case 9:
+            break;
+        case 10:
+            sprintf(p, " %s%dd8", KWD_DAM, 11 + (plev - 5) / 4);
+            break;
+        case 11:
+            break;
+        case 12:
+            sprintf(p, " %s20+d20", KWD_DURATION);
+            break;
+        case 13:
+            sprintf(p, " %s150+d%d", KWD_DAM, plev * 2);
+            break;
+        case 14:
+            break;
+        case 15:
+            break;
+        case 16:
+            sprintf(p, " %s%d", KWD_SPHERE, plev / 2 + 10);
+            break;
+        case 17:
+            break;
+        case 18:
+            sprintf(p, " %s6+d6", KWD_DURATION);
+            break;
+        case 19:
+            sprintf(p, " %s%d", KWD_DAM, plev * 11 + 5);
+            break;
+        case 20:
+            sprintf(p, " %s4+d4", KWD_DURATION);
+            break;
+        }
+        break;
+    }
+    case MIND_NINJUTSU: {
+        switch (power) {
+        case 0:
+            break;
+        case 1:
+            break;
+        case 2:
+            sprintf(p, " %s10", KWD_SPHERE);
+            break;
+        case 3:
+            break;
+        case 4:
+            sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
+            break;
+        case 5:
+            sprintf(p, " %s30", KWD_SPHERE);
+            break;
+        case 6:
+            break;
+        case 7:
+            break;
+        case 8:
+            sprintf(p, " %s20+d20", KWD_DURATION);
+            break;
+        case 9:
+            sprintf(p, " %s%d", KWD_DAM, (50 + plev) / 2);
+            break;
+        case 10:
+            break;
+        case 11:
+            break;
+        case 12:
+            break;
+        case 13:
+            break;
+        case 14:
+            break;
+        case 15:
+            break;
+        case 16:
+            sprintf(p, " %s%d+d%d", KWD_DURATION, plev / 2, plev / 2);
+            break;
+        case 17:
+            sprintf(p, " %s%d*3", KWD_DAM, (75 + plev * 2 / 3) / 2);
+            break;
+        case 18:
+            sprintf(p, " %s%dd10", KWD_DAM, 6 + plev / 8);
+            break;
+        case 19:
+            sprintf(p, " %s6+d6", KWD_DURATION);
+            break;
+        }
+        break;
+    }
+    }
 }
 
 /*!
@@ -736,331 +842,318 @@ void mindcraft_info(player_type *caster_ptr, char *p, int use_mind, int power)
  */
 static bool get_mind_power(player_type *caster_ptr, SPELL_IDX *sn, bool only_browse)
 {
-       SPELL_IDX i;
-       int             num = 0;
-       TERM_LEN y = 1;
-       TERM_LEN x = 10;
-       PERCENTAGE minfail = 0;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-       PERCENTAGE chance = 0;
-       int             ask = TRUE;
-       char            choice;
-       char            out_val[160];
-       char            comment[80];
-       concptr            p;
-       COMMAND_CODE code;
-       mind_type       spell;
-       const mind_power      *mind_ptr;
-       bool            flag, redraw;
-       int             use_mind;
-       int menu_line = (use_menu ? 1 : 0);
-
-       switch (caster_ptr->pclass)
-       {
-       case CLASS_MINDCRAFTER:
-       {
-               use_mind = MIND_MINDCRAFTER;
-               p = _("超能力", "mindcraft");
-               break;
-       }
-       case CLASS_FORCETRAINER:
-       {
-               use_mind = MIND_KI;
-               p = _("練気術", "Force");
-               break;
-       }
-       case CLASS_BERSERKER:
-       {
-               use_mind = MIND_BERSERKER;
-               p = _("技", "brutal power");
-               break;
-       }
-       case CLASS_MIRROR_MASTER:
-       {
-               use_mind = MIND_MIRROR_MASTER;
-               p = _("鏡魔法", "magic");
-               break;
-       }
-       case CLASS_NINJA:
-       {
-               use_mind = MIND_NINJUTSU;
-               p = _("忍術", "ninjutsu");
-               break;
-       }
-       default:
-       {
-               use_mind = 0;
-               p = _("超能力", "mindcraft");
-               break;
-       }
-       }
-       mind_ptr = &mind_powers[use_mind];
-
-       /* Assume cancelled */
-       *sn = (-1);
-
-       /* Get the spell, if available */
-
-       if (repeat_pull(&code))
-       {
-               *sn = (SPELL_IDX)code;
-               /* Hack -- If requested INVEN_FORCE(1111), pull again */
-               if (*sn == INVEN_FORCE) repeat_pull(&code);
-               *sn = (SPELL_IDX)code;
-
-               /* Verify the spell */
-               if (mind_ptr->info[*sn].min_lev <= plev)
-               {
-                       /* Success */
-                       return TRUE;
-               }
-       }
-
-       flag = FALSE;
-       redraw = FALSE;
-
-       for (i = 0; i < MAX_MIND_POWERS; i++)
-       {
-               if (mind_ptr->info[i].min_lev <= plev)
-               {
-                       num++;
-               }
-       }
-
-       /* Build a prompt (accept all spells) */
-       if (only_browse)
-       {
-               (void)strnfmt(out_val, 78,
-                       _("(%^s %c-%c, '*'で一覧, ESC) どの%sについて知りますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "),
-                       p, I2A(0), I2A(num - 1), p);
-       }
-       else
-       {
-               (void)strnfmt(out_val, 78,
-                       _("(%^s %c-%c, '*'で一覧, ESC) どの%sを使いますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "),
-                       p, I2A(0), I2A(num - 1), p);
-       }
-
-       if (use_menu && !only_browse) screen_save();
-
-       choice = (always_show_list || use_menu) ? ESCAPE : 1;
-
-       while (!flag)
-       {
-               if(choice==ESCAPE) choice = ' '; 
-               else if( !get_com(out_val, &choice, TRUE) )break;
-
-               if (use_menu && choice != ' ')
-               {
-                       switch(choice)
-                       {
-                               case '0':
-                               {
-                                       if (!only_browse) screen_load();
-                                       return FALSE;
-                               }
-
-                               case '8':
-                               case 'k':
-                               case 'K':
-                               {
-                                       menu_line += (num - 1);
-                                       break;
-                               }
-
-                               case '2':
-                               case 'j':
-                               case 'J':
-                               {
-                                       menu_line++;
-                                       break;
-                               }
-
-                               case 'x':
-                               case 'X':
-                               case '\r':
-                               case '\n':
-                               {
-                                       i = menu_line - 1;
-                                       ask = FALSE;
-                                       break;
-                               }
-                       }
-                       if (menu_line > num) menu_line -= num;
-               }
-               /* Request redraw */
-               if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
-               {
-                       /* Show the list */
-                       if (!redraw || use_menu)
-                       {
-                               char psi_desc[80];
-                               bool has_weapon[2];
-                               redraw = TRUE;
-                               if (!only_browse && !use_menu) screen_save();
-
-                               /* Display a list of spells */
-                               prt("", y, x);
-                               put_str(_("名前", "Name"), y, x + 5);
-
-                               put_str(format(_("Lv   %s   失率 効果", "Lv   %s   Fail Info"),
-                                       ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y, x + 35);
-
-                               has_weapon[0] = has_melee_weapon(caster_ptr, INVEN_RARM);
-                               has_weapon[1] = has_melee_weapon(caster_ptr, INVEN_LARM);
-
-                               /* Dump the spells */
-                               for (i = 0; i < MAX_MIND_POWERS; i++)
-                               {
-                                       int mana_cost;
-
-                                       /* Access the spell */
-                                       spell = mind_ptr->info[i];
-
-                                       if (spell.min_lev > plev)   break;
-
-                                       chance = spell.fail;
-
-                                       mana_cost = spell.mana_cost;
-                                       if (chance)
-                                       {
-
-                                               /* Reduce failure rate by "effective" level adjustment */
-                                               chance -= 3 * (plev - spell.min_lev);
-
-                                               /* Reduce failure rate by INT/WIS adjustment */
-                                               chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
-
-                                               if (use_mind == MIND_KI)
-                                               {
-                                                       if (heavy_armor(caster_ptr)) chance += 20;
-                                                       if (caster_ptr->icky_wield[0]) chance += 20;
-                                                       else if (has_weapon[0]) chance += 10;
-                                                       if (caster_ptr->icky_wield[1]) chance += 20;
-                                                       else if (has_weapon[1]) chance += 10;
-                                                       if (i == 5)
-                                                       {
-                                                               int j;
-                                                               for (j = 0; j < get_current_ki(caster_ptr) / 50; j++)
-                                                                       mana_cost += (j+1) * 3 / 2;
-                                                       }
-                                               }
-
-                                               /* Not enough mana to cast */
-                                               if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU) && (mana_cost > caster_ptr->csp))
-                                               {
-                                                       chance += 5 * (mana_cost - caster_ptr->csp);
-                                               }
-
-                                               chance += caster_ptr->to_m_chance;
-
-                                               /* Extract the minimum failure rate */
-                                               minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
-
-                                               /* Minimum failure rate */
-                                               if (chance < minfail) chance = minfail;
-
-                                               /* Stunning makes spells harder */
-                                               if (caster_ptr->stun > 50) chance += 25;
-                                               else if (caster_ptr->stun) chance += 15;
-
-                                               if (use_mind == MIND_KI)
-                                               {
-                                                       if (heavy_armor(caster_ptr)) chance += 5;
-                                                       if (caster_ptr->icky_wield[0]) chance += 5;
-                                                       if (caster_ptr->icky_wield[1]) chance += 5;
-                                               }
-                                               /* Always a 5 percent chance of working */
-                                               if (chance > 95) chance = 95;
-                                       }
-
-                                       /* Get info */
-                                       mindcraft_info(caster_ptr, comment, use_mind, i);
-
-                                       if (use_menu)
-                                       {
-                                               if (i == (menu_line-1)) strcpy(psi_desc, _("  》 ", "  >  "));
-                                               else strcpy(psi_desc, "     ");
-                                       }
-                                       else
-                                               sprintf(psi_desc, "  %c) ", I2A(i));
-                                       /* Dump the spell --(-- */
-                                       strcat(psi_desc,
-                                              format("%-30s%2d %4d%s %3d%%%s",
-                                                     spell.name, spell.min_lev, mana_cost,
-                                                     (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? _("~", "~ ") : "  "),
-                                                     chance, comment));
-                                       prt(psi_desc, y + i + 1, x);
-                               }
-
-                               /* Clear the bottom line */
-                               prt("", y + i + 1, x);
-                       }
-
-                       /* Hide the list */
-                       else if (!only_browse)
-                       {
-                               /* Hide list */
-                               redraw = FALSE;
-                               screen_load();
-                       }
-
-                       /* Redo asking */
-                       continue;
-               }
-
-               if (!use_menu)
-               {
-                       /* Note verify */
-                       ask = isupper(choice);
-
-                       /* Lowercase */
-                       if (ask) choice = (char)tolower(choice);
-
-                       /* Extract request */
-                       i = (islower(choice) ? A2I(choice) : -1);
-               }
-
-               /* Totally Illegal */
-               if ((i < 0) || (i >= num))
-               {
-                       bell();
-                       continue;
-               }
-
-               /* Save the spell index */
-               spell = mind_ptr->info[i];
-
-               /* Verify it */
-               if (ask)
-               {
-                       char tmp_val[160];
-
-                       /* Prompt */
-                       (void) strnfmt(tmp_val, 78, _("%sを使いますか?", "Use %s? "), spell.name);
-
-                       /* Belay that order */
-                       if (!get_check(tmp_val)) continue;
-               }
-
-               /* Stop the loop */
-               flag = TRUE;
-       }
-       if (redraw && !only_browse) screen_load();
-
-       caster_ptr->window |= (PW_SPELL);
-       handle_stuff(caster_ptr);
-
-       /* Abort if needed */
-       if (!flag) return FALSE;
-
-       /* Save the choice */
-       (*sn) = i;
-
-       repeat_push((COMMAND_CODE)i);
-
-       /* Success */
-       return TRUE;
+    SPELL_IDX i;
+    int num = 0;
+    TERM_LEN y = 1;
+    TERM_LEN x = 10;
+    PERCENTAGE minfail = 0;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+    PERCENTAGE chance = 0;
+    int ask = TRUE;
+    char choice;
+    char out_val[160];
+    char comment[80];
+    concptr p;
+    COMMAND_CODE code;
+    mind_type spell;
+    const mind_power *mind_ptr;
+    bool flag, redraw;
+    int use_mind;
+    int menu_line = (use_menu ? 1 : 0);
+
+    switch (caster_ptr->pclass) {
+    case CLASS_MINDCRAFTER: {
+        use_mind = MIND_MINDCRAFTER;
+        p = _("超能力", "mindcraft");
+        break;
+    }
+    case CLASS_FORCETRAINER: {
+        use_mind = MIND_KI;
+        p = _("練気術", "Force");
+        break;
+    }
+    case CLASS_BERSERKER: {
+        use_mind = MIND_BERSERKER;
+        p = _("技", "brutal power");
+        break;
+    }
+    case CLASS_MIRROR_MASTER: {
+        use_mind = MIND_MIRROR_MASTER;
+        p = _("鏡魔法", "magic");
+        break;
+    }
+    case CLASS_NINJA: {
+        use_mind = MIND_NINJUTSU;
+        p = _("忍術", "ninjutsu");
+        break;
+    }
+    default: {
+        use_mind = 0;
+        p = _("超能力", "mindcraft");
+        break;
+    }
+    }
+    mind_ptr = &mind_powers[use_mind];
+
+    /* Assume cancelled */
+    *sn = (-1);
+
+    /* Get the spell, if available */
+
+    if (repeat_pull(&code)) {
+        *sn = (SPELL_IDX)code;
+        /* Hack -- If requested INVEN_FORCE(1111), pull again */
+        if (*sn == INVEN_FORCE)
+            repeat_pull(&code);
+        *sn = (SPELL_IDX)code;
+
+        /* Verify the spell */
+        if (mind_ptr->info[*sn].min_lev <= plev) {
+            /* Success */
+            return TRUE;
+        }
+    }
+
+    flag = FALSE;
+    redraw = FALSE;
+
+    for (i = 0; i < MAX_MIND_POWERS; i++) {
+        if (mind_ptr->info[i].min_lev <= plev) {
+            num++;
+        }
+    }
+
+    /* Build a prompt (accept all spells) */
+    if (only_browse) {
+        (void)strnfmt(out_val, 78, _("(%^s %c-%c, '*'で一覧, ESC) どの%sについて知りますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "), p, I2A(0),
+            I2A(num - 1), p);
+    } else {
+        (void)strnfmt(
+            out_val, 78, _("(%^s %c-%c, '*'で一覧, ESC) どの%sを使いますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "), p, I2A(0), I2A(num - 1), p);
+    }
+
+    if (use_menu && !only_browse)
+        screen_save();
+
+    choice = (always_show_list || use_menu) ? ESCAPE : 1;
+
+    while (!flag) {
+        if (choice == ESCAPE)
+            choice = ' ';
+        else if (!get_com(out_val, &choice, TRUE))
+            break;
+
+        if (use_menu && choice != ' ') {
+            switch (choice) {
+            case '0': {
+                if (!only_browse)
+                    screen_load();
+                return FALSE;
+            }
+
+            case '8':
+            case 'k':
+            case 'K': {
+                menu_line += (num - 1);
+                break;
+            }
+
+            case '2':
+            case 'j':
+            case 'J': {
+                menu_line++;
+                break;
+            }
+
+            case 'x':
+            case 'X':
+            case '\r':
+            case '\n': {
+                i = menu_line - 1;
+                ask = FALSE;
+                break;
+            }
+            }
+            if (menu_line > num)
+                menu_line -= num;
+        }
+        /* Request redraw */
+        if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) {
+            /* Show the list */
+            if (!redraw || use_menu) {
+                char psi_desc[80];
+                bool has_weapon[2];
+                redraw = TRUE;
+                if (!only_browse && !use_menu)
+                    screen_save();
+
+                /* Display a list of spells */
+                prt("", y, x);
+                put_str(_("名前", "Name"), y, x + 5);
+
+                put_str(format(_("Lv   %s   失率 効果", "Lv   %s   Fail Info"), ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y,
+                    x + 35);
+
+                has_weapon[0] = has_melee_weapon(caster_ptr, INVEN_RARM);
+                has_weapon[1] = has_melee_weapon(caster_ptr, INVEN_LARM);
+
+                /* Dump the spells */
+                for (i = 0; i < MAX_MIND_POWERS; i++) {
+                    int mana_cost;
+
+                    /* Access the spell */
+                    spell = mind_ptr->info[i];
+
+                    if (spell.min_lev > plev)
+                        break;
+
+                    chance = spell.fail;
+
+                    mana_cost = spell.mana_cost;
+                    if (chance) {
+
+                        /* Reduce failure rate by "effective" level adjustment */
+                        chance -= 3 * (plev - spell.min_lev);
+
+                        /* Reduce failure rate by INT/WIS adjustment */
+                        chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
+
+                        if (use_mind == MIND_KI) {
+                            if (heavy_armor(caster_ptr))
+                                chance += 20;
+                            if (caster_ptr->icky_wield[0])
+                                chance += 20;
+                            else if (has_weapon[0])
+                                chance += 10;
+                            if (caster_ptr->icky_wield[1])
+                                chance += 20;
+                            else if (has_weapon[1])
+                                chance += 10;
+                            if (i == 5) {
+                                int j;
+                                for (j = 0; j < get_current_ki(caster_ptr) / 50; j++)
+                                    mana_cost += (j + 1) * 3 / 2;
+                            }
+                        }
+
+                        /* Not enough mana to cast */
+                        if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU) && (mana_cost > caster_ptr->csp)) {
+                            chance += 5 * (mana_cost - caster_ptr->csp);
+                        }
+
+                        chance += caster_ptr->to_m_chance;
+
+                        /* Extract the minimum failure rate */
+                        minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
+
+                        /* Minimum failure rate */
+                        if (chance < minfail)
+                            chance = minfail;
+
+                        /* Stunning makes spells harder */
+                        if (caster_ptr->stun > 50)
+                            chance += 25;
+                        else if (caster_ptr->stun)
+                            chance += 15;
+
+                        if (use_mind == MIND_KI) {
+                            if (heavy_armor(caster_ptr))
+                                chance += 5;
+                            if (caster_ptr->icky_wield[0])
+                                chance += 5;
+                            if (caster_ptr->icky_wield[1])
+                                chance += 5;
+                        }
+                        /* Always a 5 percent chance of working */
+                        if (chance > 95)
+                            chance = 95;
+                    }
+
+                    /* Get info */
+                    mindcraft_info(caster_ptr, comment, use_mind, i);
+
+                    if (use_menu) {
+                        if (i == (menu_line - 1))
+                            strcpy(psi_desc, _("  》 ", "  >  "));
+                        else
+                            strcpy(psi_desc, "     ");
+                    } else
+                        sprintf(psi_desc, "  %c) ", I2A(i));
+                    /* Dump the spell --(-- */
+                    strcat(psi_desc,
+                        format("%-30s%2d %4d%s %3d%%%s", spell.name, spell.min_lev, mana_cost,
+                            (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? _("~", "~ ") : "  "), chance, comment));
+                    prt(psi_desc, y + i + 1, x);
+                }
+
+                /* Clear the bottom line */
+                prt("", y + i + 1, x);
+            }
+
+            /* Hide the list */
+            else if (!only_browse) {
+                /* Hide list */
+                redraw = FALSE;
+                screen_load();
+            }
+
+            /* Redo asking */
+            continue;
+        }
+
+        if (!use_menu) {
+            /* Note verify */
+            ask = isupper(choice);
+
+            /* Lowercase */
+            if (ask)
+                choice = (char)tolower(choice);
+
+            /* Extract request */
+            i = (islower(choice) ? A2I(choice) : -1);
+        }
+
+        /* Totally Illegal */
+        if ((i < 0) || (i >= num)) {
+            bell();
+            continue;
+        }
+
+        /* Save the spell index */
+        spell = mind_ptr->info[i];
+
+        /* Verify it */
+        if (ask) {
+            char tmp_val[160];
+
+            /* Prompt */
+            (void)strnfmt(tmp_val, 78, _("%sを使いますか?", "Use %s? "), spell.name);
+
+            /* Belay that order */
+            if (!get_check(tmp_val))
+                continue;
+        }
+
+        /* Stop the loop */
+        flag = TRUE;
+    }
+    if (redraw && !only_browse)
+        screen_load();
+
+    caster_ptr->window |= (PW_SPELL);
+    handle_stuff(caster_ptr);
+
+    /* Abort if needed */
+    if (!flag)
+        return FALSE;
+
+    /* Save the choice */
+    (*sn) = i;
+
+    repeat_push((COMMAND_CODE)i);
+
+    /* Success */
+    return TRUE;
 }
 
 /*!
@@ -1071,158 +1164,158 @@ static bool get_mind_power(player_type *caster_ptr, SPELL_IDX *sn, bool only_bro
  */
 static bool cast_mindcrafter_spell(player_type *caster_ptr, int spell)
 {
-       int b = 0;
-       DIRECTION dir;
-       TIME_EFFECT t;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       /* spell code */
-       switch (spell)
-       {
-       case 0:   /* Precog */
-               if (plev > 44)
-               {
-                       chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
-                       chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
-                       wiz_lite(caster_ptr, FALSE);
-               }
-               else if (plev > 19)
-                       map_area(caster_ptr, DETECT_RAD_MAP);
-
-               if (plev < 30)
-               {
-                       b = detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
-                       if (plev > 14) b |= detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
-                       if (plev > 4)  {
-                               b |= detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
-                               b |= detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
-                       }
-               }
-               else
-               {
-                       b = detect_all(caster_ptr, DETECT_RAD_DEFAULT);
-               }
-
-               if ((plev > 24) && (plev < 40))
-                       set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
-
-               if (!b) msg_print(_("安全な気がする。", "You feel safe."));
-
-               break;
-       case 1:
-               /* Mindblast */
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               if (randint1(100) < plev * 2)
-                       fire_beam(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
-               else
-                       fire_ball(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
-               break;
-       case 2:
-               /* Minor displace */
-               teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
-               break;
-       case 3:
-               /* Major displace */
-               teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
-               break;
-       case 4:
-               /* Domination */
-               if (plev < 30)
-               {
-                       if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-                       fire_ball(caster_ptr, GF_DOMINATION, dir, plev, 0);
-               }
-               else
-               {
-                       charm_monsters(caster_ptr, plev * 2);
-               }
-               break;
-       case 5:
-               /* Fist of Force  ---  not 'true' TK  */
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               fire_ball(caster_ptr, GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8),
-                       (plev > 20 ? (plev - 20) / 8 + 1 : 0));
-               break;
-       case 6:
-               /* Character Armour */
-               set_shield(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev > 14) set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev > 19) set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev > 24) set_oppose_cold(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev > 29) set_oppose_elec(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev > 34) set_oppose_pois(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               break;
-       case 7:
-               /* Psychometry */
-               if (plev < 25)
-                       return psychometry(caster_ptr);
-               else
-                       return ident_spell(caster_ptr, FALSE, 0);
-       case 8:
-               /* Mindwave */
-               msg_print(_("精神を捻じ曲げる波動を発生させた!", "Mind-warping forces emanate from your brain!"));
-
-               if (plev < 25)
-                       project(caster_ptr, 0, 2 + plev / 10, caster_ptr->y, caster_ptr->x,
-                       (plev * 3), GF_PSI, PROJECT_KILL, -1);
-               else
-                       (void)mindblast_monsters(caster_ptr, randint1(plev * ((plev - 5) / 10 + 1)));
-               break;
-       case 9:
-               /* Adrenaline */
-               set_afraid(caster_ptr, 0);
-               set_stun(caster_ptr, 0);
-
-               /*
-                * Only heal when Adrenalin Channeling is not active. We check
-                * that by checking if the player isn't fast and 'heroed' atm.
-                */
-               if (!is_fast(caster_ptr) || !is_hero(caster_ptr))
-               {
-                       hp_player(caster_ptr, plev);
-               }
-
-               t = 10 + randint1((plev * 3) / 2);
-               set_hero(caster_ptr, t, FALSE);
-               /* Haste */
-               (void)set_fast(caster_ptr, t, FALSE);
-               break;
-       case 10:
-               /* Telekinesis */
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               fetch_item(caster_ptr, dir, plev * 15, FALSE);
-
-               break;
-       case 11:
-               /* Psychic Drain */
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               b = damroll(plev / 2, 6);
-
-               /* This is always a radius-0 ball now */
-               if (fire_ball(caster_ptr, GF_PSI_DRAIN, dir, b, 0))
-                       caster_ptr->energy_need += randint1(150);
-               break;
-       case 12:
-               /* psycho-spear */
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               fire_beam(caster_ptr, GF_PSY_SPEAR, dir, randint1(plev*3)+plev*3);
-               break;
-       case 13:
-       {
-               time_walk(caster_ptr);
-               break;
-       }
-       default:
-               msg_print(_("なに?", "Zap?"));
-       }
-
-       return TRUE;
+    int b = 0;
+    DIRECTION dir;
+    TIME_EFFECT t;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    /* spell code */
+    switch (spell) {
+    case 0: /* Precog */
+        if (plev > 44) {
+            chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
+            chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
+            wiz_lite(caster_ptr, FALSE);
+        } else if (plev > 19)
+            map_area(caster_ptr, DETECT_RAD_MAP);
+
+        if (plev < 30) {
+            b = detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
+            if (plev > 14)
+                b |= detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
+            if (plev > 4) {
+                b |= detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
+                b |= detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
+            }
+        } else {
+            b = detect_all(caster_ptr, DETECT_RAD_DEFAULT);
+        }
+
+        if ((plev > 24) && (plev < 40))
+            set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
+
+        if (!b)
+            msg_print(_("安全な気がする。", "You feel safe."));
+
+        break;
+    case 1:
+        /* Mindblast */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        if (randint1(100) < plev * 2)
+            fire_beam(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
+        else
+            fire_ball(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
+        break;
+    case 2:
+        /* Minor displace */
+        teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
+        break;
+    case 3:
+        /* Major displace */
+        teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
+        break;
+    case 4:
+        /* Domination */
+        if (plev < 30) {
+            if (!get_aim_dir(caster_ptr, &dir))
+                return FALSE;
+
+            fire_ball(caster_ptr, GF_DOMINATION, dir, plev, 0);
+        } else {
+            charm_monsters(caster_ptr, plev * 2);
+        }
+        break;
+    case 5:
+        /* Fist of Force  ---  not 'true' TK  */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_ball(caster_ptr, GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8), (plev > 20 ? (plev - 20) / 8 + 1 : 0));
+        break;
+    case 6:
+        /* Character Armour */
+        set_shield(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 14)
+            set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 19)
+            set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 24)
+            set_oppose_cold(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 29)
+            set_oppose_elec(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 34)
+            set_oppose_pois(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        break;
+    case 7:
+        /* Psychometry */
+        if (plev < 25)
+            return psychometry(caster_ptr);
+        else
+            return ident_spell(caster_ptr, FALSE, 0);
+    case 8:
+        /* Mindwave */
+        msg_print(_("精神を捻じ曲げる波動を発生させた!", "Mind-warping forces emanate from your brain!"));
+
+        if (plev < 25)
+            project(caster_ptr, 0, 2 + plev / 10, caster_ptr->y, caster_ptr->x, (plev * 3), GF_PSI, PROJECT_KILL, -1);
+        else
+            (void)mindblast_monsters(caster_ptr, randint1(plev * ((plev - 5) / 10 + 1)));
+        break;
+    case 9:
+        /* Adrenaline */
+        set_afraid(caster_ptr, 0);
+        set_stun(caster_ptr, 0);
+
+        /*
+         * Only heal when Adrenalin Channeling is not active. We check
+         * that by checking if the player isn't fast and 'heroed' atm.
+         */
+        if (!is_fast(caster_ptr) || !is_hero(caster_ptr)) {
+            hp_player(caster_ptr, plev);
+        }
+
+        t = 10 + randint1((plev * 3) / 2);
+        set_hero(caster_ptr, t, FALSE);
+        /* Haste */
+        (void)set_fast(caster_ptr, t, FALSE);
+        break;
+    case 10:
+        /* Telekinesis */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fetch_item(caster_ptr, dir, plev * 15, FALSE);
+
+        break;
+    case 11:
+        /* Psychic Drain */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        b = damroll(plev / 2, 6);
+
+        /* This is always a radius-0 ball now */
+        if (fire_ball(caster_ptr, GF_PSI_DRAIN, dir, b, 0))
+            caster_ptr->energy_need += randint1(150);
+        break;
+    case 12:
+        /* psycho-spear */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_beam(caster_ptr, GF_PSY_SPEAR, dir, randint1(plev * 3) + plev * 3);
+        break;
+    case 13: {
+        time_walk(caster_ptr);
+        break;
+    }
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+
+    return TRUE;
 }
 
 /*!
@@ -1233,107 +1326,108 @@ static bool cast_mindcrafter_spell(player_type *caster_ptr, int spell)
  */
 static bool cast_force_spell(player_type *caster_ptr, int spell)
 {
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-       int boost = get_current_ki(caster_ptr);
-
-       if (heavy_armor(caster_ptr)) boost /= 2;
-
-       /* spell code */
-       switch (spell)
-       {
-       case 0:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_ball(caster_ptr, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5) + boost / 12, 4), 0);
-               break;
-       case 1:
-               (void)lite_area(caster_ptr, damroll(2, (plev / 2)), (plev / 10) + 1);
-               break;
-       case 2:
-               set_tim_levitation(caster_ptr, randint1(30) + 30 + boost / 5, FALSE);
-               break;
-       case 3:
-               project_length = plev / 8 + 3;
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               fire_beam(caster_ptr, GF_MISSILE, dir, damroll(5 + ((plev - 1) / 5) + boost / 10, 5));
-               break;
-       case 4:
-               set_resist_magic(caster_ptr, randint1(20) + 20 + boost / 5, FALSE);
-               break;
-       case 5:
-               msg_print(_("気を練った。", "You improved the Force."));
-               set_current_ki(caster_ptr, FALSE, 70 + plev);
-               caster_ptr->update |= (PU_BONUS);
-               if (randint1(get_current_ki(caster_ptr)) > (plev * 4 + 120))
-               {
-                       msg_print(_("気が暴走した!", "The Force exploded!"));
-                       fire_ball(caster_ptr, GF_MANA, 0, get_current_ki(caster_ptr) / 2, 10);
-                       take_hit(caster_ptr, DAMAGE_LOSELIFE, caster_ptr->magic_num1[0] / 2, _("気の暴走", "Explosion of the Force"), -1);
-               }
-               else return TRUE;
-               break;
-       case 6:
-               set_tim_sh_force(caster_ptr, randint1(plev / 2) + 15 + boost / 7, FALSE);
-               break;
-       case 7:
-               return shock_power(caster_ptr);
-               break;
-       case 8:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_ball(caster_ptr, GF_MISSILE, dir, damroll(10, 6) + plev * 3 / 2 + boost * 3 / 5, (plev < 30) ? 2 : 3);
-               break;
-       case 9:
-       {
-               MONSTER_IDX m_idx;
-
-               if (!target_set(caster_ptr, TARGET_KILL)) return FALSE;
-               m_idx = caster_ptr->current_floor_ptr->grid_array[target_row][target_col].m_idx;
-               if (!m_idx) break;
-               if (!player_has_los_bold(caster_ptr, target_row, target_col)) break;
-               if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col)) break;
-               dispel_monster_status(caster_ptr, m_idx);
-               break;
-       }
-       case 10:
-       {
-               int i;
-               bool success = FALSE;
-
-               for (i = 0; i < 1 + boost/100; i++)
-                       if (summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_PHANTOM, PM_FORCE_PET))
-                               success = TRUE;
-               if (success)
-               {
-                       msg_print(_("御用でございますが、御主人様?", "'Your wish, master?'"));
-               }
-               else
-               {
-                       msg_print(_("何も現れなかった。", "Nothing happen."));
-               }
-               break;
-       }
-       case 11:
-               fire_ball(caster_ptr, GF_FIRE, 0, 200 + (2 * plev) + boost * 2, 10);
-               break;
-       case 12:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-               fire_beam(caster_ptr, GF_MANA, dir, damroll(10 + (plev / 2) + boost * 3 / 10, 15));
-               break;
-       case 13:
-               set_lightspeed(caster_ptr, randint1(16) + 16 + boost / 20, FALSE);
-               break;
-       default:
-               msg_print(_("なに?", "Zap?"));
-       }
-
-       set_current_ki(caster_ptr, TRUE, 0);
-       caster_ptr->update |= (PU_BONUS);
-
-       return TRUE;
-}
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+    int boost = get_current_ki(caster_ptr);
+
+    if (heavy_armor(caster_ptr))
+        boost /= 2;
+
+    /* spell code */
+    switch (spell) {
+    case 0:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_ball(caster_ptr, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5) + boost / 12, 4), 0);
+        break;
+    case 1:
+        (void)lite_area(caster_ptr, damroll(2, (plev / 2)), (plev / 10) + 1);
+        break;
+    case 2:
+        set_tim_levitation(caster_ptr, randint1(30) + 30 + boost / 5, FALSE);
+        break;
+    case 3:
+        project_length = plev / 8 + 3;
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_beam(caster_ptr, GF_MISSILE, dir, damroll(5 + ((plev - 1) / 5) + boost / 10, 5));
+        break;
+    case 4:
+        set_resist_magic(caster_ptr, randint1(20) + 20 + boost / 5, FALSE);
+        break;
+    case 5:
+        msg_print(_("気を練った。", "You improved the Force."));
+        set_current_ki(caster_ptr, FALSE, 70 + plev);
+        caster_ptr->update |= (PU_BONUS);
+        if (randint1(get_current_ki(caster_ptr)) > (plev * 4 + 120)) {
+            msg_print(_("気が暴走した!", "The Force exploded!"));
+            fire_ball(caster_ptr, GF_MANA, 0, get_current_ki(caster_ptr) / 2, 10);
+            take_hit(caster_ptr, DAMAGE_LOSELIFE, caster_ptr->magic_num1[0] / 2, _("気の暴走", "Explosion of the Force"), -1);
+        } else
+            return TRUE;
+        break;
+    case 6:
+        set_tim_sh_force(caster_ptr, randint1(plev / 2) + 15 + boost / 7, FALSE);
+        break;
+    case 7:
+        return shock_power(caster_ptr);
+        break;
+    case 8:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_ball(caster_ptr, GF_MISSILE, dir, damroll(10, 6) + plev * 3 / 2 + boost * 3 / 5, (plev < 30) ? 2 : 3);
+        break;
+    case 9: {
+        MONSTER_IDX m_idx;
+
+        if (!target_set(caster_ptr, TARGET_KILL))
+            return FALSE;
+        m_idx = caster_ptr->current_floor_ptr->grid_array[target_row][target_col].m_idx;
+        if (!m_idx)
+            break;
+        if (!player_has_los_bold(caster_ptr, target_row, target_col))
+            break;
+        if (!projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col))
+            break;
+        dispel_monster_status(caster_ptr, m_idx);
+        break;
+    }
+    case 10: {
+        int i;
+        bool success = FALSE;
+
+        for (i = 0; i < 1 + boost / 100; i++)
+            if (summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_PHANTOM, PM_FORCE_PET))
+                success = TRUE;
+        if (success) {
+            msg_print(_("御用でございますが、御主人様?", "'Your wish, master?'"));
+        } else {
+            msg_print(_("何も現れなかった。", "Nothing happen."));
+        }
+        break;
+    }
+    case 11:
+        fire_ball(caster_ptr, GF_FIRE, 0, 200 + (2 * plev) + boost * 2, 10);
+        break;
+    case 12:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_beam(caster_ptr, GF_MANA, dir, damroll(10 + (plev / 2) + boost * 3 / 10, 15));
+        break;
+    case 13:
+        set_lightspeed(caster_ptr, randint1(16) + 16 + boost / 20, FALSE);
+        break;
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+
+    set_current_ki(caster_ptr, TRUE, 0);
+    caster_ptr->update |= (PU_BONUS);
 
+    return TRUE;
+}
 
 /*!
  * @brief 現在フロアに存在している鏡の数を数える / calculate mirrors
@@ -1341,16 +1435,16 @@ static bool cast_force_spell(player_type *caster_ptr, int spell)
  */
 static int number_of_mirrors(floor_type *floor_ptr)
 {
-       int val = 0;
-       for (POSITION x = 0; x < floor_ptr->width; x++) {
-               for (POSITION y = 0; y < floor_ptr->height; y++) {
-                       if (is_mirror_grid(&floor_ptr->grid_array[y][x])) val++;
-               }
-       }
-
-       return val;
-}
+    int val = 0;
+    for (POSITION x = 0; x < floor_ptr->width; x++) {
+        for (POSITION y = 0; y < floor_ptr->height; y++) {
+            if (is_mirror_grid(&floor_ptr->grid_array[y][x]))
+                val++;
+        }
+    }
 
+    return val;
+}
 
 /*!
  * @brief 鏡魔法の発動 /
@@ -1360,147 +1454,155 @@ static int number_of_mirrors(floor_type *floor_ptr)
  */
 static bool cast_mirror_spell(player_type *caster_ptr, int spell)
 {
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-       int tmp;
-       TIME_EFFECT t;
-       POSITION x, y;
-
-       /* spell code */
-       switch (spell)
-       {
-               /* mirror of seeing */
-       case 0:
-               tmp = is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]) ? 4 : 0;
-               if (plev + tmp > 4)detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
-               if (plev + tmp > 18)detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
-               if (plev + tmp > 28)set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               if (plev + tmp > 38)map_area(caster_ptr, DETECT_RAD_MAP);
-               if (tmp == 0 && plev < 5) {
-                       msg_print(_("鏡がなくて集中できなかった!", "You need a mirror to concentrate!"));
-               }
-               break;
-               /* drip of light */
-       case 1:
-               if (number_of_mirrors(caster_ptr->current_floor_ptr) < 4 + plev / 10) {
-                       place_mirror(caster_ptr);
-               }
-               else {
-                       msg_format(_("これ以上鏡は制御できない!", "There are too many mirrors to control!"));
-               }
-               break;
-       case 2:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               if (plev > 9 && is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x])) {
-                       fire_beam(caster_ptr, GF_LITE, dir, damroll(3 + ((plev - 1) / 5), 4));
-               }
-               else {
-                       fire_bolt(caster_ptr, GF_LITE, dir, damroll(3 + ((plev - 1) / 5), 4));
-               }
-               break;
-               /* warped mirror */
-       case 3:
-               teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
-               break;
-               /* mirror of light */
-       case 4:
-               (void)lite_area(caster_ptr, damroll(2, (plev / 2)), (plev / 10) + 1);
-               break;
-               /* mirror of wandering */
-       case 5:
-               teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
-               break;
-               /* robe of dust */
-       case 6:
-               set_dustrobe(caster_ptr, 20 + randint1(20), FALSE);
-               break;
-               /* banishing mirror */
-       case 7:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, plev);
-               break;
-               /* mirror clashing */
-       case 8:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_ball(caster_ptr, GF_SHARDS, dir, damroll(8 + ((plev - 5) / 4), 8),
-                       (plev > 20 ? (plev - 20) / 8 + 1 : 0));
-               break;
-               /* mirror sleeping */
-       case 9:
-               for (x = 0; x < caster_ptr->current_floor_ptr->width; x++) {
-                       for (y = 0; y < caster_ptr->current_floor_ptr->height; y++) {
-                               if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x])) {
-                                       project(caster_ptr, 0, 2, y, x, (HIT_POINT)plev, GF_OLD_SLEEP, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
-                               }
-                       }
-               }
-               break;
-               /* seeker ray */
-       case 10:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_beam(caster_ptr, GF_SEEKER, dir, damroll(11 + (plev - 5) / 4, 8));
-               break;
-               /* seal of mirror */
-       case 11:
-               seal_of_mirror(caster_ptr, plev * 4 + 100);
-               break;
-               /* shield of water */
-       case 12:
-               t = 20 + randint1(20);
-               set_shield(caster_ptr, t, FALSE);
-               if (plev > 31)set_tim_reflect(caster_ptr, t, FALSE);
-               if (plev > 39)set_resist_magic(caster_ptr, t, FALSE);
-               break;
-               /* super ray */
-       case 13:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_beam(caster_ptr, GF_SUPER_RAY, dir, 150 + randint1(2 * plev));
-               break;
-               /* illusion light */
-       case 14:
-               tmp = is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]) ? 4 : 3;
-               slow_monsters(caster_ptr, plev);
-               stun_monsters(caster_ptr, plev*tmp);
-               confuse_monsters(caster_ptr, plev*tmp);
-               turn_monsters(caster_ptr, plev*tmp);
-               stun_monsters(caster_ptr, plev*tmp);
-               stasis_monsters(caster_ptr, plev*tmp);
-               break;
-               /* mirror shift */
-       case 15:
-               if (!is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x])) {
-                       msg_print(_("鏡の国の場所がわからない!", "You cannot find out where the mirror is!"));
-                       break;
-               }
-               reserve_alter_reality(caster_ptr);
-               break;
-               /* mirror tunnel */
-       case 16:
-               msg_print(_("鏡の世界を通り抜け…  ", "You try to enter the mirror..."));
-               return mirror_tunnel(caster_ptr);
-
-               /* mirror of recall */
-       case 17:
-               return recall_player(caster_ptr, randint0(21) + 15);
-               /* multi-shadow */
-       case 18:
-               set_multishadow(caster_ptr, 6 + randint1(6), FALSE);
-               break;
-               /* binding field */
-       case 19:
-               if (!binding_field(caster_ptr, plev * 11 + 5))msg_print(_("適当な鏡を選べなかった!", "You were not able to choose suitable mirrors!"));
-               break;
-               /* mirror of Ruffnor */
-       case 20:
-               (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
-               break;
-       default:
-               msg_print(_("なに?", "Zap?"));
-
-       }
-       caster_ptr->magic_num1[0] = 0;
-
-       return TRUE;
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+    int tmp;
+    TIME_EFFECT t;
+    POSITION x, y;
+
+    /* spell code */
+    switch (spell) {
+        /* mirror of seeing */
+    case 0:
+        tmp = is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]) ? 4 : 0;
+        if (plev + tmp > 4)
+            detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
+        if (plev + tmp > 18)
+            detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
+        if (plev + tmp > 28)
+            set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev + tmp > 38)
+            map_area(caster_ptr, DETECT_RAD_MAP);
+        if (tmp == 0 && plev < 5) {
+            msg_print(_("鏡がなくて集中できなかった!", "You need a mirror to concentrate!"));
+        }
+        break;
+        /* drip of light */
+    case 1:
+        if (number_of_mirrors(caster_ptr->current_floor_ptr) < 4 + plev / 10) {
+            place_mirror(caster_ptr);
+        } else {
+            msg_format(_("これ以上鏡は制御できない!", "There are too many mirrors to control!"));
+        }
+        break;
+    case 2:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        if (plev > 9 && is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x])) {
+            fire_beam(caster_ptr, GF_LITE, dir, damroll(3 + ((plev - 1) / 5), 4));
+        } else {
+            fire_bolt(caster_ptr, GF_LITE, dir, damroll(3 + ((plev - 1) / 5), 4));
+        }
+        break;
+        /* warped mirror */
+    case 3:
+        teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
+        break;
+        /* mirror of light */
+    case 4:
+        (void)lite_area(caster_ptr, damroll(2, (plev / 2)), (plev / 10) + 1);
+        break;
+        /* mirror of wandering */
+    case 5:
+        teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
+        break;
+        /* robe of dust */
+    case 6:
+        set_dustrobe(caster_ptr, 20 + randint1(20), FALSE);
+        break;
+        /* banishing mirror */
+    case 7:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        (void)fire_beam(caster_ptr, GF_AWAY_ALL, dir, plev);
+        break;
+        /* mirror clashing */
+    case 8:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_ball(caster_ptr, GF_SHARDS, dir, damroll(8 + ((plev - 5) / 4), 8), (plev > 20 ? (plev - 20) / 8 + 1 : 0));
+        break;
+        /* mirror sleeping */
+    case 9:
+        for (x = 0; x < caster_ptr->current_floor_ptr->width; x++) {
+            for (y = 0; y < caster_ptr->current_floor_ptr->height; y++) {
+                if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x])) {
+                    project(caster_ptr, 0, 2, y, x, (HIT_POINT)plev, GF_OLD_SLEEP,
+                        (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
+                }
+            }
+        }
+        break;
+        /* seeker ray */
+    case 10:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_beam(caster_ptr, GF_SEEKER, dir, damroll(11 + (plev - 5) / 4, 8));
+        break;
+        /* seal of mirror */
+    case 11:
+        seal_of_mirror(caster_ptr, plev * 4 + 100);
+        break;
+        /* shield of water */
+    case 12:
+        t = 20 + randint1(20);
+        set_shield(caster_ptr, t, FALSE);
+        if (plev > 31)
+            set_tim_reflect(caster_ptr, t, FALSE);
+        if (plev > 39)
+            set_resist_magic(caster_ptr, t, FALSE);
+        break;
+        /* super ray */
+    case 13:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_beam(caster_ptr, GF_SUPER_RAY, dir, 150 + randint1(2 * plev));
+        break;
+        /* illusion light */
+    case 14:
+        tmp = is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]) ? 4 : 3;
+        slow_monsters(caster_ptr, plev);
+        stun_monsters(caster_ptr, plev * tmp);
+        confuse_monsters(caster_ptr, plev * tmp);
+        turn_monsters(caster_ptr, plev * tmp);
+        stun_monsters(caster_ptr, plev * tmp);
+        stasis_monsters(caster_ptr, plev * tmp);
+        break;
+        /* mirror shift */
+    case 15:
+        if (!is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x])) {
+            msg_print(_("鏡の国の場所がわからない!", "You cannot find out where the mirror is!"));
+            break;
+        }
+        reserve_alter_reality(caster_ptr);
+        break;
+        /* mirror tunnel */
+    case 16:
+        msg_print(_("鏡の世界を通り抜け…  ", "You try to enter the mirror..."));
+        return mirror_tunnel(caster_ptr);
+
+        /* mirror of recall */
+    case 17:
+        return recall_player(caster_ptr, randint0(21) + 15);
+        /* multi-shadow */
+    case 18:
+        set_multishadow(caster_ptr, 6 + randint1(6), FALSE);
+        break;
+        /* binding field */
+    case 19:
+        if (!binding_field(caster_ptr, plev * 11 + 5))
+            msg_print(_("適当な鏡を選べなかった!", "You were not able to choose suitable mirrors!"));
+        break;
+        /* mirror of Ruffnor */
+    case 20:
+        (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
+        break;
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+    caster_ptr->magic_num1[0] = 0;
+
+    return TRUE;
 }
 
 /*!
@@ -1511,69 +1613,67 @@ static bool cast_mirror_spell(player_type *caster_ptr, int spell)
  */
 static bool cast_berserk_spell(player_type *caster_ptr, int spell)
 {
-       POSITION y, x;
-       DIRECTION dir;
-
-       /* spell code */
-       switch (spell)
-       {
-       case 0:
-               detect_monsters_mind(caster_ptr, DETECT_RAD_DEFAULT);
-               break;
-       case 1:
-       {
-               if (caster_ptr->riding)
-               {
-                       msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
-                       return FALSE;
-               }
-
-               if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return FALSE;
-
-               if (dir == 5) return FALSE;
-               y = caster_ptr->y + ddy[dir];
-               x = caster_ptr->x + ddx[dir];
-
-               if (!caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-               {
-                       msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                       return FALSE;
-               }
-
-               do_cmd_attack(caster_ptr, y, x, 0);
-
-               if (!player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0) || is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat))
-                       break;
-
-               y += ddy[dir];
-               x += ddx[dir];
-
-               if (player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0) && !is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat) && !caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-               {
-                       msg_print(NULL);
-                       (void)move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
-               }
-               break;
-       }
-       case 2:
-       {
-               if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return FALSE;
-               y = caster_ptr->y + ddy[dir];
-               x = caster_ptr->x + ddx[dir];
-               exe_movement(caster_ptr, dir, easy_disarm, TRUE);
-               break;
-       }
-       case 3:
-               earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 8+randint0(5), 0);
-               break;
-       case 4:
-               massacre(caster_ptr);
-               break;
-       default:
-               msg_print(_("なに?", "Zap?"));
-
-       }
-       return TRUE;
+    POSITION y, x;
+    DIRECTION dir;
+
+    /* spell code */
+    switch (spell) {
+    case 0:
+        detect_monsters_mind(caster_ptr, DETECT_RAD_DEFAULT);
+        break;
+    case 1: {
+        if (caster_ptr->riding) {
+            msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
+            return FALSE;
+        }
+
+        if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+            return FALSE;
+
+        if (dir == 5)
+            return FALSE;
+        y = caster_ptr->y + ddy[dir];
+        x = caster_ptr->x + ddx[dir];
+
+        if (!caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+            msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+            return FALSE;
+        }
+
+        do_cmd_attack(caster_ptr, y, x, 0);
+
+        if (!player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0)
+            || is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat))
+            break;
+
+        y += ddy[dir];
+        x += ddx[dir];
+
+        if (player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0)
+            && !is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat) && !caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+            msg_print(NULL);
+            (void)move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
+        }
+        break;
+    }
+    case 2: {
+        if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+            return FALSE;
+        y = caster_ptr->y + ddy[dir];
+        x = caster_ptr->x + ddx[dir];
+        exe_movement(caster_ptr, dir, easy_disarm, TRUE);
+        break;
+    }
+    case 3:
+        earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 8 + randint0(5), 0);
+        break;
+    case 4:
+        massacre(caster_ptr);
+        break;
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+    return TRUE;
 }
 
 /*!
@@ -1585,160 +1685,147 @@ static bool cast_berserk_spell(player_type *caster_ptr, int spell)
  */
 static bool cast_ninja_spell(player_type *caster_ptr, int spell)
 {
-       POSITION x = 0, y = 0;
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               (void)unlite_area(caster_ptr, 0, 3);
-               break;
-       case 1:
-               if (plev > 44)
-               {
-                       wiz_lite(caster_ptr, TRUE);
-               }
-               detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
-               if (plev > 4)
-               {
-                       detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
-                       detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
-                       detect_stairs(caster_ptr, DETECT_RAD_DEFAULT);
-               }
-               if (plev > 14)
-               {
-                       detect_objects_normal(caster_ptr, DETECT_RAD_DEFAULT);
-               }
-               break;
-       case 2:
-       {
-               teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
-               break;
-       }
-       case 3:
-       {
-               if (!(caster_ptr->special_defense & NINJA_KAWARIMI))
-               {
-                       msg_print(_("敵の攻撃に対して敏感になった。", "You are now prepared to evade any attacks."));
-                       caster_ptr->special_defense |= NINJA_KAWARIMI;
-                       caster_ptr->redraw |= (PR_STATUS);
-               }
-               break;
-       }
-       case 4:
-       {
-               teleport_player(caster_ptr, caster_ptr->lev * 5, TELEPORT_SPONTANEOUS);
-               break;
-       }
-       case 5:
-       {
-               if(!hit_and_away(caster_ptr)) return FALSE;
-               break;
-       }
-       case 6:
-       {
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               (void)stasis_monster(caster_ptr, dir);
-               break;
-       }
-       case 7:
-               return ident_spell(caster_ptr, FALSE, 0);
-       case 8:
-               set_tim_levitation(caster_ptr, randint1(20) + 20, FALSE);
-               break;
-       case 9:
-               fire_ball(caster_ptr, GF_FIRE, 0, 50+plev, plev/10+2);
-               teleport_player(caster_ptr, 30, TELEPORT_SPONTANEOUS);
-               set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               break;
-       case 10:
-               return rush_attack(caster_ptr, NULL);
-       case 11:
-       {
-               int i;
-               for (i = 0; i < 8; i++)
-               {
-                       OBJECT_IDX slot;
-
-                       for (slot = 0; slot < INVEN_PACK; slot++)
-                       {
-                               if (caster_ptr->inventory_list[slot].tval == TV_SPIKE) break;
-                       }
-                       if (slot == INVEN_PACK)
-                       {
-                               if (!i) msg_print(_("くさびを持っていない。", "You have no Iron Spikes."));
-                               else msg_print(_("くさびがなくなった。", "You have no more Iron Spikes."));
-                               return FALSE;
-                       }
-
-                       /* Gives a multiplier of 2 at first, up to 3 at 40th */
-                       do_cmd_throw(caster_ptr, 1, FALSE, slot);
-
-                       take_turn(caster_ptr, 100);
-               }
-               break;
-       }
-       case 12:
-               (void)fetch_monster(caster_ptr);
-               break;
-       case 13:
-               if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-               fire_ball(caster_ptr, GF_OLD_CONF, dir, plev*3, 3);
-               break;
-       case 14:
-               project_length = -1;
-               if (!get_aim_dir(caster_ptr, &dir))
-               {
-                       project_length = 0;
-                       return FALSE;
-               }
-               project_length = 0;
-
-               (void)teleport_swap(caster_ptr, dir);
-               break;
-       case 15:
-               explosive_rune(caster_ptr, caster_ptr->y, caster_ptr->x);
-               break;
-       case 16:
-               (void)set_pass_wall(caster_ptr, randint1(plev/2) + plev/2, FALSE);
-               set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
-               break;
-       case 17:
-               fire_ball(caster_ptr, GF_POIS, 0, 75+plev*2/3, plev/5+2);
-               fire_ball(caster_ptr, GF_HYPODYNAMIA, 0, 75+plev*2/3, plev/5+2);
-               fire_ball(caster_ptr, GF_CONFUSION, 0, 75+plev*2/3, plev/5+2);
-               teleport_player(caster_ptr, 30, TELEPORT_SPONTANEOUS);
-               break;
-       case 18:
-       {
-               int k;
-               int num = damroll(3, 9);
-
-               for (k = 0; k < num; k++)
-               {
-                       EFFECT_ID typ = one_in_(2) ? GF_FIRE : one_in_(3) ? GF_NETHER : GF_PLASMA;
-                       int attempts = 1000;
-
-                       while (attempts--)
-                       {
-                               scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 4, 0);
-
-                               if (!player_bold(caster_ptr, y, x)) break;
-                       }
-                       project(caster_ptr, 0, 0, y, x, damroll(6 + plev / 8, 10), typ,
-                               (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
-               }
-               break;
-       }
-       case 19:
-               set_multishadow(caster_ptr, 6+randint1(6), FALSE);
-               break;
-       default:
-               msg_print(_("なに?", "Zap?"));
-
-       }
-       return TRUE;
+    POSITION x = 0, y = 0;
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        (void)unlite_area(caster_ptr, 0, 3);
+        break;
+    case 1:
+        if (plev > 44) {
+            wiz_lite(caster_ptr, TRUE);
+        }
+        detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
+        if (plev > 4) {
+            detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
+            detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
+            detect_stairs(caster_ptr, DETECT_RAD_DEFAULT);
+        }
+        if (plev > 14) {
+            detect_objects_normal(caster_ptr, DETECT_RAD_DEFAULT);
+        }
+        break;
+    case 2: {
+        teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
+        break;
+    }
+    case 3: {
+        if (!(caster_ptr->special_defense & NINJA_KAWARIMI)) {
+            msg_print(_("敵の攻撃に対して敏感になった。", "You are now prepared to evade any attacks."));
+            caster_ptr->special_defense |= NINJA_KAWARIMI;
+            caster_ptr->redraw |= (PR_STATUS);
+        }
+        break;
+    }
+    case 4: {
+        teleport_player(caster_ptr, caster_ptr->lev * 5, TELEPORT_SPONTANEOUS);
+        break;
+    }
+    case 5: {
+        if (!hit_and_away(caster_ptr))
+            return FALSE;
+        break;
+    }
+    case 6: {
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        (void)stasis_monster(caster_ptr, dir);
+        break;
+    }
+    case 7:
+        return ident_spell(caster_ptr, FALSE, 0);
+    case 8:
+        set_tim_levitation(caster_ptr, randint1(20) + 20, FALSE);
+        break;
+    case 9:
+        fire_ball(caster_ptr, GF_FIRE, 0, 50 + plev, plev / 10 + 2);
+        teleport_player(caster_ptr, 30, TELEPORT_SPONTANEOUS);
+        set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        break;
+    case 10:
+        return rush_attack(caster_ptr, NULL);
+    case 11: {
+        int i;
+        for (i = 0; i < 8; i++) {
+            OBJECT_IDX slot;
+
+            for (slot = 0; slot < INVEN_PACK; slot++) {
+                if (caster_ptr->inventory_list[slot].tval == TV_SPIKE)
+                    break;
+            }
+            if (slot == INVEN_PACK) {
+                if (!i)
+                    msg_print(_("くさびを持っていない。", "You have no Iron Spikes."));
+                else
+                    msg_print(_("くさびがなくなった。", "You have no more Iron Spikes."));
+                return FALSE;
+            }
+
+            /* Gives a multiplier of 2 at first, up to 3 at 40th */
+            do_cmd_throw(caster_ptr, 1, FALSE, slot);
+
+            take_turn(caster_ptr, 100);
+        }
+        break;
+    }
+    case 12:
+        (void)fetch_monster(caster_ptr);
+        break;
+    case 13:
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+        fire_ball(caster_ptr, GF_OLD_CONF, dir, plev * 3, 3);
+        break;
+    case 14:
+        project_length = -1;
+        if (!get_aim_dir(caster_ptr, &dir)) {
+            project_length = 0;
+            return FALSE;
+        }
+        project_length = 0;
+
+        (void)teleport_swap(caster_ptr, dir);
+        break;
+    case 15:
+        explosive_rune(caster_ptr, caster_ptr->y, caster_ptr->x);
+        break;
+    case 16:
+        (void)set_pass_wall(caster_ptr, randint1(plev / 2) + plev / 2, FALSE);
+        set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        break;
+    case 17:
+        fire_ball(caster_ptr, GF_POIS, 0, 75 + plev * 2 / 3, plev / 5 + 2);
+        fire_ball(caster_ptr, GF_HYPODYNAMIA, 0, 75 + plev * 2 / 3, plev / 5 + 2);
+        fire_ball(caster_ptr, GF_CONFUSION, 0, 75 + plev * 2 / 3, plev / 5 + 2);
+        teleport_player(caster_ptr, 30, TELEPORT_SPONTANEOUS);
+        break;
+    case 18: {
+        int k;
+        int num = damroll(3, 9);
+
+        for (k = 0; k < num; k++) {
+            EFFECT_ID typ = one_in_(2) ? GF_FIRE : one_in_(3) ? GF_NETHER : GF_PLASMA;
+            int attempts = 1000;
+
+            while (attempts--) {
+                scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 4, 0);
+
+                if (!player_bold(caster_ptr, y, x))
+                    break;
+            }
+            project(caster_ptr, 0, 0, y, x, damroll(6 + plev / 8, 10), typ, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
+        }
+        break;
+    }
+    case 19:
+        set_multishadow(caster_ptr, 6 + randint1(6), FALSE);
+        break;
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+    return TRUE;
 }
 
 /*!
@@ -1747,301 +1834,308 @@ static bool cast_ninja_spell(player_type *caster_ptr, int spell)
  */
 void do_cmd_mind(player_type *caster_ptr)
 {
-       SPELL_IDX n = 0;
-       int b = 0;
-       PERCENTAGE chance;
-       PERCENTAGE minfail = 0;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-       int             old_csp = caster_ptr->csp;
-       mind_type       spell;
-       bool            cast;
-       int             use_mind, mana_cost;
-       concptr            p;
-       bool            on_mirror = FALSE;
-
-       if (cmd_limit_confused(caster_ptr)) return;
-       if (!get_mind_power(caster_ptr, &n, FALSE)) return;
+    SPELL_IDX n = 0;
+    int b = 0;
+    PERCENTAGE chance;
+    PERCENTAGE minfail = 0;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+    int old_csp = caster_ptr->csp;
+    mind_type spell;
+    bool cast;
+    int use_mind, mana_cost;
+    concptr p;
+    bool on_mirror = FALSE;
+
+    if (cmd_limit_confused(caster_ptr))
+        return;
+    if (!get_mind_power(caster_ptr, &n, FALSE))
+        return;
 
 #ifdef JP
-       switch(caster_ptr->pclass)
-       {
-               case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER; p = "精神";break;
-               case CLASS_FORCETRAINER:          use_mind = MIND_KI; p = "気";break;
-               case CLASS_BERSERKER:   use_mind = MIND_BERSERKER; p = "怒り";break;
-               case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER; p = "鏡魔法";break;
-               case CLASS_NINJA:       use_mind = MIND_NINJUTSU; p = "精神";break;
-               default:                use_mind = 0 ;p = "超能力"; break;
-       }
+    switch (caster_ptr->pclass) {
+    case CLASS_MINDCRAFTER:
+        use_mind = MIND_MINDCRAFTER;
+        p = "精神";
+        break;
+    case CLASS_FORCETRAINER:
+        use_mind = MIND_KI;
+        p = "気";
+        break;
+    case CLASS_BERSERKER:
+        use_mind = MIND_BERSERKER;
+        p = "怒り";
+        break;
+    case CLASS_MIRROR_MASTER:
+        use_mind = MIND_MIRROR_MASTER;
+        p = "鏡魔法";
+        break;
+    case CLASS_NINJA:
+        use_mind = MIND_NINJUTSU;
+        p = "精神";
+        break;
+    default:
+        use_mind = 0;
+        p = "超能力";
+        break;
+    }
 #else
-       switch(caster_ptr->pclass)
-       {
-               case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER; break;
-               case CLASS_FORCETRAINER: use_mind = MIND_KI; break;
-               case CLASS_BERSERKER:   use_mind = MIND_BERSERKER; break;
-               case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER; break;
-               case CLASS_NINJA:       use_mind = MIND_NINJUTSU; break;
-               default:                use_mind = 0; break;
-       }
-       p = "skill";
+    switch (caster_ptr->pclass) {
+    case CLASS_MINDCRAFTER:
+        use_mind = MIND_MINDCRAFTER;
+        break;
+    case CLASS_FORCETRAINER:
+        use_mind = MIND_KI;
+        break;
+    case CLASS_BERSERKER:
+        use_mind = MIND_BERSERKER;
+        break;
+    case CLASS_MIRROR_MASTER:
+        use_mind = MIND_MIRROR_MASTER;
+        break;
+    case CLASS_NINJA:
+        use_mind = MIND_NINJUTSU;
+        break;
+    default:
+        use_mind = 0;
+        break;
+    }
+    p = "skill";
 #endif
-       spell = mind_powers[use_mind].info[n];
-
-       /* Spell failure chance */
-       chance = spell.fail;
-
-       mana_cost = spell.mana_cost;
-       if (use_mind == MIND_KI)
-       {
-               if (heavy_armor(caster_ptr)) chance += 20;
-               if (caster_ptr->icky_wield[0]) chance += 20;
-               else if (has_melee_weapon(caster_ptr, INVEN_RARM)) chance += 10;
-               if (caster_ptr->icky_wield[1]) chance += 20;
-               else if (has_melee_weapon(caster_ptr, INVEN_LARM)) chance += 10;
-               if (n == 5)
-               {
-                       int j;
-                       for (j = 0; j < get_current_ki(caster_ptr) / 50; j++)
-                               mana_cost += (j+1) * 3 / 2;
-               }
-       }
-
-       /* Verify "dangerous" spells */
-       if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
-       {
-               if (mana_cost > caster_ptr->chp)
-               {
-                       msg_print(_("HPが足りません。", "You do not have enough hp to use this power."));
-                       return;
-               }
-       }
-       else if (mana_cost > caster_ptr->csp)
-       {
-               /* Warning */
-               msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
-
-               if (!over_exert) return;
-
-               /* Verify */
-               if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? "))) return;
-
-       }
-
-       if (chance)
-       {
-               /* Reduce failure rate by "effective" level adjustment */
-               chance -= 3 * (plev - spell.min_lev);
-
-               chance += caster_ptr->to_m_chance;
-
-               /* Reduce failure rate by INT/WIS adjustment */
-               chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
-
-               /* Not enough mana to cast */
-               if ((mana_cost > caster_ptr->csp) && (use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
-               {
-                       chance += 5 * (mana_cost - caster_ptr->csp);
-               }
-
-               /* Extract the minimum failure rate */
-               minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
-
-               /* Minimum failure rate */
-               if (chance < minfail) chance = minfail;
-
-               /* Stunning makes spells harder */
-               if (caster_ptr->stun > 50) chance += 25;
-               else if (caster_ptr->stun) chance += 15;
-
-               if (use_mind == MIND_KI)
-               {
-                       if (heavy_armor(caster_ptr)) chance += 5;
-                       if (caster_ptr->icky_wield[0]) chance += 5;
-                       if (caster_ptr->icky_wield[1]) chance += 5;
-               }
-       }
-
-       /* Always a 5 percent chance of working */
-       if (chance > 95) chance = 95;
-
-       /* Failed spell */
-       if (randint0(100) < chance)
-       {
-               if (flush_failure) flush();
-               msg_format(_("%sの集中に失敗した!", "You failed to concentrate hard enough for %s!"), p);
-
-               sound(SOUND_FAIL);
-
-               if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
-               {
-                       if ((use_mind == MIND_KI) && (n != 5) && get_current_ki(caster_ptr))
-                       {
-                               msg_print(_("気が散ってしまった...", "Your improved Force has gone away..."));
-                               set_current_ki(caster_ptr, TRUE, 0);
-                       }
-
-                       if (randint1(100) < (chance / 2))
-                       {
-                               /* Backfire */
-                         b = randint1(100);
-
-                         if( use_mind == MIND_MINDCRAFTER ){
-                               if (b < 5)
-                               {
-                                       msg_print(_("なんてこった!頭の中が真っ白になった!", "Oh, no! Your mind has gone blank!"));
-                                       lose_all_info(caster_ptr);
-                               }
-                               else if (b < 15)
-                               {
-                                       msg_print(_("奇妙な光景が目の前で踊っている...", "Weird visions seem to dance before your eyes..."));
-                                       set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
-                               }
-                               else if (b < 45)
-                               {
-                                       msg_print(_("あなたの頭は混乱した!", "Your brain is addled!"));
-                                       set_confused(caster_ptr, caster_ptr->confused + randint1(8));
-                               }
-                               else if (b < 90)
-                               {
-                                       set_stun(caster_ptr, caster_ptr->stun + randint1(8));
-                               }
-                               else
-                               {
-                                       /* Mana storm */
-                                       msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
-
-                                       project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2,
-                                               GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
-                                       caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
-                               }
-                         }
-                         if( use_mind == MIND_MIRROR_MASTER ){
-                               if (b < 51)
-                               {
-                                 /* Nothing has happen */
-                               }
-                               else if (b < 81)
-                               {
-                                       msg_print(_("鏡の世界の干渉を受けた!", "Weird visions seem to dance before your eyes..."));
-                                       teleport_player(caster_ptr, 10, TELEPORT_PASSIVE);
-                               }
-                               else if (b < 96)
-                               {
-                                       msg_print(_("まわりのものがキラキラ輝いている!", "Your brain is addled!"));
-                                       set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
-                               }
-                               else
-                               {
-                                       /* Mana storm */
-                                       msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
-
-                                       project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2,
-                                               GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
-                                       caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
-                               }
-                         }
-                       }
-               }
-       }
-       else
-       {
-               sound(SOUND_ZAP);
-
-               switch(use_mind)
-               {
-               case MIND_MINDCRAFTER:
-                       
-                       cast = cast_mindcrafter_spell(caster_ptr, n);
-                       break;
-               case MIND_KI:
-                       
-                       cast = cast_force_spell(caster_ptr, n);
-                       break;
-               case MIND_BERSERKER:
-                       
-                       cast = cast_berserk_spell(caster_ptr, n);
-                       break;
-               case MIND_MIRROR_MASTER:
-                       
-                       if(is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]) )on_mirror = TRUE;
-                       cast = cast_mirror_spell(caster_ptr, n);
-                       break;
-               case MIND_NINJUTSU:
-                       
-                       cast = cast_ninja_spell(caster_ptr, n);
-                       break;
-               default:
-                       msg_format(_("謎の能力:%d, %d", "Mystery power:%d, %d"),use_mind, n);
-                       return;
-               }
-
-               if (!cast) return;
-       }
-
-
-       /* teleport from mirror costs small energy */
-       if(on_mirror && caster_ptr->pclass == CLASS_MIRROR_MASTER)
-       {
-         if( n==3 || n==5 || n==7 || n==16 ) take_turn(caster_ptr, 50);
-       }
-       else
-       {
-               take_turn(caster_ptr, 100);
-       }
-
-       if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
-       {
-               take_hit(caster_ptr, DAMAGE_USELIFE, mana_cost, _("過度の集中", "concentrating too hard"), -1);
-               /* Redraw hp */
-               caster_ptr->redraw |= (PR_HP);
-       }
-
-       /* Sufficient mana */
-       else if (mana_cost <= old_csp)
-       {
-               /* Use some mana */
-               caster_ptr->csp -= mana_cost;
-
-               /* Limit */
-               if (caster_ptr->csp < 0) caster_ptr->csp = 0;
-
-               if ((use_mind == MIND_MINDCRAFTER) && (n == 13))
-               {
-                       /* No mana left */
-                       caster_ptr->csp = 0;
-                       caster_ptr->csp_frac = 0;
-               }
-       }
-
-       /* Over-exert the player */
-       else
-       {
-               int oops = mana_cost - old_csp;
-
-               /* No mana left */
-               if ((caster_ptr->csp - mana_cost) < 0) caster_ptr->csp_frac = 0;
-               caster_ptr->csp = MAX(0, caster_ptr->csp - mana_cost);
-
-               msg_format(_("%sを集中しすぎて気を失ってしまった!", "You faint from the effort!"),p);
-
-               /* Hack -- Bypass free action */
-               (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
-
-               /* Damage WIS (possibly permanently) */
-               if (randint0(100) < 50)
-               {
-                       bool perm = (randint0(100) < 25);
-
-                       msg_print(_("自分の精神を攻撃してしまった!", "You have damaged your mind!"));
-
-                       /* Reduce constitution */
-                       (void)dec_stat(caster_ptr, A_WIS, 15 + randint1(10), perm);
-               }
-       }
-       caster_ptr->redraw |= (PR_MANA);
-       caster_ptr->window |= (PW_PLAYER);
-       caster_ptr->window |= (PW_SPELL);
-}
+    spell = mind_powers[use_mind].info[n];
+
+    /* Spell failure chance */
+    chance = spell.fail;
+
+    mana_cost = spell.mana_cost;
+    if (use_mind == MIND_KI) {
+        if (heavy_armor(caster_ptr))
+            chance += 20;
+        if (caster_ptr->icky_wield[0])
+            chance += 20;
+        else if (has_melee_weapon(caster_ptr, INVEN_RARM))
+            chance += 10;
+        if (caster_ptr->icky_wield[1])
+            chance += 20;
+        else if (has_melee_weapon(caster_ptr, INVEN_LARM))
+            chance += 10;
+        if (n == 5) {
+            int j;
+            for (j = 0; j < get_current_ki(caster_ptr) / 50; j++)
+                mana_cost += (j + 1) * 3 / 2;
+        }
+    }
+
+    /* Verify "dangerous" spells */
+    if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) {
+        if (mana_cost > caster_ptr->chp) {
+            msg_print(_("HPが足りません。", "You do not have enough hp to use this power."));
+            return;
+        }
+    } else if (mana_cost > caster_ptr->csp) {
+        /* Warning */
+        msg_print(_("MPが足りません。", "You do not have enough mana to use this power."));
+
+        if (!over_exert)
+            return;
+
+        /* Verify */
+        if (!get_check(_("それでも挑戦しますか? ", "Attempt it anyway? ")))
+            return;
+    }
+
+    if (chance) {
+        /* Reduce failure rate by "effective" level adjustment */
+        chance -= 3 * (plev - spell.min_lev);
+
+        chance += caster_ptr->to_m_chance;
+
+        /* Reduce failure rate by INT/WIS adjustment */
+        chance -= 3 * (adj_mag_stat[caster_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
+
+        /* Not enough mana to cast */
+        if ((mana_cost > caster_ptr->csp) && (use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU)) {
+            chance += 5 * (mana_cost - caster_ptr->csp);
+        }
+
+        /* Extract the minimum failure rate */
+        minfail = adj_mag_fail[caster_ptr->stat_ind[mp_ptr->spell_stat]];
+
+        /* Minimum failure rate */
+        if (chance < minfail)
+            chance = minfail;
+
+        /* Stunning makes spells harder */
+        if (caster_ptr->stun > 50)
+            chance += 25;
+        else if (caster_ptr->stun)
+            chance += 15;
+
+        if (use_mind == MIND_KI) {
+            if (heavy_armor(caster_ptr))
+                chance += 5;
+            if (caster_ptr->icky_wield[0])
+                chance += 5;
+            if (caster_ptr->icky_wield[1])
+                chance += 5;
+        }
+    }
+
+    /* Always a 5 percent chance of working */
+    if (chance > 95)
+        chance = 95;
+
+    /* Failed spell */
+    if (randint0(100) < chance) {
+        if (flush_failure)
+            flush();
+        msg_format(_("%sの集中に失敗した!", "You failed to concentrate hard enough for %s!"), p);
+
+        sound(SOUND_FAIL);
+
+        if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU)) {
+            if ((use_mind == MIND_KI) && (n != 5) && get_current_ki(caster_ptr)) {
+                msg_print(_("気が散ってしまった...", "Your improved Force has gone away..."));
+                set_current_ki(caster_ptr, TRUE, 0);
+            }
+
+            if (randint1(100) < (chance / 2)) {
+                /* Backfire */
+                b = randint1(100);
+
+                if (use_mind == MIND_MINDCRAFTER) {
+                    if (b < 5) {
+                        msg_print(_("なんてこった!頭の中が真っ白になった!", "Oh, no! Your mind has gone blank!"));
+                        lose_all_info(caster_ptr);
+                    } else if (b < 15) {
+                        msg_print(_("奇妙な光景が目の前で踊っている...", "Weird visions seem to dance before your eyes..."));
+                        set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
+                    } else if (b < 45) {
+                        msg_print(_("あなたの頭は混乱した!", "Your brain is addled!"));
+                        set_confused(caster_ptr, caster_ptr->confused + randint1(8));
+                    } else if (b < 90) {
+                        set_stun(caster_ptr, caster_ptr->stun + randint1(8));
+                    } else {
+                        /* Mana storm */
+                        msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
+
+                        project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2, GF_MANA,
+                            PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
+                        caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
+                    }
+                }
+                if (use_mind == MIND_MIRROR_MASTER) {
+                    if (b < 51) {
+                        /* Nothing has happen */
+                    } else if (b < 81) {
+                        msg_print(_("鏡の世界の干渉を受けた!", "Weird visions seem to dance before your eyes..."));
+                        teleport_player(caster_ptr, 10, TELEPORT_PASSIVE);
+                    } else if (b < 96) {
+                        msg_print(_("まわりのものがキラキラ輝いている!", "Your brain is addled!"));
+                        set_image(caster_ptr, caster_ptr->image + 5 + randint1(10));
+                    } else {
+                        /* Mana storm */
+                        msg_format(_("%sの力が制御できない氾流となって解放された!", "Your mind unleashes its power in an uncontrollable storm!"), p);
+
+                        project(caster_ptr, PROJECT_WHO_UNCTRL_POWER, 2 + plev / 10, caster_ptr->y, caster_ptr->x, plev * 2, GF_MANA,
+                            PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
+                        caster_ptr->csp = MAX(0, caster_ptr->csp - plev * MAX(1, plev / 10));
+                    }
+                }
+            }
+        }
+    } else {
+        sound(SOUND_ZAP);
+
+        switch (use_mind) {
+        case MIND_MINDCRAFTER:
+
+            cast = cast_mindcrafter_spell(caster_ptr, n);
+            break;
+        case MIND_KI:
+
+            cast = cast_force_spell(caster_ptr, n);
+            break;
+        case MIND_BERSERKER:
+
+            cast = cast_berserk_spell(caster_ptr, n);
+            break;
+        case MIND_MIRROR_MASTER:
+
+            if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[caster_ptr->y][caster_ptr->x]))
+                on_mirror = TRUE;
+            cast = cast_mirror_spell(caster_ptr, n);
+            break;
+        case MIND_NINJUTSU:
+
+            cast = cast_ninja_spell(caster_ptr, n);
+            break;
+        default:
+            msg_format(_("謎の能力:%d, %d", "Mystery power:%d, %d"), use_mind, n);
+            return;
+        }
+
+        if (!cast)
+            return;
+    }
+
+    /* teleport from mirror costs small energy */
+    if (on_mirror && caster_ptr->pclass == CLASS_MIRROR_MASTER) {
+        if (n == 3 || n == 5 || n == 7 || n == 16)
+            take_turn(caster_ptr, 50);
+    } else {
+        take_turn(caster_ptr, 100);
+    }
+
+    if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) {
+        take_hit(caster_ptr, DAMAGE_USELIFE, mana_cost, _("過度の集中", "concentrating too hard"), -1);
+        /* Redraw hp */
+        caster_ptr->redraw |= (PR_HP);
+    }
+
+    /* Sufficient mana */
+    else if (mana_cost <= old_csp) {
+        /* Use some mana */
+        caster_ptr->csp -= mana_cost;
+
+        /* Limit */
+        if (caster_ptr->csp < 0)
+            caster_ptr->csp = 0;
+
+        if ((use_mind == MIND_MINDCRAFTER) && (n == 13)) {
+            /* No mana left */
+            caster_ptr->csp = 0;
+            caster_ptr->csp_frac = 0;
+        }
+    }
+
+    /* Over-exert the player */
+    else {
+        int oops = mana_cost - old_csp;
 
+        /* No mana left */
+        if ((caster_ptr->csp - mana_cost) < 0)
+            caster_ptr->csp_frac = 0;
+        caster_ptr->csp = MAX(0, caster_ptr->csp - mana_cost);
+
+        msg_format(_("%sを集中しすぎて気を失ってしまった!", "You faint from the effort!"), p);
+
+        /* Hack -- Bypass free action */
+        (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(5 * oops + 1));
+
+        /* Damage WIS (possibly permanently) */
+        if (randint0(100) < 50) {
+            bool perm = (randint0(100) < 25);
+
+            msg_print(_("自分の精神を攻撃してしまった!", "You have damaged your mind!"));
+
+            /* Reduce constitution */
+            (void)dec_stat(caster_ptr, A_WIS, 15 + randint1(10), perm);
+        }
+    }
+    caster_ptr->redraw |= (PR_MANA);
+    caster_ptr->window |= (PW_PLAYER);
+    caster_ptr->window |= (PW_SPELL);
+}
 
 /*!
  * @brief 現在プレイヤーが使用可能な特殊技能の一覧表示 /
@@ -2049,48 +2143,48 @@ void do_cmd_mind(player_type *caster_ptr)
  */
 void do_cmd_mind_browse(player_type *caster_ptr)
 {
-       SPELL_IDX n = 0;
-       int j, line;
-       char temp[62*5];
-       int use_mind = 0;
-
-       if (caster_ptr->pclass == CLASS_MINDCRAFTER) use_mind = MIND_MINDCRAFTER;
-       else if (caster_ptr->pclass == CLASS_FORCETRAINER) use_mind = MIND_KI;
-       else if (caster_ptr->pclass == CLASS_BERSERKER) use_mind = MIND_BERSERKER;
-       else if (caster_ptr->pclass == CLASS_NINJA) use_mind = MIND_NINJUTSU;
-       else if (caster_ptr->pclass == CLASS_MIRROR_MASTER)
-         use_mind = MIND_MIRROR_MASTER;
-
-       screen_save();
-
-       while (TRUE)
-       {
-               if (!get_mind_power(caster_ptr, &n, TRUE))
-               {
-                       screen_load();
-                       return;
-               }
-
-               /* Clear lines, position cursor  (really should use strlen here) */
-               term_erase(12, 21, 255);
-               term_erase(12, 20, 255);
-               term_erase(12, 19, 255);
-               term_erase(12, 18, 255);
-               term_erase(12, 17, 255);
-               term_erase(12, 16, 255);
-
-               shape_buffer(mind_tips[use_mind][n], 62, temp, sizeof(temp));
-               for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
-               {
-                       prt(&temp[j], line, 15);
-                       line++;
-               }
-               switch (use_mind)
-               {
-               case MIND_MIRROR_MASTER:
-               case MIND_NINJUTSU:
-                 prt(_("何かキーを押して下さい。", "Hit any key."),0,0);
-                 (void)inkey();
-               }
-       }
+    SPELL_IDX n = 0;
+    int j, line;
+    char temp[62 * 5];
+    int use_mind = 0;
+
+    if (caster_ptr->pclass == CLASS_MINDCRAFTER)
+        use_mind = MIND_MINDCRAFTER;
+    else if (caster_ptr->pclass == CLASS_FORCETRAINER)
+        use_mind = MIND_KI;
+    else if (caster_ptr->pclass == CLASS_BERSERKER)
+        use_mind = MIND_BERSERKER;
+    else if (caster_ptr->pclass == CLASS_NINJA)
+        use_mind = MIND_NINJUTSU;
+    else if (caster_ptr->pclass == CLASS_MIRROR_MASTER)
+        use_mind = MIND_MIRROR_MASTER;
+
+    screen_save();
+
+    while (TRUE) {
+        if (!get_mind_power(caster_ptr, &n, TRUE)) {
+            screen_load();
+            return;
+        }
+
+        /* Clear lines, position cursor  (really should use strlen here) */
+        term_erase(12, 21, 255);
+        term_erase(12, 20, 255);
+        term_erase(12, 19, 255);
+        term_erase(12, 18, 255);
+        term_erase(12, 17, 255);
+        term_erase(12, 16, 255);
+
+        shape_buffer(mind_tips[use_mind][n], 62, temp, sizeof(temp));
+        for (j = 0, line = 17; temp[j]; j += (1 + strlen(&temp[j]))) {
+            prt(&temp[j], line, 15);
+            line++;
+        }
+        switch (use_mind) {
+        case MIND_MIRROR_MASTER:
+        case MIND_NINJUTSU:
+            prt(_("何かキーを押して下さい。", "Hit any key."), 0, 0);
+            (void)inkey();
+        }
+    }
 }
index 2d8e7bc..8908eb5 100644 (file)
@@ -1,8 +1,8 @@
 #include "mind/mind-warrior.h"
 #include "cmd-action/cmd-attack.h"
-#include "io/targeting.h"
 #include "spell-kind/spells-teleport.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 4cfaca0..6533152 100644 (file)
@@ -11,7 +11,6 @@
 #include "core/speed-table.h"
 #include "core/stuff-handler.h"
 #include "game-option/cheat-options.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "mind/mind-force-trainer.h"
 #include "monster-race/race-flags1.h"
 #include "monster-race/race-flags3.h"
 #include "monster/monster-status.h"
-#include "system/floor-type-definition.h"
 #include "player/attack-defense-types.h"
 #include "player/special-defense-types.h"
+#include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
 #include "world/world.h"
index aa734c7..f1face8 100644 (file)
@@ -3,7 +3,6 @@
 #include "core/stuff-handler.h"
 #include "floor/floor-object.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags2.h"
 #include "monster-race/race-flags7.h"
@@ -13,6 +12,7 @@
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 
 /*!
  * @brief モンスター配列からモンスターを消去する / Delete a monster by index.
index 382fda2..cb27782 100644 (file)
@@ -2,18 +2,18 @@
 #include "core/stuff-handler.h"
 #include "game-option/play-record-options.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
+#include "monster-floor/monster-remover.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
 #include "monster/monster-describer.h"
 #include "monster/monster-description-types.h"
 #include "monster/monster-info.h"
-#include "monster-floor/monster-remover.h"
 #include "monster/monster-status.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 88b03d7..9924aa6 100644 (file)
@@ -6,7 +6,6 @@
 #include "dungeon/dungeon.h"
 #include "dungeon/quest.h"
 #include "floor/cave.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-move.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-ability1.h"
@@ -30,6 +29,7 @@
 #include "spell-kind/spells-world.h"
 #include "spell-realm/spells-hex.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 #include "world/world.h"
 #ifdef JP
index 8357cc0..2a76b61 100644 (file)
@@ -20,7 +20,6 @@
 #include "floor/cave.h"
 #include "floor/floor.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-move.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-ability1.h"
@@ -52,6 +51,7 @@
 #include "spell/range-calc.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
index 05b01ab..6ecf649 100644 (file)
@@ -15,7 +15,6 @@
 #include "floor/cave.h"
 #include "floor/floor.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
@@ -29,6 +28,7 @@
 #include "spell/range-calc.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 
 /*!
  * @brief モンスターが敵対モンスターにビームを当てること可能かを判定する /
index f8f250d..84d9f68 100644 (file)
@@ -11,7 +11,6 @@
 #include "floor/floor.h"
 #include "grid/feature.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-ability1.h"
 #include "monster-race/race-flags-ability2.h"
@@ -25,6 +24,7 @@
 #include "spell/range-calc.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 
 /*!
index f860f17..099c8f5 100644 (file)
@@ -5,7 +5,6 @@
 #include "grid/grid.h"
 #include "inventory/inventory-object.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "monster-race/monster-race.h"
@@ -36,6 +35,7 @@
 #include "store/store-util.h"
 #include "store/store.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "view/display-messages.h"
 
index 2e94625..f46f0da 100644 (file)
@@ -8,11 +8,11 @@
 #include "cmd-action/cmd-attack.h"
 #include "grid/feature.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster/monster-info.h"
 #include "player/digestion-processor.h"
 #include "player/player-move.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index be7bd7f..3160304 100644 (file)
 #include "cmd-io/cmd-dump.h"
 #include "cmd-item/cmd-throw.h"
 #include "core/asking-player.h"
-#include "player/player-race-types.h"
+#include "core/player-update-types.h"
 #include "core/show-file.h"
 #include "core/stuff-handler.h"
 #include "effect/spells-effect-util.h"
 #include "game-option/play-record-options.h"
 #include "grid/grid.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "mind/mind-mage.h"
 #include "mind/mind-warrior.h"
@@ -45,7 +44,7 @@
 #include "player/player-class.h"
 #include "player/player-damage.h"
 #include "player/player-personalities-types.h"
-#include "core/player-update-types.h"
+#include "player/player-race-types.h"
 #include "player/selfinfo.h"
 #include "racial/racial-vampire.h"
 #include "spell-kind/earthquake.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell-kind/spells-world.h"
 #include "spell-realm/spells-sorcery.h"
+#include "spell/spell-types.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
-#include "spell/spell-types.h"
 #include "status/element-resistance.h"
 #include "status/shape-changer.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
  */
 bool gain_mutation(player_type *creature_ptr, MUTATION_IDX choose_mut)
 {
-       int attempts_left = 20;
-       concptr muta_desc = "";
-       bool muta_chosen = FALSE;
-       int muta_which = 0; // mutation_flag_type_1 とmutation_flag_type_2 の両対応とするため、敢えてint型で定義する
-       BIT_FLAGS *muta_class = NULL;
-
-       if (choose_mut) attempts_left = 1;
-
-       while (attempts_left--)
-       {
-               switch (choose_mut ? choose_mut : (creature_ptr->pclass == CLASS_BERSERKER ? 74+randint1(119) : randint1(193)))
-               {
-               case 1: case 2: case 3: case 4:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SPIT_ACID;
-                       muta_desc = _("酸を吐く能力を得た。", "You gain the ability to spit acid.");
-                       break;
-                       
-               case 5: case 6: case 7:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BR_FIRE;
-                       muta_desc = _("火を吐く能力を得た。", "You gain the ability to breathe fire.");
-                       break;
-                       
-               case 8: case 9:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_HYPN_GAZE;
-                       muta_desc = _("催眠眼の能力を得た。", "Your eyes look mesmerizing...");
-                       break;
-                       
-               case 10: case 11:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_TELEKINES;
-                       muta_desc = _("物体を念動力で動かす能力を得た。", "You gain the ability to move objects telekinetically.");
-                       break;
-                       
-               case 12: case 13: case 14:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_VTELEPORT;
-                       muta_desc = _("自分の意思でテレポートする能力を得た。", "You gain the power of teleportation at will.");
-                       break;
-                       
-               case 15: case 16:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_MIND_BLST;
-                       muta_desc = _("精神攻撃の能力を得た。", "You gain the power of Mind Blast.");
-                       break;
-                       
-               case 17: case 18:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RADIATION;
-                       muta_desc = _("あなたは強い放射線を発生し始めた。", "You start emitting hard radiation.");
-                       break;
-                       
-               case 19: case 20:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_VAMPIRISM;
-                       muta_desc = _("生命力を吸収できるようになった。", "You become vampiric.");
-                       break;
-                       
-               case 21: case 22: case 23:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SMELL_MET;
-                       muta_desc = _("金属の匂いを嗅ぎ分けられるようになった。", "You smell a metallic odor.");
-                       break;
-                       
-               case 24: case 25: case 26: case 27:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SMELL_MON;
-                       muta_desc = _("モンスターの臭いを嗅ぎ分けられるようになった。", "You smell filthy monsters.");
-                       break;
-                       
-               case 28: case 29: case 30:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BLINK;
-                       muta_desc = _("近距離テレポートの能力を得た。", "You gain the power of minor teleportation.");
-                       break;
-                       
-               case 31: case 32:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EAT_ROCK;
-                       muta_desc = _("壁が美味しそうに見える。", "The walls look delicious.");
-                       break;
-                       
-               case 33: case 34:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SWAP_POS;
-                       muta_desc = _("他人の靴で一マイル歩くような気分がする。", "You feel like walking a mile in someone else's shoes.");
-                       break;
-                       
-               case 35: case 36: case 37:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SHRIEK;
-                       muta_desc = _("あなたの声は相当強くなった。", "Your vocal cords get much tougher.");
-                       break;
-                       
-               case 38: case 39: case 40:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_ILLUMINE;
-                       muta_desc = _("あなたは光り輝いて部屋を明るくするようになった。", "You can light up rooms with your presence.");
-                       break;
-                       
-               case 41: case 42:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_DET_CURSE;
-                       muta_desc = _("邪悪な魔法を感知できるようになった。", "You can feel evil magics.");
-                       break;
-                       
-               case 43: case 44: case 45:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BERSERK;
-                       muta_desc = _("制御できる激情を感じる。", "You feel a controlled rage.");
-                       break;
-                       
-               case 46:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_POLYMORPH;
-                       muta_desc = _("体が変異しやすくなった。", "Your body seems mutable.");
-                       break;
-                       
-               case 47: case 48:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_MIDAS_TCH;
-                       muta_desc = _("「ミダス王の手」の能力を得た。", "You gain the Midas touch.");/*トゥームレイダースにありましたね。 */
-                       break;
-                       
-               case 49:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_GROW_MOLD;
-                       muta_desc = _("突然カビに親しみを覚えた。", "You feel a sudden affinity for mold.");
-                       break;
-                       
-               case 50: case 51: case 52:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RESIST;
-                       muta_desc = _("あなたは自分自身を守れる気がする。", "You feel like you can protect yourself.");
-                       break;
-                       
-               case 53: case 54: case 55:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EARTHQUAKE;
-                       muta_desc = _("ダンジョンを破壊する能力を得た。", "You gain the ability to wreck the dungeon.");
-                       break;
-                       
-               case 56:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EAT_MAGIC;
-                       muta_desc = _("魔法のアイテムが美味そうに見える。", "Your magic items look delicious.");
-                       break;
-                       
-               case 57: case 58:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_WEIGH_MAG;
-                       muta_desc = _("あなたは周囲にある魔法をより良く理解できる気がする。", "You feel you can better understand the magic around you.");
-                       break;
-                       
-               case 59:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_STERILITY;
-                       muta_desc = _("周りの全ての者に頭痛を起こすことができる。", "You can give everything around you a headache.");
-                       break;
-               case 60: case 61:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_HIT_AND_AWAY;
-                       muta_desc = _("突然、泥棒の気分が分かるようになった。", "You suddenly understand how thieves feel.");
-                       break;
-                       
-               case 62: case 63: case 64:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_DAZZLE;
-                       muta_desc = _("眩い閃光を発する能力を得た。", "You gain the ability to emit dazzling lights.");
-                       break;
-                       
-               case 65: case 66: case 67:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_LASER_EYE;
-                       muta_desc = _("あなたの目は一瞬焼け付いた。", "Your eyes burn for a moment.");
-                       break;
-                       
-               case 68: case 69:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RECALL;
-                       muta_desc = _("少しだけホームシックになったが、すぐ直った。", "You feel briefly homesick, but it passes.");
-                       break;
-                       
-               case 70:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BANISH;
-                       muta_desc = _("神聖な怒りの力に満たされた。", "You feel a holy wrath fill you.");
-                       break;
-                       
-               case 71: case 72:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_COLD_TOUCH;
-                       muta_desc = _("あなたの両手はとても冷たくなった。", "Your hands get very cold.");
-                       break;
-                       
-               case 73: case 74:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_LAUNCHER;
-                       muta_desc = _("あなたの物を投げる手はかなり強くなった気がする。", "Your throwing arm feels much stronger.");
-                       break;
-                       
-               case 75:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BERS_RAGE;
-                       muta_desc = _("あなたは狂暴化の発作を起こすようになった!", "You become subject to fits of berserk rage!");
-                       break;
-                       
-               case 76:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_COWARDICE;
-                       muta_desc = _("信じられないくらい臆病になった!", "You become an incredible coward!");
-                       break;
-                       
-               case 77:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_RTELEPORT;
-                       muta_desc = _("あなたの位置は非常に不確定になった。", "Your position seems very uncertain...");
-                       break;
-                       
-               case 78:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ALCOHOL;
-                       muta_desc = _("あなたはアルコールを分泌するようになった。", "Your body starts producing alcohol!");
-                       break;
-                       
-               case 79:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HALLU;
-                       muta_desc = _("あなたは幻覚を引き起こす精神錯乱に侵された。", "You are afflicted by a hallucinatory insanity!");
-                       break;
-                       
-               case 80:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_FLATULENT;
-                       muta_desc = _( "あなたは制御不能な強烈な屁をこくようになった。",  "You become subject to uncontrollable flatulence.");
-
-                       break;
-               case 81: case 82:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SCOR_TAIL;
-                       muta_desc = _( "サソリの尻尾が生えてきた!",  "You grow a scorpion tail!");
-
-                       break;
-               case 83: case 84:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HORNS;
-                       muta_desc = _( "額に角が生えた!",  "Horns pop forth into your forehead!");
-
-                       break;
-               case 85: case 86:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BEAK;
-                       muta_desc = _( "口が鋭く強いクチバシに変化した!",  "Your mouth turns into a sharp, powerful beak!");
-
-                       break;
-               case 87: case 88:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_DEMON;
-                       muta_desc = _( "悪魔を引き付けるようになった。",  "You start attracting demons.");
-
-                       break;
-               case 89:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_PROD_MANA;
-                       muta_desc = _( "あなたは制御不能な魔法のエネルギーを発生するようになった。",  "You start producing magical energy uncontrollably.");
-
-                       break;
-               case 90: case 91:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SPEED_FLUX;
-                       muta_desc = _( "あなたは躁鬱質になった。",  "You become manic-depressive.");
-
-                       break;
-               case 92: case 93:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BANISH_ALL;
-                       muta_desc = _( "恐ろしい力があなたの背後に潜んでいる気がする。",  "You feel a terrifying power lurking behind you.");
-
-                       break;
-               case 94:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_EAT_LIGHT;
-                       muta_desc = _( "あなたはウンゴリアントに奇妙な親しみを覚えるようになった。",  "You feel a strange kinship with Ungoliant.");
-
-                       break;
-               case 95: case 96:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_TRUNK;
-                       muta_desc = _( "あなたの鼻は伸びて象の鼻のようになった。",  "Your nose grows into an elephant-like trunk.");
-
-                       break;
-               case 97:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_ANIMAL;
-                       muta_desc = _( "動物を引き付けるようになった。",  "You start attracting animals.");
-
-                       break;
-               case 98:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_TENTACLES;
-                       muta_desc = _( "邪悪な触手が体の両側に生えてきた。",  "Evil-looking tentacles sprout from your sides.");
-
-                       break;
-               case 99:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_RAW_CHAOS;
-                       muta_desc = _( "周囲の空間が不安定になった気がする。",  "You feel the universe is less stable around you.");
-
-                       break;
-               case 100: case 101: case 102:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_NORMALITY;
-                       muta_desc = _( "あなたは奇妙なほど普通になった気がする。",  "You feel strangely normal.");
-
-                       break;
-               case 103:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WRAITH;
-                       muta_desc = _( "あなたは幽体化したり実体化したりするようになった。",  "You start to fade in and out of the physical world.");
-
-                       break;
-               case 104:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_POLY_WOUND;
-                       muta_desc = _( "あなたはカオスの力が古い傷に入り込んでくるのを感じた。",  "You feel forces of chaos entering your old scars.");
-
-                       break;
-               case 105:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WASTING;
-                       muta_desc = _( "あなたは突然おぞましい衰弱病にかかった。",  "You suddenly contract a horrible wasting disease.");
-
-                       break;
-               case 106:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_DRAGON;
-                       muta_desc = _( "あなたはドラゴンを引きつけるようになった。",  "You start attracting dragons.");
-
-                       break;
-               case 107: case 108:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WEIRD_MIND;
-                       muta_desc = _( "あなたの思考は突然おかしな方向に向き始めた。",  "Your thoughts suddenly take off in strange directions.");
-
-                       break;
-               case 109:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_NAUSEA;
-                       muta_desc = _( "胃袋がピクピクしはじめた。",  "Your stomach starts to roil nauseously.");
-
-                       break;
-               case 110: case 111:
-                       /* Chaos warriors already have a chaos deity */
-                       if (creature_ptr->pclass != CLASS_CHAOS_WARRIOR)
-                       {
-                               muta_class = &(creature_ptr->muta2);
-                               muta_which = MUT2_CHAOS_GIFT;
-                       muta_desc = _( "あなたはカオスの守護悪魔の注意を惹くようになった。",  "You attract the notice of a chaos deity!");
-
-                       }
-                       break;
-               case 112:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WALK_SHAD;
-                       muta_desc = _( "あなたは現実が紙のように薄いと感じるようになった。",  "You feel like reality is as thin as paper.");
-
-                       break;
-               case 113: case 114:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WARNING;
-                       muta_desc = _( "あなたは突然パラノイアになった気がする。",  "You suddenly feel paranoid.");
-
-                       break;
-               case 115:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_INVULN;
-                       muta_desc = _( "あなたは祝福され、無敵状態になる発作を起こすようになった。",  "You are blessed with fits of invulnerability.");
-
-                       break;
-               case 116: case 117:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SP_TO_HP;
-                       muta_desc = _( "魔法の治癒の発作を起こすようになった。",  "You are subject to fits of magical healing.");
-
-                       break;
-               case 118:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HP_TO_SP;
-                       muta_desc = _( "痛みを伴う精神明瞭化の発作を起こすようになった。",  "You are subject to fits of painful clarity.");
-
-                       break;
-               case 119:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_DISARM;
-                       muta_desc = _( "あなたの脚は長さが四倍になった。",  "Your feet grow to four times their former size.");
-
-                       break;
-               case 120: case 121: case 122:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_HYPER_STR;
-                       muta_desc = _( "超人的に強くなった!",  "You turn into a superhuman he-man!");
-
-                       break;
-               case 123: case 124: case 125:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_PUNY;
-                       muta_desc = _( "筋肉が弱ってしまった...",  "Your muscles wither away...");
-
-                       break;
-               case 126: case 127: case 128:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_HYPER_INT;
-                       muta_desc = _( "あなたの脳は生体コンピュータに進化した!",  "Your brain evolves into a living computer!");
-
-                       break;
-               case 129: case 130: case 131:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MORONIC;
-                       muta_desc = _( "脳が萎縮してしまった...",  "Your brain withers away...");
-
-                       break;
-               case 132: case 133:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_RESILIENT;
-                       muta_desc = _( "並外れてタフになった。",  "You become extraordinarily resilient.");
-
-                       break;
-               case 134: case 135:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_FAT;
-                       muta_desc = _( "あなたは気持ち悪いくらい太った!",  "You become sickeningly fat!");
-
-                       break;
-               case 136: case 137:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ALBINO;
-                       muta_desc = _( "アルビノになった!弱くなった気がする...",  "You turn into an albino! You feel frail...");
-
-                       break;
-               case 138: case 139: case 140:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FLESH_ROT;
-                       muta_desc = _( "あなたの肉体は腐敗する病気に侵された!",  "Your flesh is afflicted by a rotting disease!");
-
-                       break;
-               case 141: case 142:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SILLY_VOI;
-                       muta_desc = _( "声が間抜けなキーキー声になった!",  "Your voice turns into a ridiculous squeak!");
-
-                       break;
-               case 143: case 144:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_BLANK_FAC;
-                       muta_desc = _( "のっぺらぼうになった!",  "Your face becomes completely featureless!");
-
-                       break;
-               case 145:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ILL_NORM;
-                       muta_desc = _( "心の安らぐ幻影を映し出すようになった。",  "You start projecting a reassuring image.");
-
-                       break;
-               case 146: case 147: case 148:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_EYES;
-                       muta_desc = _( "新たに二つの目が出来た!",  "You grow an extra pair of eyes!");
-
-                       break;
-               case 149: case 150:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MAGIC_RES;
-                       muta_desc = _( "魔法への耐性がついた。",  "You become resistant to magic.");
-
-                       break;
-               case 151: case 152: case 153:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_NOIS;
-                       muta_desc = _( "あなたは奇妙な音を立て始めた!",  "You start making strange noise!");
-
-                       break;
-               case 154: case 155: case 156:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_INFRAVIS;
-                       muta_desc = _( "赤外線視力が増した。",  "Your infravision is improved.");
-
-                       break;
-               case 157: case 158:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_LEGS;
-                       muta_desc = _( "新たに二本の足が生えてきた!",  "You grow an extra pair of legs!");
-
-                       break;
-               case 159: case 160:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SHORT_LEG;
-                       muta_desc = _( "足が短い突起になってしまった!",  "Your legs turn into short stubs!");
-
-                       break;
-               case 161: case 162:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ELEC_TOUC;
-                       muta_desc = _( "血管を電流が流れ始めた!",  "Electricity starts running through you!");
-
-                       break;
-               case 163: case 164:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FIRE_BODY;
-                       muta_desc = _( "あなたの体は炎につつまれている。",  "Your body is enveloped in flames!");
-
-                       break;
-               case 165: case 166: case 167:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_WART_SKIN;
-                       muta_desc = _( "気持ち悪いイボイボが体中にできた!",  "Disgusting warts appear everywhere on you!");
-
-                       break;
-               case 168: case 169: case 170:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SCALES;
-                       muta_desc = _( "肌が黒い鱗に変わった!",  "Your skin turns into black scales!");
-
-                       break;
-               case 171: case 172:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_IRON_SKIN;
-                       muta_desc = _( "あなたの肌は鉄になった!",  "Your skin turns to steel!");
-
-                       break;
-               case 173: case 174:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_WINGS;
-                       muta_desc = _( "背中に羽が生えた。",  "You grow a pair of wings.");
-
-                       break;
-               case 175: case 176: case 177:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FEARLESS;
-                       muta_desc = _( "完全に怖れ知らずになった。",  "You become completely fearless.");
-
-                       break;
-               case 178: case 179:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_REGEN;
-                       muta_desc = _( "急速に回復し始めた。",  "You start regenerating.");
-
-                       break;
-               case 180: case 181:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ESP;
-                       muta_desc = _( "テレパシーの能力を得た!",  "You develop a telepathic ability!");
-
-                       break;
-               case 182: case 183: case 184:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_LIMBER;
-                       muta_desc = _( "筋肉がしなやかになった。",  "Your muscles become limber.");
-
-                       break;
-               case 185: case 186: case 187:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ARTHRITIS;
-                       muta_desc = _( "関節が突然痛み出した。",  "Your joints suddenly hurt.");
-
-                       break;
-               case 188:
-                       if (creature_ptr->pseikaku == PERSONALITY_LUCKY) break;
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_BAD_LUCK;
-                       muta_desc = _( "悪意に満ちた黒いオーラがあなたをとりまいた...",  "There is a malignant black aura surrounding you...");
-
-                       break;
-               case 189:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_VULN_ELEM;
-                       muta_desc = _( "妙に無防備になった気がする。",  "You feel strangely exposed.");
-
-                       break;
-               case 190: case 191: case 192:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MOTION;
-                       muta_desc = _( "体の動作がより正確になった。",  "You move with new assurance.");
-
-                       break;
-               case 193:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_GOOD_LUCK;
-                       muta_desc = _( "慈悲深い白いオーラがあなたをとりまいた...",  "There is a benevolent white aura surrounding you...");
-
-                       break;
-               default:
-                       muta_class = NULL;
-                       muta_which = 0;
-               }
-
-               if (muta_class && muta_which)
-               {
-                       if (!(*muta_class & muta_which))
-                       {
-                               muta_chosen = TRUE;
-                       }
-               }
-               if (muta_chosen == TRUE) break;
-       }
-
-       if (!muta_chosen)
-       {
-               msg_print(_("普通になった気がする。", "You feel normal."));
-               return FALSE;
-       }
-
-       chg_virtue(creature_ptr, V_CHANCE, 1);
-
-       /*
-         some races are apt to gain specified mutations
-         This should be allowed only if "choose_mut" is 0.
-                                               --- henkma
-       */
-       if (!choose_mut)
-       {
-               if (creature_ptr->prace == RACE_VAMPIRE &&
-                       !(creature_ptr->muta1 & MUT1_HYPN_GAZE) &&
-                       (randint1(10) < 7))
-               {
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_HYPN_GAZE;
-                       muta_desc = _("眼が幻惑的になった...", "Your eyes look mesmerizing...");
-
-               }
-
-               else if (creature_ptr->prace == RACE_IMP &&
-                       !(creature_ptr->muta2 & MUT2_HORNS) &&
-                       (randint1(10) < 7))
-               {
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HORNS;
-                       muta_desc = _("角が額から生えてきた!", "Horns pop forth into your forehead!");
-
-               }
-
-               else if (creature_ptr->prace == RACE_YEEK &&
-                       !(creature_ptr->muta1 & MUT1_SHRIEK) &&
-                       (randint1(10) < 7))
-               {
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SHRIEK;
-                       muta_desc = _("声質がかなり強くなった。", "Your vocal cords get much tougher.");
-
-               }
-
-               else if (creature_ptr->prace == RACE_BEASTMAN &&
-                       !(creature_ptr->muta1 & MUT1_POLYMORPH) &&
-                       (randint1(10) < 2))
-               {
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_POLYMORPH;
-                       muta_desc = _("あなたの肉体は変化できるようになった、", "Your body seems mutable.");
-
-               }
-
-               else if (creature_ptr->prace == RACE_MIND_FLAYER &&
-                       !(creature_ptr->muta2 & MUT2_TENTACLES) &&
-                       (randint1(10) < 7))
-               {
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_TENTACLES;
-                       muta_desc = _("邪悪な触手が口の周りに生えた。", "Evil-looking tentacles sprout from your mouth.");
-
-               }
-       }
-
-       msg_print(_("突然変異した!", "You mutate!"));
-
-       msg_print(muta_desc);
-       *muta_class |= muta_which;
-
-       if (muta_class == &(creature_ptr->muta3))
-       {
-               if (muta_which == MUT3_PUNY)
-               {
-                       if (creature_ptr->muta3 & MUT3_HYPER_STR)
-                       {
-                               msg_print(_("あなたはもう超人的に強くはない!", "You no longer feel super-strong!"));
-
-                               creature_ptr->muta3 &= ~(MUT3_HYPER_STR);
-                       }
-               }
-               else if (muta_which == MUT3_HYPER_STR)
-               {
-                       if (creature_ptr->muta3 & MUT3_PUNY)
-                       {
-                               msg_print(_("あなたはもう虚弱ではない!", "You no longer feel puny!"));
-
-                               creature_ptr->muta3 &= ~(MUT3_PUNY);
-                       }
-               }
-               else if (muta_which == MUT3_MORONIC)
-               {
-                       if (creature_ptr->muta3 & MUT3_HYPER_INT)
-                       {
-                               msg_print(_("あなたの脳はもう生体コンピュータではない。", "Your brain is no longer a living computer."));
-
-                               creature_ptr->muta3 &= ~(MUT3_HYPER_INT);
-                       }
-               }
-               else if (muta_which == MUT3_HYPER_INT)
-               {
-                       if (creature_ptr->muta3 & MUT3_MORONIC)
-                       {
-                               msg_print(_("あなたはもう精神薄弱ではない。", "You are no longer moronic."));
-
-                               creature_ptr->muta3 &= ~(MUT3_MORONIC);
-                       }
-               }
-               else if (muta_which == MUT3_IRON_SKIN)
-               {
-                       if (creature_ptr->muta3 & MUT3_SCALES)
-                       {
-                               msg_print(_("鱗がなくなった。", "You lose your scales."));
-
-                               creature_ptr->muta3 &= ~(MUT3_SCALES);
-                       }
-                       if (creature_ptr->muta3 & MUT3_FLESH_ROT)
-                       {
-                               msg_print(_("肉体が腐乱しなくなった。", "Your flesh rots no longer."));
-
-                               creature_ptr->muta3 &= ~(MUT3_FLESH_ROT);
-                       }
-                       if (creature_ptr->muta3 & MUT3_WART_SKIN)
-                       {
-                               msg_print(_("肌のイボイボがなくなった。", "You lose your warts."));
-
-                               creature_ptr->muta3 &= ~(MUT3_WART_SKIN);
-                       }
-               }
-               else if (muta_which == MUT3_WART_SKIN || muta_which == MUT3_SCALES
-                       || muta_which == MUT3_FLESH_ROT)
-               {
-                       if (creature_ptr->muta3 & MUT3_IRON_SKIN)
-                       {
-                               msg_print(_("あなたの肌はもう鉄ではない。", "Your skin is no longer made of steel."));
-
-                               creature_ptr->muta3 &= ~(MUT3_IRON_SKIN);
-                       }
-               }
-               else if (muta_which == MUT3_FEARLESS)
-               {
-                       if (creature_ptr->muta2 & MUT2_COWARDICE)
-                       {
-                               msg_print(_("臆病でなくなった。", "You are no longer cowardly."));
-
-                               creature_ptr->muta2 &= ~(MUT2_COWARDICE);
-                       }
-               }
-               else if (muta_which == MUT3_FLESH_ROT)
-               {
-                       if (creature_ptr->muta3 & MUT3_REGEN)
-                       {
-                               msg_print(_("急速に回復しなくなった。", "You stop regenerating."));
-
-                               creature_ptr->muta3 &= ~(MUT3_REGEN);
-                       }
-               }
-               else if (muta_which == MUT3_REGEN)
-               {
-                       if (creature_ptr->muta3 & MUT3_FLESH_ROT)
-                       {
-                               msg_print(_("肉体が腐乱しなくなった。", "Your flesh stops rotting."));
-
-                               creature_ptr->muta3 &= ~(MUT3_FLESH_ROT);
-                       }
-               }
-               else if (muta_which == MUT3_LIMBER)
-               {
-                       if (creature_ptr->muta3 & MUT3_ARTHRITIS)
-                       {
-                               msg_print(_("関節が痛くなくなった。", "Your joints stop hurting."));
-
-                               creature_ptr->muta3 &= ~(MUT3_ARTHRITIS);
-                       }
-               }
-               else if (muta_which == MUT3_ARTHRITIS)
-               {
-                       if (creature_ptr->muta3 & MUT3_LIMBER)
-                       {
-                               msg_print(_("あなたはしなやかでなくなった。", "You no longer feel limber."));
-
-                               creature_ptr->muta3 &= ~(MUT3_LIMBER);
-                       }
-               }
-       }
-       else if (muta_class == &(creature_ptr->muta2))
-       {
-               if (muta_which == MUT2_COWARDICE)
-               {
-                       if (creature_ptr->muta3 & MUT3_FEARLESS)
-                       {
-                               msg_print(_("恐れ知らずでなくなった。", "You no longer feel fearless."));
-
-                               creature_ptr->muta3 &= ~(MUT3_FEARLESS);
-                       }
-               }
-               if (muta_which == MUT2_BEAK)
-               {
-                       if (creature_ptr->muta2 & MUT2_TRUNK)
-                       {
-                               msg_print(_("あなたの鼻はもう象の鼻のようではなくなった。", "Your nose is no longer elephantine."));
-
-                               creature_ptr->muta2 &= ~(MUT2_TRUNK);
-                       }
-               }
-               if (muta_which == MUT2_TRUNK)
-               {
-                       if (creature_ptr->muta2 & MUT2_BEAK)
-                       {
-                               msg_print(_("硬いクチバシがなくなった。", "You no longer have a hard beak."));
-
-                               creature_ptr->muta2 &= ~(MUT2_BEAK);
-                       }
-               }
-       }
-
-       creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
-       creature_ptr->update |= PU_BONUS;
-       handle_stuff(creature_ptr);
-       return TRUE;
+    int attempts_left = 20;
+    concptr muta_desc = "";
+    bool muta_chosen = FALSE;
+    int muta_which = 0; // mutation_flag_type_1 とmutation_flag_type_2 の両対応とするため、敢えてint型で定義する
+    BIT_FLAGS *muta_class = NULL;
+
+    if (choose_mut)
+        attempts_left = 1;
+
+    while (attempts_left--) {
+        switch (choose_mut ? choose_mut : (creature_ptr->pclass == CLASS_BERSERKER ? 74 + randint1(119) : randint1(193))) {
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SPIT_ACID;
+            muta_desc = _("酸を吐く能力を得た。", "You gain the ability to spit acid.");
+            break;
+
+        case 5:
+        case 6:
+        case 7:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BR_FIRE;
+            muta_desc = _("火を吐く能力を得た。", "You gain the ability to breathe fire.");
+            break;
+
+        case 8:
+        case 9:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_HYPN_GAZE;
+            muta_desc = _("催眠眼の能力を得た。", "Your eyes look mesmerizing...");
+            break;
+
+        case 10:
+        case 11:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_TELEKINES;
+            muta_desc = _("物体を念動力で動かす能力を得た。", "You gain the ability to move objects telekinetically.");
+            break;
+
+        case 12:
+        case 13:
+        case 14:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_VTELEPORT;
+            muta_desc = _("自分の意思でテレポートする能力を得た。", "You gain the power of teleportation at will.");
+            break;
+
+        case 15:
+        case 16:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_MIND_BLST;
+            muta_desc = _("精神攻撃の能力を得た。", "You gain the power of Mind Blast.");
+            break;
+
+        case 17:
+        case 18:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RADIATION;
+            muta_desc = _("あなたは強い放射線を発生し始めた。", "You start emitting hard radiation.");
+            break;
+
+        case 19:
+        case 20:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_VAMPIRISM;
+            muta_desc = _("生命力を吸収できるようになった。", "You become vampiric.");
+            break;
+
+        case 21:
+        case 22:
+        case 23:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SMELL_MET;
+            muta_desc = _("金属の匂いを嗅ぎ分けられるようになった。", "You smell a metallic odor.");
+            break;
+
+        case 24:
+        case 25:
+        case 26:
+        case 27:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SMELL_MON;
+            muta_desc = _("モンスターの臭いを嗅ぎ分けられるようになった。", "You smell filthy monsters.");
+            break;
+
+        case 28:
+        case 29:
+        case 30:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BLINK;
+            muta_desc = _("近距離テレポートの能力を得た。", "You gain the power of minor teleportation.");
+            break;
+
+        case 31:
+        case 32:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EAT_ROCK;
+            muta_desc = _("壁が美味しそうに見える。", "The walls look delicious.");
+            break;
+
+        case 33:
+        case 34:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SWAP_POS;
+            muta_desc = _("他人の靴で一マイル歩くような気分がする。", "You feel like walking a mile in someone else's shoes.");
+            break;
+
+        case 35:
+        case 36:
+        case 37:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SHRIEK;
+            muta_desc = _("あなたの声は相当強くなった。", "Your vocal cords get much tougher.");
+            break;
+
+        case 38:
+        case 39:
+        case 40:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_ILLUMINE;
+            muta_desc = _("あなたは光り輝いて部屋を明るくするようになった。", "You can light up rooms with your presence.");
+            break;
+
+        case 41:
+        case 42:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_DET_CURSE;
+            muta_desc = _("邪悪な魔法を感知できるようになった。", "You can feel evil magics.");
+            break;
+
+        case 43:
+        case 44:
+        case 45:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BERSERK;
+            muta_desc = _("制御できる激情を感じる。", "You feel a controlled rage.");
+            break;
+
+        case 46:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_POLYMORPH;
+            muta_desc = _("体が変異しやすくなった。", "Your body seems mutable.");
+            break;
+
+        case 47:
+        case 48:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_MIDAS_TCH;
+            muta_desc = _("「ミダス王の手」の能力を得た。", "You gain the Midas touch."); /*トゥームレイダースにありましたね。 */
+            break;
+
+        case 49:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_GROW_MOLD;
+            muta_desc = _("突然カビに親しみを覚えた。", "You feel a sudden affinity for mold.");
+            break;
+
+        case 50:
+        case 51:
+        case 52:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RESIST;
+            muta_desc = _("あなたは自分自身を守れる気がする。", "You feel like you can protect yourself.");
+            break;
+
+        case 53:
+        case 54:
+        case 55:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EARTHQUAKE;
+            muta_desc = _("ダンジョンを破壊する能力を得た。", "You gain the ability to wreck the dungeon.");
+            break;
+
+        case 56:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EAT_MAGIC;
+            muta_desc = _("魔法のアイテムが美味そうに見える。", "Your magic items look delicious.");
+            break;
+
+        case 57:
+        case 58:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_WEIGH_MAG;
+            muta_desc = _("あなたは周囲にある魔法をより良く理解できる気がする。", "You feel you can better understand the magic around you.");
+            break;
+
+        case 59:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_STERILITY;
+            muta_desc = _("周りの全ての者に頭痛を起こすことができる。", "You can give everything around you a headache.");
+            break;
+        case 60:
+        case 61:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_HIT_AND_AWAY;
+            muta_desc = _("突然、泥棒の気分が分かるようになった。", "You suddenly understand how thieves feel.");
+            break;
+
+        case 62:
+        case 63:
+        case 64:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_DAZZLE;
+            muta_desc = _("眩い閃光を発する能力を得た。", "You gain the ability to emit dazzling lights.");
+            break;
+
+        case 65:
+        case 66:
+        case 67:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_LASER_EYE;
+            muta_desc = _("あなたの目は一瞬焼け付いた。", "Your eyes burn for a moment.");
+            break;
+
+        case 68:
+        case 69:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RECALL;
+            muta_desc = _("少しだけホームシックになったが、すぐ直った。", "You feel briefly homesick, but it passes.");
+            break;
+
+        case 70:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BANISH;
+            muta_desc = _("神聖な怒りの力に満たされた。", "You feel a holy wrath fill you.");
+            break;
+
+        case 71:
+        case 72:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_COLD_TOUCH;
+            muta_desc = _("あなたの両手はとても冷たくなった。", "Your hands get very cold.");
+            break;
+
+        case 73:
+        case 74:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_LAUNCHER;
+            muta_desc = _("あなたの物を投げる手はかなり強くなった気がする。", "Your throwing arm feels much stronger.");
+            break;
+
+        case 75:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BERS_RAGE;
+            muta_desc = _("あなたは狂暴化の発作を起こすようになった!", "You become subject to fits of berserk rage!");
+            break;
+
+        case 76:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_COWARDICE;
+            muta_desc = _("信じられないくらい臆病になった!", "You become an incredible coward!");
+            break;
+
+        case 77:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_RTELEPORT;
+            muta_desc = _("あなたの位置は非常に不確定になった。", "Your position seems very uncertain...");
+            break;
+
+        case 78:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ALCOHOL;
+            muta_desc = _("あなたはアルコールを分泌するようになった。", "Your body starts producing alcohol!");
+            break;
+
+        case 79:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HALLU;
+            muta_desc = _("あなたは幻覚を引き起こす精神錯乱に侵された。", "You are afflicted by a hallucinatory insanity!");
+            break;
+
+        case 80:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_FLATULENT;
+            muta_desc = _("あなたは制御不能な強烈な屁をこくようになった。", "You become subject to uncontrollable flatulence.");
+
+            break;
+        case 81:
+        case 82:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SCOR_TAIL;
+            muta_desc = _("サソリの尻尾が生えてきた!", "You grow a scorpion tail!");
+
+            break;
+        case 83:
+        case 84:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HORNS;
+            muta_desc = _("額に角が生えた!", "Horns pop forth into your forehead!");
+
+            break;
+        case 85:
+        case 86:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BEAK;
+            muta_desc = _("口が鋭く強いクチバシに変化した!", "Your mouth turns into a sharp, powerful beak!");
+
+            break;
+        case 87:
+        case 88:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_DEMON;
+            muta_desc = _("悪魔を引き付けるようになった。", "You start attracting demons.");
+
+            break;
+        case 89:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_PROD_MANA;
+            muta_desc = _("あなたは制御不能な魔法のエネルギーを発生するようになった。", "You start producing magical energy uncontrollably.");
+
+            break;
+        case 90:
+        case 91:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SPEED_FLUX;
+            muta_desc = _("あなたは躁鬱質になった。", "You become manic-depressive.");
+
+            break;
+        case 92:
+        case 93:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BANISH_ALL;
+            muta_desc = _("恐ろしい力があなたの背後に潜んでいる気がする。", "You feel a terrifying power lurking behind you.");
+
+            break;
+        case 94:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_EAT_LIGHT;
+            muta_desc = _("あなたはウンゴリアントに奇妙な親しみを覚えるようになった。", "You feel a strange kinship with Ungoliant.");
+
+            break;
+        case 95:
+        case 96:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_TRUNK;
+            muta_desc = _("あなたの鼻は伸びて象の鼻のようになった。", "Your nose grows into an elephant-like trunk.");
+
+            break;
+        case 97:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_ANIMAL;
+            muta_desc = _("動物を引き付けるようになった。", "You start attracting animals.");
+
+            break;
+        case 98:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_TENTACLES;
+            muta_desc = _("邪悪な触手が体の両側に生えてきた。", "Evil-looking tentacles sprout from your sides.");
+
+            break;
+        case 99:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_RAW_CHAOS;
+            muta_desc = _("周囲の空間が不安定になった気がする。", "You feel the universe is less stable around you.");
+
+            break;
+        case 100:
+        case 101:
+        case 102:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_NORMALITY;
+            muta_desc = _("あなたは奇妙なほど普通になった気がする。", "You feel strangely normal.");
+
+            break;
+        case 103:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WRAITH;
+            muta_desc = _("あなたは幽体化したり実体化したりするようになった。", "You start to fade in and out of the physical world.");
+
+            break;
+        case 104:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_POLY_WOUND;
+            muta_desc = _("あなたはカオスの力が古い傷に入り込んでくるのを感じた。", "You feel forces of chaos entering your old scars.");
+
+            break;
+        case 105:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WASTING;
+            muta_desc = _("あなたは突然おぞましい衰弱病にかかった。", "You suddenly contract a horrible wasting disease.");
+
+            break;
+        case 106:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_DRAGON;
+            muta_desc = _("あなたはドラゴンを引きつけるようになった。", "You start attracting dragons.");
+
+            break;
+        case 107:
+        case 108:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WEIRD_MIND;
+            muta_desc = _("あなたの思考は突然おかしな方向に向き始めた。", "Your thoughts suddenly take off in strange directions.");
+
+            break;
+        case 109:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_NAUSEA;
+            muta_desc = _("胃袋がピクピクしはじめた。", "Your stomach starts to roil nauseously.");
+
+            break;
+        case 110:
+        case 111:
+            /* Chaos warriors already have a chaos deity */
+            if (creature_ptr->pclass != CLASS_CHAOS_WARRIOR) {
+                muta_class = &(creature_ptr->muta2);
+                muta_which = MUT2_CHAOS_GIFT;
+                muta_desc = _("あなたはカオスの守護悪魔の注意を惹くようになった。", "You attract the notice of a chaos deity!");
+            }
+            break;
+        case 112:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WALK_SHAD;
+            muta_desc = _("あなたは現実が紙のように薄いと感じるようになった。", "You feel like reality is as thin as paper.");
+
+            break;
+        case 113:
+        case 114:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WARNING;
+            muta_desc = _("あなたは突然パラノイアになった気がする。", "You suddenly feel paranoid.");
+
+            break;
+        case 115:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_INVULN;
+            muta_desc = _("あなたは祝福され、無敵状態になる発作を起こすようになった。", "You are blessed with fits of invulnerability.");
+
+            break;
+        case 116:
+        case 117:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SP_TO_HP;
+            muta_desc = _("魔法の治癒の発作を起こすようになった。", "You are subject to fits of magical healing.");
+
+            break;
+        case 118:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HP_TO_SP;
+            muta_desc = _("痛みを伴う精神明瞭化の発作を起こすようになった。", "You are subject to fits of painful clarity.");
+
+            break;
+        case 119:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_DISARM;
+            muta_desc = _("あなたの脚は長さが四倍になった。", "Your feet grow to four times their former size.");
+
+            break;
+        case 120:
+        case 121:
+        case 122:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_HYPER_STR;
+            muta_desc = _("超人的に強くなった!", "You turn into a superhuman he-man!");
+
+            break;
+        case 123:
+        case 124:
+        case 125:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_PUNY;
+            muta_desc = _("筋肉が弱ってしまった...", "Your muscles wither away...");
+
+            break;
+        case 126:
+        case 127:
+        case 128:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_HYPER_INT;
+            muta_desc = _("あなたの脳は生体コンピュータに進化した!", "Your brain evolves into a living computer!");
+
+            break;
+        case 129:
+        case 130:
+        case 131:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MORONIC;
+            muta_desc = _("脳が萎縮してしまった...", "Your brain withers away...");
+
+            break;
+        case 132:
+        case 133:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_RESILIENT;
+            muta_desc = _("並外れてタフになった。", "You become extraordinarily resilient.");
+
+            break;
+        case 134:
+        case 135:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_FAT;
+            muta_desc = _("あなたは気持ち悪いくらい太った!", "You become sickeningly fat!");
+
+            break;
+        case 136:
+        case 137:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ALBINO;
+            muta_desc = _("アルビノになった!弱くなった気がする...", "You turn into an albino! You feel frail...");
+
+            break;
+        case 138:
+        case 139:
+        case 140:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FLESH_ROT;
+            muta_desc = _("あなたの肉体は腐敗する病気に侵された!", "Your flesh is afflicted by a rotting disease!");
+
+            break;
+        case 141:
+        case 142:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SILLY_VOI;
+            muta_desc = _("声が間抜けなキーキー声になった!", "Your voice turns into a ridiculous squeak!");
+
+            break;
+        case 143:
+        case 144:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_BLANK_FAC;
+            muta_desc = _("のっぺらぼうになった!", "Your face becomes completely featureless!");
+
+            break;
+        case 145:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ILL_NORM;
+            muta_desc = _("心の安らぐ幻影を映し出すようになった。", "You start projecting a reassuring image.");
+
+            break;
+        case 146:
+        case 147:
+        case 148:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_EYES;
+            muta_desc = _("新たに二つの目が出来た!", "You grow an extra pair of eyes!");
+
+            break;
+        case 149:
+        case 150:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MAGIC_RES;
+            muta_desc = _("魔法への耐性がついた。", "You become resistant to magic.");
+
+            break;
+        case 151:
+        case 152:
+        case 153:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_NOIS;
+            muta_desc = _("あなたは奇妙な音を立て始めた!", "You start making strange noise!");
+
+            break;
+        case 154:
+        case 155:
+        case 156:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_INFRAVIS;
+            muta_desc = _("赤外線視力が増した。", "Your infravision is improved.");
+
+            break;
+        case 157:
+        case 158:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_LEGS;
+            muta_desc = _("新たに二本の足が生えてきた!", "You grow an extra pair of legs!");
+
+            break;
+        case 159:
+        case 160:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SHORT_LEG;
+            muta_desc = _("足が短い突起になってしまった!", "Your legs turn into short stubs!");
+
+            break;
+        case 161:
+        case 162:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ELEC_TOUC;
+            muta_desc = _("血管を電流が流れ始めた!", "Electricity starts running through you!");
+
+            break;
+        case 163:
+        case 164:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FIRE_BODY;
+            muta_desc = _("あなたの体は炎につつまれている。", "Your body is enveloped in flames!");
+
+            break;
+        case 165:
+        case 166:
+        case 167:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_WART_SKIN;
+            muta_desc = _("気持ち悪いイボイボが体中にできた!", "Disgusting warts appear everywhere on you!");
+
+            break;
+        case 168:
+        case 169:
+        case 170:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SCALES;
+            muta_desc = _("肌が黒い鱗に変わった!", "Your skin turns into black scales!");
+
+            break;
+        case 171:
+        case 172:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_IRON_SKIN;
+            muta_desc = _("あなたの肌は鉄になった!", "Your skin turns to steel!");
+
+            break;
+        case 173:
+        case 174:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_WINGS;
+            muta_desc = _("背中に羽が生えた。", "You grow a pair of wings.");
+
+            break;
+        case 175:
+        case 176:
+        case 177:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FEARLESS;
+            muta_desc = _("完全に怖れ知らずになった。", "You become completely fearless.");
+
+            break;
+        case 178:
+        case 179:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_REGEN;
+            muta_desc = _("急速に回復し始めた。", "You start regenerating.");
+
+            break;
+        case 180:
+        case 181:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ESP;
+            muta_desc = _("テレパシーの能力を得た!", "You develop a telepathic ability!");
+
+            break;
+        case 182:
+        case 183:
+        case 184:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_LIMBER;
+            muta_desc = _("筋肉がしなやかになった。", "Your muscles become limber.");
+
+            break;
+        case 185:
+        case 186:
+        case 187:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ARTHRITIS;
+            muta_desc = _("関節が突然痛み出した。", "Your joints suddenly hurt.");
+
+            break;
+        case 188:
+            if (creature_ptr->pseikaku == PERSONALITY_LUCKY)
+                break;
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_BAD_LUCK;
+            muta_desc = _("悪意に満ちた黒いオーラがあなたをとりまいた...", "There is a malignant black aura surrounding you...");
+
+            break;
+        case 189:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_VULN_ELEM;
+            muta_desc = _("妙に無防備になった気がする。", "You feel strangely exposed.");
+
+            break;
+        case 190:
+        case 191:
+        case 192:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MOTION;
+            muta_desc = _("体の動作がより正確になった。", "You move with new assurance.");
+
+            break;
+        case 193:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_GOOD_LUCK;
+            muta_desc = _("慈悲深い白いオーラがあなたをとりまいた...", "There is a benevolent white aura surrounding you...");
+
+            break;
+        default:
+            muta_class = NULL;
+            muta_which = 0;
+        }
+
+        if (muta_class && muta_which) {
+            if (!(*muta_class & muta_which)) {
+                muta_chosen = TRUE;
+            }
+        }
+        if (muta_chosen == TRUE)
+            break;
+    }
+
+    if (!muta_chosen) {
+        msg_print(_("普通になった気がする。", "You feel normal."));
+        return FALSE;
+    }
+
+    chg_virtue(creature_ptr, V_CHANCE, 1);
+
+    /*
+      some races are apt to gain specified mutations
+      This should be allowed only if "choose_mut" is 0.
+                                            --- henkma
+    */
+    if (!choose_mut) {
+        if (creature_ptr->prace == RACE_VAMPIRE && !(creature_ptr->muta1 & MUT1_HYPN_GAZE) && (randint1(10) < 7)) {
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_HYPN_GAZE;
+            muta_desc = _("眼が幻惑的になった...", "Your eyes look mesmerizing...");
+
+        }
+
+        else if (creature_ptr->prace == RACE_IMP && !(creature_ptr->muta2 & MUT2_HORNS) && (randint1(10) < 7)) {
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HORNS;
+            muta_desc = _("角が額から生えてきた!", "Horns pop forth into your forehead!");
+
+        }
+
+        else if (creature_ptr->prace == RACE_YEEK && !(creature_ptr->muta1 & MUT1_SHRIEK) && (randint1(10) < 7)) {
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SHRIEK;
+            muta_desc = _("声質がかなり強くなった。", "Your vocal cords get much tougher.");
+
+        }
+
+        else if (creature_ptr->prace == RACE_BEASTMAN && !(creature_ptr->muta1 & MUT1_POLYMORPH) && (randint1(10) < 2)) {
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_POLYMORPH;
+            muta_desc = _("あなたの肉体は変化できるようになった、", "Your body seems mutable.");
+
+        }
+
+        else if (creature_ptr->prace == RACE_MIND_FLAYER && !(creature_ptr->muta2 & MUT2_TENTACLES) && (randint1(10) < 7)) {
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_TENTACLES;
+            muta_desc = _("邪悪な触手が口の周りに生えた。", "Evil-looking tentacles sprout from your mouth.");
+        }
+    }
+
+    msg_print(_("突然変異した!", "You mutate!"));
+
+    msg_print(muta_desc);
+    *muta_class |= muta_which;
+
+    if (muta_class == &(creature_ptr->muta3)) {
+        if (muta_which == MUT3_PUNY) {
+            if (creature_ptr->muta3 & MUT3_HYPER_STR) {
+                msg_print(_("あなたはもう超人的に強くはない!", "You no longer feel super-strong!"));
+
+                creature_ptr->muta3 &= ~(MUT3_HYPER_STR);
+            }
+        } else if (muta_which == MUT3_HYPER_STR) {
+            if (creature_ptr->muta3 & MUT3_PUNY) {
+                msg_print(_("あなたはもう虚弱ではない!", "You no longer feel puny!"));
+
+                creature_ptr->muta3 &= ~(MUT3_PUNY);
+            }
+        } else if (muta_which == MUT3_MORONIC) {
+            if (creature_ptr->muta3 & MUT3_HYPER_INT) {
+                msg_print(_("あなたの脳はもう生体コンピュータではない。", "Your brain is no longer a living computer."));
+
+                creature_ptr->muta3 &= ~(MUT3_HYPER_INT);
+            }
+        } else if (muta_which == MUT3_HYPER_INT) {
+            if (creature_ptr->muta3 & MUT3_MORONIC) {
+                msg_print(_("あなたはもう精神薄弱ではない。", "You are no longer moronic."));
+
+                creature_ptr->muta3 &= ~(MUT3_MORONIC);
+            }
+        } else if (muta_which == MUT3_IRON_SKIN) {
+            if (creature_ptr->muta3 & MUT3_SCALES) {
+                msg_print(_("鱗がなくなった。", "You lose your scales."));
+
+                creature_ptr->muta3 &= ~(MUT3_SCALES);
+            }
+            if (creature_ptr->muta3 & MUT3_FLESH_ROT) {
+                msg_print(_("肉体が腐乱しなくなった。", "Your flesh rots no longer."));
+
+                creature_ptr->muta3 &= ~(MUT3_FLESH_ROT);
+            }
+            if (creature_ptr->muta3 & MUT3_WART_SKIN) {
+                msg_print(_("肌のイボイボがなくなった。", "You lose your warts."));
+
+                creature_ptr->muta3 &= ~(MUT3_WART_SKIN);
+            }
+        } else if (muta_which == MUT3_WART_SKIN || muta_which == MUT3_SCALES || muta_which == MUT3_FLESH_ROT) {
+            if (creature_ptr->muta3 & MUT3_IRON_SKIN) {
+                msg_print(_("あなたの肌はもう鉄ではない。", "Your skin is no longer made of steel."));
+
+                creature_ptr->muta3 &= ~(MUT3_IRON_SKIN);
+            }
+        } else if (muta_which == MUT3_FEARLESS) {
+            if (creature_ptr->muta2 & MUT2_COWARDICE) {
+                msg_print(_("臆病でなくなった。", "You are no longer cowardly."));
+
+                creature_ptr->muta2 &= ~(MUT2_COWARDICE);
+            }
+        } else if (muta_which == MUT3_FLESH_ROT) {
+            if (creature_ptr->muta3 & MUT3_REGEN) {
+                msg_print(_("急速に回復しなくなった。", "You stop regenerating."));
+
+                creature_ptr->muta3 &= ~(MUT3_REGEN);
+            }
+        } else if (muta_which == MUT3_REGEN) {
+            if (creature_ptr->muta3 & MUT3_FLESH_ROT) {
+                msg_print(_("肉体が腐乱しなくなった。", "Your flesh stops rotting."));
+
+                creature_ptr->muta3 &= ~(MUT3_FLESH_ROT);
+            }
+        } else if (muta_which == MUT3_LIMBER) {
+            if (creature_ptr->muta3 & MUT3_ARTHRITIS) {
+                msg_print(_("関節が痛くなくなった。", "Your joints stop hurting."));
+
+                creature_ptr->muta3 &= ~(MUT3_ARTHRITIS);
+            }
+        } else if (muta_which == MUT3_ARTHRITIS) {
+            if (creature_ptr->muta3 & MUT3_LIMBER) {
+                msg_print(_("あなたはしなやかでなくなった。", "You no longer feel limber."));
+
+                creature_ptr->muta3 &= ~(MUT3_LIMBER);
+            }
+        }
+    } else if (muta_class == &(creature_ptr->muta2)) {
+        if (muta_which == MUT2_COWARDICE) {
+            if (creature_ptr->muta3 & MUT3_FEARLESS) {
+                msg_print(_("恐れ知らずでなくなった。", "You no longer feel fearless."));
+
+                creature_ptr->muta3 &= ~(MUT3_FEARLESS);
+            }
+        }
+        if (muta_which == MUT2_BEAK) {
+            if (creature_ptr->muta2 & MUT2_TRUNK) {
+                msg_print(_("あなたの鼻はもう象の鼻のようではなくなった。", "Your nose is no longer elephantine."));
+
+                creature_ptr->muta2 &= ~(MUT2_TRUNK);
+            }
+        }
+        if (muta_which == MUT2_TRUNK) {
+            if (creature_ptr->muta2 & MUT2_BEAK) {
+                msg_print(_("硬いクチバシがなくなった。", "You no longer have a hard beak."));
+
+                creature_ptr->muta2 &= ~(MUT2_BEAK);
+            }
+        }
+    }
+
+    creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
+    creature_ptr->update |= PU_BONUS;
+    handle_stuff(creature_ptr);
+    return TRUE;
 }
 
 /*!
@@ -911,651 +943,740 @@ bool gain_mutation(player_type *creature_ptr, MUTATION_IDX choose_mut)
  */
 bool lose_mutation(player_type *creature_ptr, MUTATION_IDX choose_mut)
 {
-       int attempts_left = 20;
-       concptr muta_desc = "";
-       bool muta_chosen = FALSE;
-       int muta_which = 0; // mutation_flag_type_1 とmutation_flag_type_2 の両対応とするため、敢えてint型で定義する
-       BIT_FLAGS *muta_class = NULL;
-
-       if (choose_mut) attempts_left = 1;
-
-       while (attempts_left--)
-       {
-               switch (choose_mut ? choose_mut : randint1(193))
-               {
-               case 1: case 2: case 3: case 4:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SPIT_ACID;
-                       muta_desc = _( "酸を吹きかける能力を失った。",  "You lose the ability to spit acid.");
-
-                       break;
-               case 5: case 6: case 7:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BR_FIRE;
-                       muta_desc = _( "炎のブレスを吐く能力を失った。",  "You lose the ability to breathe fire.");
-
-                       break;
-               case 8: case 9:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_HYPN_GAZE;
-                       muta_desc = _( "あなたの目はつまらない目になった。",  "Your eyes look uninteresting.");
-
-                       break;
-               case 10: case 11:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_TELEKINES;
-                       muta_desc = _( "念動力で物を動かす能力を失った。",  "You lose the ability to move objects telekinetically.");
-
-                       break;
-               case 12: case 13: case 14:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_VTELEPORT;
-                       muta_desc = _( "自分の意思でテレポートする能力を失った。",  "You lose the power of teleportation at will.");
-
-                       break;
-               case 15: case 16:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_MIND_BLST;
-                       muta_desc = _( "精神攻撃の能力を失った。",  "You lose the power of Mind Blast.");
-
-                       break;
-               case 17: case 18:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RADIATION;
-                       muta_desc = _( "あなたは放射能を発生しなくなった。",  "You stop emitting hard radiation.");
-
-                       break;
-               case 19: case 20:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_VAMPIRISM;
-                       muta_desc = _( "吸血の能力を失った。",  "You are no longer vampiric.");
-
-                       break;
-               case 21: case 22: case 23:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SMELL_MET;
-                       muta_desc = _( "金属の臭いを嗅げなくなった。",  "You no longer smell a metallic odor.");
-
-                       break;
-               case 24: case 25: case 26: case 27:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SMELL_MON;
-                       muta_desc = _( "不潔なモンスターの臭いを嗅げなくなった。",  "You no longer smell filthy monsters.");
-
-                       break;
-               case 28: case 29: case 30:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BLINK;
-                       muta_desc = _( "近距離テレポートの能力を失った。",  "You lose the power of minor teleportation.");
-
-                       break;
-               case 31: case 32:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EAT_ROCK;
-                       muta_desc = _( "壁は美味しそうに見えなくなった。",  "The walls look unappetizing.");
-
-                       break;
-               case 33: case 34:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SWAP_POS;
-                       muta_desc = _( "あなたは自分の靴に留まる感じがする。",  "You feel like staying in your own shoes.");
-
-                       break;
-               case 35: case 36: case 37:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_SHRIEK;
-                       muta_desc = _( "あなたの声質は弱くなった。",  "Your vocal cords get much weaker.");
-
-                       break;
-               case 38: case 39: case 40:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_ILLUMINE;
-                       muta_desc = _( "部屋を明るく照らすことが出来なくなった。",  "You can no longer light up rooms with your presence.");
-
-                       break;
-               case 41: case 42:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_DET_CURSE;
-                       muta_desc = _( "邪悪な魔法を感じられなくなった。",  "You can no longer feel evil magics.");
-
-                       break;
-               case 43: case 44: case 45:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BERSERK;
-                       muta_desc = _( "制御できる激情を感じなくなった。",  "You no longer feel a controlled rage.");
-
-                       break;
-               case 46:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_POLYMORPH;
-                       muta_desc = _( "あなたの体は安定したように見える。",  "Your body seems stable.");
-
-                       break;
-               case 47: case 48:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_MIDAS_TCH;
-                       muta_desc = _( "ミダスの手の能力を失った。",  "You lose the Midas touch.");
-
-                       break;
-               case 49:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_GROW_MOLD;
-                       muta_desc = _( "突然カビが嫌いになった。",  "You feel a sudden dislike for mold.");
-
-                       break;
-               case 50: case 51: case 52:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RESIST;
-                       muta_desc = _( "傷つき易くなった気がする。",  "You feel like you might be vulnerable.");
-
-                       break;
-               case 53: case 54: case 55:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EARTHQUAKE;
-                       muta_desc = _( "ダンジョンを壊す能力を失った。",  "You lose the ability to wreck the dungeon.");
-
-                       break;
-               case 56:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_EAT_MAGIC;
-                       muta_desc = _( "魔法のアイテムはもう美味しそうに見えなくなった。",  "Your magic items no longer look delicious.");
-
-                       break;
-               case 57: case 58:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_WEIGH_MAG;
-                       muta_desc = _( "魔力を感じられなくなった。",  "You no longer sense magic.");
-
-                       break;
-               case 59:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_STERILITY;
-                       muta_desc = _( "たくさんの安堵の吐息が聞こえた。",  "You hear a massed sigh of relief.");
-
-                       break;
-               case 60: case 61:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_HIT_AND_AWAY;
-                       muta_desc = _( "あちこちへ跳べる気分がなくなった。",  "You no longer feel jumpy.");
-
-                       break;
-               case 62: case 63: case 64:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_DAZZLE;
-                       muta_desc = _( "まばゆい閃光を発する能力を失った。",  "You lose the ability to emit dazzling lights.");
-
-                       break;
-               case 65: case 66: case 67:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_LASER_EYE;
-                       muta_desc = _( "眼が少しの間焼き付いて、痛みが和らいだ。",  "Your eyes burn for a moment, then feel soothed.");
-
-                       break;
-               case 68: case 69:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_RECALL;
-                       muta_desc = _( "少しの間ホームシックになった。",  "You feel briefly homesick.");
-
-                       break;
-               case 70:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_BANISH;
-                       muta_desc = _( "神聖な怒りの力を感じなくなった。",  "You no longer feel a holy wrath.");
-
-                       break;
-               case 71: case 72:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_COLD_TOUCH;
-                       muta_desc = _( "手が暖かくなった。",  "Your hands warm up.");
-
-                       break;
-               case 73: case 74:
-                       muta_class = &(creature_ptr->muta1);
-                       muta_which = MUT1_LAUNCHER;
-                       muta_desc = _( "物を投げる手が弱くなった気がする。",  "Your throwing arm feels much weaker.");
-
-                       break;
-               case 75:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BERS_RAGE;
-                       muta_desc = _( "凶暴化の発作にさらされなくなった!",  "You are no longer subject to fits of berserk rage!");
-
-                       break;
-               case 76:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_COWARDICE;
-                       muta_desc = _( "もう信じがたいほど臆病ではなくなった!",  "You are no longer an incredible coward!");
-
-                       break;
-               case 77:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_RTELEPORT;
-                       muta_desc = _( "あなたの位置はより確定的になった。",  "Your position seems more certain.");
-
-                       break;
-               case 78:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ALCOHOL;
-                       muta_desc = _( "あなたはアルコールを分泌しなくなった!",  "Your body stops producing alcohol!");
-
-                       break;
-               case 79:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HALLU;
-                       muta_desc = _( "幻覚をひき起こす精神障害を起こさなくなった!",  "You are no longer afflicted by a hallucinatory insanity!");
-
-                       break;
-               case 80:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_FLATULENT;
-                       muta_desc = _( "もう強烈な屁はこかなくなった。",  "You are no longer subject to uncontrollable flatulence.");
-
-                       break;
-               case 81: case 82:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SCOR_TAIL;
-                       muta_desc = _( "サソリの尻尾がなくなった!",  "You lose your scorpion tail!");
-
-                       break;
-               case 83: case 84:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HORNS;
-                       muta_desc = _( "額から角が消えた!",  "Your horns vanish from your forehead!");
-
-                       break;
-               case 85: case 86:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BEAK;
-                       muta_desc = _( "口が普通に戻った!",  "Your mouth reverts to normal!");
-
-                       break;
-               case 87: case 88:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_DEMON;
-                       muta_desc = _( "デーモンを引き寄せなくなった。",  "You stop attracting demons.");
-
-                       break;
-               case 89:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_PROD_MANA;
-                       muta_desc = _( "制御不能な魔法のエネルギーを発生しなくなった。",  "You stop producing magical energy uncontrollably.");
-
-                       break;
-               case 90: case 91:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SPEED_FLUX;
-                       muta_desc = _( "躁鬱質でなくなった。",  "You are no longer manic-depressive.");
-
-                       break;
-               case 92: case 93:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_BANISH_ALL;
-                       muta_desc = _( "背後に恐ろしい力を感じなくなった。",  "You no longer feel a terrifying power lurking behind you.");
-
-                       break;
-               case 94:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_EAT_LIGHT;
-                       muta_desc = _( "世界が明るいと感じる。",  "You feel the world's a brighter place.");
-
-                       break;
-               case 95: case 96:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_TRUNK;
-                       muta_desc = _( "鼻が普通の長さに戻った。",  "Your nose returns to a normal length.");
-
-                       break;
-               case 97:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_ANIMAL;
-                       muta_desc = _( "動物を引き寄せなくなった。",  "You stop attracting animals.");
-
-                       break;
-               case 98:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_TENTACLES;
-                       muta_desc = _( "触手が消えた。",  "Your tentacles vanish from your sides.");
-
-                       break;
-               case 99:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_RAW_CHAOS;
-                       muta_desc = _( "周囲の空間が安定した気がする。",  "You feel the universe is more stable around you.");
-
-                       break;
-               case 100: case 101: case 102:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_NORMALITY;
-                       muta_desc = _( "普通に奇妙な感じがする。",  "You feel normally strange.");
-
-                       break;
-               case 103:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WRAITH;
-                       muta_desc = _( "あなたは物質世界にしっかり存在している。",  "You are firmly in the physical world.");
-
-                       break;
-               case 104:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_POLY_WOUND;
-                       muta_desc = _( "古い傷からカオスの力が去っていった。",  "You feel forces of chaos departing your old scars.");
-
-                       break;
-               case 105:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WASTING;
-                       muta_desc = _( "おぞましい衰弱病が治った!",  "You are cured of the horrible wasting disease!");
-
-                       break;
-               case 106:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_ATT_DRAGON;
-                       muta_desc = _( "ドラゴンを引き寄せなくなった。",  "You stop attracting dragons.");
-
-                       break;
-               case 107: case 108:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WEIRD_MIND;
-                       muta_desc = _( "思考が退屈な方向に戻った。",  "Your thoughts return to boring paths.");
-
-                       break;
-               case 109:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_NAUSEA;
-                       muta_desc = _( "胃が痙攣しなくなった。",  "Your stomach stops roiling.");
-
-                       break;
-               case 110: case 111:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_CHAOS_GIFT;
-                       muta_desc = _( "混沌の神々の興味を惹かなくなった。",  "You lose the attention of the chaos deities.");
-
-                       break;
-               case 112:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WALK_SHAD;
-                       muta_desc = _( "物質世界に捕らわれている気がする。",  "You feel like you're trapped in reality.");
-
-                       break;
-               case 113: case 114:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_WARNING;
-                       muta_desc = _( "パラノイアでなくなった。",  "You no longer feel paranoid.");
-
-                       break;
-               case 115:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_INVULN;
-                       muta_desc = _( "無敵状態の発作を起こさなくなった。",  "You are no longer blessed with fits of invulnerability.");
-
-                       break;
-               case 116: case 117:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_SP_TO_HP;
-                       muta_desc = _( "魔法の治癒の発作に襲われなくなった。",  "You are no longer subject to fits of magical healing.");
-
-                       break;
-               case 118:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_HP_TO_SP;
-                       muta_desc = _( "痛みを伴う精神明瞭化の発作に襲われなくなった。",  "You are no longer subject to fits of painful clarity.");
-
-                       break;
-               case 119:
-                       muta_class = &(creature_ptr->muta2);
-                       muta_which = MUT2_DISARM;
-                       muta_desc = _( "脚が元の大きさに戻った。",  "Your feet shrink to their former size.");
-
-                       break;
-               case 120: case 121: case 122:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_HYPER_STR;
-                       muta_desc = _( "筋肉が普通に戻った。",  "Your muscles revert to normal.");
-
-                       break;
-               case 123: case 124: case 125:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_PUNY;
-                       muta_desc = _( "筋肉が普通に戻った。",  "Your muscles revert to normal.");
-
-                       break;
-               case 126: case 127: case 128:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_HYPER_INT;
-                       muta_desc = _( "脳が普通に戻った。",  "Your brain reverts to normal.");
-
-                       break;
-               case 129: case 130: case 131:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MORONIC;
-                       muta_desc = _( "脳が普通に戻った。",  "Your brain reverts to normal.");
-
-                       break;
-               case 132: case 133:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_RESILIENT;
-                       muta_desc = _( "普通の丈夫さに戻った。",  "You become ordinarily resilient again.");
-
-                       break;
-               case 134: case 135:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_FAT;
-                       muta_desc = _( "奇跡的なダイエットに成功した!",  "You benefit from a miracle diet!");
-
-                       break;
-               case 136: case 137:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ALBINO;
-                       muta_desc = _( "アルビノでなくなった!",  "You are no longer an albino!");
-
-                       break;
-               case 138: case 139: case 140:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FLESH_ROT;
-                       muta_desc = _( "肉体を腐敗させる病気が治った!",  "Your flesh is no longer afflicted by a rotting disease!");
-
-                       break;
-               case 141: case 142:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SILLY_VOI;
-                       muta_desc = _( "声質が普通に戻った。",  "Your voice returns to normal.");
-
-                       break;
-               case 143: case 144:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_BLANK_FAC;
-                       muta_desc = _( "顔に目鼻が戻った。",  "Your facial features return.");
-
-                       break;
-               case 145:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ILL_NORM;
-                       muta_desc = _( "心が安らぐ幻影を映し出さなくなった。",  "You stop projecting a reassuring image.");
-
-                       break;
-               case 146: case 147: case 148:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_EYES;
-                       muta_desc = _( "余分な目が消えてしまった!",  "Your extra eyes vanish!");
-
-                       break;
-               case 149: case 150:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MAGIC_RES;
-                       muta_desc = _( "魔法に弱くなった。",  "You become susceptible to magic again.");
-
-                       break;
-               case 151: case 152: case 153:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_NOIS;
-                       muta_desc = _( "奇妙な音を立てなくなった!",  "You stop making strange noise!");
-
-                       break;
-               case 154: case 155: case 156:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_INFRAVIS;
-                       muta_desc = _( "赤外線視力が落ちた。",  "Your infravision is degraded.");
-
-                       break;
-               case 157: case 158:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_XTRA_LEGS;
-                       muta_desc = _( "余分な脚が消えてしまった!",  "Your extra legs disappear!");
-
-                       break;
-               case 159: case 160:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SHORT_LEG;
-                       muta_desc = _( "脚の長さが普通に戻った。",  "Your legs lengthen to normal.");
-
-                       break;
-               case 161: case 162:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ELEC_TOUC;
-                       muta_desc = _( "体を電流が流れなくなった。",  "Electricity stops running through you.");
-
-                       break;
-               case 163: case 164:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FIRE_BODY;
-                       muta_desc = _( "体が炎に包まれなくなった。",  "Your body is no longer enveloped in flames.");
-
-                       break;
-               case 165: case 166: case 167:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_WART_SKIN;
-                       muta_desc = _( "イボイボが消えた!",  "Your warts disappear!");
-
-                       break;
-               case 168: case 169: case 170:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_SCALES;
-                       muta_desc = _( "鱗が消えた!",  "Your scales vanish!");
-
-                       break;
-               case 171: case 172:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_IRON_SKIN;
-                       muta_desc = _( "肌が肉にもどった!",  "Your skin reverts to flesh!");
-
-                       break;
-               case 173: case 174:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_WINGS;
-                       muta_desc = _( "背中の羽根が取れ落ちた。",  "Your wings fall off.");
-
-                       break;
-               case 175: case 176: case 177:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_FEARLESS;
-                       muta_desc = _( "再び恐怖を感じるようになった。",  "You begin to feel fear again.");
-
-                       break;
-               case 178: case 179:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_REGEN;
-                       muta_desc = _( "急速回復しなくなった。",  "You stop regenerating.");
-
-                       break;
-               case 180: case 181:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ESP;
-                       muta_desc = _( "テレパシーの能力を失った!",  "You lose your telepathic ability!");
-
-                       break;
-               case 182: case 183: case 184:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_LIMBER;
-                       muta_desc = _( "筋肉が硬くなった。",  "Your muscles stiffen.");
-
-                       break;
-               case 185: case 186: case 187:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_ARTHRITIS;
-                       muta_desc = _( "関節が痛くなくなった。",  "Your joints stop hurting.");
-
-                       break;
-               case 188:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_BAD_LUCK;
-                       muta_desc = _( "黒いオーラは渦巻いて消えた。",  "Your black aura swirls and fades.");
-
-                       break;
-               case 189:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_VULN_ELEM;
-                       muta_desc = _( "無防備な感じはなくなった。",  "You feel less exposed.");
-
-                       break;
-               case 190: case 191: case 192:
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_MOTION;
-                       muta_desc = _( "動作の正確さがなくなった。",  "You move with less assurance.");
-
-                       break;
-               case 193:
-                       if (creature_ptr->pseikaku == PERSONALITY_LUCKY) break;
-                       muta_class = &(creature_ptr->muta3);
-                       muta_which = MUT3_GOOD_LUCK;
-                       muta_desc = _( "白いオーラは輝いて消えた。",  "Your white aura shimmers and fades.");
-
-                       break;
-               default:
-                       muta_class = NULL;
-                       muta_which = 0;
-               }
-
-               if (muta_class && muta_which)
-               {
-                       if (*(muta_class) & muta_which)
-                       {
-                               muta_chosen = TRUE;
-                       }
-               }
-               if (muta_chosen == TRUE) break;
-       }
-
-       if (!muta_chosen)
-       {
-               return FALSE;
-       }
-
-       msg_print(muta_desc);
-       *(muta_class) &= ~(muta_which);
-
-       creature_ptr->update |= PU_BONUS;
-       handle_stuff(creature_ptr);
-       creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
-       return TRUE;
-}
+    int attempts_left = 20;
+    concptr muta_desc = "";
+    bool muta_chosen = FALSE;
+    int muta_which = 0; // mutation_flag_type_1 とmutation_flag_type_2 の両対応とするため、敢えてint型で定義する
+    BIT_FLAGS *muta_class = NULL;
+
+    if (choose_mut)
+        attempts_left = 1;
+
+    while (attempts_left--) {
+        switch (choose_mut ? choose_mut : randint1(193)) {
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SPIT_ACID;
+            muta_desc = _("酸を吹きかける能力を失った。", "You lose the ability to spit acid.");
+
+            break;
+        case 5:
+        case 6:
+        case 7:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BR_FIRE;
+            muta_desc = _("炎のブレスを吐く能力を失った。", "You lose the ability to breathe fire.");
+
+            break;
+        case 8:
+        case 9:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_HYPN_GAZE;
+            muta_desc = _("あなたの目はつまらない目になった。", "Your eyes look uninteresting.");
+
+            break;
+        case 10:
+        case 11:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_TELEKINES;
+            muta_desc = _("念動力で物を動かす能力を失った。", "You lose the ability to move objects telekinetically.");
+
+            break;
+        case 12:
+        case 13:
+        case 14:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_VTELEPORT;
+            muta_desc = _("自分の意思でテレポートする能力を失った。", "You lose the power of teleportation at will.");
+
+            break;
+        case 15:
+        case 16:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_MIND_BLST;
+            muta_desc = _("精神攻撃の能力を失った。", "You lose the power of Mind Blast.");
+
+            break;
+        case 17:
+        case 18:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RADIATION;
+            muta_desc = _("あなたは放射能を発生しなくなった。", "You stop emitting hard radiation.");
+
+            break;
+        case 19:
+        case 20:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_VAMPIRISM;
+            muta_desc = _("吸血の能力を失った。", "You are no longer vampiric.");
+
+            break;
+        case 21:
+        case 22:
+        case 23:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SMELL_MET;
+            muta_desc = _("金属の臭いを嗅げなくなった。", "You no longer smell a metallic odor.");
+
+            break;
+        case 24:
+        case 25:
+        case 26:
+        case 27:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SMELL_MON;
+            muta_desc = _("不潔なモンスターの臭いを嗅げなくなった。", "You no longer smell filthy monsters.");
+
+            break;
+        case 28:
+        case 29:
+        case 30:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BLINK;
+            muta_desc = _("近距離テレポートの能力を失った。", "You lose the power of minor teleportation.");
+
+            break;
+        case 31:
+        case 32:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EAT_ROCK;
+            muta_desc = _("壁は美味しそうに見えなくなった。", "The walls look unappetizing.");
+
+            break;
+        case 33:
+        case 34:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SWAP_POS;
+            muta_desc = _("あなたは自分の靴に留まる感じがする。", "You feel like staying in your own shoes.");
+
+            break;
+        case 35:
+        case 36:
+        case 37:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_SHRIEK;
+            muta_desc = _("あなたの声質は弱くなった。", "Your vocal cords get much weaker.");
+
+            break;
+        case 38:
+        case 39:
+        case 40:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_ILLUMINE;
+            muta_desc = _("部屋を明るく照らすことが出来なくなった。", "You can no longer light up rooms with your presence.");
+
+            break;
+        case 41:
+        case 42:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_DET_CURSE;
+            muta_desc = _("邪悪な魔法を感じられなくなった。", "You can no longer feel evil magics.");
+
+            break;
+        case 43:
+        case 44:
+        case 45:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BERSERK;
+            muta_desc = _("制御できる激情を感じなくなった。", "You no longer feel a controlled rage.");
+
+            break;
+        case 46:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_POLYMORPH;
+            muta_desc = _("あなたの体は安定したように見える。", "Your body seems stable.");
+
+            break;
+        case 47:
+        case 48:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_MIDAS_TCH;
+            muta_desc = _("ミダスの手の能力を失った。", "You lose the Midas touch.");
+
+            break;
+        case 49:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_GROW_MOLD;
+            muta_desc = _("突然カビが嫌いになった。", "You feel a sudden dislike for mold.");
+
+            break;
+        case 50:
+        case 51:
+        case 52:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RESIST;
+            muta_desc = _("傷つき易くなった気がする。", "You feel like you might be vulnerable.");
+
+            break;
+        case 53:
+        case 54:
+        case 55:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EARTHQUAKE;
+            muta_desc = _("ダンジョンを壊す能力を失った。", "You lose the ability to wreck the dungeon.");
+
+            break;
+        case 56:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_EAT_MAGIC;
+            muta_desc = _("魔法のアイテムはもう美味しそうに見えなくなった。", "Your magic items no longer look delicious.");
+
+            break;
+        case 57:
+        case 58:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_WEIGH_MAG;
+            muta_desc = _("魔力を感じられなくなった。", "You no longer sense magic.");
+
+            break;
+        case 59:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_STERILITY;
+            muta_desc = _("たくさんの安堵の吐息が聞こえた。", "You hear a massed sigh of relief.");
+
+            break;
+        case 60:
+        case 61:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_HIT_AND_AWAY;
+            muta_desc = _("あちこちへ跳べる気分がなくなった。", "You no longer feel jumpy.");
+
+            break;
+        case 62:
+        case 63:
+        case 64:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_DAZZLE;
+            muta_desc = _("まばゆい閃光を発する能力を失った。", "You lose the ability to emit dazzling lights.");
+
+            break;
+        case 65:
+        case 66:
+        case 67:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_LASER_EYE;
+            muta_desc = _("眼が少しの間焼き付いて、痛みが和らいだ。", "Your eyes burn for a moment, then feel soothed.");
+
+            break;
+        case 68:
+        case 69:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_RECALL;
+            muta_desc = _("少しの間ホームシックになった。", "You feel briefly homesick.");
+
+            break;
+        case 70:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_BANISH;
+            muta_desc = _("神聖な怒りの力を感じなくなった。", "You no longer feel a holy wrath.");
+
+            break;
+        case 71:
+        case 72:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_COLD_TOUCH;
+            muta_desc = _("手が暖かくなった。", "Your hands warm up.");
+
+            break;
+        case 73:
+        case 74:
+            muta_class = &(creature_ptr->muta1);
+            muta_which = MUT1_LAUNCHER;
+            muta_desc = _("物を投げる手が弱くなった気がする。", "Your throwing arm feels much weaker.");
+
+            break;
+        case 75:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BERS_RAGE;
+            muta_desc = _("凶暴化の発作にさらされなくなった!", "You are no longer subject to fits of berserk rage!");
+
+            break;
+        case 76:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_COWARDICE;
+            muta_desc = _("もう信じがたいほど臆病ではなくなった!", "You are no longer an incredible coward!");
+
+            break;
+        case 77:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_RTELEPORT;
+            muta_desc = _("あなたの位置はより確定的になった。", "Your position seems more certain.");
+
+            break;
+        case 78:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ALCOHOL;
+            muta_desc = _("あなたはアルコールを分泌しなくなった!", "Your body stops producing alcohol!");
+
+            break;
+        case 79:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HALLU;
+            muta_desc = _("幻覚をひき起こす精神障害を起こさなくなった!", "You are no longer afflicted by a hallucinatory insanity!");
+
+            break;
+        case 80:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_FLATULENT;
+            muta_desc = _("もう強烈な屁はこかなくなった。", "You are no longer subject to uncontrollable flatulence.");
+
+            break;
+        case 81:
+        case 82:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SCOR_TAIL;
+            muta_desc = _("サソリの尻尾がなくなった!", "You lose your scorpion tail!");
+
+            break;
+        case 83:
+        case 84:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HORNS;
+            muta_desc = _("額から角が消えた!", "Your horns vanish from your forehead!");
+
+            break;
+        case 85:
+        case 86:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BEAK;
+            muta_desc = _("口が普通に戻った!", "Your mouth reverts to normal!");
+
+            break;
+        case 87:
+        case 88:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_DEMON;
+            muta_desc = _("デーモンを引き寄せなくなった。", "You stop attracting demons.");
+
+            break;
+        case 89:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_PROD_MANA;
+            muta_desc = _("制御不能な魔法のエネルギーを発生しなくなった。", "You stop producing magical energy uncontrollably.");
+
+            break;
+        case 90:
+        case 91:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SPEED_FLUX;
+            muta_desc = _("躁鬱質でなくなった。", "You are no longer manic-depressive.");
+
+            break;
+        case 92:
+        case 93:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_BANISH_ALL;
+            muta_desc = _("背後に恐ろしい力を感じなくなった。", "You no longer feel a terrifying power lurking behind you.");
+
+            break;
+        case 94:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_EAT_LIGHT;
+            muta_desc = _("世界が明るいと感じる。", "You feel the world's a brighter place.");
+
+            break;
+        case 95:
+        case 96:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_TRUNK;
+            muta_desc = _("鼻が普通の長さに戻った。", "Your nose returns to a normal length.");
+
+            break;
+        case 97:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_ANIMAL;
+            muta_desc = _("動物を引き寄せなくなった。", "You stop attracting animals.");
+
+            break;
+        case 98:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_TENTACLES;
+            muta_desc = _("触手が消えた。", "Your tentacles vanish from your sides.");
+
+            break;
+        case 99:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_RAW_CHAOS;
+            muta_desc = _("周囲の空間が安定した気がする。", "You feel the universe is more stable around you.");
+
+            break;
+        case 100:
+        case 101:
+        case 102:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_NORMALITY;
+            muta_desc = _("普通に奇妙な感じがする。", "You feel normally strange.");
+
+            break;
+        case 103:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WRAITH;
+            muta_desc = _("あなたは物質世界にしっかり存在している。", "You are firmly in the physical world.");
+
+            break;
+        case 104:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_POLY_WOUND;
+            muta_desc = _("古い傷からカオスの力が去っていった。", "You feel forces of chaos departing your old scars.");
+
+            break;
+        case 105:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WASTING;
+            muta_desc = _("おぞましい衰弱病が治った!", "You are cured of the horrible wasting disease!");
+
+            break;
+        case 106:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_ATT_DRAGON;
+            muta_desc = _("ドラゴンを引き寄せなくなった。", "You stop attracting dragons.");
+
+            break;
+        case 107:
+        case 108:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WEIRD_MIND;
+            muta_desc = _("思考が退屈な方向に戻った。", "Your thoughts return to boring paths.");
+
+            break;
+        case 109:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_NAUSEA;
+            muta_desc = _("胃が痙攣しなくなった。", "Your stomach stops roiling.");
+
+            break;
+        case 110:
+        case 111:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_CHAOS_GIFT;
+            muta_desc = _("混沌の神々の興味を惹かなくなった。", "You lose the attention of the chaos deities.");
+
+            break;
+        case 112:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WALK_SHAD;
+            muta_desc = _("物質世界に捕らわれている気がする。", "You feel like you're trapped in reality.");
+
+            break;
+        case 113:
+        case 114:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_WARNING;
+            muta_desc = _("パラノイアでなくなった。", "You no longer feel paranoid.");
+
+            break;
+        case 115:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_INVULN;
+            muta_desc = _("無敵状態の発作を起こさなくなった。", "You are no longer blessed with fits of invulnerability.");
+
+            break;
+        case 116:
+        case 117:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_SP_TO_HP;
+            muta_desc = _("魔法の治癒の発作に襲われなくなった。", "You are no longer subject to fits of magical healing.");
+
+            break;
+        case 118:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_HP_TO_SP;
+            muta_desc = _("痛みを伴う精神明瞭化の発作に襲われなくなった。", "You are no longer subject to fits of painful clarity.");
+
+            break;
+        case 119:
+            muta_class = &(creature_ptr->muta2);
+            muta_which = MUT2_DISARM;
+            muta_desc = _("脚が元の大きさに戻った。", "Your feet shrink to their former size.");
+
+            break;
+        case 120:
+        case 121:
+        case 122:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_HYPER_STR;
+            muta_desc = _("筋肉が普通に戻った。", "Your muscles revert to normal.");
+
+            break;
+        case 123:
+        case 124:
+        case 125:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_PUNY;
+            muta_desc = _("筋肉が普通に戻った。", "Your muscles revert to normal.");
+
+            break;
+        case 126:
+        case 127:
+        case 128:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_HYPER_INT;
+            muta_desc = _("脳が普通に戻った。", "Your brain reverts to normal.");
+
+            break;
+        case 129:
+        case 130:
+        case 131:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MORONIC;
+            muta_desc = _("脳が普通に戻った。", "Your brain reverts to normal.");
+
+            break;
+        case 132:
+        case 133:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_RESILIENT;
+            muta_desc = _("普通の丈夫さに戻った。", "You become ordinarily resilient again.");
+
+            break;
+        case 134:
+        case 135:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_FAT;
+            muta_desc = _("奇跡的なダイエットに成功した!", "You benefit from a miracle diet!");
+
+            break;
+        case 136:
+        case 137:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ALBINO;
+            muta_desc = _("アルビノでなくなった!", "You are no longer an albino!");
+
+            break;
+        case 138:
+        case 139:
+        case 140:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FLESH_ROT;
+            muta_desc = _("肉体を腐敗させる病気が治った!", "Your flesh is no longer afflicted by a rotting disease!");
+
+            break;
+        case 141:
+        case 142:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SILLY_VOI;
+            muta_desc = _("声質が普通に戻った。", "Your voice returns to normal.");
+
+            break;
+        case 143:
+        case 144:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_BLANK_FAC;
+            muta_desc = _("顔に目鼻が戻った。", "Your facial features return.");
+
+            break;
+        case 145:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ILL_NORM;
+            muta_desc = _("心が安らぐ幻影を映し出さなくなった。", "You stop projecting a reassuring image.");
+
+            break;
+        case 146:
+        case 147:
+        case 148:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_EYES;
+            muta_desc = _("余分な目が消えてしまった!", "Your extra eyes vanish!");
+
+            break;
+        case 149:
+        case 150:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MAGIC_RES;
+            muta_desc = _("魔法に弱くなった。", "You become susceptible to magic again.");
+
+            break;
+        case 151:
+        case 152:
+        case 153:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_NOIS;
+            muta_desc = _("奇妙な音を立てなくなった!", "You stop making strange noise!");
+
+            break;
+        case 154:
+        case 155:
+        case 156:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_INFRAVIS;
+            muta_desc = _("赤外線視力が落ちた。", "Your infravision is degraded.");
+
+            break;
+        case 157:
+        case 158:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_XTRA_LEGS;
+            muta_desc = _("余分な脚が消えてしまった!", "Your extra legs disappear!");
+
+            break;
+        case 159:
+        case 160:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SHORT_LEG;
+            muta_desc = _("脚の長さが普通に戻った。", "Your legs lengthen to normal.");
+
+            break;
+        case 161:
+        case 162:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ELEC_TOUC;
+            muta_desc = _("体を電流が流れなくなった。", "Electricity stops running through you.");
+
+            break;
+        case 163:
+        case 164:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FIRE_BODY;
+            muta_desc = _("体が炎に包まれなくなった。", "Your body is no longer enveloped in flames.");
+
+            break;
+        case 165:
+        case 166:
+        case 167:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_WART_SKIN;
+            muta_desc = _("イボイボが消えた!", "Your warts disappear!");
+
+            break;
+        case 168:
+        case 169:
+        case 170:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_SCALES;
+            muta_desc = _("鱗が消えた!", "Your scales vanish!");
+
+            break;
+        case 171:
+        case 172:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_IRON_SKIN;
+            muta_desc = _("肌が肉にもどった!", "Your skin reverts to flesh!");
+
+            break;
+        case 173:
+        case 174:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_WINGS;
+            muta_desc = _("背中の羽根が取れ落ちた。", "Your wings fall off.");
+
+            break;
+        case 175:
+        case 176:
+        case 177:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_FEARLESS;
+            muta_desc = _("再び恐怖を感じるようになった。", "You begin to feel fear again.");
+
+            break;
+        case 178:
+        case 179:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_REGEN;
+            muta_desc = _("急速回復しなくなった。", "You stop regenerating.");
+
+            break;
+        case 180:
+        case 181:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ESP;
+            muta_desc = _("テレパシーの能力を失った!", "You lose your telepathic ability!");
+
+            break;
+        case 182:
+        case 183:
+        case 184:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_LIMBER;
+            muta_desc = _("筋肉が硬くなった。", "Your muscles stiffen.");
+
+            break;
+        case 185:
+        case 186:
+        case 187:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_ARTHRITIS;
+            muta_desc = _("関節が痛くなくなった。", "Your joints stop hurting.");
+
+            break;
+        case 188:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_BAD_LUCK;
+            muta_desc = _("黒いオーラは渦巻いて消えた。", "Your black aura swirls and fades.");
+
+            break;
+        case 189:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_VULN_ELEM;
+            muta_desc = _("無防備な感じはなくなった。", "You feel less exposed.");
+
+            break;
+        case 190:
+        case 191:
+        case 192:
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_MOTION;
+            muta_desc = _("動作の正確さがなくなった。", "You move with less assurance.");
+
+            break;
+        case 193:
+            if (creature_ptr->pseikaku == PERSONALITY_LUCKY)
+                break;
+            muta_class = &(creature_ptr->muta3);
+            muta_which = MUT3_GOOD_LUCK;
+            muta_desc = _("白いオーラは輝いて消えた。", "Your white aura shimmers and fades.");
+
+            break;
+        default:
+            muta_class = NULL;
+            muta_which = 0;
+        }
 
+        if (muta_class && muta_which) {
+            if (*(muta_class)&muta_which) {
+                muta_chosen = TRUE;
+            }
+        }
+        if (muta_chosen == TRUE)
+            break;
+    }
+
+    if (!muta_chosen) {
+        return FALSE;
+    }
+
+    msg_print(muta_desc);
+    *(muta_class) &= ~(muta_which);
+
+    creature_ptr->update |= PU_BONUS;
+    handle_stuff(creature_ptr);
+    creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
+    return TRUE;
+}
 
 void lose_all_mutations(player_type *creature_ptr)
 {
-       if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3)
-       {
-               chg_virtue(creature_ptr, V_CHANCE, -5);
-               msg_print(_("全ての突然変異が治った。", "You are cured of all mutations."));
-               creature_ptr->muta1 = creature_ptr->muta2 = creature_ptr->muta3 = 0;
-               creature_ptr->update |= PU_BONUS;
-               handle_stuff(creature_ptr);
-               creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
-       }
+    if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3) {
+        chg_virtue(creature_ptr, V_CHANCE, -5);
+        msg_print(_("全ての突然変異が治った。", "You are cured of all mutations."));
+        creature_ptr->muta1 = creature_ptr->muta2 = creature_ptr->muta3 = 0;
+        creature_ptr->update |= PU_BONUS;
+        handle_stuff(creature_ptr);
+        creature_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(creature_ptr);
+    }
 }
 
-
 /*!
  * @brief 現在プレイヤー得ている突然変異の数を返す。
  * @return 現在得ている突然変異の数
  */
 static int count_mutations(player_type *creature_ptr)
 {
-       return (count_bits(creature_ptr->muta1) +
-               count_bits(creature_ptr->muta2) +
-               count_bits(creature_ptr->muta3));
+    return (count_bits(creature_ptr->muta1) + count_bits(creature_ptr->muta2) + count_bits(creature_ptr->muta3));
 }
 
-
 /*!
  * @brief 突然変異による自然回復ペナルティをパーセント値で返す /
  * Return the modifier to the regeneration rate (in percent)
@@ -1563,34 +1684,35 @@ static int count_mutations(player_type *creature_ptr)
  */
 int calc_mutant_regenerate_mod(player_type *creature_ptr)
 {
-       int regen;
-       int mod = 10;
-       int count = count_mutations(creature_ptr);
-
-       /*
-        * Beastman get 10 "free" mutations and
-        * only 5% decrease per additional mutation
-        */
-
-       if (creature_ptr->pseikaku == PERSONALITY_LUCKY) count--;
-       if (creature_ptr->prace == RACE_BEASTMAN)
-       {
-               count -= 10;
-               mod = 5;
-       }
+    int regen;
+    int mod = 10;
+    int count = count_mutations(creature_ptr);
+
+    /*
+     * Beastman get 10 "free" mutations and
+     * only 5% decrease per additional mutation
+     */
+
+    if (creature_ptr->pseikaku == PERSONALITY_LUCKY)
+        count--;
+    if (creature_ptr->prace == RACE_BEASTMAN) {
+        count -= 10;
+        mod = 5;
+    }
 
-       /* No negative modifier */
-       if (count <= 0) return 100;
+    /* No negative modifier */
+    if (count <= 0)
+        return 100;
 
-       regen = 100 - count * mod;
+    regen = 100 - count * mod;
 
-       /* Max. 90% decrease in regeneration speed */
-       if (regen < 10) regen = 10;
+    /* Max. 90% decrease in regeneration speed */
+    if (regen < 10)
+        regen = 10;
 
-       return (regen);
+    return (regen);
 }
 
-
 /*!
  * @brief 突然変異のレイシャル効果実装
  * @param creature_ptr プレーヤーへの参照ポインタ
@@ -1599,299 +1721,286 @@ int calc_mutant_regenerate_mod(player_type *creature_ptr)
  */
 bool exe_mutation_power(player_type *creature_ptr, int power)
 {
-       DIRECTION dir = 0;
-       PLAYER_LEVEL lvl = creature_ptr->lev;
-
-       switch (power)
-       {
-               case MUT1_SPIT_ACID:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       stop_mouth(creature_ptr);
-                       msg_print(_("酸を吐きかけた...", "You spit acid..."));
-                       fire_ball(creature_ptr, GF_ACID, dir, lvl, 1 + (lvl / 30));
-                       break;
-
-               case MUT1_BR_FIRE:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       stop_mouth(creature_ptr);
-                       msg_print(_("あなたは火炎のブレスを吐いた...", "You breathe fire..."));
-                       fire_breath(creature_ptr, GF_FIRE, dir, lvl * 2, 1 + (lvl / 20));
-                       break;
-
-               case MUT1_HYPN_GAZE:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       msg_print(_("あなたの目は幻惑的になった...", "Your eyes look mesmerizing..."));
-                       (void)charm_monster(creature_ptr, dir, lvl);
-                       break;
-
-               case MUT1_TELEKINES:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       msg_print(_("集中している...", "You concentrate..."));
-                       fetch_item(creature_ptr, dir, lvl * 10, TRUE);
-                       break;
-
-               case MUT1_VTELEPORT:
-                       msg_print(_("集中している...", "You concentrate..."));
-                       teleport_player(creature_ptr, 10 + 4 * lvl, TELEPORT_SPONTANEOUS);
-                       break;
-
-               case MUT1_MIND_BLST:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       msg_print(_("集中している...", "You concentrate..."));
-                       fire_bolt(creature_ptr, GF_PSI, dir, damroll(3 + ((lvl - 1) / 5), 3));
-                       break;
-
-               case MUT1_RADIATION:
-                       msg_print(_("体から放射能が発生した!", "Radiation flows from your body!"));
-                       fire_ball(creature_ptr, GF_NUKE, 0, (lvl * 2), 3 + (lvl / 20));
-                       break;
-
-               case MUT1_VAMPIRISM:
-                       vampirism(creature_ptr);
-                       break;
-
-               case MUT1_SMELL_MET:
-                       stop_mouth(creature_ptr);
-                       (void)detect_treasure(creature_ptr, DETECT_RAD_DEFAULT);
-                       break;
-
-               case MUT1_SMELL_MON:
-                       stop_mouth(creature_ptr);
-                       (void)detect_monsters_normal(creature_ptr, DETECT_RAD_DEFAULT);
-                       break;
-
-               case MUT1_BLINK:
-                       teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
-                       break;
-
-               case MUT1_EAT_ROCK:
-                       return eat_rock(creature_ptr);
-                       break;
-
-               case MUT1_SWAP_POS:
-                       project_length = -1;
-                       if (!get_aim_dir(creature_ptr, &dir))
-                       {
-                               project_length = 0;
-                               return FALSE;
-                       }
-                       (void)teleport_swap(creature_ptr, dir);
-                       project_length = 0;
-                       break;
-
-               case MUT1_SHRIEK:
-                       stop_mouth(creature_ptr);
-                       (void)fire_ball(creature_ptr, GF_SOUND, 0, 2 * lvl, 8);
-                       (void)aggravate_monsters(creature_ptr, 0);
-                       break;
-
-               case MUT1_ILLUMINE:
-                       (void)lite_area(creature_ptr, damroll(2, (lvl / 2)), (lvl / 10) + 1);
-                       break;
-
-               case MUT1_DET_CURSE:
-                       {
-                               int i;
-
-                               for (i = 0; i < INVEN_TOTAL; i++)
-                               {
-                                       object_type *o_ptr = &creature_ptr->inventory_list[i];
-
-                                       if (!o_ptr->k_idx) continue;
-                                       if (!object_is_cursed(o_ptr)) continue;
-
-                                       o_ptr->feeling = FEEL_CURSED;
-                               }
-                       }
-                       break;
-
-               case MUT1_BERSERK:
-                       (void)berserk(creature_ptr, randint1(25) + 25);
-                       break;
-
-               case MUT1_POLYMORPH:
-                       if (!get_check(_("変身します。よろしいですか?", "You will polymorph your self. Are you sure? "))) return FALSE;
-                       do_poly_self(creature_ptr);
-                       break;
-
-               case MUT1_MIDAS_TCH:
-                       if (!alchemy(creature_ptr)) return FALSE;
-                       break;
-
-               /* Summon pet molds around the player */
-               case MUT1_GROW_MOLD:
-                       {
-                               DIRECTION i;
-                               for (i = 0; i < 8; i++)
-                               {
-                                       summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, lvl, SUMMON_MOLD, PM_FORCE_PET);
-                               }
-                       }
-                       break;
-
-               case MUT1_RESIST:
-                       {
-                               int num = lvl / 10;
-                               TIME_EFFECT dur = randint1(20) + 20;
-
-                               if (randint0(5) < num)
-                               {
-                                       (void)set_oppose_acid(creature_ptr, dur, FALSE);
-                                       num--;
-                               }
-                               if (randint0(4) < num)
-                               {
-                                       (void)set_oppose_elec(creature_ptr, dur, FALSE);
-                                       num--;
-                               }
-                               if (randint0(3) < num)
-                               {
-                                       (void)set_oppose_fire(creature_ptr, dur, FALSE);
-                                       num--;
-                               }
-                               if (randint0(2) < num)
-                               {
-                                       (void)set_oppose_cold(creature_ptr, dur, FALSE);
-                                       num--;
-                               }
-                               if (num)
-                               {
-                                       (void)set_oppose_pois(creature_ptr, dur, FALSE);
-                                       num--;
-                               }
-                       }
-                       break;
-
-               case MUT1_EARTHQUAKE:
-                       (void)earthquake(creature_ptr, creature_ptr->y, creature_ptr->x, 10, 0);
-                       break;
-
-               case MUT1_EAT_MAGIC:
-                       if (!eat_magic(creature_ptr, creature_ptr->lev * 2)) return FALSE;
-                       break;
-
-               case MUT1_WEIGH_MAG:
-                       report_magics(creature_ptr);
-                       break;
-
-               case MUT1_STERILITY:
-                       msg_print(_("突然頭が痛くなった!", "You suddenly have a headache!"));
-                       take_hit(creature_ptr, DAMAGE_LOSELIFE, randint1(17) + 17, _("禁欲を強いた疲労", "the strain of forcing abstinence"), -1);
-                       creature_ptr->current_floor_ptr->num_repro += MAX_REPRO;
-                       break;
-
-               case MUT1_HIT_AND_AWAY:
-                       if(!hit_and_away(creature_ptr)) return FALSE;
-                       break;
-
-               case MUT1_DAZZLE:
-                       stun_monsters(creature_ptr, lvl * 4);
-                       confuse_monsters(creature_ptr, lvl * 4);
-                       turn_monsters(creature_ptr, lvl * 4);
-                       break;
-
-               case MUT1_LASER_EYE:
-                       if (!get_aim_dir(creature_ptr, &dir)) return FALSE;
-                       fire_beam(creature_ptr, GF_LITE, dir, 2 * lvl);
-                       break;
-
-               case MUT1_RECALL:
-                       if (!recall_player(creature_ptr, randint0(21) + 15)) return FALSE;
-                       break;
-
-               case MUT1_BANISH:
-                       {
-                               POSITION x, y;
-                               grid_type *g_ptr;
-                               monster_type *m_ptr;
-                               monster_race *r_ptr;
-                               if (!get_direction(creature_ptr, &dir, FALSE, FALSE)) return FALSE;
-                               y = creature_ptr->y + ddy[dir];
-                               x = creature_ptr->x + ddx[dir];
-                               g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
-
-                               if (!g_ptr->m_idx)
-                               {
-                                       msg_print(_("邪悪な存在を感じとれません!", "You sense no evil there!"));
-
-                                       break;
-                               }
-
-                               m_ptr = &creature_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
-                               r_ptr = &r_info[m_ptr->r_idx];
-
-                               if ((r_ptr->flags3 & RF3_EVIL) &&
-                                   !(r_ptr->flags1 & RF1_QUESTOR) &&
-                                   !(r_ptr->flags1 & RF1_UNIQUE) &&
-                                   !creature_ptr->current_floor_ptr->inside_arena && !creature_ptr->current_floor_ptr->inside_quest &&
-                                       (r_ptr->level < randint1(creature_ptr->lev+50)) &&
-                                       !(m_ptr->mflag2 & MFLAG2_NOGENO))
-                               {
-                                       if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
-                                       {
-                                               GAME_TEXT m_name[MAX_NLEN];
-                                               monster_desc(creature_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
-                                               exe_write_diary(creature_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
-                                       }
-                                       /* Delete the monster, rather than killing it. */
-                                       delete_monster_idx(creature_ptr, g_ptr->m_idx);
-                                       msg_print(_("その邪悪なモンスターは硫黄臭い煙とともに消え去った!", "The evil creature vanishes in a puff of sulfurous smoke!"));
-
-                               }
-                               else
-                               {
-                                       msg_print(_("祈りは効果がなかった!", "Your invocation is ineffectual!"));
-                                       if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO;
-                               }
-                       }
-                       break;
-
-               case MUT1_COLD_TOUCH:
-                       {
-                               POSITION x, y;
-                               grid_type *g_ptr;
-                               if (!get_direction(creature_ptr, &dir, FALSE, FALSE)) return FALSE;
-                               y = creature_ptr->y + ddy[dir];
-                               x = creature_ptr->x + ddx[dir];
-                               g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
-                               if (!g_ptr->m_idx)
-                               {
-                                       msg_print(_("あなたは何もない場所で手を振った。", "You wave your hands in the air."));
-
-                                       break;
-                               }
-                               fire_bolt(creature_ptr, GF_COLD, dir, 2 * lvl);
-                       }
-                       break;
-
-               /* XXX_XXX_XXX Hack! MUT1_LAUNCHER is negative, see above */
-               case 3: /* MUT1_LAUNCHER */
-                       /* Gives a multiplier of 2 at first, up to 3 at 40th */
-                       if (!do_cmd_throw(creature_ptr, 2 + lvl / 40, FALSE, -1)) return FALSE;
-                       break;
-
-               default:
-                       free_turn(creature_ptr);
-                       msg_format(_("能力 %s は実装されていません。", "Power %s not implemented. Oops."), power);
-       }
-
-       return TRUE;
+    DIRECTION dir = 0;
+    PLAYER_LEVEL lvl = creature_ptr->lev;
+
+    switch (power) {
+    case MUT1_SPIT_ACID:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        stop_mouth(creature_ptr);
+        msg_print(_("酸を吐きかけた...", "You spit acid..."));
+        fire_ball(creature_ptr, GF_ACID, dir, lvl, 1 + (lvl / 30));
+        break;
+
+    case MUT1_BR_FIRE:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        stop_mouth(creature_ptr);
+        msg_print(_("あなたは火炎のブレスを吐いた...", "You breathe fire..."));
+        fire_breath(creature_ptr, GF_FIRE, dir, lvl * 2, 1 + (lvl / 20));
+        break;
+
+    case MUT1_HYPN_GAZE:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        msg_print(_("あなたの目は幻惑的になった...", "Your eyes look mesmerizing..."));
+        (void)charm_monster(creature_ptr, dir, lvl);
+        break;
+
+    case MUT1_TELEKINES:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        msg_print(_("集中している...", "You concentrate..."));
+        fetch_item(creature_ptr, dir, lvl * 10, TRUE);
+        break;
+
+    case MUT1_VTELEPORT:
+        msg_print(_("集中している...", "You concentrate..."));
+        teleport_player(creature_ptr, 10 + 4 * lvl, TELEPORT_SPONTANEOUS);
+        break;
+
+    case MUT1_MIND_BLST:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        msg_print(_("集中している...", "You concentrate..."));
+        fire_bolt(creature_ptr, GF_PSI, dir, damroll(3 + ((lvl - 1) / 5), 3));
+        break;
+
+    case MUT1_RADIATION:
+        msg_print(_("体から放射能が発生した!", "Radiation flows from your body!"));
+        fire_ball(creature_ptr, GF_NUKE, 0, (lvl * 2), 3 + (lvl / 20));
+        break;
+
+    case MUT1_VAMPIRISM:
+        vampirism(creature_ptr);
+        break;
+
+    case MUT1_SMELL_MET:
+        stop_mouth(creature_ptr);
+        (void)detect_treasure(creature_ptr, DETECT_RAD_DEFAULT);
+        break;
+
+    case MUT1_SMELL_MON:
+        stop_mouth(creature_ptr);
+        (void)detect_monsters_normal(creature_ptr, DETECT_RAD_DEFAULT);
+        break;
+
+    case MUT1_BLINK:
+        teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
+        break;
+
+    case MUT1_EAT_ROCK:
+        return eat_rock(creature_ptr);
+        break;
+
+    case MUT1_SWAP_POS:
+        project_length = -1;
+        if (!get_aim_dir(creature_ptr, &dir)) {
+            project_length = 0;
+            return FALSE;
+        }
+        (void)teleport_swap(creature_ptr, dir);
+        project_length = 0;
+        break;
+
+    case MUT1_SHRIEK:
+        stop_mouth(creature_ptr);
+        (void)fire_ball(creature_ptr, GF_SOUND, 0, 2 * lvl, 8);
+        (void)aggravate_monsters(creature_ptr, 0);
+        break;
+
+    case MUT1_ILLUMINE:
+        (void)lite_area(creature_ptr, damroll(2, (lvl / 2)), (lvl / 10) + 1);
+        break;
+
+    case MUT1_DET_CURSE: {
+        int i;
+
+        for (i = 0; i < INVEN_TOTAL; i++) {
+            object_type *o_ptr = &creature_ptr->inventory_list[i];
+
+            if (!o_ptr->k_idx)
+                continue;
+            if (!object_is_cursed(o_ptr))
+                continue;
+
+            o_ptr->feeling = FEEL_CURSED;
+        }
+    } break;
+
+    case MUT1_BERSERK:
+        (void)berserk(creature_ptr, randint1(25) + 25);
+        break;
+
+    case MUT1_POLYMORPH:
+        if (!get_check(_("変身します。よろしいですか?", "You will polymorph your self. Are you sure? ")))
+            return FALSE;
+        do_poly_self(creature_ptr);
+        break;
+
+    case MUT1_MIDAS_TCH:
+        if (!alchemy(creature_ptr))
+            return FALSE;
+        break;
+
+    /* Summon pet molds around the player */
+    case MUT1_GROW_MOLD: {
+        DIRECTION i;
+        for (i = 0; i < 8; i++) {
+            summon_specific(creature_ptr, -1, creature_ptr->y, creature_ptr->x, lvl, SUMMON_MOLD, PM_FORCE_PET);
+        }
+    } break;
+
+    case MUT1_RESIST: {
+        int num = lvl / 10;
+        TIME_EFFECT dur = randint1(20) + 20;
+
+        if (randint0(5) < num) {
+            (void)set_oppose_acid(creature_ptr, dur, FALSE);
+            num--;
+        }
+        if (randint0(4) < num) {
+            (void)set_oppose_elec(creature_ptr, dur, FALSE);
+            num--;
+        }
+        if (randint0(3) < num) {
+            (void)set_oppose_fire(creature_ptr, dur, FALSE);
+            num--;
+        }
+        if (randint0(2) < num) {
+            (void)set_oppose_cold(creature_ptr, dur, FALSE);
+            num--;
+        }
+        if (num) {
+            (void)set_oppose_pois(creature_ptr, dur, FALSE);
+            num--;
+        }
+    } break;
+
+    case MUT1_EARTHQUAKE:
+        (void)earthquake(creature_ptr, creature_ptr->y, creature_ptr->x, 10, 0);
+        break;
+
+    case MUT1_EAT_MAGIC:
+        if (!eat_magic(creature_ptr, creature_ptr->lev * 2))
+            return FALSE;
+        break;
+
+    case MUT1_WEIGH_MAG:
+        report_magics(creature_ptr);
+        break;
+
+    case MUT1_STERILITY:
+        msg_print(_("突然頭が痛くなった!", "You suddenly have a headache!"));
+        take_hit(creature_ptr, DAMAGE_LOSELIFE, randint1(17) + 17, _("禁欲を強いた疲労", "the strain of forcing abstinence"), -1);
+        creature_ptr->current_floor_ptr->num_repro += MAX_REPRO;
+        break;
+
+    case MUT1_HIT_AND_AWAY:
+        if (!hit_and_away(creature_ptr))
+            return FALSE;
+        break;
+
+    case MUT1_DAZZLE:
+        stun_monsters(creature_ptr, lvl * 4);
+        confuse_monsters(creature_ptr, lvl * 4);
+        turn_monsters(creature_ptr, lvl * 4);
+        break;
+
+    case MUT1_LASER_EYE:
+        if (!get_aim_dir(creature_ptr, &dir))
+            return FALSE;
+        fire_beam(creature_ptr, GF_LITE, dir, 2 * lvl);
+        break;
+
+    case MUT1_RECALL:
+        if (!recall_player(creature_ptr, randint0(21) + 15))
+            return FALSE;
+        break;
+
+    case MUT1_BANISH: {
+        POSITION x, y;
+        grid_type *g_ptr;
+        monster_type *m_ptr;
+        monster_race *r_ptr;
+        if (!get_direction(creature_ptr, &dir, FALSE, FALSE))
+            return FALSE;
+        y = creature_ptr->y + ddy[dir];
+        x = creature_ptr->x + ddx[dir];
+        g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
+
+        if (!g_ptr->m_idx) {
+            msg_print(_("邪悪な存在を感じとれません!", "You sense no evil there!"));
+
+            break;
+        }
+
+        m_ptr = &creature_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
+        r_ptr = &r_info[m_ptr->r_idx];
+
+        if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && !(r_ptr->flags1 & RF1_UNIQUE) && !creature_ptr->current_floor_ptr->inside_arena
+            && !creature_ptr->current_floor_ptr->inside_quest && (r_ptr->level < randint1(creature_ptr->lev + 50)) && !(m_ptr->mflag2 & MFLAG2_NOGENO)) {
+            if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) {
+                GAME_TEXT m_name[MAX_NLEN];
+                monster_desc(creature_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
+                exe_write_diary(creature_ptr, DIARY_NAMED_PET, RECORD_NAMED_PET_GENOCIDE, m_name);
+            }
+            /* Delete the monster, rather than killing it. */
+            delete_monster_idx(creature_ptr, g_ptr->m_idx);
+            msg_print(_("その邪悪なモンスターは硫黄臭い煙とともに消え去った!", "The evil creature vanishes in a puff of sulfurous smoke!"));
+
+        } else {
+            msg_print(_("祈りは効果がなかった!", "Your invocation is ineffectual!"));
+            if (one_in_(13))
+                m_ptr->mflag2 |= MFLAG2_NOGENO;
+        }
+    } break;
+
+    case MUT1_COLD_TOUCH: {
+        POSITION x, y;
+        grid_type *g_ptr;
+        if (!get_direction(creature_ptr, &dir, FALSE, FALSE))
+            return FALSE;
+        y = creature_ptr->y + ddy[dir];
+        x = creature_ptr->x + ddx[dir];
+        g_ptr = &creature_ptr->current_floor_ptr->grid_array[y][x];
+        if (!g_ptr->m_idx) {
+            msg_print(_("あなたは何もない場所で手を振った。", "You wave your hands in the air."));
+
+            break;
+        }
+        fire_bolt(creature_ptr, GF_COLD, dir, 2 * lvl);
+    } break;
+
+    /* XXX_XXX_XXX Hack! MUT1_LAUNCHER is negative, see above */
+    case 3: /* MUT1_LAUNCHER */
+        /* Gives a multiplier of 2 at first, up to 3 at 40th */
+        if (!do_cmd_throw(creature_ptr, 2 + lvl / 40, FALSE, -1))
+            return FALSE;
+        break;
+
+    default:
+        free_turn(creature_ptr);
+        msg_format(_("能力 %s は実装されていません。", "Power %s not implemented. Oops."), power);
+    }
+
+    return TRUE;
 }
 
 void become_living_trump(player_type *creature_ptr)
 {
-       MUTATION_IDX mutation;
-
-       if (one_in_(7))
-               mutation = 12; /* Teleport control */
-       else
-               mutation = 77; /* Random teleportation (uncontrolled) */
-
-       /* Gain the mutation */
-       if (gain_mutation(creature_ptr, mutation))
-       {
-               msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
-       }
+    MUTATION_IDX mutation;
+
+    if (one_in_(7))
+        mutation = 12; /* Teleport control */
+    else
+        mutation = 77; /* Random teleportation (uncontrolled) */
+
+    /* Gain the mutation */
+    if (gain_mutation(creature_ptr, mutation)) {
+        msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
+    }
 }
 
 void set_mutation_flags(player_type *creature_ptr)
index 11d966a..30ca88b 100644 (file)
@@ -11,7 +11,6 @@
 #include "core/window-redrawer.h"
 #include "floor/cave.h"
 #include "grid/feature.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster/monster-describer.h"
 #include "pet/pet-util.h"
@@ -19,6 +18,7 @@
 #include "player/player-move.h"
 #include "player/player-skill.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
@@ -102,7 +102,7 @@ bool process_fall_off_horse(player_type *creature_ptr, HIT_POINT dam, bool force
 
     if (dam >= 0 || force) {
         calc_fall_off_possibility(creature_ptr, dam, force, r_ptr);
-        
+
         /* Check around the player */
         for (DIRECTION i = 0; i < 8; i++) {
             POSITION y = creature_ptr->y + ddy_ddd[i];
index ff7e65a..0705a42 100644 (file)
@@ -24,7 +24,6 @@
 #include "grid/trap.h"
 #include "inventory/player-inventory.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "mind/mind-ninja.h"
 #include "monster/monster-update.h"
 #include "perception/object-perception.h"
@@ -36,6 +35,7 @@
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index 9c5a02f..34bdd9e 100644 (file)
@@ -1,6 +1,5 @@
 #include "racial/racial-android.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "object-enchant/object-ego.h"
 #include "object-enchant/trg-types.h"
 #include "object-hook/hook-enchant.h"
@@ -16,6 +15,7 @@
 #include "sv-definition/sv-weapon-types.h"
 #include "system/artifact-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool android_inside_weapon(player_type *creature_ptr)
index d7eeb64..2784279 100644 (file)
@@ -1,7 +1,7 @@
 #include "racial/racial-balrog.h"
-#include "io/targeting.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool demonic_breath(player_type *creature_ptr)
index 5ecb586..a8207c6 100644 (file)
@@ -1,7 +1,7 @@
 #include "racial/racial-draconian.h"
-#include "io/targeting.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 static void decide_breath_kind(player_type *creature_ptr, int *breath_type, concptr *breath_type_description)
index 63986aa..05892dc 100644 (file)
@@ -27,7 +27,6 @@
 #include "io/command-repeater.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "main/sound-of-music.h"
 #include "melee/melee-postprocess.h"
 #include "mind/mind-cavalry.h"
@@ -72,6 +71,7 @@
 #include "status/bad-status-setter.h"
 #include "status/buff-setter.h"
 #include "status/experience.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
index 06406d2..429a8c4 100644 (file)
@@ -3,10 +3,10 @@
 #include "dungeon/dungeon-flag-types.h"
 #include "dungeon/dungeon.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "player/digestion-processor.h"
 #include "spell-kind/spells-specific-bolt.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 bool vampirism(player_type *caster_ptr)
index 383a3ec..44d8ef0 100644 (file)
@@ -1,7 +1,6 @@
 #include "realm/realm-arcane.h"
 #include "cmd-action/cmd-spell.h"
 #include "core/asking-player.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "player/avatar.h"
 #include "status/bad-status-setter.h"
 #include "status/element-resistance.h"
 #include "status/sight-setter.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief 秘術領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 秘術領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_arcane_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("電撃", "Zap");
-               if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 3;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("魔法の施錠", "Wizard Lock");
-               if (desc) return _("扉に鍵をかける。", "Locks a door.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               wizard_lock(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("透明体感知", "Detect Invisibility");
-               if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_invis(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("モンスター感知", "Detect Monsters");
-               if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_normal(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("ショート・テレポート", "Blink");
-               if (desc) return _("近距離のテレポートをする。", "Teleports you a short distance.");
-
-               {
-                       POSITION range = 10;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("ライト・エリア", "Light Area");
-               if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
-
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = plev / 2;
-                       POSITION rad = plev / 10 + 1;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               lite_area(caster_ptr, damroll(dice, sides), rad);
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
-               if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               destroy_door(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("軽傷の治癒", "Cure Light Wounds");
-               if (desc) return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
-
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_heal(dice, sides, 0);
-                       if (cast) (void)cure_light_wounds(caster_ptr, dice, sides);
-               }
-               break;
-
-       case 8:
-               if (name) return _("罠と扉 感知", "Detect Doors & Traps");
-               if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_traps(caster_ptr, rad, TRUE);
-                               detect_doors(caster_ptr, rad);
-                               detect_stairs(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("燃素", "Phlogiston");
-               if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
-
-               {
-                       if (cast)
-                       {
-                               phlogiston(caster_ptr);
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("財宝感知", "Detect Treasure");
-               if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_treasure(caster_ptr, rad);
-                               detect_objects_gold(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("魔法 感知", "Detect Enchantment");
-               if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_objects_magic(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("アイテム感知", "Detect Objects");
-               if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_objects_normal(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("解毒", "Cure Poison");
-               if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
-
-               {
-                       if (cast)
-                       {
-                               set_poisoned(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("耐冷", "Resist Cold");
-               if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to that from equipment for more powerful resistance.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("耐火", "Resist Fire");
-               if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to fire. This resistance can be added to that from equipment for more powerful resistance.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("耐電", "Resist Lightning");
-               if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to electricity. This resistance can be added to that from equipment for more powerful resistance.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("耐酸", "Resist Acid");
-               if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to acid. This resistance can be added to that from equipment for more powerful resistance.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("重傷の治癒", "Cure Medium Wounds");
-               if (desc) return _("怪我と体力を中程度回復させる。", "Heals cuts and HP.");
-
-               {
-                       DICE_NUMBER dice = 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_heal(dice, sides, 0);
-                       if (cast) (void)cure_serious_wounds(caster_ptr, 4, 8);
-               }
-               break;
-
-       case 19:
-               if (name) return _("テレポート", "Teleport");
-               if (desc) return _("遠距離のテレポートをする。", "Teleports you a long distance.");
-
-               {
-                       POSITION range = plev * 5;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("鑑定", "Identify");
-               if (desc) return _("アイテムを識別する。", "Identifies an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("岩石溶解", "Stone to Mud");
-               if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
-
-               {
-                       DICE_NUMBER dice = 1;
-                       DICE_SID sides = 30;
-                       int base = 20;
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               wall_to_mud(caster_ptr, dir, 20 + randint1(30));
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("閃光", "Ray of Light");
-               if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
-
-               {
-                       DICE_NUMBER dice = 6;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               msg_print(_("光線が放たれた。", "A line of light appears."));
-                               lite_line(caster_ptr, dir, damroll(6, 8));
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("空腹充足", "Satisfy Hunger");
-               if (desc) return _("満腹にする。", "Satisfies hunger.");
-
-               {
-                       if (cast)
-                       {
-                               set_food(caster_ptr, PY_FOOD_MAX - 1);
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("透明視認", "See Invisible");
-               if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
-
-               {
-                       int base = 24;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("エレメンタル召喚", "Conjure Elemental");
-               if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
-               {
-                       if (cast)
-                       {
-                               if (!summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
-                               {
-                                       msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
-                               }
-                       }
-               }
-               break;
-
-       case 26:
-               if (name) return _("テレポート・レベル", "Teleport Level");
-               if (desc) return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
-                               teleport_level(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("テレポート・モンスター", "Teleport Away");
-               if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("元素の球", "Elemental Ball");
-               if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
-
-               {
-                       HIT_POINT dam = 75 + plev;
-                       POSITION rad = 2;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               int type;
-
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               switch (randint1(4))
-                               {
-                               case 1:  type = GF_FIRE; break;
-                               case 2:  type = GF_ELEC; break;
-                               case 3:  type = GF_COLD; break;
-                               default: type = GF_ACID; break;
-                               }
-
-                               fire_ball(caster_ptr, type, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("全感知", "Detection");
-               if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
-                       "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_all(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("帰還の呪文", "Word of Recall");
-               if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
-                       "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
-
-               {
-                       int base = 15;
-                       DICE_SID sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
-                       if (cast)
-                       {
-                               if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("千里眼", "Clairvoyance");
-               if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
-                       "Maps and lights whole dungeon level. Reveals locations of all objects. Gives telepathy for a while.");
-
-               {
-                       int base = 25;
-                       DICE_SID sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
-                               chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
-
-                               wiz_lite(caster_ptr, FALSE);
-
-                               if (!caster_ptr->telepathy)
-                               {
-                                       set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
-                               }
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("電撃", "Zap");
+        if (desc)
+            return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 3;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("魔法の施錠", "Wizard Lock");
+        if (desc)
+            return _("扉に鍵をかける。", "Locks a door.");
+
+        {
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                wizard_lock(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("透明体感知", "Detect Invisibility");
+        if (desc)
+            return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_invis(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("モンスター感知", "Detect Monsters");
+        if (desc)
+            return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_normal(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("ショート・テレポート", "Blink");
+        if (desc)
+            return _("近距離のテレポートをする。", "Teleports you a short distance.");
+
+        {
+            POSITION range = 10;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("ライト・エリア", "Light Area");
+        if (desc)
+            return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
+
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = plev / 2;
+            POSITION rad = plev / 10 + 1;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                lite_area(caster_ptr, damroll(dice, sides), rad);
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("罠と扉 破壊", "Trap & Door Destruction");
+        if (desc)
+            return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
+
+        {
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                destroy_door(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("軽傷の治癒", "Cure Light Wounds");
+        if (desc)
+            return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
+
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_heal(dice, sides, 0);
+            if (cast)
+                (void)cure_light_wounds(caster_ptr, dice, sides);
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("罠と扉 感知", "Detect Doors & Traps");
+        if (desc)
+            return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_traps(caster_ptr, rad, TRUE);
+                detect_doors(caster_ptr, rad);
+                detect_stairs(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("燃素", "Phlogiston");
+        if (desc)
+            return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
+
+        {
+            if (cast) {
+                phlogiston(caster_ptr);
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("財宝感知", "Detect Treasure");
+        if (desc)
+            return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_treasure(caster_ptr, rad);
+                detect_objects_gold(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("魔法 感知", "Detect Enchantment");
+        if (desc)
+            return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_objects_magic(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("アイテム感知", "Detect Objects");
+        if (desc)
+            return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_objects_normal(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("解毒", "Cure Poison");
+        if (desc)
+            return _("毒を体内から完全に取り除く。", "Cures poison status.");
+
+        {
+            if (cast) {
+                set_poisoned(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("耐冷", "Resist Cold");
+        if (desc)
+            return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to cold. This resistance can be added to that from equipment for more powerful resistance.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("耐火", "Resist Fire");
+        if (desc)
+            return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to fire. This resistance can be added to that from equipment for more powerful resistance.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("耐電", "Resist Lightning");
+        if (desc)
+            return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to electricity. This resistance can be added to that from equipment for more powerful resistance.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("耐酸", "Resist Acid");
+        if (desc)
+            return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to acid. This resistance can be added to that from equipment for more powerful resistance.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("重傷の治癒", "Cure Medium Wounds");
+        if (desc)
+            return _("怪我と体力を中程度回復させる。", "Heals cuts and HP.");
+
+        {
+            DICE_NUMBER dice = 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_heal(dice, sides, 0);
+            if (cast)
+                (void)cure_serious_wounds(caster_ptr, 4, 8);
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("テレポート", "Teleport");
+        if (desc)
+            return _("遠距離のテレポートをする。", "Teleports you a long distance.");
+
+        {
+            POSITION range = plev * 5;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("鑑定", "Identify");
+        if (desc)
+            return _("アイテムを識別する。", "Identifies an item.");
+
+        {
+            if (cast) {
+                if (!ident_spell(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("岩石溶解", "Stone to Mud");
+        if (desc)
+            return _("壁を溶かして床にする。", "Turns one rock square to mud.");
+
+        {
+            DICE_NUMBER dice = 1;
+            DICE_SID sides = 30;
+            int base = 20;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                wall_to_mud(caster_ptr, dir, 20 + randint1(30));
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("閃光", "Ray of Light");
+        if (desc)
+            return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
+
+        {
+            DICE_NUMBER dice = 6;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                msg_print(_("光線が放たれた。", "A line of light appears."));
+                lite_line(caster_ptr, dir, damroll(6, 8));
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("空腹充足", "Satisfy Hunger");
+        if (desc)
+            return _("満腹にする。", "Satisfies hunger.");
+
+        {
+            if (cast) {
+                set_food(caster_ptr, PY_FOOD_MAX - 1);
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("透明視認", "See Invisible");
+        if (desc)
+            return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
+
+        {
+            int base = 24;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("エレメンタル召喚", "Conjure Elemental");
+        if (desc)
+            return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
+        {
+            if (cast) {
+                if (!summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET))) {
+                    msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
+                }
+            }
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("テレポート・レベル", "Teleport Level");
+        if (desc)
+            return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
+
+        {
+            if (cast) {
+                if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)")))
+                    return NULL;
+                teleport_level(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("テレポート・モンスター", "Teleport Away");
+        if (desc)
+            return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("元素の球", "Elemental Ball");
+        if (desc)
+            return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
+
+        {
+            HIT_POINT dam = 75 + plev;
+            POSITION rad = 2;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                int type;
+
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                switch (randint1(4)) {
+                case 1:
+                    type = GF_FIRE;
+                    break;
+                case 2:
+                    type = GF_ELEC;
+                    break;
+                case 3:
+                    type = GF_COLD;
+                    break;
+                default:
+                    type = GF_ACID;
+                    break;
+                }
+
+                fire_ball(caster_ptr, type, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("全感知", "Detection");
+        if (desc)
+            return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
+                "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_all(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("帰還の呪文", "Word of Recall");
+        if (desc)
+            return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
+                "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
+
+        {
+            int base = 15;
+            DICE_SID sides = 20;
+
+            if (info)
+                return info_delay(base, sides);
+
+            if (cast) {
+                if (!recall_player(caster_ptr, randint0(21) + 15))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("千里眼", "Clairvoyance");
+        if (desc)
+            return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
+                "Maps and lights whole dungeon level. Reveals locations of all objects. Gives telepathy for a while.");
+
+        {
+            int base = 25;
+            DICE_SID sides = 30;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
+                chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
+
+                wiz_lite(caster_ptr, FALSE);
+
+                if (!caster_ptr->telepathy) {
+                    set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
+                }
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index 411307e..93e2f6f 100644 (file)
@@ -3,7 +3,6 @@
 #include "core/asking-player.h"
 #include "core/player-redraw-types.h"
 #include "effect/effect-characteristics.h"
-#include "io/targeting.h"
 #include "player/attack-defense-types.h"
 #include "player/player-realm.h"
 #include "spell-kind/magic-item-recharger.h"
@@ -22,6 +21,7 @@
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
 #include "status/shape-changer.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 24d5e92..68444d6 100644 (file)
@@ -4,11 +4,8 @@
 #include "effect/effect-characteristics.h"
 #include "floor/cave.h"
 #include "floor/floor.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
-#include "status/bad-status-setter.h"
-#include "status/buff-setter.h"
 #include "player/player-class.h"
 #include "spell-kind/spells-beam.h"
 #include "spell-kind/spells-curse-removal.h"
 #include "spell/spells-object.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
+#include "status/bad-status-setter.h"
 #include "status/body-improvement.h"
+#include "status/buff-setter.h"
 #include "status/sight-setter.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 #include "world/world.h"
 
 /*!
-* @brief 破邪領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 破邪領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_crusade_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("懲罰", "Punishment");
-               if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 4;
-                       if (info) return info_damage(dice, sides, 0);
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("邪悪存在感知", "Detect Evil");
-               if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-                       if (info) return info_radius(rad);
-                       if (cast)
-                       {
-                               detect_monsters_evil(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("恐怖除去", "Remove Fear");
-               if (desc) return _("恐怖を取り除く。", "Removes fear.");
-               {
-                       if (cast) set_afraid(caster_ptr, 0);
-               }
-               break;
-
-       case 3:
-               if (name) return _("威圧", "Scare Monster");
-               if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
-
-               {
-                       PLAYER_LEVEL power = plev;
-                       if (info) return info_power(power);
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fear_monster(caster_ptr, dir, power);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("聖域", "Sanctuary");
-               if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put to sleep monsters in the adjacent squares.");
-               {
-                       PLAYER_LEVEL power = plev;
-                       if (info) return info_power(power);
-                       if (cast) sleep_monsters_touch(caster_ptr);
-               }
-               break;
-
-       case 5:
-               if (name) return _("入口", "Portal");
-               if (desc) return _("中距離のテレポートをする。", "Teleports you a medium distance.");
-
-               {
-                       POSITION range = 25 + plev / 2;
-                       if (info) return info_range(range);
-                       if (cast) teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-               }
-               break;
-
-       case 6:
-               if (name) return _("スターダスト", "Star Dust");
-               if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 9;
-                       DICE_SID sides = 2;
-                       if (info) return info_multi_damage_dice(dice, sides);
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_blast(caster_ptr, GF_LITE, dir, dice, sides, 10, 3);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("身体浄化", "Purify");
-               if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cuts, poisons and being stunned.");
-               {
-                       if (cast)
-                       {
-                               set_cut(caster_ptr,0);
-                               set_poisoned(caster_ptr, 0);
-                               set_stun(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("邪悪飛ばし", "Scatter Evil");
-               if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
-
-               {
-                       int power = MAX_SIGHT * 5;
-                       if (info) return info_power(power);
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball(caster_ptr, GF_AWAY_EVIL, dir, power, 0);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("聖なる光球", "Holy Orb");
-               if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
-                       "Fires a ball with holy power. Hurts evil monsters greatly but doesn't affect good monsters.");
-
-               {
-                       DICE_NUMBER dice = 3;
-                       DICE_SID sides = 6;
-                       POSITION rad = (plev < 30) ? 2 : 3;
-                       int base;
-                       if (caster_ptr->pclass == CLASS_PRIEST ||
-                               caster_ptr->pclass == CLASS_HIGH_MAGE ||
-                               caster_ptr->pclass == CLASS_SORCERER)
-                               base = plev + plev / 2;
-                       else
-                               base = plev + plev / 4;
-
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("悪魔払い", "Exorcism");
-               if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
-                       "Damages all undead and demons in sight, and scares all evil monsters in sight.");
-               {
-                       DICE_SID sides = plev;
-                       int power = plev;
-                       if (info) return info_damage(1, sides, 0);
-                       if (cast)
-                       {
-                               dispel_undead(caster_ptr, randint1(sides));
-                               dispel_demons(caster_ptr, randint1(sides));
-                               turn_evil(caster_ptr, power);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("解呪", "Remove Curse");
-               if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
-               {
-                       if (cast) (void)remove_curse(caster_ptr);
-               }
-               break;
-
-       case 12:
-               if (name) return _("透明視認", "Sense Unseen");
-               if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
-
-               {
-                       int base = 24;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("対邪悪結界", "Protection from Evil");
-               if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protects you from evil monster's physical attack.");
-
-               {
-                       int base = 25;
-                       DICE_SID sides = 3 * plev;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_protevil(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("裁きの雷", "Judgment Thunder");
-               if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
-
-               {
-                       HIT_POINT dam = plev * 5;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_bolt(caster_ptr, GF_ELEC, dir, dam);
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("聖なる御言葉", "Holy Word");
-               if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
-                       "Damages all evil monsters in sight, heals HP somewhat and completely cures fear, poisons, cuts and being stunned.");
-
-               {
-                       int dam_sides = plev * 6;
-                       int heal = 100;
-
-                       if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
-                       if (cast)
-                       {
-                               dispel_evil(caster_ptr, randint1(dam_sides));
-                               hp_player(caster_ptr, heal);
-                               set_afraid(caster_ptr, 0);
-                               set_poisoned(caster_ptr, 0);
-                               set_stun(caster_ptr, 0);
-                               set_cut(caster_ptr,0);
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("開かれた道", "Unbarring Ways");
-               if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               destroy_door(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("封魔", "Arrest");
-               if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
-
-               {
-                       int power = plev * 2;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               stasis_evil(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("聖なるオーラ", "Holy Aura");
-               if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
-                       "Gives aura of holy power that injures evil monsters which attacked you for a while.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_sh_holy(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
-               if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
-
-               {
-                       DICE_SID sides = plev * 4;
-
-                       if (info) return info_damage(1, sides, 0);
-
-                       if (cast)
-                       {
-                               dispel_undead(caster_ptr, randint1(sides));
-                               dispel_demons(caster_ptr, randint1(sides));
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("邪悪退散", "Dispel Evil");
-               if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
-
-               {
-                       DICE_SID sides = plev * 4;
-
-                       if (info) return info_damage(1, sides, 0);
-
-                       if (cast)
-                       {
-                               dispel_evil(caster_ptr, randint1(sides));
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("聖なる刃", "Holy Blade");
-               if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, 13);
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("スターバースト", "Star Burst");
-               if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
-
-               {
-                       HIT_POINT dam = 100 + plev * 2;
-                       POSITION rad = 4;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_LITE, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("天使召喚", "Summon Angel");
-               if (desc) return _("天使を1体召喚する。", "Summons an angel.");
-
-               {
-                       if (cast)
-                       {
-                               bool pet = !one_in_(3);
-                               u32b flg = 0L;
-
-                               if (pet) flg |= PM_FORCE_PET;
-                               else flg |= PM_NO_PET;
-                               if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
-
-                               if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
-                               {
-                                       if (pet)
-                                       {
-                                               msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
-                                       }
-                                       else
-                                       {
-                                               msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("士気高揚", "Heroism");
-               if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
-
-               {
-                       int base = 25;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               (void)heroism(caster_ptr, base);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("呪い退散", "Dispel Curse");
-               if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
-
-               {
-                       if (cast) (void)remove_all_curse(caster_ptr);
-               }
-               break;
-
-       case 26:
-               if (name) return _("邪悪追放", "Banish Evil");
-               if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
-                       "Teleports all evil monsters in sight away unless resisted.");
-
-               {
-                       int power = 100;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (banish_evil(caster_ptr, power))
-                               {
-                                       msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
-                               }
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("ハルマゲドン", "Armageddon");
-               if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroys everything in nearby area.");
-
-               {
-                       int base = 12;
-                       DICE_SID sides = 4;
-
-                       if (cast)
-                       {
-                               destroy_area(caster_ptr, caster_ptr->y, caster_ptr->x, base + randint1(sides), FALSE);
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("目には目を", "An Eye for an Eye");
-               if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
-                       "Gives special aura for a while. When you are attacked by a monster, the monster is injured with same amount of damage as you took.");
-
-               {
-                       int base = 10;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_eyeeye(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("神の怒り", "Wrath of the God");
-               if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
-
-               {
-                       HIT_POINT dam = plev * 3 + 25;
-                       POSITION rad = 2;
-
-                       if (info) return info_multi_damage(dam);
-
-                       if (cast)
-                       {
-                               if (!cast_wrath_of_the_god(caster_ptr, dam, rad)) return NULL;
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("神威", "Divine Intervention");
-               if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
-                       "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
-
-               {
-                       int b_dam = plev * 11;
-                       int d_dam = plev * 4;
-                       int heal = 100;
-                       int power = plev * 4;
-
-                       if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam / 2);
-                       if (cast)
-                       {
-                               project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
-                               dispel_monsters(caster_ptr, d_dam);
-                               slow_monsters(caster_ptr, plev);
-                               stun_monsters(caster_ptr, power);
-                               confuse_monsters(caster_ptr, power);
-                               turn_monsters(caster_ptr, power);
-                               stasis_monsters(caster_ptr, power);
-                               hp_player(caster_ptr, heal);
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("聖戦", "Crusade");
-               if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
-                       "Attempts to charm all good monsters in sight and scares all non-charmed monsters. Summons a great number of knights. Gives heroism, bless, speed and protection from evil to the caster.");
-
-               {
-                       if (cast)
-                       {
-                               int base = 25;
-                               int sp_sides = 20 + plev;
-                               int sp_base = plev;
-
-                               int i;
-                               crusade(caster_ptr);
-                               for (i = 0; i < 12; i++)
-                               {
-                                       int attempt = 10;
-                                       POSITION my = 0, mx = 0;
-
-                                       while (attempt--)
-                                       {
-                                               scatter(caster_ptr, &my, &mx, caster_ptr->y, caster_ptr->x, 4, 0);
-
-                                               /* Require empty grids */
-                                               if (is_cave_empty_bold2(caster_ptr, my, mx)) break;
-                                       }
-                                       if (attempt < 0) continue;
-                                       summon_specific(caster_ptr, -1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
-                               }
-                               set_hero(caster_ptr, randint1(base) + base, FALSE);
-                               set_blessed(caster_ptr, randint1(base) + base, FALSE);
-                               set_fast(caster_ptr, randint1(sp_sides) + sp_base, FALSE);
-                               set_protevil(caster_ptr, randint1(base) + base, FALSE);
-                               set_afraid(caster_ptr, 0);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("懲罰", "Punishment");
+        if (desc)
+            return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 4;
+            if (info)
+                return info_damage(dice, sides, 0);
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("邪悪存在感知", "Detect Evil");
+        if (desc)
+            return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+            if (info)
+                return info_radius(rad);
+            if (cast) {
+                detect_monsters_evil(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("恐怖除去", "Remove Fear");
+        if (desc)
+            return _("恐怖を取り除く。", "Removes fear.");
+        {
+            if (cast)
+                set_afraid(caster_ptr, 0);
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("威圧", "Scare Monster");
+        if (desc)
+            return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
+
+        {
+            PLAYER_LEVEL power = plev;
+            if (info)
+                return info_power(power);
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fear_monster(caster_ptr, dir, power);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("聖域", "Sanctuary");
+        if (desc)
+            return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put to sleep monsters in the adjacent squares.");
+        {
+            PLAYER_LEVEL power = plev;
+            if (info)
+                return info_power(power);
+            if (cast)
+                sleep_monsters_touch(caster_ptr);
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("入口", "Portal");
+        if (desc)
+            return _("中距離のテレポートをする。", "Teleports you a medium distance.");
+
+        {
+            POSITION range = 25 + plev / 2;
+            if (info)
+                return info_range(range);
+            if (cast)
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("スターダスト", "Star Dust");
+        if (desc)
+            return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 9;
+            DICE_SID sides = 2;
+            if (info)
+                return info_multi_damage_dice(dice, sides);
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_blast(caster_ptr, GF_LITE, dir, dice, sides, 10, 3);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("身体浄化", "Purify");
+        if (desc)
+            return _("傷、毒、朦朧から全快する。", "Heals all cuts, poisons and being stunned.");
+        {
+            if (cast) {
+                set_cut(caster_ptr, 0);
+                set_poisoned(caster_ptr, 0);
+                set_stun(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("邪悪飛ばし", "Scatter Evil");
+        if (desc)
+            return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
+
+        {
+            int power = MAX_SIGHT * 5;
+            if (info)
+                return info_power(power);
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball(caster_ptr, GF_AWAY_EVIL, dir, power, 0);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("聖なる光球", "Holy Orb");
+        if (desc)
+            return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
+                "Fires a ball with holy power. Hurts evil monsters greatly but doesn't affect good monsters.");
+
+        {
+            DICE_NUMBER dice = 3;
+            DICE_SID sides = 6;
+            POSITION rad = (plev < 30) ? 2 : 3;
+            int base;
+            if (caster_ptr->pclass == CLASS_PRIEST || caster_ptr->pclass == CLASS_HIGH_MAGE || caster_ptr->pclass == CLASS_SORCERER)
+                base = plev + plev / 2;
+            else
+                base = plev + plev / 4;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("悪魔払い", "Exorcism");
+        if (desc)
+            return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
+                "Damages all undead and demons in sight, and scares all evil monsters in sight.");
+        {
+            DICE_SID sides = plev;
+            int power = plev;
+            if (info)
+                return info_damage(1, sides, 0);
+            if (cast) {
+                dispel_undead(caster_ptr, randint1(sides));
+                dispel_demons(caster_ptr, randint1(sides));
+                turn_evil(caster_ptr, power);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("解呪", "Remove Curse");
+        if (desc)
+            return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
+        {
+            if (cast)
+                (void)remove_curse(caster_ptr);
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("透明視認", "Sense Unseen");
+        if (desc)
+            return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
+
+        {
+            int base = 24;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_invis(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("対邪悪結界", "Protection from Evil");
+        if (desc)
+            return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protects you from evil monster's physical attack.");
+
+        {
+            int base = 25;
+            DICE_SID sides = 3 * plev;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_protevil(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("裁きの雷", "Judgment Thunder");
+        if (desc)
+            return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
+
+        {
+            HIT_POINT dam = plev * 5;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_bolt(caster_ptr, GF_ELEC, dir, dam);
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("聖なる御言葉", "Holy Word");
+        if (desc)
+            return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
+                "Damages all evil monsters in sight, heals HP somewhat and completely cures fear, poisons, cuts and being stunned.");
+
+        {
+            int dam_sides = plev * 6;
+            int heal = 100;
+
+            if (info)
+                return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
+            if (cast) {
+                dispel_evil(caster_ptr, randint1(dam_sides));
+                hp_player(caster_ptr, heal);
+                set_afraid(caster_ptr, 0);
+                set_poisoned(caster_ptr, 0);
+                set_stun(caster_ptr, 0);
+                set_cut(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("開かれた道", "Unbarring Ways");
+        if (desc)
+            return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
+
+        {
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                destroy_door(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("封魔", "Arrest");
+        if (desc)
+            return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
+
+        {
+            int power = plev * 2;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                stasis_evil(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("聖なるオーラ", "Holy Aura");
+        if (desc)
+            return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
+                "Gives aura of holy power that injures evil monsters which attacked you for a while.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_sh_holy(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
+        if (desc)
+            return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
+
+        {
+            DICE_SID sides = plev * 4;
+
+            if (info)
+                return info_damage(1, sides, 0);
+
+            if (cast) {
+                dispel_undead(caster_ptr, randint1(sides));
+                dispel_demons(caster_ptr, randint1(sides));
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("邪悪退散", "Dispel Evil");
+        if (desc)
+            return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
+
+        {
+            DICE_SID sides = plev * 4;
+
+            if (info)
+                return info_damage(1, sides, 0);
+
+            if (cast) {
+                dispel_evil(caster_ptr, randint1(sides));
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("聖なる刃", "Holy Blade");
+        if (desc)
+            return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, 13);
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("スターバースト", "Star Burst");
+        if (desc)
+            return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
+
+        {
+            HIT_POINT dam = 100 + plev * 2;
+            POSITION rad = 4;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_LITE, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("天使召喚", "Summon Angel");
+        if (desc)
+            return _("天使を1体召喚する。", "Summons an angel.");
+
+        {
+            if (cast) {
+                bool pet = !one_in_(3);
+                u32b flg = 0L;
+
+                if (pet)
+                    flg |= PM_FORCE_PET;
+                else
+                    flg |= PM_NO_PET;
+                if (!(pet && (plev < 50)))
+                    flg |= PM_ALLOW_GROUP;
+
+                if (summon_specific(caster_ptr, (pet ? -1 : 0), caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg)) {
+                    if (pet) {
+                        msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
+                    } else {
+                        msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("士気高揚", "Heroism");
+        if (desc)
+            return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
+
+        {
+            int base = 25;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                (void)heroism(caster_ptr, base);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("呪い退散", "Dispel Curse");
+        if (desc)
+            return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
+
+        {
+            if (cast)
+                (void)remove_all_curse(caster_ptr);
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("邪悪追放", "Banish Evil");
+        if (desc)
+            return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", "Teleports all evil monsters in sight away unless resisted.");
+
+        {
+            int power = 100;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (banish_evil(caster_ptr, power)) {
+                    msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
+                }
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("ハルマゲドン", "Armageddon");
+        if (desc)
+            return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroys everything in nearby area.");
+
+        {
+            int base = 12;
+            DICE_SID sides = 4;
+
+            if (cast) {
+                destroy_area(caster_ptr, caster_ptr->y, caster_ptr->x, base + randint1(sides), FALSE);
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("目には目を", "An Eye for an Eye");
+        if (desc)
+            return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
+                "Gives special aura for a while. When you are attacked by a monster, the monster is injured with same amount of damage as you took.");
+
+        {
+            int base = 10;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_eyeeye(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("神の怒り", "Wrath of the God");
+        if (desc)
+            return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
+
+        {
+            HIT_POINT dam = plev * 3 + 25;
+            POSITION rad = 2;
+
+            if (info)
+                return info_multi_damage(dam);
+
+            if (cast) {
+                if (!cast_wrath_of_the_god(caster_ptr, dam, rad))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("神威", "Divine Intervention");
+        if (desc)
+            return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
+                "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals "
+                "HP.");
+
+        {
+            int b_dam = plev * 11;
+            int d_dam = plev * 4;
+            int heal = 100;
+            int power = plev * 4;
+
+            if (info)
+                return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam / 2);
+            if (cast) {
+                project(caster_ptr, 0, 1, caster_ptr->y, caster_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
+                dispel_monsters(caster_ptr, d_dam);
+                slow_monsters(caster_ptr, plev);
+                stun_monsters(caster_ptr, power);
+                confuse_monsters(caster_ptr, power);
+                turn_monsters(caster_ptr, power);
+                stasis_monsters(caster_ptr, power);
+                hp_player(caster_ptr, heal);
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("聖戦", "Crusade");
+        if (desc)
+            return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、"
+                     "ヒーロー、祝福、加速、対邪悪結界を得る。",
+                "Attempts to charm all good monsters in sight and scares all non-charmed monsters. Summons a great number of knights. Gives heroism, bless, "
+                "speed and protection from evil to the caster.");
+
+        {
+            if (cast) {
+                int base = 25;
+                int sp_sides = 20 + plev;
+                int sp_base = plev;
+
+                int i;
+                crusade(caster_ptr);
+                for (i = 0; i < 12; i++) {
+                    int attempt = 10;
+                    POSITION my = 0, mx = 0;
+
+                    while (attempt--) {
+                        scatter(caster_ptr, &my, &mx, caster_ptr->y, caster_ptr->x, 4, 0);
+
+                        /* Require empty grids */
+                        if (is_cave_empty_bold2(caster_ptr, my, mx))
+                            break;
+                    }
+                    if (attempt < 0)
+                        continue;
+                    summon_specific(caster_ptr, -1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
+                }
+                set_hero(caster_ptr, randint1(base) + base, FALSE);
+                set_blessed(caster_ptr, randint1(base) + base, FALSE);
+                set_fast(caster_ptr, randint1(sp_sides) + sp_base, FALSE);
+                set_protevil(caster_ptr, randint1(base) + base, FALSE);
+                set_afraid(caster_ptr, 0);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
-
index 654113d..06e88f8 100644 (file)
@@ -2,7 +2,6 @@
 #include "cmd-action/cmd-spell.h"
 #include "core/hp-mp-processor.h"
 #include "effect/effect-characteristics.h"
-#include "io/targeting.h"
 #include "player/avatar.h"
 #include "player/digestion-processor.h"
 #include "player/player-damage.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
 #include "status/buff-setter.h"
+#include "status/element-resistance.h"
 #include "status/experience.h"
 #include "status/shape-changer.h"
-#include "status/element-resistance.h"
+#include "target/targeting.h"
 
 /*!
-* @brief 暗黒領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 暗黒領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_death_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("無生命感知", "Detect Unlife");
-               if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_nonliving(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("呪殺弾", "Malediction");
-               if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
-                       "Fires a tiny ball of evil power which hurts good monsters greatly.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 4;
-                       POSITION rad = 0;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               /*
-                               * A radius-0 ball may (1) be aimed at
-                               * objects etc., and will affect them;
-                               * (2) may be aimed at ANY visible
-                               * monster, unlike a 'bolt' which must
-                               * travel to the monster.
-                               */
-
-                               fire_ball(caster_ptr, GF_HELL_FIRE, dir, damroll(dice, sides), rad);
-
-                               if (one_in_(5))
-                               {
-                                       /* Special effect first */
-                                       int effect = randint1(1000);
-
-                                       if (effect == 666)
-                                               fire_ball_hide(caster_ptr, GF_DEATH_RAY, dir, plev * 200, 0);
-                                       else if (effect < 500)
-                                               fire_ball_hide(caster_ptr, GF_TURN_ALL, dir, plev, 0);
-                                       else if (effect < 800)
-                                               fire_ball_hide(caster_ptr, GF_OLD_CONF, dir, plev, 0);
-                                       else
-                                               fire_ball_hide(caster_ptr, GF_STUN, dir, plev, 0);
-                               }
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("邪悪感知", "Detect Evil");
-               if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_evil(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("悪臭雲", "Stinking Cloud");
-               if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
-
-               {
-                       HIT_POINT dam = 10 + plev / 2;
-                       POSITION rad = 2;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_POIS, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("黒い眠り", "Black Sleep");
-               if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to put a monster to sleep.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               sleep_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("耐毒", "Resist Poison");
-               if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to poison. This resistance can be added to that from equipment for more powerful resistance.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("恐慌", "Horrify");
-               if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fear_monster(caster_ptr, dir, plev);
-                               stun_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("アンデッド従属", "Enslave Undead");
-               if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               control_one_undead(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("エントロピーの球", "Orb of Entropy");
-               if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
-
-               {
-                       DICE_NUMBER dice = 3;
-                       DICE_SID sides = 6;
-                       POSITION rad = (plev < 30) ? 2 : 3;
-                       int base;
-
-                       if (is_wizard_class(caster_ptr))
-                               base = plev + plev / 2;
-                       else
-                               base = plev + plev / 4;
-
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("地獄の矢", "Nether Bolt");
-               if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
-
-               {
-                       DICE_NUMBER dice = 8 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_NETHER, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("殺戮雲", "Cloud kill");
-               if (desc) return _("自分を中心とした毒の球を発生させる。", "Generates a ball of poison centered on you.");
-
-               {
-                       HIT_POINT dam = (30 + plev) * 2;
-                       POSITION rad = plev / 10 + 2;
-
-                       if (info) return info_damage(0, 0, dam / 2);
-
-                       if (cast)
-                       {
-                               project(caster_ptr, 0, rad, caster_ptr->y, caster_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("モンスター消滅", "Genocide One");
-               if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to eradicate one monster.");
-
-               {
-                       int power = plev + 50;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball_hide(caster_ptr, GF_GENOCIDE, dir, power, 0);
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("毒の刃", "Poison Branding");
-               if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, 3);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("吸血の矢", "Vampiric Bolt");
-               if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
-                       "Fires a bolt which transfers HP from a monster to you. You will also gain nutritional sustenance from this.");
-
-               {
-                       DICE_NUMBER dice = 1;
-                       DICE_SID sides = plev * 2;
-                       int base = plev * 2;
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               HIT_POINT dam = base + damroll(dice, sides);
-
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               if (hypodynamic_bolt(caster_ptr, dir, dam))
-                               {
-                                       chg_virtue(caster_ptr, V_SACRIFICE, -1);
-                                       chg_virtue(caster_ptr, V_VITALITY, -1);
-
-                                       hp_player(caster_ptr, dam);
-
-                                       /*
-                                       * Gain nutritional sustenance:
-                                       * 150/hp drained
-                                       *
-                                       * A Food ration gives 5000
-                                       * food points (by contrast)
-                                       * Don't ever get more than
-                                       * "Full" this way But if we
-                                       * ARE Gorged, it won't cure
-                                       * us
-                                       */
-                                       dam = caster_ptr->food + MIN(5000, 100 * dam);
-
-                                       /* Not gorged already */
-                                       if (caster_ptr->food < PY_FOOD_MAX)
-                                               set_food(caster_ptr, dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
-                               }
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("反魂の術", "Animate dead");
-               if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
-
-               {
-                       if (cast)
-                       {
-                               animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("抹殺", "Genocide");
-               if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
-                       "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
-
-               {
-                       int power = plev + 50;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               symbol_genocide(caster_ptr, power, TRUE);
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("狂戦士化", "Berserk");
-               if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives a bonus to hit and HP, immunity to fear for a while. But decreases AC.");
-
-               {
-                       int base = 25;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               (void)berserk(caster_ptr, base + randint1(base));
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("悪霊召喚", "Invoke Spirits");
-               if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
-
-               {
-                       if (info) return KWD_RANDOM;
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               cast_invoke_spirits(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("暗黒の矢", "Dark Bolt");
-               if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
-
-               {
-                       DICE_NUMBER dice = 4 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_DARK, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("狂乱戦士", "Battle Frenzy");
-               if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
-                       "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
-
-               {
-                       int b_base = 25;
-                       int sp_base = plev / 2;
-                       int sp_sides = 20 + plev / 2;
-
-                       if (info) return info_duration(b_base, b_base);
-
-                       if (cast)
-                       {
-                               (void)berserk(caster_ptr, b_base + randint1(b_base));
-                               set_fast(caster_ptr, randint1(sp_sides) + sp_base, FALSE);
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("吸血の刃", "Vampiric Branding");
-               if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, 4);
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("吸血の連矢", "Vampiric Bolts");
-               if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
-                       "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
-               {
-                       HIT_POINT dam = 100;
-
-                       if (info) return format("%s3*%d", KWD_DAM, dam);
-
-                       if (cast)
-                       {
-                               int i;
-
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               chg_virtue(caster_ptr, V_SACRIFICE, -1);
-                               chg_virtue(caster_ptr, V_VITALITY, -1);
-
-                               for (i = 0; i < 3; i++)
-                               {
-                                       if (hypodynamic_bolt(caster_ptr, dir, dam))
-                                               hp_player(caster_ptr, dam);
-                               }
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("死の言魂", "Nether Wave");
-               if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
-
-               {
-                       DICE_SID sides = plev * 3;
-
-                       if (info) return info_damage(1, sides, 0);
-
-                       if (cast)
-                       {
-                               dispel_living(caster_ptr, randint1(sides));
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("暗黒の嵐", "Darkness Storm");
-               if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
-
-               {
-                       HIT_POINT dam = 100 + plev * 2;
-                       POSITION rad = 4;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_DARK, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("死の光線", "Death Ray");
-               if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               death_ray(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("死者召喚", "Raise the Dead");
-               if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
-               if (cast) cast_summon_undead(caster_ptr, (plev * 3) / 2);
-               break;
-
-       case 26:
-               if (name) return _("死者の秘伝", "Secrets of the Dead");
-               if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
-                       "Identifies or, at higher levels, *identifies* an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (randint1(50) > plev)
-                               {
-                                       if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
-                               }
-                               else
-                               {
-                                       if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
-                               }
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("吸血鬼変化", "Polymorph Vampire");
-               if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
-                       "Causes you to mimic a vampire for a while. You lose the abilities of your original race and get the abilities of a vampire for that time.");
-
-               {
-                       int base = 10 + plev / 2;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_mimic(caster_ptr, base + randint1(base), MIMIC_VAMPIRE, FALSE);
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("経験値復活", "Restore Life");
-               if (desc) return _("失った経験値を回復する。", "Restores lost experience.");
-
-               {
-                       if (cast)
-                       {
-                               restore_level(caster_ptr);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("周辺抹殺", "Mass Genocide");
-               if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
-                       "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
-
-               {
-                       int power = plev + 50;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               mass_genocide(caster_ptr, power, TRUE);
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("地獄の劫火", "Hellfire");
-               if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
-                       "Fires a powerful ball of evil power. Hurts good monsters greatly.");
-
-               {
-                       HIT_POINT dam = 666;
-                       POSITION rad = 3;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_HELL_FIRE, dir, dam, rad);
-                               take_hit(caster_ptr, DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("幽体化", "Wraithform");
-               if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
-                       "Causes you to be ghost-like for a while. That reduces the damage you take and allows you to pass through walls.");
-
-               {
-                       int base = plev / 2;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_wraith_form(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("無生命感知", "Detect Unlife");
+        if (desc)
+            return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_nonliving(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("呪殺弾", "Malediction");
+        if (desc)
+            return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
+                "Fires a tiny ball of evil power which hurts good monsters greatly.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 4;
+            POSITION rad = 0;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                /*
+                 * A radius-0 ball may (1) be aimed at
+                 * objects etc., and will affect them;
+                 * (2) may be aimed at ANY visible
+                 * monster, unlike a 'bolt' which must
+                 * travel to the monster.
+                 */
+
+                fire_ball(caster_ptr, GF_HELL_FIRE, dir, damroll(dice, sides), rad);
+
+                if (one_in_(5)) {
+                    /* Special effect first */
+                    int effect = randint1(1000);
+
+                    if (effect == 666)
+                        fire_ball_hide(caster_ptr, GF_DEATH_RAY, dir, plev * 200, 0);
+                    else if (effect < 500)
+                        fire_ball_hide(caster_ptr, GF_TURN_ALL, dir, plev, 0);
+                    else if (effect < 800)
+                        fire_ball_hide(caster_ptr, GF_OLD_CONF, dir, plev, 0);
+                    else
+                        fire_ball_hide(caster_ptr, GF_STUN, dir, plev, 0);
+                }
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("邪悪感知", "Detect Evil");
+        if (desc)
+            return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_evil(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("悪臭雲", "Stinking Cloud");
+        if (desc)
+            return _("毒の球を放つ。", "Fires a ball of poison.");
+
+        {
+            HIT_POINT dam = 10 + plev / 2;
+            POSITION rad = 2;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_POIS, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("黒い眠り", "Black Sleep");
+        if (desc)
+            return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to put a monster to sleep.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                sleep_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("耐毒", "Resist Poison");
+        if (desc)
+            return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to poison. This resistance can be added to that from equipment for more powerful resistance.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("恐慌", "Horrify");
+        if (desc)
+            return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fear_monster(caster_ptr, dir, plev);
+                stun_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("アンデッド従属", "Enslave Undead");
+        if (desc)
+            return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                control_one_undead(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("エントロピーの球", "Orb of Entropy");
+        if (desc)
+            return _(
+                "生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
+
+        {
+            DICE_NUMBER dice = 3;
+            DICE_SID sides = 6;
+            POSITION rad = (plev < 30) ? 2 : 3;
+            int base;
+
+            if (is_wizard_class(caster_ptr))
+                base = plev + plev / 2;
+            else
+                base = plev + plev / 4;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("地獄の矢", "Nether Bolt");
+        if (desc)
+            return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
+
+        {
+            DICE_NUMBER dice = 8 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_NETHER, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("殺戮雲", "Cloud kill");
+        if (desc)
+            return _("自分を中心とした毒の球を発生させる。", "Generates a ball of poison centered on you.");
+
+        {
+            HIT_POINT dam = (30 + plev) * 2;
+            POSITION rad = plev / 10 + 2;
+
+            if (info)
+                return info_damage(0, 0, dam / 2);
+
+            if (cast) {
+                project(caster_ptr, 0, rad, caster_ptr->y, caster_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("モンスター消滅", "Genocide One");
+        if (desc)
+            return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to eradicate one monster.");
+
+        {
+            int power = plev + 50;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball_hide(caster_ptr, GF_GENOCIDE, dir, power, 0);
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("毒の刃", "Poison Branding");
+        if (desc)
+            return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, 3);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("吸血の矢", "Vampiric Bolt");
+        if (desc)
+            return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
+                "Fires a bolt which transfers HP from a monster to you. You will also gain nutritional sustenance from this.");
+
+        {
+            DICE_NUMBER dice = 1;
+            DICE_SID sides = plev * 2;
+            int base = plev * 2;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                HIT_POINT dam = base + damroll(dice, sides);
+
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                if (hypodynamic_bolt(caster_ptr, dir, dam)) {
+                    chg_virtue(caster_ptr, V_SACRIFICE, -1);
+                    chg_virtue(caster_ptr, V_VITALITY, -1);
+
+                    hp_player(caster_ptr, dam);
+
+                    /*
+                     * Gain nutritional sustenance:
+                     * 150/hp drained
+                     *
+                     * A Food ration gives 5000
+                     * food points (by contrast)
+                     * Don't ever get more than
+                     * "Full" this way But if we
+                     * ARE Gorged, it won't cure
+                     * us
+                     */
+                    dam = caster_ptr->food + MIN(5000, 100 * dam);
+
+                    /* Not gorged already */
+                    if (caster_ptr->food < PY_FOOD_MAX)
+                        set_food(caster_ptr, dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
+                }
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("反魂の術", "Animate dead");
+        if (desc)
+            return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
+
+        {
+            if (cast) {
+                animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("抹殺", "Genocide");
+        if (desc)
+            return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
+                "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
+
+        {
+            int power = plev + 50;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                symbol_genocide(caster_ptr, power, TRUE);
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("狂戦士化", "Berserk");
+        if (desc)
+            return _("狂戦士化し、恐怖を除去する。", "Gives a bonus to hit and HP, immunity to fear for a while. But decreases AC.");
+
+        {
+            int base = 25;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                (void)berserk(caster_ptr, base + randint1(base));
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("悪霊召喚", "Invoke Spirits");
+        if (desc)
+            return _("ランダムで様々な効果が起こる。", "Causes random effects.");
+
+        {
+            if (info)
+                return KWD_RANDOM;
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                cast_invoke_spirits(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("暗黒の矢", "Dark Bolt");
+        if (desc)
+            return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
+
+        {
+            DICE_NUMBER dice = 4 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_DARK, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("狂乱戦士", "Battle Frenzy");
+        if (desc)
+            return _("狂戦士化し、恐怖を除去し、加速する。", "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
+
+        {
+            int b_base = 25;
+            int sp_base = plev / 2;
+            int sp_sides = 20 + plev / 2;
+
+            if (info)
+                return info_duration(b_base, b_base);
+
+            if (cast) {
+                (void)berserk(caster_ptr, b_base + randint1(b_base));
+                set_fast(caster_ptr, randint1(sp_sides) + sp_base, FALSE);
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("吸血の刃", "Vampiric Branding");
+        if (desc)
+            return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, 4);
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("吸血の連矢", "Vampiric Bolts");
+        if (desc)
+            return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
+                "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
+        {
+            HIT_POINT dam = 100;
+
+            if (info)
+                return format("%s3*%d", KWD_DAM, dam);
+
+            if (cast) {
+                int i;
+
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                chg_virtue(caster_ptr, V_SACRIFICE, -1);
+                chg_virtue(caster_ptr, V_VITALITY, -1);
+
+                for (i = 0; i < 3; i++) {
+                    if (hypodynamic_bolt(caster_ptr, dir, dam))
+                        hp_player(caster_ptr, dam);
+                }
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("死の言魂", "Nether Wave");
+        if (desc)
+            return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
+
+        {
+            DICE_SID sides = plev * 3;
+
+            if (info)
+                return info_damage(1, sides, 0);
+
+            if (cast) {
+                dispel_living(caster_ptr, randint1(sides));
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("暗黒の嵐", "Darkness Storm");
+        if (desc)
+            return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
+
+        {
+            HIT_POINT dam = 100 + plev * 2;
+            POSITION rad = 4;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_DARK, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("死の光線", "Death Ray");
+        if (desc)
+            return _("死の光線を放つ。", "Fires a beam of death.");
+
+        {
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                death_ray(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("死者召喚", "Raise the Dead");
+        if (desc)
+            return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
+        if (cast)
+            cast_summon_undead(caster_ptr, (plev * 3) / 2);
+        break;
+
+    case 26:
+        if (name)
+            return _("死者の秘伝", "Secrets of the Dead");
+        if (desc)
+            return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。", "Identifies or, at higher levels, *identifies* an item.");
+
+        {
+            if (cast) {
+                if (randint1(50) > plev) {
+                    if (!ident_spell(caster_ptr, FALSE, 0))
+                        return NULL;
+                } else {
+                    if (!identify_fully(caster_ptr, FALSE, 0))
+                        return NULL;
+                }
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("吸血鬼変化", "Polymorph Vampire");
+        if (desc)
+            return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
+                "Causes you to mimic a vampire for a while. You lose the abilities of your original race and get the abilities of a vampire for that time.");
+
+        {
+            int base = 10 + plev / 2;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_mimic(caster_ptr, base + randint1(base), MIMIC_VAMPIRE, FALSE);
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("経験値復活", "Restore Life");
+        if (desc)
+            return _("失った経験値を回復する。", "Restores lost experience.");
+
+        {
+            if (cast) {
+                restore_level(caster_ptr);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("周辺抹殺", "Mass Genocide");
+        if (desc)
+            return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
+                "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
+
+        {
+            int power = plev + 50;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                mass_genocide(caster_ptr, power, TRUE);
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("地獄の劫火", "Hellfire");
+        if (desc)
+            return _(
+                "邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。", "Fires a powerful ball of evil power. Hurts good monsters greatly.");
+
+        {
+            HIT_POINT dam = 666;
+            POSITION rad = 3;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_HELL_FIRE, dir, dam, rad);
+                take_hit(caster_ptr, DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("幽体化", "Wraithform");
+        if (desc)
+            return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
+                "Causes you to be ghost-like for a while. That reduces the damage you take and allows you to pass through walls.");
+
+        {
+            int base = plev / 2;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_wraith_form(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index f42a1d2..af57bf5 100644 (file)
@@ -1,6 +1,5 @@
 #include "realm/realm-demon.h"
 #include "cmd-action/cmd-spell.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "player/player-damage.h"
 #include "spell-kind/spells-pet.h"
 #include "spell-kind/spells-sight.h"
 #include "spell-realm/spells-demon.h"
+#include "spell/spell-types.h"
 #include "spell/spells-diceroll.h"
 #include "spell/spells-object.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
-#include "spell/spell-types.h"
 #include "status/bad-status-setter.h"
 #include "status/buff-setter.h"
 #include "status/element-resistance.h"
 #include "status/shape-changer.h"
 #include "status/sight-setter.h"
 #include "status/temporary-resistance.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief 悪魔領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 悪魔領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_daemon_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("マジック・ミサイル", "Magic Missile");
-               if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 4;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_MISSILE, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("無生命感知", "Detect Unlife");
-               if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_nonliving(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("邪なる祝福", "Evil Bless");
-               if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
-
-               {
-                       int base = 12;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_blessed(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("耐火炎", "Resist Fire");
-               if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to fire, cold and electricity for a while. These resistances can be added to those from equipment for more powerful resistances.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("恐慌", "Horrify");
-               if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
-
-               {
-                       PLAYER_LEVEL power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fear_monster(caster_ptr, dir, power);
-                               stun_monster(caster_ptr, dir, power);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("地獄の矢", "Nether Bolt");
-               if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
-
-               {
-                       DICE_NUMBER dice = 6 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_NETHER, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("古代の死霊召喚", "Summon Manes");
-               if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
-
-               {
-                       if (cast)
-                       {
-                               if (!summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
-                               {
-                                       msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
-                               }
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("地獄の焔", "Hellish Flame");
-               if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
-                       "Fires a ball of evil power. Hurts good monsters greatly.");
-
-               {
-                       DICE_NUMBER dice = 3;
-                       DICE_SID sides = 6;
-                       POSITION rad = (plev < 30) ? 2 : 3;
-                       int base;
-
-                       if (is_wizard_class(caster_ptr))
-                               base = plev + plev / 2;
-                       else
-                               base = plev + plev / 4;
-
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("デーモン支配", "Dominate Demon");
-               if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               control_one_demon(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("ビジョン", "Vision");
-               if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
-
-               {
-                       POSITION rad = DETECT_RAD_MAP;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               map_area(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("耐地獄", "Resist Nether");
-               if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_res_nether(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("プラズマ・ボルト", "Plasma bolt");
-               if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
-
-               {
-                       DICE_NUMBER dice = 11 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_PLASMA, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("ファイア・ボール", "Fire Ball");
-               if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
-
-               {
-                       HIT_POINT dam = plev + 55;
-                       POSITION rad = 2;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_FIRE, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("炎の刃", "Fire Branding");
-               if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, 1);
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("地獄球", "Nether Ball");
-               if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
-
-               {
-                       HIT_POINT dam = plev * 3 / 2 + 100;
-                       POSITION rad = plev / 20 + 2;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("デーモン召喚", "Summon Demon");
-               if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
-
-               {
-                       if (cast)
-                       {
-                               cast_summon_demon(caster_ptr, plev * 2 / 3 + randint1(plev / 2));
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("悪魔の目", "Devilish Eye");
-               if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
-
-               {
-                       int base = 30;
-                       DICE_SID sides = 25;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("悪魔のクローク", "Devil Cloak");
-               if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
-                       "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to those from equipment for more powerful resistances.");
-
-               {
-                       TIME_EFFECT base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               TIME_EFFECT dur = randint1(base) + base;
-
-                               set_oppose_fire(caster_ptr, dur, FALSE);
-                               set_oppose_cold(caster_ptr, dur, FALSE);
-                               set_tim_sh_fire(caster_ptr, dur, FALSE);
-                               set_afraid(caster_ptr, 0);
-                               break;
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("溶岩流", "The Flow of Lava");
-               if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
-                       "Generates a ball of fire centered on you which transforms floors to magma.");
-
-               {
-                       HIT_POINT dam = (55 + plev) * 2;
-                       POSITION rad = 3;
-
-                       if (info) return info_damage(0, 0, dam / 2);
-
-                       if (cast)
-                       {
-                               fire_ball(caster_ptr, GF_FIRE, 0, dam, rad);
-                               fire_ball_hide(caster_ptr, GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("プラズマ球", "Plasma Ball");
-               if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
-
-               {
-                       HIT_POINT dam = plev * 3 / 2 + 80;
-                       POSITION rad = 2 + plev / 40;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_PLASMA, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("悪魔変化", "Polymorph Demon");
-               if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
-                       "Causes you to mimic a demon for a while. You lose the abilities of your original race and get the abilities of a demon for that time.");
-
-               {
-                       int base = 10 + plev / 2;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON, FALSE);
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("地獄の波動", "Nather Wave");
-               if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
-                       "Damages all monsters in sight. Hurts good monsters greatly.");
-
-               {
-                       int sides1 = plev * 2;
-                       int sides2 = plev * 2;
-
-                       if (info) return format("%sd%d+d%d", KWD_DAM, sides1, sides2);
-
-                       if (cast)
-                       {
-                               dispel_monsters(caster_ptr, randint1(sides1));
-                               dispel_good(caster_ptr, randint1(sides2));
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("サキュバスの接吻", "Kiss of Succubus");
-               if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
-
-               {
-                       HIT_POINT dam = 100 + plev * 2;
-                       POSITION rad = 4;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball(caster_ptr, GF_NEXUS, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("破滅の手", "Doom Hand");
-               if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to cut a monster's HP roughly in half.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir))
-                                       return NULL;
-                               else
-                                       msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
-
-                               fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 2, 0);
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("士気高揚", "Raise the Morale");
-               if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
-
-               {
-                       int base = 25;
-                       if (info) return info_duration(base, base);
-                       if (cast)heroism(caster_ptr, base);
-               }
-               break;
-
-       case 25:
-               if (name) return _("不滅の肉体", "Immortal Body");
-               if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_res_time(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 26:
-               if (name) return _("狂気の円環", "Insanity Circle");
-               if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
-                       "Generates balls of chaos, confusion and charm centered on you.");
-
-               {
-                       HIT_POINT dam = 50 + plev;
-                       int power = 20 + plev;
-                       POSITION rad = 3 + plev / 20;
-
-                       if (info) return format("%s%d+%d", KWD_DAM, dam / 2, dam / 2);
-
-                       if (cast)
-                       {
-                               fire_ball(caster_ptr, GF_CHAOS, 0, dam, rad);
-                               fire_ball(caster_ptr, GF_CONFUSION, 0, dam, rad);
-                               fire_ball(caster_ptr, GF_CHARM, 0, power, rad);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("ペット爆破", "Explode Pets");
-               if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
-
-               {
-                       if (cast)
-                       {
-                               discharge_minion(caster_ptr);
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
-               if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
-                       "Summons greater demon. Requires the sacrifice of a human corpse ('p', 'h' or 't').");
-
-               {
-                       if (cast)
-                       {
-                               if (!cast_summon_greater_demon(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("地獄嵐", "Nether Storm");
-               if (desc) return _("超巨大な地獄の球を放つ。", "Generates a huge ball of nether.");
-
-               {
-                       HIT_POINT dam = plev * 15;
-                       POSITION rad = plev / 5;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("血の呪い", "Bloody Curse");
-               if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
-                       "Puts blood curse, which damages and causes various effects, on a monster. You also take damage.");
-
-               {
-                       HIT_POINT dam = 600;
-                       POSITION rad = 0;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball_hide(caster_ptr, GF_BLOOD_CURSE, dir, dam, rad);
-                               take_hit(caster_ptr, DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("魔王変化", "Polymorph Demonlord");
-               if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
-                       "Causes you to mimic a demon lord for a while. You lose the abilities of your original race and get the great abilities of a demon lord for that time. Even hard walls can't stop your walking.");
-
-               {
-                       int base = 15;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON_LORD, FALSE);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("マジック・ミサイル", "Magic Missile");
+        if (desc)
+            return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 4;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_MISSILE, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("無生命感知", "Detect Unlife");
+        if (desc)
+            return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_nonliving(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("邪なる祝福", "Evil Bless");
+        if (desc)
+            return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
+
+        {
+            int base = 12;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_blessed(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("耐火炎", "Resist Fire");
+        if (desc)
+            return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to fire, cold and electricity for a while. These resistances can be added to those from equipment for more powerful "
+                "resistances.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("恐慌", "Horrify");
+        if (desc)
+            return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
+
+        {
+            PLAYER_LEVEL power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fear_monster(caster_ptr, dir, power);
+                stun_monster(caster_ptr, dir, power);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("地獄の矢", "Nether Bolt");
+        if (desc)
+            return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
+
+        {
+            DICE_NUMBER dice = 6 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_NETHER, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("古代の死霊召喚", "Summon Manes");
+        if (desc)
+            return _("古代の死霊を召喚する。", "Summons a manes.");
+
+        {
+            if (cast) {
+                if (!summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET))) {
+                    msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
+                }
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("地獄の焔", "Hellish Flame");
+        if (desc)
+            return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。", "Fires a ball of evil power. Hurts good monsters greatly.");
+
+        {
+            DICE_NUMBER dice = 3;
+            DICE_SID sides = 6;
+            POSITION rad = (plev < 30) ? 2 : 3;
+            int base;
+
+            if (is_wizard_class(caster_ptr))
+                base = plev + plev / 2;
+            else
+                base = plev + plev / 4;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("デーモン支配", "Dominate Demon");
+        if (desc)
+            return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                control_one_demon(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("ビジョン", "Vision");
+        if (desc)
+            return _("周辺の地形を感知する。", "Maps nearby area.");
+
+        {
+            POSITION rad = DETECT_RAD_MAP;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                map_area(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("耐地獄", "Resist Nether");
+        if (desc)
+            return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_res_nether(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("プラズマ・ボルト", "Plasma bolt");
+        if (desc)
+            return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
+
+        {
+            DICE_NUMBER dice = 11 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_PLASMA, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("ファイア・ボール", "Fire Ball");
+        if (desc)
+            return _("炎の球を放つ。", "Fires a ball of fire.");
+
+        {
+            HIT_POINT dam = plev + 55;
+            POSITION rad = 2;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_FIRE, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("炎の刃", "Fire Branding");
+        if (desc)
+            return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, 1);
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("地獄球", "Nether Ball");
+        if (desc)
+            return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
+
+        {
+            HIT_POINT dam = plev * 3 / 2 + 100;
+            POSITION rad = plev / 20 + 2;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("デーモン召喚", "Summon Demon");
+        if (desc)
+            return _("悪魔1体を召喚する。", "Summons a demon.");
+
+        {
+            if (cast) {
+                cast_summon_demon(caster_ptr, plev * 2 / 3 + randint1(plev / 2));
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("悪魔の目", "Devilish Eye");
+        if (desc)
+            return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
+
+        {
+            int base = 30;
+            DICE_SID sides = 25;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("悪魔のクローク", "Devil Cloak");
+        if (desc)
+            return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
+                "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to those from equipment for more powerful "
+                "resistances.");
+
+        {
+            TIME_EFFECT base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                TIME_EFFECT dur = randint1(base) + base;
+
+                set_oppose_fire(caster_ptr, dur, FALSE);
+                set_oppose_cold(caster_ptr, dur, FALSE);
+                set_tim_sh_fire(caster_ptr, dur, FALSE);
+                set_afraid(caster_ptr, 0);
+                break;
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("溶岩流", "The Flow of Lava");
+        if (desc)
+            return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", "Generates a ball of fire centered on you which transforms floors to magma.");
+
+        {
+            HIT_POINT dam = (55 + plev) * 2;
+            POSITION rad = 3;
+
+            if (info)
+                return info_damage(0, 0, dam / 2);
+
+            if (cast) {
+                fire_ball(caster_ptr, GF_FIRE, 0, dam, rad);
+                fire_ball_hide(caster_ptr, GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("プラズマ球", "Plasma Ball");
+        if (desc)
+            return _("プラズマの球を放つ。", "Fires a ball of plasma.");
+
+        {
+            HIT_POINT dam = plev * 3 / 2 + 80;
+            POSITION rad = 2 + plev / 40;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_PLASMA, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("悪魔変化", "Polymorph Demon");
+        if (desc)
+            return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
+                "Causes you to mimic a demon for a while. You lose the abilities of your original race and get the abilities of a demon for that time.");
+
+        {
+            int base = 10 + plev / 2;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON, FALSE);
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("地獄の波動", "Nather Wave");
+        if (desc)
+            return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
+                "Damages all monsters in sight. Hurts good monsters greatly.");
+
+        {
+            int sides1 = plev * 2;
+            int sides2 = plev * 2;
+
+            if (info)
+                return format("%sd%d+d%d", KWD_DAM, sides1, sides2);
+
+            if (cast) {
+                dispel_monsters(caster_ptr, randint1(sides1));
+                dispel_good(caster_ptr, randint1(sides2));
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("サキュバスの接吻", "Kiss of Succubus");
+        if (desc)
+            return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
+
+        {
+            HIT_POINT dam = 100 + plev * 2;
+            POSITION rad = 4;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball(caster_ptr, GF_NEXUS, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("破滅の手", "Doom Hand");
+        if (desc)
+            return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to cut a monster's HP roughly in half.");
+
+        {
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                else
+                    msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
+
+                fire_ball_hide(caster_ptr, GF_HAND_DOOM, dir, plev * 2, 0);
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("士気高揚", "Raise the Morale");
+        if (desc)
+            return _("一定時間、ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP.");
+
+        {
+            int base = 25;
+            if (info)
+                return info_duration(base, base);
+            if (cast)
+                heroism(caster_ptr, base);
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("不滅の肉体", "Immortal Body");
+        if (desc)
+            return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_tim_res_time(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("狂気の円環", "Insanity Circle");
+        if (desc)
+            return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
+                "Generates balls of chaos, confusion and charm centered on you.");
+
+        {
+            HIT_POINT dam = 50 + plev;
+            int power = 20 + plev;
+            POSITION rad = 3 + plev / 20;
+
+            if (info)
+                return format("%s%d+%d", KWD_DAM, dam / 2, dam / 2);
+
+            if (cast) {
+                fire_ball(caster_ptr, GF_CHAOS, 0, dam, rad);
+                fire_ball(caster_ptr, GF_CONFUSION, 0, dam, rad);
+                fire_ball(caster_ptr, GF_CHARM, 0, power, rad);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("ペット爆破", "Explode Pets");
+        if (desc)
+            return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
+
+        {
+            if (cast) {
+                discharge_minion(caster_ptr);
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("グレーターデーモン召喚", "Summon Greater Demon");
+        if (desc)
+            return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
+                "Summons greater demon. Requires the sacrifice of a human corpse ('p', 'h' or 't').");
+
+        {
+            if (cast) {
+                if (!cast_summon_greater_demon(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("地獄嵐", "Nether Storm");
+        if (desc)
+            return _("超巨大な地獄の球を放つ。", "Generates a huge ball of nether.");
+
+        {
+            HIT_POINT dam = plev * 15;
+            POSITION rad = plev / 5;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_NETHER, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("血の呪い", "Bloody Curse");
+        if (desc)
+            return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
+                "Puts blood curse, which damages and causes various effects, on a monster. You also take damage.");
+
+        {
+            HIT_POINT dam = 600;
+            POSITION rad = 0;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball_hide(caster_ptr, GF_BLOOD_CURSE, dir, dam, rad);
+                take_hit(caster_ptr, DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("魔王変化", "Polymorph Demonlord");
+        if (desc)
+            return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
+                "Causes you to mimic a demon lord for a while. You lose the abilities of your original race and get the great abilities of a demon lord for "
+                "that time. Even hard walls can't stop your walking.");
+
+        {
+            int base = 15;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_mimic(caster_ptr, base + randint1(base), MIMIC_DEMON_LORD, FALSE);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
-
index 351d431..bcffcf7 100644 (file)
 #include "effect/effect-characteristics.h"
 #include "flavor/flavor-describer.h"
 #include "flavor/object-flavor-types.h"
-#include "floor/floor-object.h"
 #include "floor/cave.h"
+#include "floor/floor-object.h"
 #include "grid/grid.h"
 #include "inventory/inventory-slot-types.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "object-enchant/object-curse.h"
 #include "object-enchant/tr-types.h"
@@ -56,6 +55,7 @@
 #include "spell/technic-info-table.h"
 #include "status/action-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index db27bd6..b793d13 100644 (file)
@@ -19,7 +19,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "mind/mind-ninja.h"
 #include "monster-race/monster-race-hook.h"
 #include "monster-race/monster-race.h"
 #include "monster/monster-update.h"
 #include "object-enchant/tr-types.h"
 #include "object/object-flags.h"
-#include "status/bad-status-setter.h"
 #include "player/player-damage.h"
 #include "player/player-move.h"
 #include "player/player-status.h"
-#include "spell/process-effect.h"
 #include "spell-kind/earthquake.h"
 #include "spell-kind/spells-detection.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell-kind/spells-perception.h"
 #include "spell-kind/spells-sight.h"
 #include "spell-kind/spells-teleport.h"
+#include "spell/process-effect.h"
 #include "spell/spell-types.h"
 #include "spell/technic-info-table.h"
+#include "status/bad-status-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
 
 /*!
-* @brief 剣術の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 剣術ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 剣術の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 剣術ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_hissatsu_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("飛飯綱", "Tobi-Izuna");
-               if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a monster two squares away.");
-
-               if (cast)
-               {
-                       project_length = 2;
-                       if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                       project_hook(caster_ptr, GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
-               }
-               break;
-
-       case 1:
-               if (name) return _("五月雨斬り", "3-Way Attack");
-               if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions at one time.");
-
-               if (cast)
-               {
-                       DIRECTION cdir;
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       for (cdir = 0; cdir < 8; cdir++)
-                       {
-                               if (cdd[cdir] == dir) break;
-                       }
-
-                       if (cdir == 8) return NULL;
-
-                       y = caster_ptr->y + ddy_cdd[cdir];
-                       x = caster_ptr->x + ddx_cdd[cdir];
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, 0);
-                       else
-                               msg_print(_("攻撃は空を切った。", "You attack the empty air."));
-
-                       y = caster_ptr->y + ddy_cdd[(cdir + 7) % 8];
-                       x = caster_ptr->x + ddx_cdd[(cdir + 7) % 8];
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, 0);
-                       else
-                               msg_print(_("攻撃は空を切った。", "You attack the empty air."));
-
-                       y = caster_ptr->y + ddy_cdd[(cdir + 1) % 8];
-                       x = caster_ptr->x + ddx_cdd[(cdir + 1) % 8];
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, 0);
-                       else
-                               msg_print(_("攻撃は空を切った。", "You attack the empty air."));
-               }
-               break;
-
-       case 2:
-               if (name) return _("ブーメラン", "Boomerang");
-               if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
-                       "Throws current weapon. It'll return to your hand unless the action failed.");
-
-               if (cast)
-               {
-                       if (!do_cmd_throw(caster_ptr, 1, TRUE, -1)) return NULL;
-               }
-               break;
-
-       case 3:
-               if (name) return _("焔霊", "Burning Strike");
-               if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_FIRE);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("殺気感知", "Detect Ferocity");
-               if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except the mindless in your vicinity.");
-
-               if (cast)
-               {
-                       detect_monsters_mind(caster_ptr, DETECT_RAD_DEFAULT);
-               }
-               break;
-
-       case 5:
-               if (name) return _("みね打ち", "Strike to Stun");
-               if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster next to you.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_MINEUCHI);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("カウンター", "Counter");
-               if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
-                       "Prepares to counterattack. When attacked by a monster, strikes back using SP each time.");
-
-               if (cast)
-               {
-                       if (caster_ptr->riding)
-                       {
-                               msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
-                               return NULL;
-                       }
-                       msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counterattack."));
-                       caster_ptr->counter = TRUE;
-               }
-               break;
-
-       case 7:
-               if (name) return _("払い抜け", "Harainuke");
-               if (desc) return _("攻撃した後、反対側に抜ける。",
-                       "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (caster_ptr->riding)
-                       {
-                               msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
-                               return NULL;
-                       }
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-
-                       if (dir == 5) return NULL;
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (!caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-
-                       do_cmd_attack(caster_ptr, y, x, 0);
-
-                       if (!player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0) || is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat))
-                               break;
-
-                       y += ddy[dir];
-                       x += ddx[dir];
-
-                       if (player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0) && !is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat) && !caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                       {
-                               msg_print(NULL);
-                               (void)move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("サーペンツタン", "Serpent's Tongue");
-               if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_POISON);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("斬魔剣弐の太刀", "Zammaken");
-               if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
-                       "Attacks an evil unliving monster with great damage. Has no effect on other monsters.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_ZANMA);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("裂風剣", "Wind Blast");
-               if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster and blows it away.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, 0);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-                       if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
-                       {
-                               return "";
-                       }
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                       {
-                               int i;
-                               POSITION ty = y, tx = x;
-                               POSITION oy = y, ox = x;
-                               MONSTER_IDX m_idx = caster_ptr->current_floor_ptr->grid_array[y][x].m_idx;
-                               monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[m_idx];
-                               GAME_TEXT m_name[MAX_NLEN];
-
-                               monster_desc(caster_ptr, m_name, m_ptr, 0);
-
-                               for (i = 0; i < 5; i++)
-                               {
-                                       y += ddy[dir];
-                                       x += ddx[dir];
-                                       if (is_cave_empty_bold(caster_ptr, y, x))
-                                       {
-                                               ty = y;
-                                               tx = x;
-                                       }
-                                       else break;
-                               }
-                               if ((ty != oy) || (tx != ox))
-                               {
-                                       msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
-                                       caster_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0;
-                                       caster_ptr->current_floor_ptr->grid_array[ty][tx].m_idx = m_idx;
-                                       m_ptr->fy = ty;
-                                       m_ptr->fx = tx;
-
-                                       update_monster(caster_ptr, m_idx, TRUE);
-                                       lite_spot(caster_ptr, oy, ox);
-                                       lite_spot(caster_ptr, ty, tx);
-
-                                       if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
-                                               caster_ptr->update |= (PU_MON_LITE);
-                               }
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("刀匠の目利き", "Judge");
-               if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
-                       "Identifies a weapon or armor. *Identifies* the item at level 45.");
-
-               if (cast)
-               {
-                       if (plev > 44)
-                       {
-                               if (!identify_fully(caster_ptr, TRUE, 0)) return NULL;
-                       }
-                       else
-                       {
-                               if (!ident_spell(caster_ptr, TRUE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("破岩斬", "Rock Smash");
-               if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock or greatly damages a monster made of rocks.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_HAGAN);
-
-                       if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_HURT_ROCK)) break;
-
-                       /* Destroy the feature */
-                       cave_alter_feat(caster_ptr, y, x, FF_HURT_ROCK);
-                       caster_ptr->update |= (PU_FLOW);
-               }
-               break;
-
-       case 13:
-               if (name) return _("乱れ雪月花", "Midare-Setsugekka");
-               if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
-                       "Attacks a monster with an increased number of attacks and more damage unless it has resistance to cold.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_COLD);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("急所突き", "Spot Aiming");
-               if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
-                       "Attempts to kill a monster instantly. If that fails, causes only 1HP of damage.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_KYUSHO);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("魔神斬り", "Majingiri");
-               if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
-                       "Attempts to attack with a critical hit, but this attack is easy to evade for a monster.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_MAJIN);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("捨て身", "Desperate Attack");
-               if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
-                       "Attacks with all of your power, but all damage you take will be doubled for one turn.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_SUTEMI);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-                       caster_ptr->sutemi = TRUE;
-               }
-               break;
-
-       case 17:
-               if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
-               if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
-                       "Attacks a monster with more damage unless it has resistance to electricity.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_ELEC);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("入身", "Rush Attack");
-               if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at the same time.");
-
-               if (cast)
-               {
-                       if (!rush_attack(caster_ptr, NULL)) return NULL;
-               }
-               break;
-
-       case 19:
-               if (name) return _("赤流渦", "Bloody Maelstrom");
-               if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
-                       "Attacks all adjacent monsters with power corresponding to your cuts. Then increases your cuts. Has no effect on unliving monsters.");
-
-               if (cast)
-               {
-                       POSITION y = 0, x = 0;
-
-                       grid_type       *g_ptr;
-                       monster_type    *m_ptr;
-
-                       if (caster_ptr->cut < 300)
-                               set_cut(caster_ptr,caster_ptr->cut + 300);
-                       else
-                               set_cut(caster_ptr,caster_ptr->cut * 2);
-
-                       for (dir = 0; dir < 8; dir++)
-                       {
-                               y = caster_ptr->y + ddy_ddd[dir];
-                               x = caster_ptr->x + ddx_ddd[dir];
-                               g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
-                               m_ptr = &caster_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
-
-                               /* Hack -- attack monsters */
-                               if (g_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT)))
-                               {
-                                       if (!monster_living(m_ptr->r_idx))
-                                       {
-                                               GAME_TEXT m_name[MAX_NLEN];
-
-                                               monster_desc(caster_ptr, m_name, m_ptr, 0);
-                                               msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
-                                       }
-                                       else do_cmd_attack(caster_ptr, y, x, HISSATSU_SEKIRYUKA);
-                               }
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("激震撃", "Earthquake Blow");
-               if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_QUAKE);
-                       else
-                               earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 10, 0);
-               }
-               break;
-
-       case 21:
-               if (name) return _("地走り", "Crack");
-               if (desc) return _("衝撃波のビームを放つ。", "Fires a shock wave as a beam.");
-
-               if (cast)
-               {
-                       int total_damage = 0, basedam, i;
-                       BIT_FLAGS flgs[TR_FLAG_SIZE];
-                       object_type *o_ptr;
-                       if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                       msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
-                       for (i = 0; i < 2; i++)
-                       {
-                               int damage;
-
-                               if (!has_melee_weapon(caster_ptr, INVEN_RARM + i)) break;
-                               o_ptr = &caster_ptr->inventory_list[INVEN_RARM + i];
-                               basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
-                               damage = o_ptr->to_d * 100;
-                               object_flags(caster_ptr, o_ptr, flgs);
-                               if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
-                               {
-                                       /* vorpal blade */
-                                       basedam *= 5;
-                                       basedam /= 3;
-                               }
-                               else if (have_flag(flgs, TR_VORPAL))
-                               {
-                                       /* vorpal flag only */
-                                       basedam *= 11;
-                                       basedam /= 9;
-                               }
-                               damage += basedam;
-                               damage *= caster_ptr->num_blow[i];
-                               total_damage += damage / 200;
-                               if (i) total_damage = total_damage * 7 / 10;
-                       }
-                       fire_beam(caster_ptr, GF_FORCE, dir, total_damage);
-               }
-               break;
-
-       case 22:
-               if (name) return _("気迫の雄叫び", "War Cry");
-               if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
-                       "Damages all monsters in sight with sound. Aggravates nearby monsters.");
-
-               if (cast)
-               {
-                       msg_print(_("雄叫びをあげた!", "You roar!"));
-                       project_all_los(caster_ptr, GF_SOUND, randint1(plev * 3));
-                       aggravate_monsters(caster_ptr, 0);
-               }
-               break;
-
-       case 23:
-               if (name) return _("無双三段", "Musou-Sandan");
-               if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with three powerful strikes.");
-
-               if (cast)
-               {
-                       int i;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       for (i = 0; i < 3; i++)
-                       {
-                               POSITION y, x;
-                               POSITION ny, nx;
-                               MONSTER_IDX m_idx;
-                               grid_type *g_ptr;
-                               monster_type *m_ptr;
-
-                               y = caster_ptr->y + ddy[dir];
-                               x = caster_ptr->x + ddx[dir];
-                               g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
-
-                               if (g_ptr->m_idx)
-                                       do_cmd_attack(caster_ptr, y, x, HISSATSU_3DAN);
-                               else
-                               {
-                                       msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                                       return NULL;
-                               }
-
-                               if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
-                               {
-                                       return "";
-                               }
-
-                               /* Monster is dead? */
-                               if (!g_ptr->m_idx) break;
-
-                               ny = y + ddy[dir];
-                               nx = x + ddx[dir];
-                               m_idx = g_ptr->m_idx;
-                               m_ptr = &caster_ptr->current_floor_ptr->m_list[m_idx];
-
-                               /* Monster cannot move back? */
-                               if (!monster_can_enter(caster_ptr, ny, nx, &r_info[m_ptr->r_idx], 0))
-                               {
-                                       /* -more- */
-                                       if (i < 2) msg_print(NULL);
-                                       continue;
-                               }
-
-                               g_ptr->m_idx = 0;
-                               caster_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx;
-                               m_ptr->fy = ny;
-                               m_ptr->fx = nx;
-
-                               update_monster(caster_ptr, m_idx, TRUE);
-
-                               /* Redraw the old spot */
-                               lite_spot(caster_ptr, y, x);
-
-                               /* Redraw the new spot */
-                               lite_spot(caster_ptr, ny, nx);
-
-                               /* Player can move forward? */
-                               if (player_can_enter(caster_ptr, g_ptr->feat, 0))
-                               {
-                                       if (!move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
-                               }
-                               else
-                               {
-                                       break;
-                               }
-
-                               /* -more- */
-                               if (i < 2) msg_print(NULL);
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("吸血鬼の牙", "Vampire's Fang");
-               if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
-                       "Attacks with vampiric strikes which absorb HP from a monster and heal you. Has no effect on unliving monsters.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_DRAIN);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("幻惑", "Moon Dazzling");
-               if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and put to sleep all waking monsters.");
-
-               if (cast)
-               {
-                       msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
-                       project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
-                       project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
-                       project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
-               }
-               break;
-
-       case 26:
-               if (name) return _("百人斬り", "Hundred Slaughter");
-               if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
-                       "Performs a series of rush attacks. The series continues as long as the attacked monster dies and you have sufficient SP.");
-
-               if (cast)
-               {
-                       const int mana_cost_per_monster = 8;
-                       bool is_new = TRUE;
-                       bool mdeath;
-
-                       do
-                       {
-                               if (!rush_attack(caster_ptr, &mdeath)) break;
-                               if (is_new)
-                               {
-                                       /* Reserve needed mana point */
-                                       caster_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
-                                       is_new = FALSE;
-                               }
-                               else
-                                       caster_ptr->csp -= mana_cost_per_monster;
-
-                               if (!mdeath) break;
-                               command_dir = 0;
-
-                               caster_ptr->redraw |= PR_MANA;
-                               handle_stuff(caster_ptr);
-                       } while (caster_ptr->csp > mana_cost_per_monster);
-
-                       if (is_new) return NULL;
-
-                       /* Restore reserved mana */
-                       caster_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
-               }
-               break;
-
-       case 27:
-               if (name) return _("天翔龍閃", "Dragonic Flash");
-               if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
-                       "Runs toward given location while attacking all monsters on the path.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!tgt_pt(caster_ptr, &x, &y)) return NULL;
-
-                       if (!cave_player_teleportable_bold(caster_ptr, y, x, TELEPORT_SPONTANEOUS) ||
-                               (distance(y, x, caster_ptr->y, caster_ptr->x) > MAX_SIGHT / 2) ||
-                               !projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x))
-                       {
-                               msg_print(_("失敗!", "You cannot move to that place!"));
-                               break;
-                       }
-                       if (caster_ptr->anti_tele)
-                       {
-                               msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
-                               break;
-                       }
-                       project(caster_ptr, 0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
-                       teleport_player_to(caster_ptr, y, x, TELEPORT_SPONTANEOUS);
-               }
-               break;
-
-       case 28:
-               if (name) return _("二重の剣撃", "Twin Slash");
-               if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
-
-               if (cast)
-               {
-                       POSITION x, y;
-
-                       if (!get_rep_dir(caster_ptr, &dir, FALSE)) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                       {
-                               do_cmd_attack(caster_ptr, y, x, 0);
-                               if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               {
-                                       handle_stuff(caster_ptr);
-                                       do_cmd_attack(caster_ptr, y, x, 0);
-                               }
-                       }
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
-                               return NULL;
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
-               if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even affects nearby monsters.");
-
-               if (cast)
-               {
-                       int total_damage = 0, basedam, i;
-                       POSITION y, x;
-                       BIT_FLAGS flgs[TR_FLAG_SIZE];
-                       object_type *o_ptr;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
-                       {
-                               msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
-                               return "";
-                       }
-                       msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
-                       for (i = 0; i < 2; i++)
-                       {
-                               int damage;
-                               if (!has_melee_weapon(caster_ptr, INVEN_RARM + i)) break;
-                               o_ptr = &caster_ptr->inventory_list[INVEN_RARM + i];
-                               basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
-                               damage = o_ptr->to_d * 100;
-                               object_flags(caster_ptr, o_ptr, flgs);
-                               if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
-                               {
-                                       /* vorpal blade */
-                                       basedam *= 5;
-                                       basedam /= 3;
-                               }
-                               else if (have_flag(flgs, TR_VORPAL))
-                               {
-                                       /* vorpal flag only */
-                                       basedam *= 11;
-                                       basedam /= 9;
-                               }
-                               damage += basedam;
-                               damage += caster_ptr->to_d[i] * 100;
-                               damage *= caster_ptr->num_blow[i];
-                               total_damage += (damage / 100);
-                       }
-                       project(caster_ptr, 0, (cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
-               }
-               break;
-
-       case 30:
-               if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
-               if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
-                       "Attacks a monster with extremely powerful damage, but you also take some damage. Hurts an undead monster greatly.");
-
-               if (cast)
-               {
-                       POSITION y, x;
-
-                       if (!get_direction(caster_ptr, &dir, FALSE, FALSE)) return NULL;
-                       if (dir == 5) return NULL;
-
-                       y = caster_ptr->y + ddy[dir];
-                       x = caster_ptr->x + ddx[dir];
-
-                       if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
-                               do_cmd_attack(caster_ptr, y, x, HISSATSU_UNDEAD);
-                       else
-                       {
-                               msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
-                               return NULL;
-                       }
-                       take_hit(caster_ptr, DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
-               }
-               break;
-
-       case 31:
-               if (name) return _("切腹", "Harakiri");
-               if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Bushido, the way of warriors, is found in death'");
-
-               if (cast)
-               {
-                       int i;
-                       if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
-                       /* Special Verification for suicide */
-                       prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
-
-                       flush();
-                       i = inkey();
-                       prt("", 0, 0);
-                       if (i != '@') return NULL;
-                       if (current_world_ptr->total_winner)
-                       {
-                               take_hit(caster_ptr, DAMAGE_FORCE, 9999, "Seppuku", -1);
-                               current_world_ptr->total_winner = TRUE;
-                       }
-                       else
-                       {
-                               msg_print(_("武士道とは、死ぬことと見つけたり。", "The meaning of bushido is found in death."));
-                               take_hit(caster_ptr, DAMAGE_FORCE, 9999, "Seppuku", -1);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("飛飯綱", "Tobi-Izuna");
+        if (desc)
+            return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a monster two squares away.");
+
+        if (cast) {
+            project_length = 2;
+            if (!get_aim_dir(caster_ptr, &dir))
+                return NULL;
+
+            project_hook(caster_ptr, GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("五月雨斬り", "3-Way Attack");
+        if (desc)
+            return _("3方向に対して攻撃する。", "Attacks in 3 directions at one time.");
+
+        if (cast) {
+            DIRECTION cdir;
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            for (cdir = 0; cdir < 8; cdir++) {
+                if (cdd[cdir] == dir)
+                    break;
+            }
+
+            if (cdir == 8)
+                return NULL;
+
+            y = caster_ptr->y + ddy_cdd[cdir];
+            x = caster_ptr->x + ddx_cdd[cdir];
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, 0);
+            else
+                msg_print(_("攻撃は空を切った。", "You attack the empty air."));
+
+            y = caster_ptr->y + ddy_cdd[(cdir + 7) % 8];
+            x = caster_ptr->x + ddx_cdd[(cdir + 7) % 8];
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, 0);
+            else
+                msg_print(_("攻撃は空を切った。", "You attack the empty air."));
+
+            y = caster_ptr->y + ddy_cdd[(cdir + 1) % 8];
+            x = caster_ptr->x + ddx_cdd[(cdir + 1) % 8];
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, 0);
+            else
+                msg_print(_("攻撃は空を切った。", "You attack the empty air."));
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("ブーメラン", "Boomerang");
+        if (desc)
+            return _(
+                "武器を手元に戻ってくるように投げる。戻ってこないこともある。", "Throws current weapon. It'll return to your hand unless the action failed.");
+
+        if (cast) {
+            if (!do_cmd_throw(caster_ptr, 1, TRUE, -1))
+                return NULL;
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("焔霊", "Burning Strike");
+        if (desc)
+            return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_FIRE);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("殺気感知", "Detect Ferocity");
+        if (desc)
+            return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except the mindless in your vicinity.");
+
+        if (cast) {
+            detect_monsters_mind(caster_ptr, DETECT_RAD_DEFAULT);
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("みね打ち", "Strike to Stun");
+        if (desc)
+            return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster next to you.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_MINEUCHI);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("カウンター", "Counter");
+        if (desc)
+            return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
+                "Prepares to counterattack. When attacked by a monster, strikes back using SP each time.");
+
+        if (cast) {
+            if (caster_ptr->riding) {
+                msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
+                return NULL;
+            }
+            msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counterattack."));
+            caster_ptr->counter = TRUE;
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("払い抜け", "Harainuke");
+        if (desc)
+            return _("攻撃した後、反対側に抜ける。",
+                "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (caster_ptr->riding) {
+                msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
+                return NULL;
+            }
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+
+            if (dir == 5)
+                return NULL;
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (!caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+
+            do_cmd_attack(caster_ptr, y, x, 0);
+
+            if (!player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0)
+                || is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat))
+                break;
+
+            y += ddy[dir];
+            x += ddx[dir];
+
+            if (player_can_enter(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat, 0)
+                && !is_trap(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].feat) && !caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+                msg_print(NULL);
+                (void)move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("サーペンツタン", "Serpent's Tongue");
+        if (desc)
+            return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_POISON);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("斬魔剣弐の太刀", "Zammaken");
+        if (desc)
+            return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
+                "Attacks an evil unliving monster with great damage. Has no effect on other monsters.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_ZANMA);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("裂風剣", "Wind Blast");
+        if (desc)
+            return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster and blows it away.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, 0);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+            if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+                return "";
+            }
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+                int i;
+                POSITION ty = y, tx = x;
+                POSITION oy = y, ox = x;
+                MONSTER_IDX m_idx = caster_ptr->current_floor_ptr->grid_array[y][x].m_idx;
+                monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[m_idx];
+                GAME_TEXT m_name[MAX_NLEN];
+
+                monster_desc(caster_ptr, m_name, m_ptr, 0);
+
+                for (i = 0; i < 5; i++) {
+                    y += ddy[dir];
+                    x += ddx[dir];
+                    if (is_cave_empty_bold(caster_ptr, y, x)) {
+                        ty = y;
+                        tx = x;
+                    } else
+                        break;
+                }
+                if ((ty != oy) || (tx != ox)) {
+                    msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
+                    caster_ptr->current_floor_ptr->grid_array[oy][ox].m_idx = 0;
+                    caster_ptr->current_floor_ptr->grid_array[ty][tx].m_idx = m_idx;
+                    m_ptr->fy = ty;
+                    m_ptr->fx = tx;
+
+                    update_monster(caster_ptr, m_idx, TRUE);
+                    lite_spot(caster_ptr, oy, ox);
+                    lite_spot(caster_ptr, ty, tx);
+
+                    if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
+                        caster_ptr->update |= (PU_MON_LITE);
+                }
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("刀匠の目利き", "Judge");
+        if (desc)
+            return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
+                "Identifies a weapon or armor. *Identifies* the item at level 45.");
+
+        if (cast) {
+            if (plev > 44) {
+                if (!identify_fully(caster_ptr, TRUE, 0))
+                    return NULL;
+            } else {
+                if (!ident_spell(caster_ptr, TRUE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("破岩斬", "Rock Smash");
+        if (desc)
+            return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock or greatly damages a monster made of rocks.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_HAGAN);
+
+            if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_HURT_ROCK))
+                break;
+
+            /* Destroy the feature */
+            cave_alter_feat(caster_ptr, y, x, FF_HURT_ROCK);
+            caster_ptr->update |= (PU_FLOW);
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("乱れ雪月花", "Midare-Setsugekka");
+        if (desc)
+            return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
+                "Attacks a monster with an increased number of attacks and more damage unless it has resistance to cold.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_COLD);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("急所突き", "Spot Aiming");
+        if (desc)
+            return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
+                "Attempts to kill a monster instantly. If that fails, causes only 1HP of damage.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_KYUSHO);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("魔神斬り", "Majingiri");
+        if (desc)
+            return _("会心の一撃で攻撃する。攻撃がかわされやすい。", "Attempts to attack with a critical hit, but this attack is easy to evade for a monster.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_MAJIN);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("捨て身", "Desperate Attack");
+        if (desc)
+            return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
+                "Attacks with all of your power, but all damage you take will be doubled for one turn.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_SUTEMI);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+            caster_ptr->sutemi = TRUE;
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("雷撃鷲爪斬", "Lightning Eagle");
+        if (desc)
+            return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", "Attacks a monster with more damage unless it has resistance to electricity.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_ELEC);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("入身", "Rush Attack");
+        if (desc)
+            return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at the same time.");
+
+        if (cast) {
+            if (!rush_attack(caster_ptr, NULL))
+                return NULL;
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("赤流渦", "Bloody Maelstrom");
+        if (desc)
+            return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
+                "Attacks all adjacent monsters with power corresponding to your cuts. Then increases your cuts. Has no effect on unliving monsters.");
+
+        if (cast) {
+            POSITION y = 0, x = 0;
+
+            grid_type *g_ptr;
+            monster_type *m_ptr;
+
+            if (caster_ptr->cut < 300)
+                set_cut(caster_ptr, caster_ptr->cut + 300);
+            else
+                set_cut(caster_ptr, caster_ptr->cut * 2);
+
+            for (dir = 0; dir < 8; dir++) {
+                y = caster_ptr->y + ddy_ddd[dir];
+                x = caster_ptr->x + ddx_ddd[dir];
+                g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
+                m_ptr = &caster_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
+
+                /* Hack -- attack monsters */
+                if (g_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT))) {
+                    if (!monster_living(m_ptr->r_idx)) {
+                        GAME_TEXT m_name[MAX_NLEN];
+
+                        monster_desc(caster_ptr, m_name, m_ptr, 0);
+                        msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
+                    } else
+                        do_cmd_attack(caster_ptr, y, x, HISSATSU_SEKIRYUKA);
+                }
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("激震撃", "Earthquake Blow");
+        if (desc)
+            return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_QUAKE);
+            else
+                earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 10, 0);
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("地走り", "Crack");
+        if (desc)
+            return _("衝撃波のビームを放つ。", "Fires a shock wave as a beam.");
+
+        if (cast) {
+            int total_damage = 0, basedam, i;
+            BIT_FLAGS flgs[TR_FLAG_SIZE];
+            object_type *o_ptr;
+            if (!get_aim_dir(caster_ptr, &dir))
+                return NULL;
+            msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
+            for (i = 0; i < 2; i++) {
+                int damage;
+
+                if (!has_melee_weapon(caster_ptr, INVEN_RARM + i))
+                    break;
+                o_ptr = &caster_ptr->inventory_list[INVEN_RARM + i];
+                basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
+                damage = o_ptr->to_d * 100;
+                object_flags(caster_ptr, o_ptr, flgs);
+                if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) {
+                    /* vorpal blade */
+                    basedam *= 5;
+                    basedam /= 3;
+                } else if (have_flag(flgs, TR_VORPAL)) {
+                    /* vorpal flag only */
+                    basedam *= 11;
+                    basedam /= 9;
+                }
+                damage += basedam;
+                damage *= caster_ptr->num_blow[i];
+                total_damage += damage / 200;
+                if (i)
+                    total_damage = total_damage * 7 / 10;
+            }
+            fire_beam(caster_ptr, GF_FORCE, dir, total_damage);
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("気迫の雄叫び", "War Cry");
+        if (desc)
+            return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
+                "Damages all monsters in sight with sound. Aggravates nearby monsters.");
+
+        if (cast) {
+            msg_print(_("雄叫びをあげた!", "You roar!"));
+            project_all_los(caster_ptr, GF_SOUND, randint1(plev * 3));
+            aggravate_monsters(caster_ptr, 0);
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("無双三段", "Musou-Sandan");
+        if (desc)
+            return _("強力な3段攻撃を繰り出す。", "Attacks with three powerful strikes.");
+
+        if (cast) {
+            int i;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            for (i = 0; i < 3; i++) {
+                POSITION y, x;
+                POSITION ny, nx;
+                MONSTER_IDX m_idx;
+                grid_type *g_ptr;
+                monster_type *m_ptr;
+
+                y = caster_ptr->y + ddy[dir];
+                x = caster_ptr->x + ddx[dir];
+                g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
+
+                if (g_ptr->m_idx)
+                    do_cmd_attack(caster_ptr, y, x, HISSATSU_3DAN);
+                else {
+                    msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                    return NULL;
+                }
+
+                if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+                    return "";
+                }
+
+                /* Monster is dead? */
+                if (!g_ptr->m_idx)
+                    break;
+
+                ny = y + ddy[dir];
+                nx = x + ddx[dir];
+                m_idx = g_ptr->m_idx;
+                m_ptr = &caster_ptr->current_floor_ptr->m_list[m_idx];
+
+                /* Monster cannot move back? */
+                if (!monster_can_enter(caster_ptr, ny, nx, &r_info[m_ptr->r_idx], 0)) {
+                    /* -more- */
+                    if (i < 2)
+                        msg_print(NULL);
+                    continue;
+                }
+
+                g_ptr->m_idx = 0;
+                caster_ptr->current_floor_ptr->grid_array[ny][nx].m_idx = m_idx;
+                m_ptr->fy = ny;
+                m_ptr->fx = nx;
+
+                update_monster(caster_ptr, m_idx, TRUE);
+
+                /* Redraw the old spot */
+                lite_spot(caster_ptr, y, x);
+
+                /* Redraw the new spot */
+                lite_spot(caster_ptr, ny, nx);
+
+                /* Player can move forward? */
+                if (player_can_enter(caster_ptr, g_ptr->feat, 0)) {
+                    if (!move_player_effect(caster_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP))
+                        break;
+                } else {
+                    break;
+                }
+
+                /* -more- */
+                if (i < 2)
+                    msg_print(NULL);
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("吸血鬼の牙", "Vampire's Fang");
+        if (desc)
+            return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
+                "Attacks with vampiric strikes which absorb HP from a monster and heal you. Has no effect on unliving monsters.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_DRAIN);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("幻惑", "Moon Dazzling");
+        if (desc)
+            return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and put to sleep all waking monsters.");
+
+        if (cast) {
+            msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
+            project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
+            project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
+            project_all_los(caster_ptr, GF_ENGETSU, plev * 4);
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("百人斬り", "Hundred Slaughter");
+        if (desc)
+            return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
+                "Performs a series of rush attacks. The series continues as long as the attacked monster dies and you have sufficient SP.");
+
+        if (cast) {
+            const int mana_cost_per_monster = 8;
+            bool is_new = TRUE;
+            bool mdeath;
+
+            do {
+                if (!rush_attack(caster_ptr, &mdeath))
+                    break;
+                if (is_new) {
+                    /* Reserve needed mana point */
+                    caster_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
+                    is_new = FALSE;
+                } else
+                    caster_ptr->csp -= mana_cost_per_monster;
+
+                if (!mdeath)
+                    break;
+                command_dir = 0;
+
+                caster_ptr->redraw |= PR_MANA;
+                handle_stuff(caster_ptr);
+            } while (caster_ptr->csp > mana_cost_per_monster);
+
+            if (is_new)
+                return NULL;
+
+            /* Restore reserved mana */
+            caster_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("天翔龍閃", "Dragonic Flash");
+        if (desc)
+            return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
+                "Runs toward given location while attacking all monsters on the path.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!tgt_pt(caster_ptr, &x, &y))
+                return NULL;
+
+            if (!cave_player_teleportable_bold(caster_ptr, y, x, TELEPORT_SPONTANEOUS) || (distance(y, x, caster_ptr->y, caster_ptr->x) > MAX_SIGHT / 2)
+                || !projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) {
+                msg_print(_("失敗!", "You cannot move to that place!"));
+                break;
+            }
+            if (caster_ptr->anti_tele) {
+                msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
+                break;
+            }
+            project(caster_ptr, 0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
+            teleport_player_to(caster_ptr, y, x, TELEPORT_SPONTANEOUS);
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("二重の剣撃", "Twin Slash");
+        if (desc)
+            return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
+
+        if (cast) {
+            POSITION x, y;
+
+            if (!get_rep_dir(caster_ptr, &dir, FALSE))
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+                do_cmd_attack(caster_ptr, y, x, 0);
+                if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
+                    handle_stuff(caster_ptr);
+                    do_cmd_attack(caster_ptr, y, x, 0);
+                }
+            } else {
+                msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
+                return NULL;
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("虎伏絶刀勢", "Kofuku-Zettousei");
+        if (desc)
+            return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even affects nearby monsters.");
+
+        if (cast) {
+            int total_damage = 0, basedam, i;
+            POSITION y, x;
+            BIT_FLAGS flgs[TR_FLAG_SIZE];
+            object_type *o_ptr;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+                msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
+                return "";
+            }
+            msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
+            for (i = 0; i < 2; i++) {
+                int damage;
+                if (!has_melee_weapon(caster_ptr, INVEN_RARM + i))
+                    break;
+                o_ptr = &caster_ptr->inventory_list[INVEN_RARM + i];
+                basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
+                damage = o_ptr->to_d * 100;
+                object_flags(caster_ptr, o_ptr, flgs);
+                if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) {
+                    /* vorpal blade */
+                    basedam *= 5;
+                    basedam /= 3;
+                } else if (have_flag(flgs, TR_VORPAL)) {
+                    /* vorpal flag only */
+                    basedam *= 11;
+                    basedam /= 9;
+                }
+                damage += basedam;
+                damage += caster_ptr->to_d[i] * 100;
+                damage *= caster_ptr->num_blow[i];
+                total_damage += (damage / 100);
+            }
+            project(caster_ptr, 0, (cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR,
+                PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("慶雲鬼忍剣", "Keiun-Kininken");
+        if (desc)
+            return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
+                "Attacks a monster with extremely powerful damage, but you also take some damage. Hurts an undead monster greatly.");
+
+        if (cast) {
+            POSITION y, x;
+
+            if (!get_direction(caster_ptr, &dir, FALSE, FALSE))
+                return NULL;
+            if (dir == 5)
+                return NULL;
+
+            y = caster_ptr->y + ddy[dir];
+            x = caster_ptr->x + ddx[dir];
+
+            if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx)
+                do_cmd_attack(caster_ptr, y, x, HISSATSU_UNDEAD);
+            else {
+                msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
+                return NULL;
+            }
+            take_hit(caster_ptr, DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("切腹", "Harakiri");
+        if (desc)
+            return _("「武士道とは、死ぬことと見つけたり。」", "'Bushido, the way of warriors, is found in death'");
+
+        if (cast) {
+            int i;
+            if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? ")))
+                return NULL;
+            /* Special Verification for suicide */
+            prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
+
+            flush();
+            i = inkey();
+            prt("", 0, 0);
+            if (i != '@')
+                return NULL;
+            if (current_world_ptr->total_winner) {
+                take_hit(caster_ptr, DAMAGE_FORCE, 9999, "Seppuku", -1);
+                current_world_ptr->total_winner = TRUE;
+            } else {
+                msg_print(_("武士道とは、死ぬことと見つけたり。", "The meaning of bushido is found in death."));
+                take_hit(caster_ptr, DAMAGE_FORCE, 9999, "Seppuku", -1);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index a3fc0b6..d2d2e87 100644 (file)
@@ -1,6 +1,5 @@
 #include "realm/realm-life.h"
 #include "cmd-action/cmd-spell.h"
-#include "io/targeting.h"
 #include "player/digestion-processor.h"
 #include "spell-kind/spells-curse-removal.h"
 #include "spell-kind/spells-detection.h"
 #include "status/experience.h"
 #include "status/temporary-resistance.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 
 /*!
-* @brief 生命領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 生命領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_life_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("軽傷の治癒", "Cure Light Wounds");
-               if (desc) return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = 10;
-                       if (info) return info_heal(dice, sides, 0);
-                       if (cast) (void)cure_light_wounds(caster_ptr, dice, sides);
-               }
-               break;
-
-       case 1:
-               if (name) return _("祝福", "Bless");
-               if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
-               {
-                       int base = 12;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_blessed(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("軽傷", "Cause Light Wounds");
-               if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 4;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("光の召喚", "Call Light");
-               if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = plev / 2;
-                       POSITION rad = plev / 10 + 1;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               lite_area(caster_ptr, damroll(dice, sides), rad);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
-               if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_traps(caster_ptr, rad, TRUE);
-                               detect_doors(caster_ptr, rad);
-                               detect_stairs(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("重傷の治癒", "Cure Medium Wounds");
-               if (desc) return _("怪我と体力を中程度回復させる。", "Heals cuts and HP more.");
-               {
-                       DICE_NUMBER dice = 4;
-                       DICE_SID sides = 10;
-
-                       if (info) return info_heal(dice, sides, 0);
-                       if (cast) (void)cure_serious_wounds(caster_ptr, dice, sides);
-               }
-               break;
-
-       case 6:
-               if (name) return _("解毒", "Cure Poison");
-               if (desc) return _("体内の毒を取り除く。", "Cures yourself of any poisons.");
-               {
-                       if (cast)
-                       {
-                               set_poisoned(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("空腹充足", "Satisfy Hunger");
-               if (desc) return _("満腹にする。", "Satisfies hunger.");
-               {
-                       if (cast)
-                       {
-                               set_food(caster_ptr, PY_FOOD_MAX - 1);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("解呪", "Remove Curse");
-               if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
-               {
-                       if (cast) (void)remove_curse(caster_ptr);
-               }
-               break;
-
-       case 9:
-               if (name) return _("重傷", "Cause Medium Wounds");
-               if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
-               {
-                       DICE_SID sides = 8 + (plev - 5) / 4;
-                       DICE_NUMBER dice = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("致命傷の治癒", "Cure Critical Wounds");
-               if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals HP greatly. Also cures cuts and being stunned.");
-               {
-                       DICE_NUMBER dice = 8;
-                       DICE_SID sides = 10;
-
-                       if (info) return info_heal(dice, sides, 0);
-                       if (cast) (void)cure_critical_wounds(caster_ptr, damroll(dice, sides));
-               }
-               break;
-
-       case 11:
-               if (name) return _("耐熱耐寒", "Resist Heat and Cold");
-               if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to fire and cold. These resistances can be added to those from equipment for more powerful resistances.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("周辺感知", "Sense Surroundings");
-               if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
-
-               {
-                       POSITION rad = DETECT_RAD_MAP;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               map_area(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("パニック・アンデッド", "Turn Undead");
-               if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
-
-               {
-                       if (cast)
-                       {
-                               turn_undead(caster_ptr);
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("体力回復", "Healing");
-               if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Is very powerful healing magic. Also completely cures cuts and being stunned.");
-
-               {
-                       int heal = 300;
-                       if (info) return info_heal(0, 0, heal);
-                       if (cast) (void)cure_critical_wounds(caster_ptr, heal);
-               }
-               break;
-
-       case 15:
-               if (name) return _("結界の紋章", "Glyph of Warding");
-               if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
-                       "Sets a glyph on the floor beneath you. If you are on a glyph, monsters cannot attack you but can try to break the glyph.");
-
-               {
-                       if (cast)
-                       {
-                               warding_glyph(caster_ptr);
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("*解呪*", "Dispel Curse");
-               if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
-               {
-                       if (cast) (void)remove_all_curse(caster_ptr);
-               }
-               break;
-
-       case 17:
-               if (name) return _("鑑識", "Perception");
-               if (desc) return _("アイテムを識別する。", "Identifies an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("アンデッド退散", "Dispel Undead");
-               if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
-
-               {
-                       DICE_NUMBER dice = 1;
-                       DICE_SID sides = plev * 5;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               dispel_undead(caster_ptr, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("凪の刻", "Day of the Dove");
-               if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
-
-               {
-                       int power = plev * 2;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               charm_monsters(caster_ptr, power);
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("致命傷", "Cause Critical Wounds");
-               if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
-
-               {
-                       DICE_NUMBER dice = 5 + (plev - 5) / 3;
-                       DICE_SID sides = 15;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("帰還の詔", "Word of Recall");
-               if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
-
-               {
-                       int base = 15;
-                       DICE_SID sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
-                       if (cast)
-                       {
-                               if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("真実の祭壇", "Alter Reality");
-               if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
-
-               {
-                       int base = 15;
-                       DICE_SID sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
-                       if (cast)
-                       {
-                               reserve_alter_reality(caster_ptr);
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("真・結界", "Warding True");
-               if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
-
-               {
-                       POSITION rad = 1;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               warding_glyph(caster_ptr);
-                               glyph_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("不毛化", "Sterilization");
-               if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
-
-               {
-                       if (cast)
-                       {
-                               caster_ptr->current_floor_ptr->num_repro += MAX_REPRO;
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("全感知", "Detection");
-               if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_all(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 26:
-               if (name) return _("アンデッド消滅", "Annihilate Undead");
-               if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
-                       "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
-
-               {
-                       int power = plev + 50;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               mass_genocide_undead(caster_ptr, power, TRUE);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("千里眼", "Clairvoyance");
-               if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
-
-               {
-                       if (cast)
-                       {
-                               wiz_lite(caster_ptr, FALSE);
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("全復活", "Restoration");
-               if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
-
-               {
-                       if (cast)
-                       {
-                               (void)restore_all_status(caster_ptr);
-                               restore_level(caster_ptr);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("*体力回復*", "Healing True");
-               if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "Is the greatest healing magic. Heals all HP, cuts and being stunned.");
-
-               {
-                       int heal = 2000;
-                       if (info) return info_heal(0, 0, heal);
-                       if (cast) (void)cure_critical_wounds(caster_ptr, heal);
-               }
-               break;
-
-       case 30:
-               if (name) return _("聖なるビジョン", "Holy Vision");
-               if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("究極の耐性", "Ultimate Resistance");
-               if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
-
-               {
-                       TIME_EFFECT base = (TIME_EFFECT)plev / 2;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               TIME_EFFECT v = randint1(base) + base;
-                               set_fast(caster_ptr, v, FALSE);
-                               set_oppose_acid(caster_ptr, v, FALSE);
-                               set_oppose_elec(caster_ptr, v, FALSE);
-                               set_oppose_fire(caster_ptr, v, FALSE);
-                               set_oppose_cold(caster_ptr, v, FALSE);
-                               set_oppose_pois(caster_ptr, v, FALSE);
-                               set_ultimate_res(caster_ptr, v, FALSE);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("軽傷の治癒", "Cure Light Wounds");
+        if (desc)
+            return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = 10;
+            if (info)
+                return info_heal(dice, sides, 0);
+            if (cast)
+                (void)cure_light_wounds(caster_ptr, dice, sides);
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("祝福", "Bless");
+        if (desc)
+            return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
+        {
+            int base = 12;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_blessed(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("軽傷", "Cause Light Wounds");
+        if (desc)
+            return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 4;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("光の召喚", "Call Light");
+        if (desc)
+            return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = plev / 2;
+            POSITION rad = plev / 10 + 1;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                lite_area(caster_ptr, damroll(dice, sides), rad);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("罠 & 隠し扉感知", "Detect Doors & Traps");
+        if (desc)
+            return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_traps(caster_ptr, rad, TRUE);
+                detect_doors(caster_ptr, rad);
+                detect_stairs(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("重傷の治癒", "Cure Medium Wounds");
+        if (desc)
+            return _("怪我と体力を中程度回復させる。", "Heals cuts and HP more.");
+        {
+            DICE_NUMBER dice = 4;
+            DICE_SID sides = 10;
+
+            if (info)
+                return info_heal(dice, sides, 0);
+            if (cast)
+                (void)cure_serious_wounds(caster_ptr, dice, sides);
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("解毒", "Cure Poison");
+        if (desc)
+            return _("体内の毒を取り除く。", "Cures yourself of any poisons.");
+        {
+            if (cast) {
+                set_poisoned(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("空腹充足", "Satisfy Hunger");
+        if (desc)
+            return _("満腹にする。", "Satisfies hunger.");
+        {
+            if (cast) {
+                set_food(caster_ptr, PY_FOOD_MAX - 1);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("解呪", "Remove Curse");
+        if (desc)
+            return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
+        {
+            if (cast)
+                (void)remove_curse(caster_ptr);
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("重傷", "Cause Medium Wounds");
+        if (desc)
+            return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
+        {
+            DICE_SID sides = 8 + (plev - 5) / 4;
+            DICE_NUMBER dice = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("致命傷の治癒", "Cure Critical Wounds");
+        if (desc)
+            return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals HP greatly. Also cures cuts and being stunned.");
+        {
+            DICE_NUMBER dice = 8;
+            DICE_SID sides = 10;
+
+            if (info)
+                return info_heal(dice, sides, 0);
+            if (cast)
+                (void)cure_critical_wounds(caster_ptr, damroll(dice, sides));
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("耐熱耐寒", "Resist Heat and Cold");
+        if (desc)
+            return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to fire and cold. These resistances can be added to those from equipment for more powerful resistances.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("周辺感知", "Sense Surroundings");
+        if (desc)
+            return _("周辺の地形を感知する。", "Maps nearby area.");
+
+        {
+            POSITION rad = DETECT_RAD_MAP;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                map_area(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("パニック・アンデッド", "Turn Undead");
+        if (desc)
+            return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
+
+        {
+            if (cast) {
+                turn_undead(caster_ptr);
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("体力回復", "Healing");
+        if (desc)
+            return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Is very powerful healing magic. Also completely cures cuts and being stunned.");
+
+        {
+            int heal = 300;
+            if (info)
+                return info_heal(0, 0, heal);
+            if (cast)
+                (void)cure_critical_wounds(caster_ptr, heal);
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("結界の紋章", "Glyph of Warding");
+        if (desc)
+            return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
+                "Sets a glyph on the floor beneath you. If you are on a glyph, monsters cannot attack you but can try to break the glyph.");
+
+        {
+            if (cast) {
+                warding_glyph(caster_ptr);
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("*解呪*", "Dispel Curse");
+        if (desc)
+            return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
+        {
+            if (cast)
+                (void)remove_all_curse(caster_ptr);
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("鑑識", "Perception");
+        if (desc)
+            return _("アイテムを識別する。", "Identifies an item.");
+
+        {
+            if (cast) {
+                if (!ident_spell(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("アンデッド退散", "Dispel Undead");
+        if (desc)
+            return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
+
+        {
+            DICE_NUMBER dice = 1;
+            DICE_SID sides = plev * 5;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                dispel_undead(caster_ptr, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("凪の刻", "Day of the Dove");
+        if (desc)
+            return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
+
+        {
+            int power = plev * 2;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                charm_monsters(caster_ptr, power);
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("致命傷", "Cause Critical Wounds");
+        if (desc)
+            return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
+
+        {
+            DICE_NUMBER dice = 5 + (plev - 5) / 3;
+            DICE_SID sides = 15;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("帰還の詔", "Word of Recall");
+        if (desc)
+            return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
+                "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
+
+        {
+            int base = 15;
+            DICE_SID sides = 20;
+
+            if (info)
+                return info_delay(base, sides);
+
+            if (cast) {
+                if (!recall_player(caster_ptr, randint0(21) + 15))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("真実の祭壇", "Alter Reality");
+        if (desc)
+            return _("現在の階を再構成する。", "Recreates current dungeon level.");
+
+        {
+            int base = 15;
+            DICE_SID sides = 20;
+
+            if (info)
+                return info_delay(base, sides);
+
+            if (cast) {
+                reserve_alter_reality(caster_ptr);
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("真・結界", "Warding True");
+        if (desc)
+            return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
+                "Creates glyphs in all adjacent squares and under you.");
+
+        {
+            POSITION rad = 1;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                warding_glyph(caster_ptr);
+                glyph_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("不毛化", "Sterilization");
+        if (desc)
+            return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
+
+        {
+            if (cast) {
+                caster_ptr->current_floor_ptr->num_repro += MAX_REPRO;
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("全感知", "Detection");
+        if (desc)
+            return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
+                "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_all(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("アンデッド消滅", "Annihilate Undead");
+        if (desc)
+            return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
+                "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
+
+        {
+            int power = plev + 50;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                mass_genocide_undead(caster_ptr, power, TRUE);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("千里眼", "Clairvoyance");
+        if (desc)
+            return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
+                "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
+
+        {
+            if (cast) {
+                wiz_lite(caster_ptr, FALSE);
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("全復活", "Restoration");
+        if (desc)
+            return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
+
+        {
+            if (cast) {
+                (void)restore_all_status(caster_ptr);
+                restore_level(caster_ptr);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("*体力回復*", "Healing True");
+        if (desc)
+            return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "Is the greatest healing magic. Heals all HP, cuts and being stunned.");
+
+        {
+            int heal = 2000;
+            if (info)
+                return info_heal(0, 0, heal);
+            if (cast)
+                (void)cure_critical_wounds(caster_ptr, heal);
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("聖なるビジョン", "Holy Vision");
+        if (desc)
+            return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
+
+        {
+            if (cast) {
+                if (!identify_fully(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("究極の耐性", "Ultimate Resistance");
+        if (desc)
+            return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
+
+        {
+            TIME_EFFECT base = (TIME_EFFECT)plev / 2;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                TIME_EFFECT v = randint1(base) + base;
+                set_fast(caster_ptr, v, FALSE);
+                set_oppose_acid(caster_ptr, v, FALSE);
+                set_oppose_elec(caster_ptr, v, FALSE);
+                set_oppose_fire(caster_ptr, v, FALSE);
+                set_oppose_cold(caster_ptr, v, FALSE);
+                set_oppose_pois(caster_ptr, v, FALSE);
+                set_ultimate_res(caster_ptr, v, FALSE);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index 0323d9f..3cef96e 100644 (file)
@@ -4,7 +4,6 @@
 #include "effect/effect-characteristics.h"
 #include "effect/spells-effect-util.h"
 #include "floor/floor-object.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "object/object-generator.h"
 #include "spell-kind/spells-perception.h"
 #include "spell-kind/spells-sight.h"
 #include "spell/process-effect.h"
+#include "spell/spell-types.h"
 #include "spell/spells-diceroll.h"
 #include "spell/spells-object.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
-#include "spell/spell-types.h"
 #include "status/bad-status-setter.h"
 #include "status/buff-setter.h"
 #include "status/element-resistance.h"
 #include "sv-definition/sv-food-types.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief 自然領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 自然領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_nature_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("モンスター感知", "Detect Creatures");
-               if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_normal(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("稲妻", "Lightning");
-               if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
-                       DICE_SID sides = 4;
-                       POSITION range = plev / 6 + 2;
-
-                       if (info) return format("%s%dd%d %s%d", KWD_DAM, dice, sides, KWD_RANGE, range);
-
-                       if (cast)
-                       {
-                               project_length = range;
-
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_beam(caster_ptr, GF_ELEC, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("罠と扉感知", "Detect Doors and Traps");
-               if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_traps(caster_ptr, rad, TRUE);
-                               detect_doors(caster_ptr, rad);
-                               detect_stairs(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("食糧生成", "Produce Food");
-               if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
-
-               {
-                       if (cast)
-                       {
-                               object_type forge, *q_ptr = &forge;
-                               msg_print(_("食料を生成した。", "A food ration is produced."));
-
-                               /* Create the food ration */
-                               object_prep(caster_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
-
-                               /* Drop the object from heaven */
-                               (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("日の光", "Daylight");
-               if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
-
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = plev / 2;
-                       POSITION rad = (plev / 10) + 1;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               lite_area(caster_ptr, damroll(dice, sides), rad);
-
-                               if ((is_specific_player_race(caster_ptr, RACE_VAMPIRE) || (caster_ptr->mimic_form == MIMIC_VAMPIRE)) && !caster_ptr->resist_lite)
-                               {
-                                       msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
-                                       take_hit(caster_ptr, DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
-                               }
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("動物習し", "Animal Taming");
-               if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               charm_animal(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("環境への耐性", "Resist Environment");
-               if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to fire, cold and electricity for a while. These resistances can be added to those from equipment for more powerful resistances.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("傷と毒治療", "Cure Wounds & Poison");
-               if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cuts and poisons. Heals HP a little.");
-
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_heal(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               hp_player(caster_ptr, damroll(dice, sides));
-                               set_cut(caster_ptr,0);
-                               set_poisoned(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("岩石溶解", "Stone to Mud");
-               if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
-
-               {
-                       DICE_NUMBER dice = 1;
-                       DICE_SID sides = 30;
-                       int base = 20;
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               wall_to_mud(caster_ptr, dir, 20 + randint1(30));
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("アイス・ボルト", "Frost Bolt");
-               if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
-
-               {
-                       DICE_NUMBER dice = 3 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_COLD, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("自然の覚醒", "Nature Awareness");
-               if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
-                       "Maps nearby area. Detects all monsters, traps, doors and stairs.");
-
-               {
-                       int rad1 = DETECT_RAD_MAP;
-                       int rad2 = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(MAX(rad1, rad2));
-
-                       if (cast)
-                       {
-                               map_area(caster_ptr, rad1);
-                               detect_traps(caster_ptr, rad2, TRUE);
-                               detect_doors(caster_ptr, rad2);
-                               detect_stairs(caster_ptr, rad2);
-                               detect_monsters_normal(caster_ptr, rad2);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("ファイア・ボルト", "Fire Bolt");
-               if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
-
-               {
-                       DICE_NUMBER dice = 5 + (plev - 5) / 4;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_FIRE, dir, damroll(dice, sides));
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("太陽光線", "Ray of Sunlight");
-               if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages light-sensitive monsters.");
-
-               {
-                       DICE_NUMBER dice = 6;
-                       DICE_SID sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
-                               lite_line(caster_ptr, dir, damroll(6, 8));
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("足かせ", "Entangle");
-               if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
-               {
-                       int power = plev;
-                       if (info) return info_power(power);
-                       if (cast) slow_monsters(caster_ptr, plev);
-               }
-               break;
-
-       case 14:
-               if (name) return _("動物召喚", "Summon Animal");
-               if (desc) return _("動物を1体召喚する。", "Summons an animal.");
-
-               {
-                       if (cast)
-                       {
-                               if (!(summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
-                               {
-                                       msg_print(_("動物は現れなかった。", "No animals arrive."));
-                               }
-                               break;
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("薬草治療", "Herbal Healing");
-               if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. Completely cures cuts, poisons and being stunned.");
-               {
-                       int heal = 500;
-                       if (info) return info_heal(0, 0, heal);
-                       if (cast) (void)cure_critical_wounds(caster_ptr, heal);
-               }
-               break;
-
-       case 16:
-               if (name) return _("階段生成", "Stair Building");
-               if (desc) return _("自分のいる位置に階段を作る。", "Creates a staircase which goes down or up.");
-
-               {
-                       if (cast)
-                       {
-                               stair_creation(caster_ptr);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("肌石化", "Stone Skin");
-               if (desc) return _("一定時間、ACを上昇させる。", "Gives a bonus to AC for a while.");
-
-               {
-                       int base = 20;
-                       DICE_SID sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_shield(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("真・耐性", "Resistance True");
-               if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
-                       "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to those from equipment for more powerful resistances.");
-
-               {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
-                               set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("森林創造", "Forest Creation");
-               if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
-
-               {
-                       if (cast)
-                       {
-                               tree_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("動物友和", "Animal Friendship");
-               if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
-
-               {
-                       int power = plev * 2;
-                       if (info) return info_power(power);
-                       if (cast) charm_animals(caster_ptr, power);
-               }
-               break;
-
-       case 21:
-               if (name) return _("試金石", "Stone Tell");
-               if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("石の壁", "Wall of Stone");
-               if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
-
-               {
-                       if (cast)
-                       {
-                               wall_stone(caster_ptr);
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("腐食防止", "Protect from Corrosion");
-               if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes a piece of equipment acid-proof.");
-
-               {
-                       if (cast)
-                       {
-                               if (!rustproof(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("地震", "Earthquake");
-               if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
-                       "Shakes dungeon structure, and results in random swapping of floors and walls.");
-
-               {
-                       POSITION rad = 10;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, rad, 0);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("カマイタチ", "Whirlwind");
-               if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
-               if (cast) massacre(caster_ptr);
-               break;
-
-       case 26:
-               if (name) return _("ブリザード", "Blizzard");
-               if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
-
-               {
-                       HIT_POINT dam = 70 + plev * 3 / 2;
-                       POSITION rad = plev / 12 + 1;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_ball(caster_ptr, GF_COLD, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("稲妻嵐", "Lightning Storm");
-               if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
-
-               {
-                       HIT_POINT dam = 90 + plev * 3 / 2;
-                       POSITION rad = plev / 12 + 1;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball(caster_ptr, GF_ELEC, dir, dam, rad);
-                               break;
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("渦潮", "Whirlpool");
-               if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
-
-               {
-                       HIT_POINT dam = 100 + plev * 3 / 2;
-                       POSITION rad = plev / 12 + 1;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-                               fire_ball(caster_ptr, GF_WATER, dir, dam, rad);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("陽光召喚", "Call Sunlight");
-               if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
-                       "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
-
-               {
-                       HIT_POINT dam = 150;
-                       POSITION rad = 8;
-
-                       if (info) return info_damage(0, 0, dam / 2);
-
-                       if (cast)
-                       {
-                               fire_ball(caster_ptr, GF_LITE, 0, dam, rad);
-                               chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
-                               chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
-                               wiz_lite(caster_ptr, FALSE);
-
-                               if ((is_specific_player_race(caster_ptr, RACE_VAMPIRE) || (caster_ptr->mimic_form == MIMIC_VAMPIRE)) && !caster_ptr->resist_lite)
-                               {
-                                       msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
-                                       take_hit(caster_ptr, DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
-                               }
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("精霊の刃", "Elemental Branding");
-               if (desc) return _("武器に炎か冷気の属性をつける。", "Brands current weapon with fire or frost.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, randint0(2));
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("自然の脅威", "Nature's Wrath");
-               if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
-                       "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
-
-               {
-                       int d_dam = 4 * plev;
-                       int b_dam = (100 + plev) * 2;
-                       POSITION b_rad = 1 + plev / 12;
-                       POSITION q_rad = 20 + plev / 2;
-
-                       if (info) return format("%s%d+%d", KWD_DAM, d_dam, b_dam / 2);
-
-                       if (cast)
-                       {
-                               dispel_monsters(caster_ptr, d_dam);
-                               earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, q_rad, 0);
-                               project(caster_ptr, 0, b_rad, caster_ptr->y, caster_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("モンスター感知", "Detect Creatures");
+        if (desc)
+            return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_normal(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("稲妻", "Lightning");
+        if (desc)
+            return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 1) / 5;
+            DICE_SID sides = 4;
+            POSITION range = plev / 6 + 2;
+
+            if (info)
+                return format("%s%dd%d %s%d", KWD_DAM, dice, sides, KWD_RANGE, range);
+
+            if (cast) {
+                project_length = range;
+
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_beam(caster_ptr, GF_ELEC, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("罠と扉感知", "Detect Doors and Traps");
+        if (desc)
+            return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_traps(caster_ptr, rad, TRUE);
+                detect_doors(caster_ptr, rad);
+                detect_stairs(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("食糧生成", "Produce Food");
+        if (desc)
+            return _("食料を一つ作り出す。", "Produces a Ration of Food.");
+
+        {
+            if (cast) {
+                object_type forge, *q_ptr = &forge;
+                msg_print(_("食料を生成した。", "A food ration is produced."));
+
+                /* Create the food ration */
+                object_prep(caster_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+
+                /* Drop the object from heaven */
+                (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("日の光", "Daylight");
+        if (desc)
+            return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
+
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = plev / 2;
+            POSITION rad = (plev / 10) + 1;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                lite_area(caster_ptr, damroll(dice, sides), rad);
+
+                if ((is_specific_player_race(caster_ptr, RACE_VAMPIRE) || (caster_ptr->mimic_form == MIMIC_VAMPIRE)) && !caster_ptr->resist_lite) {
+                    msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
+                    take_hit(caster_ptr, DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
+                }
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("動物習し", "Animal Taming");
+        if (desc)
+            return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                charm_animal(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("環境への耐性", "Resist Environment");
+        if (desc)
+            return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to fire, cold and electricity for a while. These resistances can be added to those from equipment for more powerful "
+                "resistances.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("傷と毒治療", "Cure Wounds & Poison");
+        if (desc)
+            return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cuts and poisons. Heals HP a little.");
+
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_heal(dice, sides, 0);
+
+            if (cast) {
+                hp_player(caster_ptr, damroll(dice, sides));
+                set_cut(caster_ptr, 0);
+                set_poisoned(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("岩石溶解", "Stone to Mud");
+        if (desc)
+            return _("壁を溶かして床にする。", "Turns one rock square to mud.");
+
+        {
+            DICE_NUMBER dice = 1;
+            DICE_SID sides = 30;
+            int base = 20;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                wall_to_mud(caster_ptr, dir, 20 + randint1(30));
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("アイス・ボルト", "Frost Bolt");
+        if (desc)
+            return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
+
+        {
+            DICE_NUMBER dice = 3 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_COLD, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("自然の覚醒", "Nature Awareness");
+        if (desc)
+            return _(
+                "周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。", "Maps nearby area. Detects all monsters, traps, doors and stairs.");
+
+        {
+            int rad1 = DETECT_RAD_MAP;
+            int rad2 = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(MAX(rad1, rad2));
+
+            if (cast) {
+                map_area(caster_ptr, rad1);
+                detect_traps(caster_ptr, rad2, TRUE);
+                detect_doors(caster_ptr, rad2);
+                detect_stairs(caster_ptr, rad2);
+                detect_monsters_normal(caster_ptr, rad2);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("ファイア・ボルト", "Fire Bolt");
+        if (desc)
+            return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
+
+        {
+            DICE_NUMBER dice = 5 + (plev - 5) / 4;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_FIRE, dir, damroll(dice, sides));
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("太陽光線", "Ray of Sunlight");
+        if (desc)
+            return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages light-sensitive monsters.");
+
+        {
+            DICE_NUMBER dice = 6;
+            DICE_SID sides = 8;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
+                lite_line(caster_ptr, dir, damroll(6, 8));
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("足かせ", "Entangle");
+        if (desc)
+            return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
+        {
+            int power = plev;
+            if (info)
+                return info_power(power);
+            if (cast)
+                slow_monsters(caster_ptr, plev);
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("動物召喚", "Summon Animal");
+        if (desc)
+            return _("動物を1体召喚する。", "Summons an animal.");
+
+        {
+            if (cast) {
+                if (!(summon_specific(caster_ptr, -1, caster_ptr->y, caster_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET)))) {
+                    msg_print(_("動物は現れなかった。", "No animals arrive."));
+                }
+                break;
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("薬草治療", "Herbal Healing");
+        if (desc)
+            return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. Completely cures cuts, poisons and being stunned.");
+        {
+            int heal = 500;
+            if (info)
+                return info_heal(0, 0, heal);
+            if (cast)
+                (void)cure_critical_wounds(caster_ptr, heal);
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("階段生成", "Stair Building");
+        if (desc)
+            return _("自分のいる位置に階段を作る。", "Creates a staircase which goes down or up.");
+
+        {
+            if (cast) {
+                stair_creation(caster_ptr);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("肌石化", "Stone Skin");
+        if (desc)
+            return _("一定時間、ACを上昇させる。", "Gives a bonus to AC for a while.");
+
+        {
+            int base = 20;
+            DICE_SID sides = 30;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_shield(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("真・耐性", "Resistance True");
+        if (desc)
+            return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
+                "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to those from equipment for more "
+                "powerful resistances.");
+
+        {
+            int base = 20;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_oppose_acid(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_elec(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
+                set_oppose_pois(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("森林創造", "Forest Creation");
+        if (desc)
+            return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
+
+        {
+            if (cast) {
+                tree_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("動物友和", "Animal Friendship");
+        if (desc)
+            return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
+
+        {
+            int power = plev * 2;
+            if (info)
+                return info_power(power);
+            if (cast)
+                charm_animals(caster_ptr, power);
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("試金石", "Stone Tell");
+        if (desc)
+            return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
+
+        {
+            if (cast) {
+                if (!identify_fully(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("石の壁", "Wall of Stone");
+        if (desc)
+            return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
+
+        {
+            if (cast) {
+                wall_stone(caster_ptr);
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("腐食防止", "Protect from Corrosion");
+        if (desc)
+            return _("アイテムを酸で傷つかないよう加工する。", "Makes a piece of equipment acid-proof.");
+
+        {
+            if (cast) {
+                if (!rustproof(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("地震", "Earthquake");
+        if (desc)
+            return _(
+                "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
+
+        {
+            POSITION rad = 10;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, rad, 0);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("カマイタチ", "Whirlwind");
+        if (desc)
+            return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
+        if (cast)
+            massacre(caster_ptr);
+        break;
+
+    case 26:
+        if (name)
+            return _("ブリザード", "Blizzard");
+        if (desc)
+            return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
+
+        {
+            HIT_POINT dam = 70 + plev * 3 / 2;
+            POSITION rad = plev / 12 + 1;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_ball(caster_ptr, GF_COLD, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("稲妻嵐", "Lightning Storm");
+        if (desc)
+            return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
+
+        {
+            HIT_POINT dam = 90 + plev * 3 / 2;
+            POSITION rad = plev / 12 + 1;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball(caster_ptr, GF_ELEC, dir, dam, rad);
+                break;
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("渦潮", "Whirlpool");
+        if (desc)
+            return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
+
+        {
+            HIT_POINT dam = 100 + plev * 3 / 2;
+            POSITION rad = plev / 12 + 1;
+
+            if (info)
+                return info_damage(0, 0, dam);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+                fire_ball(caster_ptr, GF_WATER, dir, dam, rad);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("陽光召喚", "Call Sunlight");
+        if (desc)
+            return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
+                "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
+
+        {
+            HIT_POINT dam = 150;
+            POSITION rad = 8;
+
+            if (info)
+                return info_damage(0, 0, dam / 2);
+
+            if (cast) {
+                fire_ball(caster_ptr, GF_LITE, 0, dam, rad);
+                chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
+                chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
+                wiz_lite(caster_ptr, FALSE);
+
+                if ((is_specific_player_race(caster_ptr, RACE_VAMPIRE) || (caster_ptr->mimic_form == MIMIC_VAMPIRE)) && !caster_ptr->resist_lite) {
+                    msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
+                    take_hit(caster_ptr, DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
+                }
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("精霊の刃", "Elemental Branding");
+        if (desc)
+            return _("武器に炎か冷気の属性をつける。", "Brands current weapon with fire or frost.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, randint0(2));
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("自然の脅威", "Nature's Wrath");
+        if (desc)
+            return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
+                "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
+
+        {
+            int d_dam = 4 * plev;
+            int b_dam = (100 + plev) * 2;
+            POSITION b_rad = 1 + plev / 12;
+            POSITION q_rad = 20 + plev / 2;
+
+            if (info)
+                return format("%s%d+%d", KWD_DAM, d_dam, b_dam / 2);
+
+            if (cast) {
+                dispel_monsters(caster_ptr, d_dam);
+                earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, q_rad, 0);
+                project(caster_ptr, 0, b_rad, caster_ptr->y, caster_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
-
index a9c9344..2ef98d7 100644 (file)
@@ -4,7 +4,6 @@
 #include "core/player-update-types.h"
 #include "core/window-redrawer.h"
 #include "effect/effect-characteristics.h"
-#include "io/targeting.h"
 #include "player/attack-defense-types.h"
 #include "player/player-class.h"
 #include "realm/realm-song-numbers.h"
@@ -23,6 +22,7 @@
 #include "status/action-setter.h"
 #include "status/bad-status-setter.h"
 #include "status/experience.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 39db993..0395a7c 100644 (file)
@@ -1,7 +1,6 @@
 #include "realm/realm-sorcery.h"
 #include "cmd-action/cmd-spell.h"
 #include "core/asking-player.h"
-#include "io/targeting.h"
 #include "player/avatar.h"
 #include "player/selfinfo.h"
 #include "spell-kind/magic-item-recharger.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell-kind/spells-world.h"
 #include "spell-realm/spells-sorcery.h"
-#include "spell/spells-status.h"
 #include "spell/spell-types.h"
+#include "spell/spells-status.h"
 #include "status/body-improvement.h"
 #include "status/buff-setter.h"
 #include "status/sight-setter.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief 仙術領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief 仙術領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_sorcery_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("モンスター感知", "Detect Monsters");
-               if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_monsters_normal(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("ショート・テレポート", "Phase Door");
-               if (desc) return _("近距離のテレポートをする。", "Teleports you a short distance.");
-
-               {
-                       POSITION range = 10;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("罠と扉感知", "Detect Doors and Traps");
-               if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_traps(caster_ptr, rad, TRUE);
-                               detect_doors(caster_ptr, rad);
-                               detect_stairs(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("ライト・エリア", "Light Area");
-               if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
-
-               {
-                       DICE_NUMBER dice = 2;
-                       DICE_SID sides = plev / 2;
-                       POSITION rad = plev / 10 + 1;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cast)
-                       {
-                               lite_area(caster_ptr, damroll(dice, sides), rad);
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("パニック・モンスター", "Confuse Monster");
-               if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
-
-               {
-                       PLAYER_LEVEL power = (plev * 3) / 2;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               confuse_monster(caster_ptr, dir, power);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("テレポート", "Teleport");
-               if (desc) return _("遠距離のテレポートをする。", "Teleports you a long distance.");
-
-               {
-                       POSITION range = plev * 5;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("スリープ・モンスター", "Sleep Monster");
-               if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to put a monster to sleep.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               sleep_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("魔力充填", "Recharging");
-               if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
-
-               {
-                       int power = plev * 4;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!recharge(caster_ptr, power)) return NULL;
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("魔法の地図", "Magic Mapping");
-               if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
-
-               {
-                       POSITION rad = DETECT_RAD_MAP;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               map_area(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("鑑定", "Identify");
-               if (desc) return _("アイテムを識別する。", "Identifies an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("スロウ・モンスター", "Slow Monster");
-               if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               slow_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("周辺スリープ", "Mass Sleep");
-               if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put all monsters in sight to sleep.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               sleep_monsters(caster_ptr, plev);
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("テレポート・モンスター", "Teleport Away");
-               if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("スピード", "Haste Self");
-               if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
-
-               {
-                       int base = plev;
-                       DICE_SID sides = 20 + plev;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_fast(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("真・感知", "Detection True");
-               if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
-                       "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_all(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("真・鑑定", "Identify True");
-               if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("物体と財宝感知", "Detect items and Treasure");
-               if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_objects_normal(caster_ptr, rad);
-                               detect_treasure(caster_ptr, rad);
-                               detect_objects_gold(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("チャーム・モンスター", "Charm Monster");
-               if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               charm_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("精神感知", "Sense Minds");
-               if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
-
-               {
-                       int base = 25;
-                       DICE_SID sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("街移動", "Teleport to town");
-               if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Instantly teleports you to a town which you choose. Can only be used outdoors.");
-
-               {
-                       if (cast)
-                       {
-                               if (!tele_town(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("自己分析", "Self Knowledge");
-               if (desc) return _("現在の自分の状態を完全に知る。",
-                       "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
-
-               {
-                       if (cast)
-                       {
-                               self_knowledge(caster_ptr);
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("テレポート・レベル", "Teleport Level");
-               if (desc) return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
-                               teleport_level(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("帰還の呪文", "Word of Recall");
-               if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
-                       "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
-
-               {
-                       int base = 15;
-                       DICE_SID sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
-                       if (cast)
-                       {
-                               if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
-                       }
-               }
-               break;
-
-       case 23:
-               if (name) return _("次元の扉", "Dimension Door");
-               if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
-
-               {
-                       POSITION range = plev / 2 + 10;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
-                               if (!dimension_door(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("調査", "Probing");
-               if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
-                       "Probes all monsters' alignment, HP, speed and their true character.");
-
-               {
-                       if (cast)
-                       {
-                               probing(caster_ptr);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("爆発のルーン", "Explosive Rune");
-               if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
-                       "Sets a glyph under you. The glyph will explode when a monster moves on it.");
-
-               {
-                       DICE_NUMBER dice = 7;
-                       DICE_SID sides = 7;
-                       int base = plev;
-
-                       if (info) return info_damage(dice, sides, base);
-
-                       if (cast)
-                       {
-                               explosive_rune(caster_ptr, caster_ptr->y, caster_ptr->x);
-                       }
-               }
-               break;
-
-       case 26:
-               if (name) return _("念動力", "Telekinesis");
-               if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
-
-               {
-                       WEIGHT weight = plev * 15;
-
-                       if (info) return info_weight(weight);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fetch_item(caster_ptr, dir, weight, FALSE);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("千里眼", "Clairvoyance");
-               if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
-                       "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
-
-               {
-                       int base = 25;
-                       DICE_SID sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
-                               chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
-
-                               wiz_lite(caster_ptr, FALSE);
-
-                               if (!caster_ptr->telepathy)
-                               {
-                                       set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
-                               }
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("魅了の視線", "Charm monsters");
-               if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
-
-               {
-                       int power = plev * 2;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               charm_monsters(caster_ptr, power);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("錬金術", "Alchemy");
-               if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
-
-               {
-                       if (cast)
-                       {
-                               if (!alchemy(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("怪物追放", "Banishment");
-               if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
-
-               {
-                       int power = plev * 4;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               banish_monsters(caster_ptr, power);
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("無傷の球", "Globe of Invulnerability");
-               if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
-                       "Generates a barrier which completely protects you from almost all damage. Takes a few of your turns when the barrier breaks or duration time is exceeded.");
-
-               {
-                       int base = 4;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_invuln(caster_ptr, randint1(base) + base, FALSE);
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("モンスター感知", "Detect Monsters");
+        if (desc)
+            return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_monsters_normal(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("ショート・テレポート", "Phase Door");
+        if (desc)
+            return _("近距離のテレポートをする。", "Teleports you a short distance.");
+
+        {
+            POSITION range = 10;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("罠と扉感知", "Detect Doors and Traps");
+        if (desc)
+            return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_traps(caster_ptr, rad, TRUE);
+                detect_doors(caster_ptr, rad);
+                detect_stairs(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("ライト・エリア", "Light Area");
+        if (desc)
+            return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
+
+        {
+            DICE_NUMBER dice = 2;
+            DICE_SID sides = plev / 2;
+            POSITION rad = plev / 10 + 1;
+
+            if (info)
+                return info_damage(dice, sides, 0);
+
+            if (cast) {
+                lite_area(caster_ptr, damroll(dice, sides), rad);
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("パニック・モンスター", "Confuse Monster");
+        if (desc)
+            return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
+
+        {
+            PLAYER_LEVEL power = (plev * 3) / 2;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                confuse_monster(caster_ptr, dir, power);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("テレポート", "Teleport");
+        if (desc)
+            return _("遠距離のテレポートをする。", "Teleports you a long distance.");
+
+        {
+            POSITION range = plev * 5;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("スリープ・モンスター", "Sleep Monster");
+        if (desc)
+            return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to put a monster to sleep.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                sleep_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("魔力充填", "Recharging");
+        if (desc)
+            return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
+
+        {
+            int power = plev * 4;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!recharge(caster_ptr, power))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("魔法の地図", "Magic Mapping");
+        if (desc)
+            return _("周辺の地形を感知する。", "Maps nearby area.");
+
+        {
+            POSITION rad = DETECT_RAD_MAP;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                map_area(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("鑑定", "Identify");
+        if (desc)
+            return _("アイテムを識別する。", "Identifies an item.");
+
+        {
+            if (cast) {
+                if (!ident_spell(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("スロウ・モンスター", "Slow Monster");
+        if (desc)
+            return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                slow_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("周辺スリープ", "Mass Sleep");
+        if (desc)
+            return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put all monsters in sight to sleep.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                sleep_monsters(caster_ptr, plev);
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("テレポート・モンスター", "Teleport Away");
+        if (desc)
+            return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("スピード", "Haste Self");
+        if (desc)
+            return _("一定時間、加速する。", "Hastes you for a while.");
+
+        {
+            int base = plev;
+            DICE_SID sides = 20 + plev;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_fast(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("真・感知", "Detection True");
+        if (desc)
+            return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
+                "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_all(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("真・鑑定", "Identify True");
+        if (desc)
+            return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
+
+        {
+            if (cast) {
+                if (!identify_fully(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("物体と財宝感知", "Detect items and Treasure");
+        if (desc)
+            return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_objects_normal(caster_ptr, rad);
+                detect_treasure(caster_ptr, rad);
+                detect_objects_gold(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("チャーム・モンスター", "Charm Monster");
+        if (desc)
+            return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                charm_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("精神感知", "Sense Minds");
+        if (desc)
+            return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
+
+        {
+            int base = 25;
+            DICE_SID sides = 30;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("街移動", "Teleport to town");
+        if (desc)
+            return _("街へ移動する。地上にいるときしか使えない。", "Instantly teleports you to a town which you choose. Can only be used outdoors.");
+
+        {
+            if (cast) {
+                if (!tele_town(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("自己分析", "Self Knowledge");
+        if (desc)
+            return _("現在の自分の状態を完全に知る。",
+                "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
+
+        {
+            if (cast) {
+                self_knowledge(caster_ptr);
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("テレポート・レベル", "Teleport Level");
+        if (desc)
+            return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
+
+        {
+            if (cast) {
+                if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)")))
+                    return NULL;
+                teleport_level(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("帰還の呪文", "Word of Recall");
+        if (desc)
+            return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
+                "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
+
+        {
+            int base = 15;
+            DICE_SID sides = 20;
+
+            if (info)
+                return info_delay(base, sides);
+
+            if (cast) {
+                if (!recall_player(caster_ptr, randint0(21) + 15))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 23:
+        if (name)
+            return _("次元の扉", "Dimension Door");
+        if (desc)
+            return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
+
+        {
+            POSITION range = plev / 2 + 10;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
+                if (!dimension_door(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("調査", "Probing");
+        if (desc)
+            return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。", "Probes all monsters' alignment, HP, speed and their true character.");
+
+        {
+            if (cast) {
+                probing(caster_ptr);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("爆発のルーン", "Explosive Rune");
+        if (desc)
+            return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
+                "Sets a glyph under you. The glyph will explode when a monster moves on it.");
+
+        {
+            DICE_NUMBER dice = 7;
+            DICE_SID sides = 7;
+            int base = plev;
+
+            if (info)
+                return info_damage(dice, sides, base);
+
+            if (cast) {
+                explosive_rune(caster_ptr, caster_ptr->y, caster_ptr->x);
+            }
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("念動力", "Telekinesis");
+        if (desc)
+            return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
+
+        {
+            WEIGHT weight = plev * 15;
+
+            if (info)
+                return info_weight(weight);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fetch_item(caster_ptr, dir, weight, FALSE);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("千里眼", "Clairvoyance");
+        if (desc)
+            return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
+                "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
+
+        {
+            int base = 25;
+            DICE_SID sides = 30;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
+                chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
+
+                wiz_lite(caster_ptr, FALSE);
+
+                if (!caster_ptr->telepathy) {
+                    set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
+                }
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("魅了の視線", "Charm monsters");
+        if (desc)
+            return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
+
+        {
+            int power = plev * 2;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                charm_monsters(caster_ptr, power);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("錬金術", "Alchemy");
+        if (desc)
+            return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
+
+        {
+            if (cast) {
+                if (!alchemy(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("怪物追放", "Banishment");
+        if (desc)
+            return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
+
+        {
+            int power = plev * 4;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                banish_monsters(caster_ptr, power);
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("無傷の球", "Globe of Invulnerability");
+        if (desc)
+            return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
+                "Generates a barrier which completely protects you from almost all damage. Takes a few of your turns when the barrier breaks or duration time "
+                "is exceeded.");
+
+        {
+            int base = 4;
+
+            if (info)
+                return info_duration(base, base);
+
+            if (cast) {
+                set_invuln(caster_ptr, randint1(base) + base, FALSE);
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index 7337182..6491803 100644 (file)
@@ -3,7 +3,6 @@
 #include "core/asking-player.h"
 #include "effect/spells-effect-util.h"
 #include "game-option/input-options.h"
-#include "io/targeting.h"
 #include "monster-floor/place-monster-types.h"
 #include "mutation/mutation.h"
 #include "player/player-class.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
 #include "status/sight-setter.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief トランプ領域魔法の各処理を行う
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param spell 魔法ID
-* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
-*/
+ * @brief トランプ領域魔法の各処理を行う
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param spell 魔法ID
+ * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+ * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+ */
 concptr do_trump_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
 {
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
-       bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
-
-       DIRECTION dir;
-       PLAYER_LEVEL plev = caster_ptr->lev;
-
-       switch (spell)
-       {
-       case 0:
-               if (name) return _("ショート・テレポート", "Phase Door");
-               if (desc) return _("近距離のテレポートをする。", "Teleports you a short distance.");
-
-               {
-                       POSITION range = 10;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 1:
-               if (name) return _("蜘蛛のカード", "Trump Spiders");
-               if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 2:
-               if (name) return _("シャッフル", "Shuffle");
-               if (desc) return _("カードの占いをする。", "Causes random effects.");
-
-               {
-                       if (info) return KWD_RANDOM;
-
-                       if (cast)
-                       {
-                               cast_shuffle(caster_ptr);
-                       }
-               }
-               break;
-
-       case 3:
-               if (name) return _("フロア・リセット", "Reset Recall");
-               if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
-
-               {
-                       if (cast)
-                       {
-                               if (!reset_recall(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 4:
-               if (name) return _("テレポート", "Teleport");
-               if (desc) return _("遠距離のテレポートをする。", "Teleports you a long distance.");
-
-               {
-                       POSITION range = plev * 4;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
-                       }
-               }
-               break;
-
-       case 5:
-               if (name) return _("感知のカード", "Trump Spying");
-               if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
-
-               {
-                       int base = 25;
-                       DICE_SID sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
-                       {
-                               set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
-                       }
-               }
-               break;
-
-       case 6:
-               if (name) return _("テレポート・モンスター", "Teleport Away");
-               if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
-
-               {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
-                       }
-               }
-               break;
-
-       case 7:
-               if (name) return _("動物のカード", "Trump Animals");
-               if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
-
-               {
-                       if (cast || fail)
-                       {
-                               int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
-                               msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 8:
-               if (name) return _("移動のカード", "Trump Reach");
-               if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
-
-               {
-                       WEIGHT weight = plev * 15;
-
-                       if (info) return info_weight(weight);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(caster_ptr, &dir)) return NULL;
-
-                               fetch_item(caster_ptr, dir, weight, FALSE);
-                       }
-               }
-               break;
-
-       case 9:
-               if (name) return _("カミカゼのカード", "Trump Kamikaze");
-               if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
-
-               {
-                       if (cast || fail)
-                       {
-                               POSITION x, y;
-                               int type;
-
-                               if (cast)
-                               {
-                                       if (!target_set(caster_ptr, TARGET_KILL)) return NULL;
-                                       x = target_col;
-                                       y = target_row;
-                               }
-                               else
-                               {
-                                       /* Summons near player when failed */
-                                       x = caster_ptr->x;
-                                       y = caster_ptr->y;
-                               }
-
-                               if (caster_ptr->pclass == CLASS_BEASTMASTER)
-                                       type = SUMMON_KAMIKAZE_LIVING;
-                               else
-                                       type = SUMMON_KAMIKAZE;
-
-                               msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
-                               if (trump_summoning(caster_ptr, 2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 10:
-               if (name) return _("幻霊召喚", "Phantasmal Servant");
-               if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
-
-               {
-                       /* Phantasmal Servant is not summoned as enemy when failed */
-                       if (cast)
-                       {
-                               int summon_lev = plev * 2 / 3 + randint1(plev / 2);
-
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
-                               {
-                                       msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
-                               }
-                       }
-               }
-               break;
-
-       case 11:
-               if (name) return _("スピード・モンスター", "Haste Monster");
-               if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
-
-               {
-                       if (cast)
-                       {
-                               bool result;
-
-                               /* Temporary enable target_pet option */
-                               bool old_target_pet = target_pet;
-                               target_pet = TRUE;
-
-                               result = get_aim_dir(caster_ptr, &dir);
-
-                               /* Restore target_pet option */
-                               target_pet = old_target_pet;
-
-                               if (!result) return NULL;
-
-                               speed_monster(caster_ptr, dir, plev);
-                       }
-               }
-               break;
-
-       case 12:
-               if (name) return _("テレポート・レベル", "Teleport Level");
-               if (desc) return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
-
-               {
-                       if (cast)
-                       {
-                               if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
-                               teleport_level(caster_ptr, 0);
-                       }
-               }
-               break;
-
-       case 13:
-               if (name) return _("次元の扉", "Dimension Door");
-               if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
-
-               {
-                       POSITION range = plev / 2 + 10;
-
-                       if (info) return info_range(range);
-
-                       if (cast)
-                       {
-                               msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
-                               if (!dimension_door(caster_ptr)) return NULL;
-                       }
-               }
-               break;
-
-       case 14:
-               if (name) return _("帰還の呪文", "Word of Recall");
-               if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
-                       "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
-
-               {
-                       int base = 15;
-                       DICE_SID sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
-                       if (cast)
-                       {
-                               if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
-                       }
-               }
-               break;
-
-       case 15:
-               if (name) return _("怪物追放", "Banish");
-               if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
-
-               {
-                       int power = plev * 4;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               banish_monsters(caster_ptr, power);
-                       }
-               }
-               break;
-
-       case 16:
-               if (name) return _("位置交換のカード", "Swap Position");
-               if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
-
-               {
-                       if (cast)
-                       {
-                               bool result;
-
-                               /* HACK -- No range limit */
-                               project_length = -1;
-
-                               result = get_aim_dir(caster_ptr, &dir);
-
-                               /* Restore range to default */
-                               project_length = 0;
-
-                               if (!result) return NULL;
-
-                               teleport_swap(caster_ptr, dir);
-                       }
-               }
-               break;
-
-       case 17:
-               if (name) return _("アンデッドのカード", "Trump Undead");
-               if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_UNDEAD, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 18:
-               if (name) return _("爬虫類のカード", "Trump Reptile");
-               if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HYDRA, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 19:
-               if (name) return _("モンスターのカード", "Trump Monsters");
-               if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
-
-               {
-                       if (cast || fail)
-                       {
-                               int type;
-                               msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
-                               if (caster_ptr->pclass == CLASS_BEASTMASTER)
-                                       type = SUMMON_LIVING;
-                               else
-                                       type = 0;
-
-                               if (trump_summoning(caster_ptr, (1 + (plev - 15) / 10), !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
-                                       }
-                               }
-
-                       }
-               }
-               break;
-
-       case 20:
-               if (name) return _("ハウンドのカード", "Trump Hounds");
-               if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 21:
-               if (name) return _("トランプの刃", "Trump Branding");
-               if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
-
-               {
-                       if (cast)
-                       {
-                               brand_weapon(caster_ptr, 5);
-                       }
-               }
-               break;
-
-       case 22:
-               if (name) return _("人間トランプ", "Living Trump");
-               if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
-                       "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
-               if (cast) become_living_trump(caster_ptr);
-               break;
-
-       case 23:
-               if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
-               if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_CYBER, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 24:
-               if (name) return _("予見のカード", "Trump Divination");
-               if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
-                       "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
-
-               {
-                       POSITION rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               detect_all(caster_ptr, rad);
-                       }
-               }
-               break;
-
-       case 25:
-               if (name) return _("知識のカード", "Trump Lore");
-               if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
-
-               {
-                       if (cast)
-                       {
-                               if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
-                       }
-               }
-               break;
-
-       case 26:
-               if (name) return _("回復モンスター", "Heal Monster");
-               if (desc) return _("モンスター1体の体力を回復させる。", "Heals a monster.");
-
-               {
-                       int heal = plev * 10 + 200;
-
-                       if (info) return info_heal(0, 0, heal);
-
-                       if (cast)
-                       {
-                               bool result;
-
-                               /* Temporary enable target_pet option */
-                               bool old_target_pet = target_pet;
-                               target_pet = TRUE;
-
-                               result = get_aim_dir(caster_ptr, &dir);
-
-                               /* Restore target_pet option */
-                               target_pet = old_target_pet;
-
-                               if (!result) return NULL;
-
-                               heal_monster(caster_ptr, dir, heal);
-                       }
-               }
-               break;
-
-       case 27:
-               if (name) return _("ドラゴンのカード", "Trump Dragon");
-               if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DRAGON, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 28:
-               if (name) return _("隕石のカード", "Trump Meteor");
-               if (desc) return _("自分の周辺に隕石を落とす。", "Causes meteorites to fall down on nearby random locations.");
-
-               {
-                       HIT_POINT dam = plev * 2;
-                       POSITION rad = 2;
-
-                       if (info) return info_multi_damage(dam);
-
-                       if (cast)
-                       {
-                               cast_meteor(caster_ptr, dam, rad);
-                       }
-               }
-               break;
-
-       case 29:
-               if (name) return _("デーモンのカード", "Trump Demon");
-               if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DEMON, 0L))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 30:
-               if (name) return _("地獄のカード", "Trump Greater Undead");
-               if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
-
-               {
-                       if (cast || fail)
-                       {
-                               msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
-                               /* May allow unique depend on level and dice roll */
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-
-       case 31:
-               if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
-               if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
-
-               {
-                       if (cast)
-                       {
-                               int type;
-
-                               if (caster_ptr->pclass == CLASS_BEASTMASTER)
-                                       type = SUMMON_HI_DRAGON_LIVING;
-                               else
-                                       type = SUMMON_HI_DRAGON;
-
-                               msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
-                               /* May allow unique depend on level and dice roll */
-                               if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, PM_ALLOW_UNIQUE))
-                               {
-                                       if (fail)
-                                       {
-                                               msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
-                                       }
-                               }
-                       }
-               }
-               break;
-       }
-
-       return "";
+    bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+    bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+    bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+    bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+    bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
+
+    DIRECTION dir;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+
+    switch (spell) {
+    case 0:
+        if (name)
+            return _("ショート・テレポート", "Phase Door");
+        if (desc)
+            return _("近距離のテレポートをする。", "Teleports you a short distance.");
+
+        {
+            POSITION range = 10;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 1:
+        if (name)
+            return _("蜘蛛のカード", "Trump Spiders");
+        if (desc)
+            return _("蜘蛛を召喚する。", "Summons spiders.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP)) {
+                    if (fail) {
+                        msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 2:
+        if (name)
+            return _("シャッフル", "Shuffle");
+        if (desc)
+            return _("カードの占いをする。", "Causes random effects.");
+
+        {
+            if (info)
+                return KWD_RANDOM;
+
+            if (cast) {
+                cast_shuffle(caster_ptr);
+            }
+        }
+        break;
+
+    case 3:
+        if (name)
+            return _("フロア・リセット", "Reset Recall");
+        if (desc)
+            return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
+
+        {
+            if (cast) {
+                if (!reset_recall(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 4:
+        if (name)
+            return _("テレポート", "Teleport");
+        if (desc)
+            return _("遠距離のテレポートをする。", "Teleports you a long distance.");
+
+        {
+            POSITION range = plev * 4;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
+            }
+        }
+        break;
+
+    case 5:
+        if (name)
+            return _("感知のカード", "Trump Spying");
+        if (desc)
+            return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
+
+        {
+            int base = 25;
+            DICE_SID sides = 30;
+
+            if (info)
+                return info_duration(base, sides);
+
+            if (cast) {
+                set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
+            }
+        }
+        break;
+
+    case 6:
+        if (name)
+            return _("テレポート・モンスター", "Teleport Away");
+        if (desc)
+            return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
+
+        {
+            int power = plev;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
+            }
+        }
+        break;
+
+    case 7:
+        if (name)
+            return _("動物のカード", "Trump Animals");
+        if (desc)
+            return _("1体の動物を召喚する。", "Summons an animal.");
+
+        {
+            if (cast || fail) {
+                int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
+                msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 8:
+        if (name)
+            return _("移動のカード", "Trump Reach");
+        if (desc)
+            return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
+
+        {
+            WEIGHT weight = plev * 15;
+
+            if (info)
+                return info_weight(weight);
+
+            if (cast) {
+                if (!get_aim_dir(caster_ptr, &dir))
+                    return NULL;
+
+                fetch_item(caster_ptr, dir, weight, FALSE);
+            }
+        }
+        break;
+
+    case 9:
+        if (name)
+            return _("カミカゼのカード", "Trump Kamikaze");
+        if (desc)
+            return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
+
+        {
+            if (cast || fail) {
+                POSITION x, y;
+                int type;
+
+                if (cast) {
+                    if (!target_set(caster_ptr, TARGET_KILL))
+                        return NULL;
+                    x = target_col;
+                    y = target_row;
+                } else {
+                    /* Summons near player when failed */
+                    x = caster_ptr->x;
+                    y = caster_ptr->y;
+                }
+
+                if (caster_ptr->pclass == CLASS_BEASTMASTER)
+                    type = SUMMON_KAMIKAZE_LIVING;
+                else
+                    type = SUMMON_KAMIKAZE;
+
+                msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
+                if (trump_summoning(caster_ptr, 2 + randint0(plev / 7), !fail, y, x, 0, type, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 10:
+        if (name)
+            return _("幻霊召喚", "Phantasmal Servant");
+        if (desc)
+            return _("1体の幽霊を召喚する。", "Summons a ghost.");
+
+        {
+            /* Phantasmal Servant is not summoned as enemy when failed */
+            if (cast) {
+                int summon_lev = plev * 2 / 3 + randint1(plev / 2);
+
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L)) {
+                    msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
+                }
+            }
+        }
+        break;
+
+    case 11:
+        if (name)
+            return _("スピード・モンスター", "Haste Monster");
+        if (desc)
+            return _("モンスター1体を加速させる。", "Hastes a monster.");
+
+        {
+            if (cast) {
+                bool result;
+
+                /* Temporary enable target_pet option */
+                bool old_target_pet = target_pet;
+                target_pet = TRUE;
+
+                result = get_aim_dir(caster_ptr, &dir);
+
+                /* Restore target_pet option */
+                target_pet = old_target_pet;
+
+                if (!result)
+                    return NULL;
+
+                speed_monster(caster_ptr, dir, plev);
+            }
+        }
+        break;
+
+    case 12:
+        if (name)
+            return _("テレポート・レベル", "Teleport Level");
+        if (desc)
+            return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
+
+        {
+            if (cast) {
+                if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)")))
+                    return NULL;
+                teleport_level(caster_ptr, 0);
+            }
+        }
+        break;
+
+    case 13:
+        if (name)
+            return _("次元の扉", "Dimension Door");
+        if (desc)
+            return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
+
+        {
+            POSITION range = plev / 2 + 10;
+
+            if (info)
+                return info_range(range);
+
+            if (cast) {
+                msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
+                if (!dimension_door(caster_ptr))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 14:
+        if (name)
+            return _("帰還の呪文", "Word of Recall");
+        if (desc)
+            return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
+                "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
+
+        {
+            int base = 15;
+            DICE_SID sides = 20;
+
+            if (info)
+                return info_delay(base, sides);
+
+            if (cast) {
+                if (!recall_player(caster_ptr, randint0(21) + 15))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 15:
+        if (name)
+            return _("怪物追放", "Banish");
+        if (desc)
+            return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
+
+        {
+            int power = plev * 4;
+
+            if (info)
+                return info_power(power);
+
+            if (cast) {
+                banish_monsters(caster_ptr, power);
+            }
+        }
+        break;
+
+    case 16:
+        if (name)
+            return _("位置交換のカード", "Swap Position");
+        if (desc)
+            return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
+
+        {
+            if (cast) {
+                bool result;
+
+                /* HACK -- No range limit */
+                project_length = -1;
+
+                result = get_aim_dir(caster_ptr, &dir);
+
+                /* Restore range to default */
+                project_length = 0;
+
+                if (!result)
+                    return NULL;
+
+                teleport_swap(caster_ptr, dir);
+            }
+        }
+        break;
+
+    case 17:
+        if (name)
+            return _("アンデッドのカード", "Trump Undead");
+        if (desc)
+            return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_UNDEAD, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 18:
+        if (name)
+            return _("爬虫類のカード", "Trump Reptile");
+        if (desc)
+            return _("1体のヒドラを召喚する。", "Summons a hydra.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HYDRA, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 19:
+        if (name)
+            return _("モンスターのカード", "Trump Monsters");
+        if (desc)
+            return _("複数のモンスターを召喚する。", "Summons some monsters.");
+
+        {
+            if (cast || fail) {
+                int type;
+                msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
+                if (caster_ptr->pclass == CLASS_BEASTMASTER)
+                    type = SUMMON_LIVING;
+                else
+                    type = 0;
+
+                if (trump_summoning(caster_ptr, (1 + (plev - 15) / 10), !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 20:
+        if (name)
+            return _("ハウンドのカード", "Trump Hounds");
+        if (desc)
+            return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP)) {
+                    if (fail) {
+                        msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 21:
+        if (name)
+            return _("トランプの刃", "Trump Branding");
+        if (desc)
+            return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
+
+        {
+            if (cast) {
+                brand_weapon(caster_ptr, 5);
+            }
+        }
+        break;
+
+    case 22:
+        if (name)
+            return _("人間トランプ", "Living Trump");
+        if (desc)
+            return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
+                "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
+        if (cast)
+            become_living_trump(caster_ptr);
+        break;
+
+    case 23:
+        if (name)
+            return _("サイバーデーモンのカード", "Trump Cyberdemon");
+        if (desc)
+            return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_CYBER, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 24:
+        if (name)
+            return _("予見のカード", "Trump Divination");
+        if (desc)
+            return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
+                "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
+
+        {
+            POSITION rad = DETECT_RAD_DEFAULT;
+
+            if (info)
+                return info_radius(rad);
+
+            if (cast) {
+                detect_all(caster_ptr, rad);
+            }
+        }
+        break;
+
+    case 25:
+        if (name)
+            return _("知識のカード", "Trump Lore");
+        if (desc)
+            return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
+
+        {
+            if (cast) {
+                if (!identify_fully(caster_ptr, FALSE, 0))
+                    return NULL;
+            }
+        }
+        break;
+
+    case 26:
+        if (name)
+            return _("回復モンスター", "Heal Monster");
+        if (desc)
+            return _("モンスター1体の体力を回復させる。", "Heals a monster.");
+
+        {
+            int heal = plev * 10 + 200;
+
+            if (info)
+                return info_heal(0, 0, heal);
+
+            if (cast) {
+                bool result;
+
+                /* Temporary enable target_pet option */
+                bool old_target_pet = target_pet;
+                target_pet = TRUE;
+
+                result = get_aim_dir(caster_ptr, &dir);
+
+                /* Restore target_pet option */
+                target_pet = old_target_pet;
+
+                if (!result)
+                    return NULL;
+
+                heal_monster(caster_ptr, dir, heal);
+            }
+        }
+        break;
+
+    case 27:
+        if (name)
+            return _("ドラゴンのカード", "Trump Dragon");
+        if (desc)
+            return _("1体のドラゴンを召喚する。", "Summons a dragon.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DRAGON, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 28:
+        if (name)
+            return _("隕石のカード", "Trump Meteor");
+        if (desc)
+            return _("自分の周辺に隕石を落とす。", "Causes meteorites to fall down on nearby random locations.");
+
+        {
+            HIT_POINT dam = plev * 2;
+            POSITION rad = 2;
+
+            if (info)
+                return info_multi_damage(dam);
+
+            if (cast) {
+                cast_meteor(caster_ptr, dam, rad);
+            }
+        }
+        break;
+
+    case 29:
+        if (name)
+            return _("デーモンのカード", "Trump Demon");
+        if (desc)
+            return _("1体の悪魔を召喚する。", "Summons a demon.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DEMON, 0L)) {
+                    if (fail) {
+                        msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 30:
+        if (name)
+            return _("地獄のカード", "Trump Greater Undead");
+        if (desc)
+            return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
+
+        {
+            if (cast || fail) {
+                msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
+                /* May allow unique depend on level and dice roll */
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE)) {
+                    if (fail) {
+                        msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+
+    case 31:
+        if (name)
+            return _("古代ドラゴンのカード", "Trump Ancient Dragon");
+        if (desc)
+            return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
+
+        {
+            if (cast) {
+                int type;
+
+                if (caster_ptr->pclass == CLASS_BEASTMASTER)
+                    type = SUMMON_HI_DRAGON_LIVING;
+                else
+                    type = SUMMON_HI_DRAGON;
+
+                msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
+                /* May allow unique depend on level and dice roll */
+                if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, PM_ALLOW_UNIQUE)) {
+                    if (fail) {
+                        msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
+                    }
+                }
+            }
+        }
+        break;
+    }
+
+    return "";
 }
index 02c178e..bc13a0d 100644 (file)
@@ -1,9 +1,9 @@
 #include "specific-object/death-crimson.h"
 #include "effect/effect-characteristics.h"
 #include "floor/geometry.h"
-#include "io/targeting.h"
 #include "spell/process-effect.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 
 /*!
  * @brief クリムゾンを発射する / Fire Crimson, evoluting gun.
index 0c4fd5b..0c5ab06 100644 (file)
@@ -8,7 +8,6 @@
 #include "floor/floor.h"
 #include "grid/feature-flag-types.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags7.h"
 #include "monster/monster-describer.h"
@@ -16,6 +15,7 @@
 #include "monster/monster-update.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
index b2af2f6..7f7e2f0 100644 (file)
@@ -1,9 +1,9 @@
 #include "spell-kind/spells-launcher.h"
 #include "effect/effect-characteristics.h"
 #include "floor/geometry.h"
-#include "io/targeting.h"
 #include "spell/process-effect.h"
 #include "spell/spell-types.h"
+#include "target/targeting.h"
 
 /*!
  * @brief ボール系スペルの発動 / Cast a ball spell
index 743be2a..1b34107 100644 (file)
@@ -6,7 +6,6 @@
 #include "floor/floor.h"
 #include "game-option/map-screen-options.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "mind/mind-ninja.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags2.h"
@@ -18,6 +17,7 @@
 #include "spell/process-effect.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
index c03231d..c1d2161 100644 (file)
@@ -2,7 +2,6 @@
 #include "core/stuff-handler.h"
 #include "floor/floor-object.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-generator.h"
 #include "monster-floor/monster-remover.h"
 #include "monster-floor/place-monster-types.h"
@@ -15,6 +14,7 @@
 #include "monster/monster-util.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
+#include "target/targeting.h"
 
 /*!
  * @brief 変身処理向けにモンスターの近隣レベル帯モンスターを返す /
index 7555513..c3cc753 100644 (file)
@@ -7,14 +7,12 @@
 #include "spell-kind/spells-random.h"
 #include "core/hp-mp-processor.h"
 #include "effect/effect-characteristics.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "mutation/mutation.h"
 #include "player/avatar.h"
-#include "status/bad-status-setter.h"
 #include "player/player-damage.h"
 #include "spell-kind/earthquake.h"
 #include "spell-kind/spells-equipment.h"
 #include "spell-kind/spells-specific-bolt.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell/process-effect.h"
+#include "spell/spell-types.h"
 #include "spell/spells-diceroll.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
-#include "spell/spell-types.h"
+#include "status/bad-status-setter.h"
 #include "status/base-status.h"
 #include "status/experience.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 20e8b2d..1735b33 100644 (file)
@@ -13,7 +13,6 @@
 #include "floor/floor.h"
 #include "grid/grid.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "monster-floor/monster-move.h"
@@ -33,6 +32,7 @@
 #include "spell-kind/spells-launcher.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 #include "world/world.h"
index 38bc9e4..20924b4 100644 (file)
 #include "game-option/special-options.h"
 #include "grid/grid.h"
 #include "io/input-key-acceptor.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "market/building-util.h"
+#include "monster-floor/monster-remover.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags-resistance.h"
 #include "monster-race/race-flags1.h"
 #include "monster/monster-describer.h"
 #include "monster/monster-description-types.h"
 #include "monster/monster-info.h"
-#include "monster-floor/monster-remover.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
index e8a7696..31a0535 100644 (file)
 #include "game-option/disturbance-options.h"
 #include "grid/feature-flag-types.h"
 #include "grid/grid.h"
-#include "io/targeting.h"
 #include "spell-realm/spells-crusade.h"
-#include "spell/range-calc.h"
 #include "spell/process-effect.h"
+#include "spell/range-calc.h"
 #include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
 /*!
-* @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
-* @param caster_ptr プレーヤーへの参照ポインタ
-* @param dam ダメージ
-* @param rad 効力の半径
-* @return ターゲットを指定し、実行したならばTRUEを返す。
-*/
+ * @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param dam ダメージ
+ * @param rad 効力の半径
+ * @return ターゲットを指定し、実行したならばTRUEを返す。
+ */
 bool cast_wrath_of_the_god(player_type *caster_ptr, HIT_POINT dam, POSITION rad)
 {
-       DIRECTION dir;
-       if (!get_aim_dir(caster_ptr, &dir)) return FALSE;
-
-       POSITION tx = caster_ptr->x + 99 * ddx[dir];
-       POSITION ty = caster_ptr->y + 99 * ddy[dir];
-       if ((dir == 5) && target_okay(caster_ptr))
-       {
-               tx = target_col;
-               ty = target_row;
-       }
-
-       POSITION x = caster_ptr->x;
-       POSITION y = caster_ptr->y;
-       POSITION nx, ny;
-       while (TRUE)
-       {
-               if ((y == ty) && (x == tx)) break;
-
-               ny = y;
-               nx = x;
-               mmove2(&ny, &nx, caster_ptr->y, caster_ptr->x, ty, tx);
-               if (get_max_range(caster_ptr) <= distance(caster_ptr->y, caster_ptr->x, ny, nx)) break;
-               if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, ny, nx, FF_PROJECT)) break;
-               if ((dir != 5) && caster_ptr->current_floor_ptr->grid_array[ny][nx].m_idx != 0) break;
-
-               x = nx;
-               y = ny;
-       }
-
-       tx = x;
-       ty = y;
-
-       int b = 10 + randint1(10);
-       for (int i = 0; i < b; i++)
-       {
-               int count = 20, d = 0;
-
-               while (count--)
-               {
-                       int dx, dy;
-
-                       x = tx - 5 + randint0(11);
-                       y = ty - 5 + randint0(11);
-
-                       dx = (tx > x) ? (tx - x) : (x - tx);
-                       dy = (ty > y) ? (ty - y) : (y - ty);
-
-                       d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
-                       if (d < 5) break;
-               }
-
-               if (count < 0) continue;
-
-               if (!in_bounds(caster_ptr->current_floor_ptr, y, x) ||
-                       cave_stop_disintegration(caster_ptr->current_floor_ptr, y, x) ||
-                       !in_disintegration_range(caster_ptr->current_floor_ptr, ty, tx, y, x))
-                       continue;
-
-               project(caster_ptr, 0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
-       }
-
-       return TRUE;
+    DIRECTION dir;
+    if (!get_aim_dir(caster_ptr, &dir))
+        return FALSE;
+
+    POSITION tx = caster_ptr->x + 99 * ddx[dir];
+    POSITION ty = caster_ptr->y + 99 * ddy[dir];
+    if ((dir == 5) && target_okay(caster_ptr)) {
+        tx = target_col;
+        ty = target_row;
+    }
+
+    POSITION x = caster_ptr->x;
+    POSITION y = caster_ptr->y;
+    POSITION nx, ny;
+    while (TRUE) {
+        if ((y == ty) && (x == tx))
+            break;
+
+        ny = y;
+        nx = x;
+        mmove2(&ny, &nx, caster_ptr->y, caster_ptr->x, ty, tx);
+        if (get_max_range(caster_ptr) <= distance(caster_ptr->y, caster_ptr->x, ny, nx))
+            break;
+        if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, ny, nx, FF_PROJECT))
+            break;
+        if ((dir != 5) && caster_ptr->current_floor_ptr->grid_array[ny][nx].m_idx != 0)
+            break;
+
+        x = nx;
+        y = ny;
+    }
+
+    tx = x;
+    ty = y;
+
+    int b = 10 + randint1(10);
+    for (int i = 0; i < b; i++) {
+        int count = 20, d = 0;
+
+        while (count--) {
+            int dx, dy;
+
+            x = tx - 5 + randint0(11);
+            y = ty - 5 + randint0(11);
+
+            dx = (tx > x) ? (tx - x) : (x - tx);
+            dy = (ty > y) ? (ty - y) : (y - ty);
+
+            d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
+            if (d < 5)
+                break;
+        }
+
+        if (count < 0)
+            continue;
+
+        if (!in_bounds(caster_ptr->current_floor_ptr, y, x) || cave_stop_disintegration(caster_ptr->current_floor_ptr, y, x)
+            || !in_disintegration_range(caster_ptr->current_floor_ptr, ty, tx, y, x))
+            continue;
+
+        project(caster_ptr, 0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
+    }
+
+    return TRUE;
 }
 
 /*!
index 693841b..ace524b 100644 (file)
@@ -1,10 +1,8 @@
 #include "spell-realm/spells-trump.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "mutation/mutation.h"
 #include "player/avatar.h"
-#include "status/buff-setter.h"
 #include "spell-kind/earthquake.h"
 #include "spell-kind/spells-charm.h"
 #include "spell-kind/spells-floor.h"
 #include "spell/spells-status.h"
 #include "spell/spells-summon.h"
 #include "status/base-status.h"
+#include "status/buff-setter.h"
 #include "status/experience.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 /*!
index 61e8bbc..339b7c6 100644 (file)
@@ -12,7 +12,6 @@
 #include "grid/feature-flag-types.h"
 #include "io/cursor.h"
 #include "io/screen-util.h"
-#include "io/targeting.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
 #include "monster-race/monster-race.h"
 #include "monster/monster-description-types.h"
 #include "monster/monster-info.h"
 #include "pet/pet-fall-off.h"
-#include "spell/spell-types.h"
 #include "spell/range-calc.h"
+#include "spell/spell-types.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/gameterm.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
@@ -334,14 +334,18 @@ bool project(player_type *caster_ptr, MONSTER_IDX who, POSITION rad, POSITION y,
 
                 path_n = i;
                 second_step = i + 1;
-                path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y - 1, x - 1, flag);
+                path_n
+                    += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y - 1, x - 1, flag);
                 path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y - 1, x, flag);
-                path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y - 1, x + 1, flag);
+                path_n
+                    += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y - 1, x + 1, flag);
                 path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y, x - 1, flag);
                 path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y, x + 1, flag);
-                path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y + 1, x - 1, flag);
+                path_n
+                    += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y + 1, x - 1, flag);
                 path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y + 1, x, flag);
-                path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y + 1, x + 1, flag);
+                path_n
+                    += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : get_max_range(caster_ptr)), y, x, y + 1, x + 1, flag);
             }
         }
 
index 12a5b51..3afcf6d 100644 (file)
@@ -22,7 +22,6 @@
 #include "inventory/inventory-object.h"
 #include "inventory/inventory-slot-types.h"
 #include "inventory/player-inventory.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
 #include "object-enchant/apply-magic.h"
@@ -63,6 +62,7 @@
 #include "sv-definition/sv-weapon-types.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
index c0a20af..3a2385a 100644 (file)
@@ -21,7 +21,6 @@
 #include "grid/grid.h"
 #include "inventory/inventory-object.h"
 #include "inventory/inventory-slot-types.h"
-#include "io/targeting.h"
 #include "mind/mind-force-trainer.h"
 #include "monster/monster-describer.h"
 #include "object/object-generator.h"
@@ -44,6 +43,7 @@
 #include "status/shape-changer.h"
 #include "status/sight-setter.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
similarity index 99%
rename from src/io/targeting.c
rename to src/target/targeting.c
index 2e9bc00..faddbcc 100644 (file)
@@ -9,7 +9,7 @@
  * 2014 Deskull rearranged comment for Doxygen.
  */
 
-#include "io/targeting.h"
+#include "target/targeting.h"
 #include "action/travel-execution.h"
 #include "cmd-action/cmd-pet.h"
 #include "cmd-building/cmd-building.h"
similarity index 100%
rename from src/io/targeting.h
rename to src/target/targeting.h
index 5922420..17d9748 100644 (file)
@@ -10,7 +10,6 @@
 #include "inventory/inventory-describer.h"
 #include "inventory/inventory-slot-types.h"
 #include "inventory/inventory-util.h"
-#include "io/targeting.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
 #include "monster/monster-flag-types.h"
@@ -20,6 +19,7 @@
 #include "spell-kind/magic-item-recharger.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
+#include "target/targeting.h"
 #include "term/gameterm.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
@@ -27,9 +27,9 @@
 #include "view/display-map.h"
 #include "view/display-messages.h"
 #include "view/display-player.h"
-#include "window/main-window-util.h"
 #include "view/object-describer.h"
 #include "window/main-window-equipments.h"
+#include "window/main-window-util.h"
 #include "world/world.h"
 
 /*!
index bcf86f5..b1a312c 100644 (file)
@@ -39,7 +39,6 @@
 #include "io/files-util.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
-#include "io/targeting.h"
 #include "io/write-diary.h"
 #include "market/arena.h"
 #include "monster-floor/monster-remover.h"
@@ -81,6 +80,7 @@
 #include "system/angband-version.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
 #include "util/angband-files.h"
index 5fb7c1c..61e0552 100644 (file)
@@ -9,7 +9,6 @@
 #include "core/asking-player.h"
 #include "floor/cave.h"
 #include "floor/floor.h"
-#include "io/targeting.h"
 #include "monster-floor/monster-generator.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
@@ -18,6 +17,7 @@
 #include "spell-realm/spells-chaos.h"
 #include "spell/spells-status.h"
 #include "system/floor-type-definition.h"
+#include "target/targeting.h"
 #include "view/display-messages.h"
 
 debug_spell_command debug_spell_commands_list[SPELL_MAX] = {