OSDN Git Service

一番大事なファイル do-spell.c をaddし忘れていたので追加。
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 2 Jan 2004 14:03:55 +0000 (14:03 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 2 Jan 2004 14:03:55 +0000 (14:03 +0000)
魔法の処理全般がこのファイルに全部入っている。
ただし、mind.c で処理していた分はまだ do-spell.c に統一していない。

src/do-spell.c [new file with mode: 0644]

diff --git a/src/do-spell.c b/src/do-spell.c
new file mode 100644 (file)
index 0000000..a68d17b
--- /dev/null
@@ -0,0 +1,12228 @@
+/* File: do-spell.c */
+
+/* Purpose: Do everything for each spell */
+
+#include "angband.h"
+
+#define LIFE_SPEL_CURE_LIGHT_WOUNDS         0  
+#define LIFE_SPEL_BLESS                            1  
+#define LIFE_SPEL_CAUSE_LIGHT_WOUNDS       2  
+#define LIFE_SPEL_CALL_LIGHT               3  
+#define LIFE_SPEL_DETECT_DOORS_AND_TRAPS    4  
+#define LIFE_SPEL_CURE_MEDIUM_WOUNDS       5  
+#define LIFE_SPEL_CURE_POISON              6  
+#define LIFE_SPEL_SATISFY_HUNGER           7  
+#define LIFE_SPEL_REMOVE_CURSE             8  
+#define LIFE_SPEL_CAUSE_MEDIUM_WOUNDS      9  
+#define LIFE_SPEL_CURE_CRITICAL_WOUNDS     10 
+#define LIFE_SPEL_RESIST_HEAT_AND_COLD     11 
+#define LIFE_SPEL_SENSE_SURROUNDINGS       12 
+#define LIFE_SPEL_TURN_UNDEAD              13 
+#define LIFE_SPEL_HEALING                  14 
+#define LIFE_SPEL_GLYPH_OF_WARDING         15 
+#define LIFE_SPEL_DISPEL_CURSE             16 
+#define LIFE_SPEL_PERCEPTION               17 
+#define LIFE_SPEL_DISPEL_UNDEAD                    18 
+#define LIFE_SPEL_DAY_OF_THE_DOVE          19 
+#define LIFE_SPEL_CAUSE_CRITICAL_WOUNDS            20 
+#define LIFE_SPEL_WORD_OF_RECALL           21 
+#define LIFE_SPEL_ALTER_REALITY                    22 
+#define LIFE_SPEL_WARDING_TRUE             23 
+#define LIFE_SPEL_STERILIZATION                    24 
+#define LIFE_SPEL_DETECTION                25 
+#define LIFE_SPEL_ANNIHILATE_UNDEAD        26 
+#define LIFE_SPEL_CLAIRVOYANCE             27 
+#define LIFE_SPEL_RESTORATION              28 
+#define LIFE_SPEL_HEALING_TRUE             29 
+#define LIFE_SPEL_HOLY_VISION              30 
+#define LIFE_SPEL_ULTIMATE_RESISTANCE      31 
+#define SORC_SPEL_DETECT_MONSTERS          32 
+#define SORC_SPEL_PHASE_DOOR               33 
+#define SORC_SPEL_DETECT_DOORS_AND_TRAPS    34 
+#define SORC_SPEL_LIGHT_AREA               35 
+#define SORC_SPEL_CONFUSE_MONSTER          36 
+#define SORC_SPEL_TELEPORT                 37 
+#define SORC_SPEL_SLEEP_MONSTER                    38 
+#define SORC_SPEL_RECHARGING               39 
+#define SORC_SPEL_MAGIC_MAPPING                    40 
+#define SORC_SPEL_IDENTIFY                 41 
+#define SORC_SPEL_SLOW_MONSTER             42 
+#define SORC_SPEL_MASS_SLEEP               43 
+#define SORC_SPEL_TELEPORT_AWAY                    44 
+#define SORC_SPEL_HASTE_SELF               45 
+#define SORC_SPEL_DETECTION_TRUE           46 
+#define SORC_SPEL_IDENTIFY_TRUE                    47 
+#define SORC_SPEL_DETECT_ITEMS_AND_TREASURE 48 
+#define SORC_SPEL_CHARM_MONSTER                    49 
+#define SORC_SPEL_SENSE_MINDS              50 
+#define SORC_SPEL_TELEPORT_TO_TOWN         51 
+#define SORC_SPEL_SELF_KNOWLEDGE           52 
+#define SORC_SPEL_TELEPORT_LEVEL           53 
+#define SORC_SPEL_WORD_OF_RECALL           54 
+#define SORC_SPEL_DIMENSION_DOOR           55 
+#define SORC_SPEL_PROBING                  56 
+#define SORC_SPEL_EXPLOSIVE_RUNE           57 
+#define SORC_SPEL_TELEKINESIS              58 
+#define SORC_SPEL_CLAIRVOYANCE             59 
+#define SORC_SPEL_CHARM_MONSTERS           60 
+#define SORC_SPEL_ALCHEMY                  61 
+#define SORC_SPEL_BANISHMENT               62 
+#define SORC_SPEL_GLOBE_OF_INVULNERABILITY  63 
+#define NATU_SPEL_DETECT_CREATURES         64 
+#define NATU_SPEL_LIGHTNING                65 
+#define NATU_SPEL_DETECT_DOORS_AND_TRAPS    66 
+#define NATU_SPEL_PRODUCE_FOOD             67 
+#define NATU_SPEL_DAYLIGHT                 68 
+#define NATU_SPEL_ANIMAL_TAMING                    69 
+#define NATU_SPEL_RESIST_ENVIRONMENT       70 
+#define NATU_SPEL_CURE_WOUNDS_AND_POISON    71 
+#define NATU_SPEL_STONE_TO_MUD             72 
+#define NATU_SPEL_FROST_BOLT               73 
+#define NATU_SPEL_NATURE_AWARENESS         74 
+#define NATU_SPEL_FIRE_BOLT                75 
+#define NATU_SPEL_RAY_OF_SUNLIGHT          76 
+#define NATU_SPEL_ENTANGLE                 77 
+#define NATU_SPEL_SUMMON_ANIMAL                    78 
+#define NATU_SPEL_HERBAL_HEALING           79 
+#define NATU_SPEL_STAIR_BUILDING           80 
+#define NATU_SPEL_STONE_SKIN               81 
+#define NATU_SPEL_RESISTANCE_TRUE          82 
+#define NATU_SPEL_FOREST_CREATION          83 
+#define NATU_SPEL_ANIMAL_FRIENDSHIP        84 
+#define NATU_SPEL_STONE_TELL               85 
+#define NATU_SPEL_WALL_OF_STONE                    86 
+#define NATU_SPEL_PROTECT_FROM_CORROSION    87 
+#define NATU_SPEL_EARTHQUAKE               88 
+#define NATU_SPEL_CYCLONE                  89 
+#define NATU_SPEL_BLIZZARD                 90 
+#define NATU_SPEL_LIGHTNING_STORM          91 
+#define NATU_SPEL_WHIRLPOOL                92 
+#define NATU_SPEL_CALL_SUNLIGHT                    93 
+#define NATU_SPEL_ELEMENTAL_BRANDING       94 
+#define NATU_SPEL_NATURES_WRATH                    95 
+#define CHAO_SPEL_MAGIC_MISSILE                    96 
+#define CHAO_SPEL_TRAP_DOOR_DESTRUCTION     97 
+#define CHAO_SPEL_FLASH_OF_LIGHT           98 
+#define CHAO_SPEL_TOUCH_OF_CONFUSION       99 
+#define CHAO_SPEL_MANA_BURST               100
+#define CHAO_SPEL_FIRE_BOLT                101
+#define CHAO_SPEL_FIST_OF_FORCE                    102
+#define CHAO_SPEL_TELEPORT_SELF                    103
+#define CHAO_SPEL_WONDER                   104
+#define CHAO_SPEL_CHAOS_BOLT               105
+#define CHAO_SPEL_SONIC_BOOM               106
+#define CHAO_SPEL_DOOM_BOLT                107
+#define CHAO_SPEL_FIRE_BALL                108
+#define CHAO_SPEL_TELEPORT_OTHER           109
+#define CHAO_SPEL_WORD_OF_DESTRUCTION      110
+#define CHAO_SPEL_INVOKE_LOGRUS                    111
+#define CHAO_SPEL_POLYMORPH_OTHER          112
+#define CHAO_SPEL_CHAIN_LIGHTNING          113
+#define CHAO_SPEL_ARCANE_BINDING           114
+#define CHAO_SPEL_DISINTEGRATE             115
+#define CHAO_SPEL_ALTER_REALITY                    116
+#define CHAO_SPEL_MAGIC_ROCKET             117
+#define CHAO_SPEL_CHAOS_BRANDING           118
+#define CHAO_SPEL_SUMMON_DEMON             119
+#define CHAO_SPEL_BEAM_OF_GRAVITY          120
+#define CHAO_SPEL_METEOR_SWARM             121
+#define CHAO_SPEL_FLAME_STRIKE             122
+#define CHAO_SPEL_CALL_CHAOS               123
+#define CHAO_SPEL_POLYMORPH_SELF           124
+#define CHAO_SPEL_MANA_STORM               125
+#define CHAO_SPEL_BREATHE_LOGRUS           126
+#define CHAO_SPEL_CALL_THE_VOID                    127
+#define DEAT_SPEL_DETECT_UNLIFE                    128
+#define DEAT_SPEL_MALEDICTION              129
+#define DEAT_SPEL_DETECT_EVIL              130
+#define DEAT_SPEL_STINKING_CLOUD           131
+#define DEAT_SPEL_BLACK_SLEEP              132
+#define DEAT_SPEL_RESIST_POISON                    133
+#define DEAT_SPEL_HORRIFY                  134
+#define DEAT_SPEL_ENSLAVE_UNDEAD           135
+#define DEAT_SPEL_ORB_OF_ENTROPY           136
+#define DEAT_SPEL_NETHER_BOLT              137
+#define DEAT_SPEL_CLOUD_KILL               138
+#define DEAT_SPEL_GENOCIDE_ONE             139
+#define DEAT_SPEL_POISON_BRANDING          140
+#define DEAT_SPEL_VAMPIRIC_DRAIN           141
+#define DEAT_SPEL_ANIMATE_DEAD             142
+#define DEAT_SPEL_GENOCIDE                 143
+#define DEAT_SPEL_BERSERK                  144
+#define DEAT_SPEL_INVOKE_SPIRITS           145
+#define DEAT_SPEL_DARK_BOLT                146
+#define DEAT_SPEL_BATTLE_FRENZY                    147
+#define DEAT_SPEL_VAMPIRIC_BRANDING        148
+#define DEAT_SPEL_VAMPIRISM_TRUE           149
+#define DEAT_SPEL_NETHER_WAVE              150
+#define DEAT_SPEL_DARKNESS_STORM           151
+#define DEAT_SPEL_DEATH_RAY                152
+#define DEAT_SPEL_RAISE_THE_DEAD           153
+#define DEAT_SPEL_ESOTERIA                 154
+#define DEAT_SPEL_POLYMORPH_VAMPIRE        155
+#define DEAT_SPEL_RESTORE_LIFE             156
+#define DEAT_SPEL_MASS_GENOCIDE                    157
+#define DEAT_SPEL_HELLFIRE                 158
+#define DEAT_SPEL_WRAITHFORM               159
+#define TRUM_SPEL_PHASE_DOOR               160
+#define TRUM_SPEL_TRUMP_SPIDERS                    161
+#define TRUM_SPEL_SHUFFLE                  162
+#define TRUM_SPEL_RESET_RECALL             163
+#define TRUM_SPEL_TELEPORT                 164
+#define TRUM_SPEL_TRUMP_SPYING             165
+#define TRUM_SPEL_TELEPORT_AWAY                    166
+#define TRUM_SPEL_TRUMP_ANIMALS                    167
+#define TRUM_SPEL_TRUMP_REACH              168
+#define TRUM_SPEL_TRUMP_KAMIKAZE           169
+#define TRUM_SPEL_PHANTASMAL_SERVANT       170
+#define TRUM_SPEL_HASTE_MONSTER                    171
+#define TRUM_SPEL_TELEPORT_LEVEL           172
+#define TRUM_SPEL_DIMENSION_DOOR           173
+#define TRUM_SPEL_WORD_OF_RECALL           174
+#define TRUM_SPEL_BANISH                   175
+#define TRUM_SPEL_SWAP_POSITION                    176
+#define TRUM_SPEL_TRUMP_UNDEAD             177
+#define TRUM_SPEL_TRUMP_REPTILES           178
+#define TRUM_SPEL_TRUMP_MONSTERS           179
+#define TRUM_SPEL_TRUMP_HOUNDS             180
+#define TRUM_SPEL_TRUMP_BRANDING           181
+#define TRUM_SPEL_LIVING_TRUMP             182
+#define TRUM_SPEL_TRUMP_CYBERDEMON         183
+#define TRUM_SPEL_TRUMP_DIVINATION         184
+#define TRUM_SPEL_TRUMP_LORE               185
+#define TRUM_SPEL_HEAL_MONSTER             186
+#define TRUM_SPEL_TRUMP_DRAGON             187
+#define TRUM_SPEL_TRUMP_METEOR             188
+#define TRUM_SPEL_TRUMP_DEMON              189
+#define TRUM_SPEL_TRUMP_GREATER_UNDEAD     190
+#define TRUM_SPEL_TRUMP_ANCIENT_DRAGON     191
+#define ARCA_SPEL_ZAP                      192
+#define ARCA_SPEL_WIZARD_LOCK              193
+#define ARCA_SPEL_DETECT_INVISIBILITY      194
+#define ARCA_SPEL_DETECT_MONSTERS          195
+#define ARCA_SPEL_BLINK                            196
+#define ARCA_SPEL_LIGHT_AREA               197
+#define ARCA_SPEL_TRAP_AND_DOOR_DESTRUCTION 198
+#define ARCA_SPEL_CURE_LIGHT_WOUNDS        199
+#define ARCA_SPEL_DETECT_DOORS_AND_TRAPS    200
+#define ARCA_SPEL_PHLOGISTON               201
+#define ARCA_SPEL_DETECT_TREASURE          202
+#define ARCA_SPEL_DETECT_ENCHANTMENT       203
+#define ARCA_SPEL_DETECT_OBJECTS           204
+#define ARCA_SPEL_CURE_POISON              205
+#define ARCA_SPEL_RESIST_COLD              206
+#define ARCA_SPEL_RESIST_FIRE              207
+#define ARCA_SPEL_RESIST_LIGHTNING         208
+#define ARCA_SPEL_RESIST_ACID              209
+#define ARCA_SPEL_CURE_MEDIUM_WOUNDS       210
+#define ARCA_SPEL_TELEPORT                 211
+#define ARCA_SPEL_IDENTIFY                 212
+#define ARCA_SPEL_STONE_TO_MUD             213
+#define ARCA_SPEL_RAY_OF_LIGHT             214
+#define ARCA_SPEL_SATISFY_HUNGER           215
+#define ARCA_SPEL_SEE_INVISIBLE                    216
+#define ARCA_SPEL_CONJURE_ELEMENTAL        217
+#define ARCA_SPEL_TELEPORT_LEVEL           218
+#define ARCA_SPEL_TELEPORT_AWAY                    219
+#define ARCA_SPEL_ELEMENTAL_BALL           220
+#define ARCA_SPEL_DETECTION                221
+#define ARCA_SPEL_WORD_OF_RECALL           222
+#define ARCA_SPEL_CLAIRVOYANCE             223
+#define CRAF_SPEL_INFRAVISION              224
+#define CRAF_SPEL_REGENERATION             225
+#define CRAF_SPEL_SATISFY_HUNGER           226
+#define CRAF_SPEL_RESIST_COLD              227
+#define CRAF_SPEL_RESIST_FIRE              228
+#define CRAF_SPEL_HEROISM                  229
+#define CRAF_SPEL_RESIST_LIGHTNING         230
+#define CRAF_SPEL_RESIST_ACID              231
+#define CRAF_SPEL_SEE_INVISIBILITY         232
+#define CRAF_SPEL_REMOVE_CURSE             233
+#define CRAF_SPEL_RESIST_POISON                    234
+#define CRAF_SPEL_BERSERK                  235
+#define CRAF_SPEL_SELF_KNOWLEDGE           236
+#define CRAF_SPEL_PROTECTION_FROM_EVIL     237
+#define CRAF_SPEL_CURE                     238
+#define CRAF_SPEL_MANA_BRANDING                    239
+#define CRAF_SPEL_TELEPATHY                240
+#define CRAF_SPEL_STONE_SKIN               241
+#define CRAF_SPEL_RESISTANCE               242
+#define CRAF_SPEL_HASTE_SELF               243
+#define CRAF_SPEL_WALK_THROUGH_WALL        244
+#define CRAF_SPEL_POLISH_SHIELD                    245
+#define CRAF_SPEL_CREATE_GOLEM             246
+#define CRAF_SPEL_MAGICAL_ARMOR                    247
+#define CRAF_SPEL_REMOVE_ENCHANTMENT       248
+#define CRAF_SPEL_REMOVE_ALL_CURSE         249
+#define CRAF_SPEL_KNOWLEDGE_TRUE           250
+#define CRAF_SPEL_ENCHANT_WEAPON           251
+#define CRAF_SPEL_ENCHANT_ARMOR                    252
+#define CRAF_SPEL_BRAND_WEAPON             253
+#define CRAF_SPEL_LIVING_TRUMP             254
+#define CRAF_SPEL_IMMUNITY                 255
+#define DAEM_SPEL_MAGIC_MISSILE                    256
+#define DAEM_SPEL_DETECT_UNLIFE                    257
+#define DAEM_SPEL_EVIL_BLESS               258
+#define DAEM_SPEL_RESIST_FIRE              259
+#define DAEM_SPEL_HORRIFY                  260
+#define DAEM_SPEL_NETHER_BOLT              261
+#define DAEM_SPEL_SUMMON_MANES             262
+#define DAEM_SPEL_HELLISH_FLAME                    263
+#define DAEM_SPEL_DOMINATE_DEMON           264
+#define DAEM_SPEL_VISION                   265
+#define DAEM_SPEL_RESIST_NETHER                    266
+#define DAEM_SPEL_PLASMA_BOLT              267
+#define DAEM_SPEL_FIRE_BALL                268
+#define DAEM_SPEL_FIRE_BRANDING                    269
+#define DAEM_SPEL_NETHER_BALL              270
+#define DAEM_SPEL_SUMMON_DEMON             271
+#define DAEM_SPEL_DEVILISH_EYE             272
+#define DAEM_SPEL_DEVIL_CLOAK              273
+#define DAEM_SPEL_THE_FLOW_OF_LAVA         274
+#define DAEM_SPEL_PLASMA_BALL              275
+#define DAEM_SPEL_POLYMORPH_DEMON          276
+#define DAEM_SPEL_NATHER_WAVE              277
+#define DAEM_SPEL_KISS_OF_SUCCUBUS         278
+#define DAEM_SPEL_DOOM_HAND                279
+#define DAEM_SPEL_RAISE_THE_MORALE         280
+#define DAEM_SPEL_IMMORTAL_BODY                    281
+#define DAEM_SPEL_INSANITY_CIRCLE          282
+#define DAEM_SPEL_EXPLODE_PETS             283
+#define DAEM_SPEL_SUMMON_GREATER_DEMON     284
+#define DAEM_SPEL_NETHER_STORM             285
+#define DAEM_SPEL_BLOODY_CURSE             286
+#define DAEM_SPEL_POLYMORPH_DEMONLORD      287
+#define CRUS_SPEL_PUNISHMENT               288
+#define CRUS_SPEL_DETECT_EVIL              289
+#define CRUS_SPEL_REMOVE_FEAR              290
+#define CRUS_SPEL_SCARE_MONSTER                    291
+#define CRUS_SPEL_SANCTUARY                292
+#define CRUS_SPEL_PORTAL                   293
+#define CRUS_SPEL_STAR_DUST                294
+#define CRUS_SPEL_PURIFY                   295
+#define CRUS_SPEL_SCATTER_EVIL             296
+#define CRUS_SPEL_HOLY_ORB                 297
+#define CRUS_SPEL_EXORCISM                 298
+#define CRUS_SPEL_REMOVE_CURSE             299
+#define CRUS_SPEL_SENSE_UNSEEN             300
+#define CRUS_SPEL_PROTECTION_FROM_EVIL     301
+#define CRUS_SPEL_JUDGMENT_THUNDER         302
+#define CRUS_SPEL_HOLY_WORD                303
+#define CRUS_SPEL_UNBARRING_WAYS           304
+#define CRUS_SPEL_ARREST                   305
+#define CRUS_SPEL_HOLY_AURA                306
+#define CRUS_SPEL_DISPEL_UNDEAD_AND_DEMONS  307
+#define CRUS_SPEL_DISPEL_EVIL              308
+#define CRUS_SPEL_HOLY_BLADE               309
+#define CRUS_SPEL_STAR_BURST               310
+#define CRUS_SPEL_SUMMON_ANGEL             311
+#define CRUS_SPEL_HEROISM                  312
+#define CRUS_SPEL_DISPEL_CURSE             313
+#define CRUS_SPEL_BANISH_EVIL              314
+#define CRUS_SPEL_ARMAGEDDON               315
+#define CRUS_SPEL_AN_EYE_FOR_AN_EYE        316
+#define CRUS_SPEL_WRATH_OF_THE_GOD         317
+#define CRUS_SPEL_DIVINE_INTERVENTION      318
+#define CRUS_SPEL_CRUSADE                  319
+#define MUSI_SPEL_SONG_OF_HOLDING          320
+#define MUSI_SPEL_SONG_OF_BLESSING         321
+#define MUSI_SPEL_WRECKING_NOTE                    322
+#define MUSI_SPEL_STUN_PATTERN             323
+#define MUSI_SPEL_FLOW_OF_LIFE             324
+#define MUSI_SPEL_SONG_OF_THE_SUN          325
+#define MUSI_SPEL_SONG_OF_FEAR             326
+#define MUSI_SPEL_HEROIC_BALLAD                    327
+#define MUSI_SPEL_CLAIRAUDIENCE                    328
+#define MUSI_SPEL_SOUL_SHRIEK              329
+#define MUSI_SPEL_SONG_OF_LORE             330
+#define MUSI_SPEL_HIDING_TUNE              331
+#define MUSI_SPEL_ILLUSION_PATTERN         332
+#define MUSI_SPEL_DOOMCALL                 333
+#define MUSI_SPEL_FIRIELS_SONG             334
+#define MUSI_SPEL_FELLOWSHIP_CHANT         335
+#define MUSI_SPEL_SOUND_OF_DISINTEGRATION   336
+#define MUSI_SPEL_FINRODS_RESISTANCE       337
+#define MUSI_SPEL_HOBBIT_MELODIES          338
+#define MUSI_SPEL_WORLD_CONTORTION         339
+#define MUSI_SPEL_DISPELLING_CHANT         340
+#define MUSI_SPEL_THE_VOICE_OF_SARUMAN     341
+#define MUSI_SPEL_SONG_OF_THE_TEMPEST      342
+#define MUSI_SPEL_AMBARKANTA               343
+#define MUSI_SPEL_WRECKING_PATTERN         344
+#define MUSI_SPEL_STATIONARY_SHRIEK        345
+#define MUSI_SPEL_ENDURANCE                346
+#define MUSI_SPEL_THE_HEROS_POEM           347
+#define MUSI_SPEL_RELIEF_OF_YAVANNA        348
+#define MUSI_SPEL_GODDESS_REBIRTH          349
+#define MUSI_SPEL_WIZARDRY_OF_SAURON       350
+#define MUSI_SPEL_FINGOLFINS_CHALLENGE     351
+#define TECH_SPEL_TOBI_IZUNA               352
+#define TECH_SPEL_3_WAY_ATTACK             353
+#define TECH_SPEL_BOOMERANG                354
+#define TECH_SPEL_BURNING_STRIKE           355
+#define TECH_SPEL_DETECT_FEROCITY          356
+#define TECH_SPEL_STRIKE_TO_STUN           357
+#define TECH_SPEL_COUNTER                  358
+#define TECH_SPEL_HARAINUKE                359
+#define TECH_SPEL_SERPENTS_TONGUE          360
+#define TECH_SPEL_ZAMMAKEN                 361
+#define TECH_SPEL_WIND_BLAST               362
+#define TECH_SPEL_JUDGE                            363
+#define TECH_SPEL_ROCK_SMASH               364
+#define TECH_SPEL_MIDARE_SETSUGEKKA        365
+#define TECH_SPEL_SPOT_AIMING              366
+#define TECH_SPEL_MAJINGIRI                367
+#define TECH_SPEL_DESPERATE_ATTACK         368
+#define TECH_SPEL_LIGHTNING_EAGLE          369
+#define TECH_SPEL_RUSH_ATTACK              370
+#define TECH_SPEL_BLOODY_MAELSTROM         371
+#define TECH_SPEL_EARTHQUAKE_BLOW          372
+#define TECH_SPEL_CRACK                            373
+#define TECH_SPEL_WAR_CRY                  374
+#define TECH_SPEL_MUSOU_SANDAN             375
+#define TECH_SPEL_VAMPIRES_FANG                    376
+#define TECH_SPEL_MOON_DAZZLING                    377
+#define TECH_SPEL_HUNDRED_SLAUGHTER        378
+#define TECH_SPEL_DRAGONIC_FLASH           379
+#define TECH_SPEL_TWIN_SLASH               380
+#define TECH_SPEL_KOFUKU_ZETTOUSEI         381
+#define TECH_SPEL_KEIUN_KININKEN           382
+#define TECH_SPEL_HARAKIRI                 383
+
+
+/*
+ * List of spell ID's for each realm
+ */
+static s16b spell_id_list[][32] =
+{
+       {
+               LIFE_SPEL_CURE_LIGHT_WOUNDS,
+               LIFE_SPEL_BLESS,
+               LIFE_SPEL_CAUSE_LIGHT_WOUNDS,
+               LIFE_SPEL_CALL_LIGHT,
+               LIFE_SPEL_DETECT_DOORS_AND_TRAPS,
+               LIFE_SPEL_CURE_MEDIUM_WOUNDS,
+               LIFE_SPEL_CURE_POISON,
+               LIFE_SPEL_SATISFY_HUNGER,
+               LIFE_SPEL_REMOVE_CURSE,
+               LIFE_SPEL_CAUSE_MEDIUM_WOUNDS,
+               LIFE_SPEL_CURE_CRITICAL_WOUNDS,
+               LIFE_SPEL_RESIST_HEAT_AND_COLD,
+               LIFE_SPEL_SENSE_SURROUNDINGS,
+               LIFE_SPEL_TURN_UNDEAD,
+               LIFE_SPEL_HEALING,
+               LIFE_SPEL_GLYPH_OF_WARDING,
+               LIFE_SPEL_DISPEL_CURSE,
+               LIFE_SPEL_PERCEPTION,
+               LIFE_SPEL_DISPEL_UNDEAD,
+               LIFE_SPEL_DAY_OF_THE_DOVE,
+               LIFE_SPEL_CAUSE_CRITICAL_WOUNDS,
+               LIFE_SPEL_WORD_OF_RECALL,
+               LIFE_SPEL_ALTER_REALITY,
+               LIFE_SPEL_WARDING_TRUE,
+               LIFE_SPEL_STERILIZATION,
+               LIFE_SPEL_DETECTION,
+               LIFE_SPEL_ANNIHILATE_UNDEAD,
+               LIFE_SPEL_CLAIRVOYANCE,
+               LIFE_SPEL_RESTORATION,
+               LIFE_SPEL_HEALING_TRUE,
+               LIFE_SPEL_HOLY_VISION,
+               LIFE_SPEL_ULTIMATE_RESISTANCE,
+       },
+
+       {
+               SORC_SPEL_DETECT_MONSTERS,
+               SORC_SPEL_PHASE_DOOR,
+               SORC_SPEL_DETECT_DOORS_AND_TRAPS,
+               SORC_SPEL_LIGHT_AREA,
+               SORC_SPEL_CONFUSE_MONSTER,
+               SORC_SPEL_TELEPORT,
+               SORC_SPEL_SLEEP_MONSTER,
+               SORC_SPEL_RECHARGING,
+               SORC_SPEL_MAGIC_MAPPING,
+               SORC_SPEL_IDENTIFY,
+               SORC_SPEL_SLOW_MONSTER,
+               SORC_SPEL_MASS_SLEEP,
+               SORC_SPEL_TELEPORT_AWAY,
+               SORC_SPEL_HASTE_SELF,
+               SORC_SPEL_DETECTION_TRUE,
+               SORC_SPEL_IDENTIFY_TRUE,
+               SORC_SPEL_DETECT_ITEMS_AND_TREASURE,
+               SORC_SPEL_CHARM_MONSTER,
+               SORC_SPEL_SENSE_MINDS,
+               SORC_SPEL_TELEPORT_TO_TOWN,
+               SORC_SPEL_SELF_KNOWLEDGE,
+               SORC_SPEL_TELEPORT_LEVEL,
+               SORC_SPEL_WORD_OF_RECALL,
+               SORC_SPEL_DIMENSION_DOOR,
+               SORC_SPEL_PROBING,
+               SORC_SPEL_EXPLOSIVE_RUNE,
+               SORC_SPEL_TELEKINESIS,
+               SORC_SPEL_CLAIRVOYANCE,
+               SORC_SPEL_CHARM_MONSTERS,
+               SORC_SPEL_ALCHEMY,
+               SORC_SPEL_BANISHMENT,
+               SORC_SPEL_GLOBE_OF_INVULNERABILITY,
+       },
+
+       {
+               NATU_SPEL_DETECT_CREATURES,
+               NATU_SPEL_LIGHTNING,
+               NATU_SPEL_DETECT_DOORS_AND_TRAPS,
+               NATU_SPEL_PRODUCE_FOOD,
+               NATU_SPEL_DAYLIGHT,
+               NATU_SPEL_ANIMAL_TAMING,
+               NATU_SPEL_RESIST_ENVIRONMENT,
+               NATU_SPEL_CURE_WOUNDS_AND_POISON,
+               NATU_SPEL_STONE_TO_MUD,
+               NATU_SPEL_FROST_BOLT,
+               NATU_SPEL_NATURE_AWARENESS,
+               NATU_SPEL_FIRE_BOLT,
+               NATU_SPEL_RAY_OF_SUNLIGHT,
+               NATU_SPEL_ENTANGLE,
+               NATU_SPEL_SUMMON_ANIMAL,
+               NATU_SPEL_HERBAL_HEALING,
+               NATU_SPEL_STAIR_BUILDING,
+               NATU_SPEL_STONE_SKIN,
+               NATU_SPEL_RESISTANCE_TRUE,
+               NATU_SPEL_FOREST_CREATION,
+               NATU_SPEL_ANIMAL_FRIENDSHIP,
+               NATU_SPEL_STONE_TELL,
+               NATU_SPEL_WALL_OF_STONE,
+               NATU_SPEL_PROTECT_FROM_CORROSION,
+               NATU_SPEL_EARTHQUAKE,
+               NATU_SPEL_CYCLONE,
+               NATU_SPEL_BLIZZARD,
+               NATU_SPEL_LIGHTNING_STORM,
+               NATU_SPEL_WHIRLPOOL,
+               NATU_SPEL_CALL_SUNLIGHT,
+               NATU_SPEL_ELEMENTAL_BRANDING,
+               NATU_SPEL_NATURES_WRATH,
+       },
+
+       {
+               CHAO_SPEL_MAGIC_MISSILE,
+               CHAO_SPEL_TRAP_DOOR_DESTRUCTION,
+               CHAO_SPEL_FLASH_OF_LIGHT,
+               CHAO_SPEL_TOUCH_OF_CONFUSION,
+               CHAO_SPEL_MANA_BURST,
+               CHAO_SPEL_FIRE_BOLT,
+               CHAO_SPEL_FIST_OF_FORCE,
+               CHAO_SPEL_TELEPORT_SELF,
+               CHAO_SPEL_WONDER,
+               CHAO_SPEL_CHAOS_BOLT,
+               CHAO_SPEL_SONIC_BOOM,
+               CHAO_SPEL_DOOM_BOLT,
+               CHAO_SPEL_FIRE_BALL,
+               CHAO_SPEL_TELEPORT_OTHER,
+               CHAO_SPEL_WORD_OF_DESTRUCTION,
+               CHAO_SPEL_INVOKE_LOGRUS,
+               CHAO_SPEL_POLYMORPH_OTHER,
+               CHAO_SPEL_CHAIN_LIGHTNING,
+               CHAO_SPEL_ARCANE_BINDING,
+               CHAO_SPEL_DISINTEGRATE,
+               CHAO_SPEL_ALTER_REALITY,
+               CHAO_SPEL_MAGIC_ROCKET,
+               CHAO_SPEL_CHAOS_BRANDING,
+               CHAO_SPEL_SUMMON_DEMON,
+               CHAO_SPEL_BEAM_OF_GRAVITY,
+               CHAO_SPEL_METEOR_SWARM,
+               CHAO_SPEL_FLAME_STRIKE,
+               CHAO_SPEL_CALL_CHAOS,
+               CHAO_SPEL_POLYMORPH_SELF,
+               CHAO_SPEL_MANA_STORM,
+               CHAO_SPEL_BREATHE_LOGRUS,
+               CHAO_SPEL_CALL_THE_VOID,
+       },
+
+       {
+               DEAT_SPEL_DETECT_UNLIFE,
+               DEAT_SPEL_MALEDICTION,
+               DEAT_SPEL_DETECT_EVIL,
+               DEAT_SPEL_STINKING_CLOUD,
+               DEAT_SPEL_BLACK_SLEEP,
+               DEAT_SPEL_RESIST_POISON,
+               DEAT_SPEL_HORRIFY,
+               DEAT_SPEL_ENSLAVE_UNDEAD,
+               DEAT_SPEL_ORB_OF_ENTROPY,
+               DEAT_SPEL_NETHER_BOLT,
+               DEAT_SPEL_CLOUD_KILL,
+               DEAT_SPEL_GENOCIDE_ONE,
+               DEAT_SPEL_POISON_BRANDING,
+               DEAT_SPEL_VAMPIRIC_DRAIN,
+               DEAT_SPEL_ANIMATE_DEAD,
+               DEAT_SPEL_GENOCIDE,
+               DEAT_SPEL_BERSERK,
+               DEAT_SPEL_INVOKE_SPIRITS,
+               DEAT_SPEL_DARK_BOLT,
+               DEAT_SPEL_BATTLE_FRENZY,
+               DEAT_SPEL_VAMPIRIC_BRANDING,
+               DEAT_SPEL_VAMPIRISM_TRUE,
+               DEAT_SPEL_NETHER_WAVE,
+               DEAT_SPEL_DARKNESS_STORM,
+               DEAT_SPEL_DEATH_RAY,
+               DEAT_SPEL_RAISE_THE_DEAD,
+               DEAT_SPEL_ESOTERIA,
+               DEAT_SPEL_POLYMORPH_VAMPIRE,
+               DEAT_SPEL_RESTORE_LIFE,
+               DEAT_SPEL_MASS_GENOCIDE,
+               DEAT_SPEL_HELLFIRE,
+               DEAT_SPEL_WRAITHFORM,
+       },
+
+       {
+               TRUM_SPEL_PHASE_DOOR,
+               TRUM_SPEL_TRUMP_SPIDERS,
+               TRUM_SPEL_SHUFFLE,
+               TRUM_SPEL_RESET_RECALL,
+               TRUM_SPEL_TELEPORT,
+               TRUM_SPEL_TRUMP_SPYING,
+               TRUM_SPEL_TELEPORT_AWAY,
+               TRUM_SPEL_TRUMP_ANIMALS,
+               TRUM_SPEL_TRUMP_REACH,
+               TRUM_SPEL_TRUMP_KAMIKAZE,
+               TRUM_SPEL_PHANTASMAL_SERVANT,
+               TRUM_SPEL_HASTE_MONSTER,
+               TRUM_SPEL_TELEPORT_LEVEL,
+               TRUM_SPEL_DIMENSION_DOOR,
+               TRUM_SPEL_WORD_OF_RECALL,
+               TRUM_SPEL_BANISH,
+               TRUM_SPEL_SWAP_POSITION,
+               TRUM_SPEL_TRUMP_UNDEAD,
+               TRUM_SPEL_TRUMP_REPTILES,
+               TRUM_SPEL_TRUMP_MONSTERS,
+               TRUM_SPEL_TRUMP_HOUNDS,
+               TRUM_SPEL_TRUMP_BRANDING,
+               TRUM_SPEL_LIVING_TRUMP,
+               TRUM_SPEL_TRUMP_CYBERDEMON,
+               TRUM_SPEL_TRUMP_DIVINATION,
+               TRUM_SPEL_TRUMP_LORE,
+               TRUM_SPEL_HEAL_MONSTER,
+               TRUM_SPEL_TRUMP_DRAGON,
+               TRUM_SPEL_TRUMP_METEOR,
+               TRUM_SPEL_TRUMP_DEMON,
+               TRUM_SPEL_TRUMP_GREATER_UNDEAD,
+               TRUM_SPEL_TRUMP_ANCIENT_DRAGON,
+       },
+
+       {
+               ARCA_SPEL_ZAP,
+               ARCA_SPEL_WIZARD_LOCK,
+               ARCA_SPEL_DETECT_INVISIBILITY,
+               ARCA_SPEL_DETECT_MONSTERS,
+               ARCA_SPEL_BLINK,
+               ARCA_SPEL_LIGHT_AREA,
+               ARCA_SPEL_TRAP_AND_DOOR_DESTRUCTION,
+               ARCA_SPEL_CURE_LIGHT_WOUNDS,
+               ARCA_SPEL_DETECT_DOORS_AND_TRAPS,
+               ARCA_SPEL_PHLOGISTON,
+               ARCA_SPEL_DETECT_TREASURE,
+               ARCA_SPEL_DETECT_ENCHANTMENT,
+               ARCA_SPEL_DETECT_OBJECTS,
+               ARCA_SPEL_CURE_POISON,
+               ARCA_SPEL_RESIST_COLD,
+               ARCA_SPEL_RESIST_FIRE,
+               ARCA_SPEL_RESIST_LIGHTNING,
+               ARCA_SPEL_RESIST_ACID,
+               ARCA_SPEL_CURE_MEDIUM_WOUNDS,
+               ARCA_SPEL_TELEPORT,
+               ARCA_SPEL_IDENTIFY,
+               ARCA_SPEL_STONE_TO_MUD,
+               ARCA_SPEL_RAY_OF_LIGHT,
+               ARCA_SPEL_SATISFY_HUNGER,
+               ARCA_SPEL_SEE_INVISIBLE,
+               ARCA_SPEL_CONJURE_ELEMENTAL,
+               ARCA_SPEL_TELEPORT_LEVEL,
+               ARCA_SPEL_TELEPORT_AWAY,
+               ARCA_SPEL_ELEMENTAL_BALL,
+               ARCA_SPEL_DETECTION,
+               ARCA_SPEL_WORD_OF_RECALL,
+               ARCA_SPEL_CLAIRVOYANCE,
+       },
+
+       {
+               CRAF_SPEL_INFRAVISION,
+               CRAF_SPEL_REGENERATION,
+               CRAF_SPEL_SATISFY_HUNGER,
+               CRAF_SPEL_RESIST_COLD,
+               CRAF_SPEL_RESIST_FIRE,
+               CRAF_SPEL_HEROISM,
+               CRAF_SPEL_RESIST_LIGHTNING,
+               CRAF_SPEL_RESIST_ACID,
+               CRAF_SPEL_SEE_INVISIBILITY,
+               CRAF_SPEL_REMOVE_CURSE,
+               CRAF_SPEL_RESIST_POISON,
+               CRAF_SPEL_BERSERK,
+               CRAF_SPEL_SELF_KNOWLEDGE,
+               CRAF_SPEL_PROTECTION_FROM_EVIL,
+               CRAF_SPEL_CURE,
+               CRAF_SPEL_MANA_BRANDING,
+               CRAF_SPEL_TELEPATHY,
+               CRAF_SPEL_STONE_SKIN,
+               CRAF_SPEL_RESISTANCE,
+               CRAF_SPEL_HASTE_SELF,
+               CRAF_SPEL_WALK_THROUGH_WALL,
+               CRAF_SPEL_POLISH_SHIELD,
+               CRAF_SPEL_CREATE_GOLEM,
+               CRAF_SPEL_MAGICAL_ARMOR,
+               CRAF_SPEL_REMOVE_ENCHANTMENT,
+               CRAF_SPEL_REMOVE_ALL_CURSE,
+               CRAF_SPEL_KNOWLEDGE_TRUE,
+               CRAF_SPEL_ENCHANT_WEAPON,
+               CRAF_SPEL_ENCHANT_ARMOR,
+               CRAF_SPEL_BRAND_WEAPON,
+               CRAF_SPEL_LIVING_TRUMP,
+               CRAF_SPEL_IMMUNITY,
+       },
+
+       {
+               DAEM_SPEL_MAGIC_MISSILE,
+               DAEM_SPEL_DETECT_UNLIFE,
+               DAEM_SPEL_EVIL_BLESS,
+               DAEM_SPEL_RESIST_FIRE,
+               DAEM_SPEL_HORRIFY,
+               DAEM_SPEL_NETHER_BOLT,
+               DAEM_SPEL_SUMMON_MANES,
+               DAEM_SPEL_HELLISH_FLAME,
+               DAEM_SPEL_DOMINATE_DEMON,
+               DAEM_SPEL_VISION,
+               DAEM_SPEL_RESIST_NETHER,
+               DAEM_SPEL_PLASMA_BOLT,
+               DAEM_SPEL_FIRE_BALL,
+               DAEM_SPEL_FIRE_BRANDING,
+               DAEM_SPEL_NETHER_BALL,
+               DAEM_SPEL_SUMMON_DEMON,
+               DAEM_SPEL_DEVILISH_EYE,
+               DAEM_SPEL_DEVIL_CLOAK,
+               DAEM_SPEL_THE_FLOW_OF_LAVA,
+               DAEM_SPEL_PLASMA_BALL,
+               DAEM_SPEL_POLYMORPH_DEMON,
+               DAEM_SPEL_NATHER_WAVE,
+               DAEM_SPEL_KISS_OF_SUCCUBUS,
+               DAEM_SPEL_DOOM_HAND,
+               DAEM_SPEL_RAISE_THE_MORALE,
+               DAEM_SPEL_IMMORTAL_BODY,
+               DAEM_SPEL_INSANITY_CIRCLE,
+               DAEM_SPEL_EXPLODE_PETS,
+               DAEM_SPEL_SUMMON_GREATER_DEMON,
+               DAEM_SPEL_NETHER_STORM,
+               DAEM_SPEL_BLOODY_CURSE,
+               DAEM_SPEL_POLYMORPH_DEMONLORD,
+       },
+
+       {
+               CRUS_SPEL_PUNISHMENT,
+               CRUS_SPEL_DETECT_EVIL,
+               CRUS_SPEL_REMOVE_FEAR,
+               CRUS_SPEL_SCARE_MONSTER,
+               CRUS_SPEL_SANCTUARY,
+               CRUS_SPEL_PORTAL,
+               CRUS_SPEL_STAR_DUST,
+               CRUS_SPEL_PURIFY,
+               CRUS_SPEL_SCATTER_EVIL,
+               CRUS_SPEL_HOLY_ORB,
+               CRUS_SPEL_EXORCISM,
+               CRUS_SPEL_REMOVE_CURSE,
+               CRUS_SPEL_SENSE_UNSEEN,
+               CRUS_SPEL_PROTECTION_FROM_EVIL,
+               CRUS_SPEL_JUDGMENT_THUNDER,
+               CRUS_SPEL_HOLY_WORD,
+               CRUS_SPEL_UNBARRING_WAYS,
+               CRUS_SPEL_ARREST,
+               CRUS_SPEL_HOLY_AURA,
+               CRUS_SPEL_DISPEL_UNDEAD_AND_DEMONS,
+               CRUS_SPEL_DISPEL_EVIL,
+               CRUS_SPEL_HOLY_BLADE,
+               CRUS_SPEL_STAR_BURST,
+               CRUS_SPEL_SUMMON_ANGEL,
+               CRUS_SPEL_HEROISM,
+               CRUS_SPEL_DISPEL_CURSE,
+               CRUS_SPEL_BANISH_EVIL,
+               CRUS_SPEL_ARMAGEDDON,
+               CRUS_SPEL_AN_EYE_FOR_AN_EYE,
+               CRUS_SPEL_WRATH_OF_THE_GOD,
+               CRUS_SPEL_DIVINE_INTERVENTION,
+               CRUS_SPEL_CRUSADE,
+       },
+};
+
+
+/*
+ * List of spell ID's for each special realm
+ */
+static s16b technique_id_list[][32] =
+{
+       {
+               MUSI_SPEL_SONG_OF_HOLDING,
+               MUSI_SPEL_SONG_OF_BLESSING,
+               MUSI_SPEL_WRECKING_NOTE,
+               MUSI_SPEL_STUN_PATTERN,
+               MUSI_SPEL_FLOW_OF_LIFE,
+               MUSI_SPEL_SONG_OF_THE_SUN,
+               MUSI_SPEL_SONG_OF_FEAR,
+               MUSI_SPEL_HEROIC_BALLAD,
+               MUSI_SPEL_CLAIRAUDIENCE,
+               MUSI_SPEL_SOUL_SHRIEK,
+               MUSI_SPEL_SONG_OF_LORE,
+               MUSI_SPEL_HIDING_TUNE,
+               MUSI_SPEL_ILLUSION_PATTERN,
+               MUSI_SPEL_DOOMCALL,
+               MUSI_SPEL_FIRIELS_SONG,
+               MUSI_SPEL_FELLOWSHIP_CHANT,
+               MUSI_SPEL_SOUND_OF_DISINTEGRATION,
+               MUSI_SPEL_FINRODS_RESISTANCE,
+               MUSI_SPEL_HOBBIT_MELODIES,
+               MUSI_SPEL_WORLD_CONTORTION,
+               MUSI_SPEL_DISPELLING_CHANT,
+               MUSI_SPEL_THE_VOICE_OF_SARUMAN,
+               MUSI_SPEL_SONG_OF_THE_TEMPEST,
+               MUSI_SPEL_AMBARKANTA,
+               MUSI_SPEL_WRECKING_PATTERN,
+               MUSI_SPEL_STATIONARY_SHRIEK,
+               MUSI_SPEL_ENDURANCE,
+               MUSI_SPEL_THE_HEROS_POEM,
+               MUSI_SPEL_RELIEF_OF_YAVANNA,
+               MUSI_SPEL_GODDESS_REBIRTH,
+               MUSI_SPEL_WIZARDRY_OF_SAURON,
+               MUSI_SPEL_FINGOLFINS_CHALLENGE,
+       },
+
+       {
+               TECH_SPEL_TOBI_IZUNA,
+               TECH_SPEL_3_WAY_ATTACK,
+               TECH_SPEL_BOOMERANG,
+               TECH_SPEL_BURNING_STRIKE,
+               TECH_SPEL_DETECT_FEROCITY,
+               TECH_SPEL_STRIKE_TO_STUN,
+               TECH_SPEL_COUNTER,
+               TECH_SPEL_HARAINUKE,
+               TECH_SPEL_SERPENTS_TONGUE,
+               TECH_SPEL_ZAMMAKEN,
+               TECH_SPEL_WIND_BLAST,
+               TECH_SPEL_JUDGE,
+               TECH_SPEL_ROCK_SMASH,
+               TECH_SPEL_MIDARE_SETSUGEKKA,
+               TECH_SPEL_SPOT_AIMING,
+               TECH_SPEL_MAJINGIRI,
+               TECH_SPEL_DESPERATE_ATTACK,
+               TECH_SPEL_LIGHTNING_EAGLE,
+               TECH_SPEL_RUSH_ATTACK,
+               TECH_SPEL_BLOODY_MAELSTROM,
+               TECH_SPEL_EARTHQUAKE_BLOW,
+               TECH_SPEL_CRACK,
+               TECH_SPEL_WAR_CRY,
+               TECH_SPEL_MUSOU_SANDAN,
+               TECH_SPEL_VAMPIRES_FANG,
+               TECH_SPEL_MOON_DAZZLING,
+               TECH_SPEL_HUNDRED_SLAUGHTER,
+               TECH_SPEL_DRAGONIC_FLASH,
+               TECH_SPEL_TWIN_SLASH,
+               TECH_SPEL_KOFUKU_ZETTOUSEI,
+               TECH_SPEL_KEIUN_KININKEN,
+               TECH_SPEL_HARAKIRI,
+       },
+};
+
+
+/*
+ * Get unique spell id from realm and spell number (0-31) in the realm
+ */
+int spell_id_from(int realm, int spell)
+{
+       if (is_magic(realm))
+               return (int)spell_id_list[realm - 1][spell];
+       else
+               return (int)technique_id_list[realm - MIN_TECHNIC][spell];
+}
+
+
+/*
+ * Generate dice info string such as "foo 2d10"
+ */
+static cptr info_string_dice(cptr str, int dice, int sides, int base)
+{
+       /* Fix value */
+       if (!dice)
+               return format("%s%d", str, base);
+
+       /* Dice only */
+       else if (!base)
+               return format("%s%dd%d", str, dice, sides);
+
+       /* Dice plus base value */
+       else
+               return format("%s%dd%d%+d", str, dice, sides, base);
+}
+
+
+/*
+ * Generate damage-dice info string such as "dam 2d10"
+ */
+static cptr info_damage(int dice, int sides, int base)
+{
+#ifdef JP
+       return info_string_dice("»½ý:", dice, sides, base);
+#else
+       return info_string_dice("dam ", dice, sides, base);
+#endif
+}
+
+
+/*
+ * Generate duration info string such as "dur 20+1d20"
+ */
+static cptr info_duration(int base, int sides)
+{
+#ifdef JP
+       return format("´ü´Ö:%d+1d%d", base, sides);
+#else
+       return format("dur %d+1d%d", base, sides);
+#endif
+}
+
+
+/*
+ * Generate range info string such as "range 5"
+ */
+static cptr info_range(int range)
+{
+#ifdef JP
+       return format("ÈÏ°Ï:%d", range);
+#else
+       return format("range %d", range);
+#endif
+}
+
+
+/*
+ * Generate heal info string such as "heal 2d8"
+ */
+static cptr info_heal(int dice, int sides, int base)
+{
+#ifdef JP
+       return info_string_dice("²óÉü:", dice, sides, base);
+#else
+       return info_string_dice("heal ", dice, sides, base);
+#endif
+}
+
+
+/*
+ * Generate delay info string such as "delay 15+1d15"
+ */
+static cptr info_delay(int base, int sides)
+{
+#ifdef JP
+       return format("ÃÙ±ä:%d+1d%d", base, sides);
+#else
+       return format("delay %d+1d%d", base, sides);
+#endif
+}
+
+
+/*
+ * Generate multiple-damage info string such as "dam 25 each"
+ */
+static cptr info_multi_damage(int dam)
+{
+#ifdef JP
+       return format("»½ý:³Æ%d", dam);
+#else
+       return format("dam %d each", dam);
+#endif
+}
+
+
+/*
+ * Generate multiple-damage-dice info string such as "dam 5d2 each"
+ */
+static cptr info_multi_damage_dice(int dice, int sides)
+{
+#ifdef JP
+       return format("»½ý:³Æ%dd%d", dice, sides);
+#else
+       return format("dam %dd%d each", dice, sides);
+#endif
+}
+
+
+/*
+ * Generate power info string such as "power 100"
+ */
+static cptr info_power(int power)
+{
+#ifdef JP
+       return format("¸úÎÏ:%d", power);
+#else
+       return format("power %d", power);
+#endif
+}
+
+
+/*
+ * Generate power info string such as "power 1d100"
+ */
+static cptr info_power_dice(int dice, int sides)
+{
+#ifdef JP
+       return format("¸úÎÏ:%dd%d", dice, sides);
+#else
+       return format("power %dd%d", dice, sides);
+#endif
+}
+
+
+/*
+ * Generate radius info string such as "rad 100"
+ */
+static cptr info_radius(int rad)
+{
+#ifdef JP
+       return format("Ⱦ·Â:%d", rad);
+#else
+       return format("rad %d", rad);
+#endif
+}
+
+
+/*
+ * Generate weight info string such as "max wgt 15"
+ */
+static cptr info_weight(int weight)
+{
+#ifdef JP
+       return format("ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(weight/10), lbtokg2(weight/10));
+#else
+       return format("max wgt %d", weight/10);
+#endif
+}
+
+
+/*
+ * Prepare standard probability to become beam for fire_bolt_or_beam()
+ */
+static int beam_chance(void)
+{
+       if (p_ptr->pclass == CLASS_MAGE)
+               return p_ptr->lev;
+       if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
+               return p_ptr->lev + 10;
+
+       return p_ptr->lev / 2;
+}
+
+
+/*
+ * Handle summoning and failure of trump spells
+ */
+static bool trump_summoning(int num, bool pet, int y, int x, int lev, int type, u32b mode)
+{
+       int plev = p_ptr->lev;
+
+       int who;
+       int i;
+       bool success = FALSE;
+
+       /* Default level */
+       if (!lev) lev = plev * 2 / 3 + randint1(plev / 2);
+
+       if (pet)
+       {
+               /* Become pet */
+               mode |= PM_FORCE_PET;
+
+               /* Only sometimes allow unique monster */
+               if (mode & PM_ALLOW_UNIQUE)
+               {
+                       /* Forbid often */
+                       if (randint1(50 + plev) >= plev / 10)
+                               mode &= ~PM_ALLOW_UNIQUE;
+               }
+
+               /* Player is who summons */
+               who = -1;
+       }
+       else
+       {
+               /* Prevent taming, allow unique monster */
+               mode |= PM_NO_PET;
+
+               /* Behave as if they appear by themselfs */
+               who = 0;
+       }
+
+       for (i = 0; i < num; i++)
+       {
+               if (summon_specific(who, y, x, lev, type, mode))
+                       success = TRUE;
+       }
+
+       if (!success)
+       {
+#ifdef JP
+               msg_print("ï¤â¤¢¤Ê¤¿¤Î¥«¡¼¥É¤Î¸Æ¤ÓÀ¼¤ËÅú¤¨¤Ê¤¤¡£");
+#else
+               msg_print("Nobody answers to your Trump call.");
+#endif
+       }
+
+       return success;
+}
+
+
+/*
+ * This spell should become more useful (more controlled) as the
+ * player gains experience levels.  Thus, add 1/5 of the player's
+ * level to the die roll.  This eliminates the worst effects later on,
+ * while keeping the results quite random.  It also allows some potent
+ * effects only at high level.
+ */
+static void cast_wonder(int dir)
+{
+       int plev = p_ptr->lev;
+       int die = randint1(100) + plev / 5;
+       int vir = virtue_number(V_CHANCE);
+
+       if (vir)
+       {
+               if (p_ptr->virtues[vir - 1] > 0)
+               {
+                       while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
+               }
+               else
+               {
+                       while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
+               }
+       }
+
+       if (die < 26)
+               chg_virtue(V_CHANCE, 1);
+
+       if (die > 100)
+       {
+#ifdef JP
+               msg_print("¤¢¤Ê¤¿¤ÏÎϤ¬¤ß¤Ê¤®¤ë¤Î¤ò´¶¤¸¤¿¡ª");
+#else
+               msg_print("You feel a surge of power!");
+#endif
+       }
+
+       if (die < 8) clone_monster(dir);
+       else if (die < 14) speed_monster(dir);
+       else if (die < 26) heal_monster(dir, damroll(4, 6));
+       else if (die < 31) poly_monster(dir);
+       else if (die < 36)
+               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
+                                 damroll(3 + ((plev - 1) / 5), 4));
+       else if (die < 41) confuse_monster(dir, plev);
+       else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
+       else if (die < 51) (void)lite_line(dir);
+       else if (die < 56)
+               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
+                                 damroll(3 + ((plev - 5) / 4), 8));
+       else if (die < 61)
+               fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
+                                 damroll(5 + ((plev - 5) / 4), 8));
+       else if (die < 66)
+               fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
+                                 damroll(6 + ((plev - 5) / 4), 8));
+       else if (die < 71)
+               fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
+                                 damroll(8 + ((plev - 5) / 4), 8));
+       else if (die < 76) drain_life(dir, 75);
+       else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
+       else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2);
+       else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3);
+       else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3);
+       else if (die < 101) drain_life(dir, 100 + plev);
+       else if (die < 104)
+       {
+               earthquake(py, px, 12);
+       }
+       else if (die < 106)
+       {
+               (void)destroy_area(py, px, 13 + randint0(5), FALSE);
+       }
+       else if (die < 108)
+       {
+               symbol_genocide(plev+50, TRUE);
+       }
+       else if (die < 110) dispel_monsters(120);
+       else /* RARE */
+       {
+               dispel_monsters(150);
+               slow_monsters();
+               sleep_monsters();
+               hp_player(300);
+       }
+}
+
+
+static void cast_invoke_spirits(int dir)
+{
+       int plev = p_ptr->lev;
+       int die = randint1(100) + plev / 5;
+       int vir = virtue_number(V_CHANCE);
+
+       if (vir)
+       {
+               if (p_ptr->virtues[vir - 1] > 0)
+               {
+                       while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
+               }
+               else
+               {
+                       while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
+               }
+       }
+
+#ifdef JP
+       msg_print("¤¢¤Ê¤¿¤Ï»à¼Ô¤¿¤Á¤ÎÎϤò¾·½¸¤·¤¿...");
+#else
+       msg_print("You call on the power of the dead...");
+#endif
+       if (die < 26)
+               chg_virtue(V_CHANCE, 1);
+
+       if (die > 100)
+       {
+#ifdef JP
+               msg_print("¤¢¤Ê¤¿¤Ï¤ª¤É¤í¤ª¤É¤í¤·¤¤ÎϤΤ¦¤Í¤ê¤ò´¶¤¸¤¿¡ª");
+#else
+               msg_print("You feel a surge of eldritch force!");
+#endif
+       }
+
+
+       if (die < 8)
+       {
+#ifdef JP
+               msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¤¢¤Ê¤¿¤Î¼þ¤ê¤ÎÃÏÌ̤«¤éµà¤Á¤¿¿Í±Æ¤¬Î©¤Á¾å¤¬¤Ã¤Æ¤­¤¿¡ª");
+#else
+               msg_print("Oh no! Mouldering forms rise from the earth around you!");
+#endif
+
+               (void)summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
+               chg_virtue(V_UNLIFE, 1);
+       }
+       else if (die < 14)
+       {
+#ifdef JP
+               msg_print("̾¾õ¤·Æñ¤¤¼Ù°­¤Ê¸ºß¤¬¤¢¤Ê¤¿¤Î¿´¤òÄ̤ê²á¤®¤Æ¹Ô¤Ã¤¿...");
+#else
+               msg_print("An unnamable evil brushes against your mind...");
+#endif
+
+               set_afraid(p_ptr->afraid + randint1(4) + 4);
+       }
+       else if (die < 26)
+       {
+#ifdef JP
+               msg_print("¤¢¤Ê¤¿¤ÎƬ¤ËÂçÎ̤ÎÍ©Î¤Á¤ÎÁû¡¹¤·¤¤À¼¤¬²¡¤·´ó¤»¤Æ¤­¤¿...");
+#else
+               msg_print("Your head is invaded by a horde of gibbering spectral voices...");
+#endif
+
+               set_confused(p_ptr->confused + randint1(4) + 4);
+       }
+       else if (die < 31)
+       {
+               poly_monster(dir);
+       }
+       else if (die < 36)
+       {
+               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
+                                 damroll(3 + ((plev - 1) / 5), 4));
+       }
+       else if (die < 41)
+       {
+               confuse_monster (dir, plev);
+       }
+       else if (die < 46)
+       {
+               fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
+       }
+       else if (die < 51)
+       {
+               (void)lite_line(dir);
+       }
+       else if (die < 56)
+       {
+               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
+                                 damroll(3+((plev-5)/4),8));
+       }
+       else if (die < 61)
+       {
+               fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
+                                 damroll(5+((plev-5)/4),8));
+       }
+       else if (die < 66)
+       {
+               fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
+                                 damroll(6+((plev-5)/4),8));
+       }
+       else if (die < 71)
+       {
+               fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
+                                 damroll(8+((plev-5)/4),8));
+       }
+       else if (die < 76)
+       {
+               drain_life(dir, 75);
+       }
+       else if (die < 81)
+       {
+               fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
+       }
+       else if (die < 86)
+       {
+               fire_ball(GF_ACID, dir, 40 + plev, 2);
+       }
+       else if (die < 91)
+       {
+               fire_ball(GF_ICE, dir, 70 + plev, 3);
+       }
+       else if (die < 96)
+       {
+               fire_ball(GF_FIRE, dir, 80 + plev, 3);
+       }
+       else if (die < 101)
+       {
+               drain_life(dir, 100 + plev);
+       }
+       else if (die < 104)
+       {
+               earthquake(py, px, 12);
+       }
+       else if (die < 106)
+       {
+               (void)destroy_area(py, px, 13 + randint0(5), FALSE);
+       }
+       else if (die < 108)
+       {
+               symbol_genocide(plev+50, TRUE);
+       }
+       else if (die < 110)
+       {
+               dispel_monsters(120);
+       }
+       else
+       { /* RARE */
+               dispel_monsters(150);
+               slow_monsters();
+               sleep_monsters();
+               hp_player(300);
+       }
+
+       if (die < 31)
+       {
+#ifdef JP
+               msg_print("±¢±µ¤ÊÀ¼¤¬¥¯¥¹¥¯¥¹¾Ð¤¦¡£¡Ö¤â¤¦¤¹¤°¤ª¤Þ¤¨¤Ï²æ¡¹¤ÎÃç´Ö¤Ë¤Ê¤ë¤À¤í¤¦¡£¼å¤­¼Ô¤è¡£¡×");
+#else
+               msg_print("Sepulchral voices chuckle. 'Soon you will join us, mortal.'");
+#endif
+       }
+}
+
+
+static void wild_magic(int spell)
+{
+       int counter = 0;
+       int type = SUMMON_BIZARRE1 + randint0(6);
+
+       if (type < SUMMON_BIZARRE1) type = SUMMON_BIZARRE1;
+       else if (type > SUMMON_BIZARRE6) type = SUMMON_BIZARRE6;
+
+       switch (randint1(spell) + randint1(8) + 1)
+       {
+       case 1:
+       case 2:
+       case 3:
+               teleport_player(10, TRUE);
+               break;
+       case 4:
+       case 5:
+       case 6:
+               teleport_player(100, TRUE);
+               break;
+       case 7:
+       case 8:
+               teleport_player(200, TRUE);
+               break;
+       case 9:
+       case 10:
+       case 11:
+               unlite_area(10, 3);
+               break;
+       case 12:
+       case 13:
+       case 14:
+               lite_area(damroll(2, 3), 2);
+               break;
+       case 15:
+               destroy_doors_touch();
+               break;
+       case 16: case 17:
+               wall_breaker();
+       case 18:
+               sleep_monsters_touch();
+               break;
+       case 19:
+       case 20:
+               trap_creation(py, px);
+               break;
+       case 21:
+       case 22:
+               door_creation();
+               break;
+       case 23:
+       case 24:
+       case 25:
+               aggravate_monsters(0);
+               break;
+       case 26:
+               earthquake(py, px, 5);
+               break;
+       case 27:
+       case 28:
+               (void)gain_random_mutation(0);
+               break;
+       case 29:
+       case 30:
+               apply_disenchant(1);
+               break;
+       case 31:
+               lose_all_info();
+               break;
+       case 32:
+               fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
+               break;
+       case 33:
+               wall_stone();
+               break;
+       case 34:
+       case 35:
+               while (counter++ < 8)
+               {
+                       (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
+               }
+               break;
+       case 36:
+       case 37:
+               activate_hi_summon(py, px, FALSE);
+               break;
+       case 38:
+               (void)summon_cyber(-1, py, px);
+               break;
+       default:
+               {
+                       int count = 0;
+                       (void)activate_ty_curse(FALSE, &count);
+                       break;
+               }
+       }
+}
+
+
+static void cast_shuffle(void)
+{
+       int plev = p_ptr->lev;
+       int dir;
+       int die;
+       int vir = virtue_number(V_CHANCE);
+       int i;
+
+       /* Card sharks and high mages get a level bonus */
+       if ((p_ptr->pclass == CLASS_ROGUE) ||
+           (p_ptr->pclass == CLASS_HIGH_MAGE) ||
+           (p_ptr->pclass == CLASS_SORCERER))
+               die = (randint1(110)) + plev / 5;
+       else
+               die = randint1(120);
+
+
+       if (vir)
+       {
+               if (p_ptr->virtues[vir - 1] > 0)
+               {
+                       while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
+               }
+               else
+               {
+                       while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
+               }
+       }
+
+#ifdef JP
+       msg_print("¤¢¤Ê¤¿¤Ï¥«¡¼¥É¤òÀڤäưìËç°ú¤¤¤¿...");
+#else
+       msg_print("You shuffle the deck and draw a card...");
+#endif
+
+       if (die < 30)
+               chg_virtue(V_CHANCE, 1);
+
+       if (die < 7)
+       {
+#ifdef JP
+               msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô»à¡Õ¤À¡ª");
+#else
+               msg_print("Oh no! It's Death!");
+#endif
+
+               for (i = 0; i < randint1(3); i++)
+                       activate_hi_summon(py, px, FALSE);
+       }
+       else if (die < 14)
+       {
+#ifdef JP
+               msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô°­Ëâ¡Õ¤À¡ª");
+#else
+               msg_print("Oh no! It's the Devil!");
+#endif
+
+               summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
+       }
+       else if (die < 18)
+       {
+               int count = 0;
+#ifdef JP
+               msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡ÔÄߤé¤ì¤¿ÃË¡Õ¤À¡ª");
+#else
+               msg_print("Oh no! It's the Hanged Man.");
+#endif
+
+               activate_ty_curse(FALSE, &count);
+       }
+       else if (die < 22)
+       {
+#ifdef JP
+               msg_print("¡ÔÉÔĴϤηõ¡Õ¤À¡£");
+#else
+               msg_print("It's the swords of discord.");
+#endif
+
+               aggravate_monsters(0);
+       }
+       else if (die < 26)
+       {
+#ifdef JP
+               msg_print("¡Ô¶ò¼Ô¡Õ¤À¡£");
+#else
+               msg_print("It's the Fool.");
+#endif
+
+               do_dec_stat(A_INT);
+               do_dec_stat(A_WIS);
+       }
+       else if (die < 30)
+       {
+#ifdef JP
+               msg_print("´ñ̯¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
+#else
+               msg_print("It's the picture of a strange monster.");
+#endif
+
+               trump_summoning(1, FALSE, py, px, (dun_level * 3 / 2), (32 + randint1(6)), PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
+       }
+       else if (die < 33)
+       {
+#ifdef JP
+               msg_print("¡Ô·î¡Õ¤À¡£");
+#else
+               msg_print("It's the Moon.");
+#endif
+
+               unlite_area(10, 3);
+       }
+       else if (die < 38)
+       {
+#ifdef JP
+               msg_print("¡Ô±¿Ì¿¤ÎÎØ¡Õ¤À¡£");
+#else
+               msg_print("It's the Wheel of Fortune.");
+#endif
+
+               wild_magic(randint0(32));
+       }
+       else if (die < 40)
+       {
+#ifdef JP
+               msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
+#else
+               msg_print("It's a teleport trump card.");
+#endif
+
+               teleport_player(10, TRUE);
+       }
+       else if (die < 42)
+       {
+#ifdef JP
+               msg_print("¡ÔÀµµÁ¡Õ¤À¡£");
+#else
+               msg_print("It's Justice.");
+#endif
+
+               set_blessed(p_ptr->lev, FALSE);
+       }
+       else if (die < 47)
+       {
+#ifdef JP
+               msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
+#else
+               msg_print("It's a teleport trump card.");
+#endif
+
+               teleport_player(100, TRUE);
+       }
+       else if (die < 52)
+       {
+#ifdef JP
+               msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£");
+#else
+               msg_print("It's a teleport trump card.");
+#endif
+
+               teleport_player(200, TRUE);
+       }
+       else if (die < 60)
+       {
+#ifdef JP
+               msg_print("¡ÔÅã¡Õ¤À¡£");
+#else
+               msg_print("It's the Tower.");
+#endif
+
+               wall_breaker();
+       }
+       else if (die < 72)
+       {
+#ifdef JP
+               msg_print("¡ÔÀáÀ©¡Õ¤À¡£");
+#else
+               msg_print("It's Temperance.");
+#endif
+
+               sleep_monsters_touch();
+       }
+       else if (die < 80)
+       {
+#ifdef JP
+               msg_print("¡ÔÅã¡Õ¤À¡£");
+#else
+               msg_print("It's the Tower.");
+#endif
+
+               earthquake(py, px, 5);
+       }
+       else if (die < 82)
+       {
+#ifdef JP
+               msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
+#else
+               msg_print("It's the picture of a friendly monster.");
+#endif
+
+               trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_BIZARRE1, 0L);
+       }
+       else if (die < 84)
+       {
+#ifdef JP
+               msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
+#else
+               msg_print("It's the picture of a friendly monster.");
+#endif
+
+               trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_BIZARRE2, 0L);
+       }
+       else if (die < 86)
+       {
+#ifdef JP
+               msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
+#else
+               msg_print("It's the picture of a friendly monster.");
+#endif
+
+               trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_BIZARRE4, 0L);
+       }
+       else if (die < 88)
+       {
+#ifdef JP
+               msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£");
+#else
+               msg_print("It's the picture of a friendly monster.");
+#endif
+
+               trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_BIZARRE5, 0L);
+       }
+       else if (die < 96)
+       {
+#ifdef JP
+               msg_print("¡ÔÎø¿Í¡Õ¤À¡£");
+#else
+               msg_print("It's the Lovers.");
+#endif
+
+               if (get_aim_dir(&dir))
+                       charm_monster(dir, MIN(p_ptr->lev, 20));
+       }
+       else if (die < 101)
+       {
+#ifdef JP
+               msg_print("¡Ô±£¼Ô¡Õ¤À¡£");
+#else
+               msg_print("It's the Hermit.");
+#endif
+
+               wall_stone();
+       }
+       else if (die < 111)
+       {
+#ifdef JP
+               msg_print("¡Ô¿³È½¡Õ¤À¡£");
+#else
+               msg_print("It's the Judgement.");
+#endif
+
+               do_cmd_rerate(FALSE);
+               if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
+               {
+#ifdef JP
+                       msg_print("Á´¤Æ¤ÎÆÍÁ³ÊÑ°Û¤¬¼£¤Ã¤¿¡£");
+#else
+                       msg_print("You are cured of all mutations.");
+#endif
+
+                       p_ptr->muta1 = p_ptr->muta2 = p_ptr->muta3 = 0;
+                       p_ptr->update |= PU_BONUS;
+                       handle_stuff();
+               }
+       }
+       else if (die < 120)
+       {
+#ifdef JP
+               msg_print("¡ÔÂÀÍÛ¡Õ¤À¡£");
+#else
+               msg_print("It's the Sun.");
+#endif
+
+               chg_virtue(V_KNOWLEDGE, 1);
+               chg_virtue(V_ENLIGHTEN, 1);
+               wiz_lite(FALSE);
+       }
+       else
+       {
+#ifdef JP
+               msg_print("¡ÔÀ¤³¦¡Õ¤À¡£");
+#else
+               msg_print("It's the World.");
+#endif
+
+               if (p_ptr->exp < PY_MAX_EXP)
+               {
+                       s32b ee = (p_ptr->exp / 25) + 1;
+                       if (ee > 5000) ee = 5000;
+#ifdef JP
+                       msg_print("¹¹¤Ë·Ð¸³¤òÀѤó¤À¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                       msg_print("You feel more experienced.");
+#endif
+
+                       gain_exp(ee);
+               }
+       }
+}
+
+
+/*
+ * Drop 10+1d10 meteor ball at random places near the player
+ */
+static void cast_meteor(int dam, int rad)
+{
+       int i;
+       int b = 10 + randint1(10);
+
+       for (i = 0; i < b; i++)
+       {
+               int y, x;
+               int count;
+
+               for (count = 0; count <= 20; count++)
+               {
+                       int dy, dx, d;
+
+                       x = px - 8 + randint0(17);
+                       y = py - 8 + randint0(17);
+
+                       dx = (px > x) ? (px - x) : (x - px);
+                       dy = (py > y) ? (py - y) : (y - py);
+
+                       /* Approximate distance */
+                       d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
+
+                       if (d >= 9) continue;
+
+                       if (!in_bounds(y, x) || !projectable(py, px, y, x)) continue;
+
+                       /* Valid position */
+                       break;
+               }
+
+               if (count > 20) continue;
+
+               project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
+       }
+}
+
+
+/*
+ * Drop 10+1d10 disintegration ball at random places near the target
+ */
+static bool cast_wrath_of_the_god(int dam, int rad)
+{
+       int x, y, tx, ty;
+       int nx, ny;
+       int dir, i;
+       int b = 10 + randint1(10);
+
+       if (!get_aim_dir(&dir)) return FALSE;
+
+       /* Use the given direction */
+       tx = px + 99 * ddx[dir];
+       ty = py + 99 * ddy[dir];
+
+       /* Hack -- Use an actual "target" */
+       if ((dir == 5) && target_okay())
+       {
+               tx = target_col;
+               ty = target_row;
+       }
+
+       x = px;
+       y = py;
+
+       while (1)
+       {
+               /* Hack -- Stop at the target */
+               if ((y == ty) && (x == tx)) break;
+
+               ny = y;
+               nx = x;
+               mmove2(&ny, &nx, py, px, ty, tx);
+
+               /* Stop at maximum range */
+               if (MAX_RANGE <= distance(py, px, ny, nx)) break;
+
+               /* Stopped by walls/doors */
+               if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break;
+
+               /* Stopped by monsters */
+               if ((dir != 5) && cave[ny][nx].m_idx != 0) break;
+
+               /* Save the new location */
+               x = nx;
+               y = ny;
+       }
+       tx = x;
+       ty = y;
+
+       for (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);
+
+                       /* Approximate distance */
+                       d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
+                       /* Within the radius */
+                       if (d < 5) break;
+               }
+
+               if (count < 0) continue;
+
+               /* Cannot penetrate perm walls */
+               if (!in_bounds(y,x) ||
+                   cave_stop_disintegration(y,x) ||
+                   !in_disintegration_range(ty, tx, y, x))
+                       continue;
+
+               project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
+       }
+
+       return TRUE;
+}
+
+
+/*
+ * An "item_tester_hook" for offer
+ */
+static bool item_tester_offer(object_type *o_ptr)
+{
+       /* Flasks of oil are okay */
+       if (o_ptr->tval != TV_CORPSE) return (FALSE);
+
+       if (o_ptr->sval != SV_CORPSE) return (FALSE);
+
+       if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
+
+       /* Assume not okay */
+       return (FALSE);
+}
+
+
+/*
+ * Daemon spell Summon Greater Demon
+ */
+static bool cast_summon_greater_demon(void)
+{
+       int plev = p_ptr->lev;
+       int item;
+       cptr q, s;
+       int summon_lev;
+       object_type *o_ptr;
+
+       item_tester_hook = item_tester_offer;
+#ifdef JP
+       q = "¤É¤Î»àÂΤòÊû¤²¤Þ¤¹¤«? ";
+       s = "Êû¤²¤é¤ì¤ë»àÂΤò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£";
+#else
+       q = "Sacrifice which corpse? ";
+       s = "You have nothing to scrifice.";
+#endif
+       if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
+
+       /* Get the item (in the pack) */
+       if (item >= 0)
+       {
+               o_ptr = &inventory[item];
+       }
+
+       /* Get the item (on the floor) */
+       else
+       {
+               o_ptr = &o_list[0 - item];
+       }
+
+       summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
+
+       if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
+       {
+#ifdef JP
+               msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
+#else
+               msg_print("The area fills with a stench of sulphur and brimstone.");
+#endif
+
+
+#ifdef JP
+               msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
+#else
+               msg_print("'What is thy bidding... Master?'");
+#endif
+
+               /* Decrease the item (from the pack) */
+               if (item >= 0)
+               {
+                       inven_item_increase(item, -1);
+                       inven_item_describe(item);
+                       inven_item_optimize(item);
+               }
+
+               /* Decrease the item (from the floor) */
+               else
+               {
+                       floor_item_increase(0 - item, -1);
+                       floor_item_describe(0 - item);
+                       floor_item_optimize(0 - item);
+               }
+       }
+       else
+       {
+#ifdef JP
+               msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+               msg_print("No Greater Demon arrive.");
+#endif
+       }
+
+       return TRUE;
+}
+
+
+/*
+ * Do everything for each spell
+ */
+cptr do_singing(int song, int mode)
+{
+       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+       bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
+       bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
+
+#ifdef JP
+       static const char s_dam[] = "»½ý:";
+#else
+       static const char s_dam[] = "dam ";
+#endif
+
+       int plev = p_ptr->lev;
+
+
+       switch (song)
+       {
+       case MUSIC_SLOW:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start humming a slow, steady melody...");
+#endif
+               }
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cont)
+                       {
+                               slow_monsters();
+                       }
+               }
+               break;
+
+       case MUSIC_BLESS:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¸·¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("The holy power of the Music of the Ainur enters you...");
+#endif
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->blessed)
+                       {
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The prayer has expired.");
+#endif
+                       }
+               }
+
+               break;
+
+       case MUSIC_STUN:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("âÁÏǤµ¤»¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a pattern of sounds to bewilder and daze...");
+#endif
+               }
+
+               {
+                       int dice = plev / 10;
+                       int sides = 2;
+
+                       if (info) return info_power_dice(dice, sides);
+
+                       if (cont)
+                       {
+                               stun_monsters(damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_L_LIFE:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Life flows through you as you sing a song of healing...");
+#endif
+               }
+
+               {
+                       int dice = 2;
+                       int sides = 6;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cont)
+                       {
+                               hp_player(damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_FEAR:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤ª¤É¤í¤ª¤É¤í¤·¤¤¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You start weaving a fearful pattern...");
+#endif
+               }
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cont)
+                       {
+                               project_hack(GF_TURN_ALL, power);
+                       }
+               }
+               break;
+
+       case MUSIC_HERO:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("·ã¤·¤¤À襤¤Î²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start singing a song of intense fighting...");
+#endif
+
+                       (void)hp_player(10);
+                       (void)set_afraid(0);
+
+                       /* Recalculate hitpoints */
+                       p_ptr->update |= (PU_HP);
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->hero)
+                       {
+#ifdef JP
+                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The heroism wears off.");
+#endif
+                               /* Recalculate hitpoints */
+                               p_ptr->update |= (PU_HP);
+                       }
+               }
+
+               break;
+
+       case MUSIC_DETECT:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÀŤ«¤Ê²»³Ú¤¬´¶³Ð¤ò¸¦¤®À¡¤Þ¤µ¤»¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Your quiet music sharpens your sense of hearing...");
+#endif
+
+                       /* Hack -- Initialize the turn count */
+                       p_ptr->magic_num1[2] = 0;
+               }
+
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cont)
+                       {
+                               int count = p_ptr->magic_num1[2];
+
+                               if (count >= 19) wiz_lite(FALSE);
+                               if (count >= 11)
+                               {
+                                       map_area(rad);
+                                       if (plev > 39 && count < 19)
+                                               p_ptr->magic_num1[2] = count + 1;
+                               }
+                               if (count >= 6)
+                               {
+                                       /* There are too many hidden treasure.  So... */
+                                       /* detect_treasure(rad); */
+                                       detect_objects_gold(rad);
+                                       detect_objects_normal(rad);
+
+                                       if (plev > 24 && count < 11)
+                                               p_ptr->magic_num1[2] = count + 1;
+                               }
+                               if (count >= 3)
+                               {
+                                       detect_monsters_invis(rad);
+                                       detect_monsters_normal(rad);
+
+                                       if (plev > 19 && count < 6)
+                                               p_ptr->magic_num1[2] = count + 1;
+                               }
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
+
+                               if (plev > 14 && count < 3)
+                                       p_ptr->magic_num1[2] = count + 1;
+                       }
+               }
+               break;
+
+       case MUSIC_PSI:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ë²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start singing a song of soul in pain...");
+#endif
+               }
+
+               {
+                       int dice = 1;
+                       int sides = plev * 3 / 2;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cont)
+                       {
+                               project_hack(GF_PSI, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_ID:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤³¤ÎÀ¤³¦¤ÎÃ챤¬Î®¤ì¹þ¤ó¤Ç¤­¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You recall the rich lore of the world...");
+#endif
+               }
+
+               {
+                       int rad = 1;
+
+                       if (info) return info_radius(rad);
+
+                       /*
+                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
+                        * MPÉÔ­¤Ç´ÕÄ꤬ȯư¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
+                        */
+                       if (cont || cast)
+                       {
+                               project(0, rad, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
+                       }
+               }
+               break;
+
+       case MUSIC_STEALTH:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤Î»Ñ¤¬·Ê¿§¤Ë¤È¤±¤³¤ó¤Ç¤¤¤Ã¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Your song carries you beyond the sight of mortal eyes...");
+#endif
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->tim_stealth)
+                       {
+#ifdef JP
+                               msg_print("»Ñ¤¬¤Ï¤Ã¤­¤ê¤È¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£");
+#else
+                               msg_print("You are no longer hided.");
+#endif
+                       }
+               }
+
+               break;
+
+       case MUSIC_CONF:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÊÕ¤ê°ìÌ̤˸¸±Æ¤¬¸½¤ì¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a pattern of sounds to beguile and confuse...");
+#endif
+               }
+
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cont)
+                       {
+                               confuse_monsters(power);
+                       }
+               }
+               break;
+
+       case MUSIC_SOUND:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¹ì²»¤¬¶Á¤¤¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("The fury of the Downfall of Numenor lashes out...");
+#endif
+               }
+
+               {
+                       int dice = 10 + plev / 5;
+                       int sides = 7;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cont)
+                       {
+                               project_hack(GF_SOUND, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_CHARM:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("°Â¤é¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a slow, soothing melody of imploration...");
+#endif
+               }
+
+               {
+                       int dice = 10 + plev / 15;
+                       int sides = 6;
+
+                       if (info) return info_power_dice(dice, sides);
+
+                       if (cont)
+                       {
+                               charm_monsters(damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_WALL:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Ê´ºÕ¤¹¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a violent pattern of sounds to break wall.");
+#endif
+               }
+
+               {
+                       /*
+                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
+                        * MPÉÔ­¤Ç¸ú²Ì¤¬È¯Æ°¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
+                        */
+                       if (cont || cast)
+                       {
+                               project(0, 0, py, px,
+                                       0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
+                       }
+               }
+               break;
+
+       case MUSIC_RESIST:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¸µÁǤÎÎϤËÂФ¹¤ëǦÂѤβΤò²Î¤Ã¤¿¡£");
+#else
+                       msg_print("You sing a song of perseverance against powers...");
+#endif
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->oppose_acid)
+                       {
+#ifdef JP
+                               msg_print("»À¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to acid.");
+#endif
+                       }
+
+                       if (!p_ptr->oppose_elec)
+                       {
+#ifdef JP
+                               msg_print("ÅÅ·â¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to elec.");
+#endif
+                       }
+
+                       if (!p_ptr->oppose_fire)
+                       {
+#ifdef JP
+                               msg_print("²Ð¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to fire.");
+#endif
+                       }
+
+                       if (!p_ptr->oppose_cold)
+                       {
+#ifdef JP
+                               msg_print("Î䵤¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to cold.");
+#endif
+                       }
+
+                       if (!p_ptr->oppose_pois)
+                       {
+#ifdef JP
+                               msg_print("ÆǤؤÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to pois.");
+#endif
+                       }
+               }
+
+               break;
+
+       case MUSIC_SPEED:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("·Ú²÷¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start singing joyful pop song...");
+#endif
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->fast)
+                       {
+#ifdef JP
+                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
+#else
+                               msg_print("You feel yourself slow down.");
+#endif
+                       }
+               }
+
+               break;
+
+       case MUSIC_DISPEL:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂѤ¨¤é¤ì¤Ê¤¤ÉÔ¶¨Ï²»¤¬Å¨¤òÀÕ¤áΩ¤Æ¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You cry out in an ear-wracking voice...");
+#endif
+               }
+
+               {
+                       int m_sides = plev * 3;
+                       int e_sides = plev * 3;
+
+                       if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
+
+                       if (cont)
+                       {
+                               dispel_monsters(randint1(m_sides));
+                               dispel_evil(randint1(e_sides));
+                       }
+               }
+               break;
+
+       case MUSIC_SARUMAN:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Í¥¤·¤¯¡¢Ì¥ÎÏŪ¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start humming a gentle and attractive song...");
+#endif
+               }
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cont)
+                       {
+                               slow_monsters();
+                               sleep_monsters();
+                       }
+               }
+               break;
+
+       case MUSIC_QUAKE:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Ç˲õŪ¤Ê²Î¤¬¶Á¤­¤ï¤¿¤Ã¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a pattern of sounds to contort and shatter...");
+#endif
+               }
+
+               {
+                       int rad = 10;
+
+                       if (info) return info_radius(rad);
+
+                       if (cont)
+                       {
+                               earthquake(py, px, 10);
+                       }
+               }
+               break;
+
+       case MUSIC_STASIS:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a very slow pattern which is almost likely to stop...");
+#endif
+               }
+
+               {
+                       int power = plev * 4;
+
+                       if (info) return info_power(power);
+
+                       if (cont)
+                       {
+                               stasis_monsters(power);
+                       }
+               }
+               break;
+
+       case MUSIC_SHERO:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("±Ñͺ¤Î²Î¤ò¸ý¤º¤µ¤ó¤À¡¥¡¥¡¥");
+#else
+                       msg_print("You chant a powerful, heroic call to arms...");
+#endif
+                       (void)hp_player(10);
+                       (void)set_afraid(0);
+
+                       /* Recalculate hitpoints */
+                       p_ptr->update |= (PU_HP);
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->hero)
+                       {
+#ifdef JP
+                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The heroism wears off.");
+#endif
+                               /* Recalculate hitpoints */
+                               p_ptr->update |= (PU_HP);
+                       }
+
+                       if (!p_ptr->fast)
+                       {
+#ifdef JP
+                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
+#else
+                               msg_print("You feel yourself slow down.");
+#endif
+                       }
+               }
+
+               {
+                       int dice = 1;
+                       int sides = plev * 3;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cont)
+                       {
+                               dispel_monsters(damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSIC_H_LIFE:
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Life flows through you as you sing the song...");
+#endif
+               }
+
+               {
+                       int dice = 15;
+                       int sides = 10;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cont)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case MUSIC_INVULN:
+               if (cast)
+               {
+#ifdef JP
+                               msg_print("¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤Î̽²¦¤Ø¤ÎÄ©Àï¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+#else
+                               msg_print("You recall the valor of Fingolfin's challenge to the Dark Lord...");
+#endif
+
+                               /* Redraw map */
+                               p_ptr->redraw |= (PR_MAP);
+               
+                               /* Update monsters */
+                               p_ptr->update |= (PU_MONSTERS);
+               
+                               /* Window stuff */
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->invuln)
+                       {
+#ifdef JP
+                               msg_print("̵Ũ¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
+#else
+                               msg_print("The invulnerability wears off.");
+#endif
+                               /* Redraw map */
+                               p_ptr->redraw |= (PR_MAP);
+
+                               /* Update monsters */
+                               p_ptr->update |= (PU_MONSTERS);
+
+                               /* Window stuff */
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                       }
+               }
+
+               break;
+       }
+
+       return "";
+}
+
+
+/*
+ * Start singing if the player is a Bard 
+ */
+static void start_singing(int spell, int song)
+{
+       /* Remember the song index */
+       p_ptr->magic_num1[0] = song;
+
+       /* Remember the index of the spell which activated the song */
+       p_ptr->magic_num2[0] = spell;
+
+
+       /* Get message text of each song and etc. */
+       do_singing(song, SPELL_CAST);
+
+       /* Now the player is singing */
+       set_action(ACTION_SING);
+
+
+       /* Recalculate bonuses */
+       p_ptr->update |= (PU_BONUS);
+
+       /* Redraw status bar */
+       p_ptr->redraw |= (PR_STATUS);
+}
+
+
+/*
+ * Stop singing if the player is a Bard 
+ */
+void stop_singing(void)
+{
+       if (p_ptr->pclass != CLASS_BARD) return;
+
+       /* Are there interupted song? */
+       if (p_ptr->magic_num1[1])
+       {
+               /* Forget interupted song */
+               p_ptr->magic_num1[1] = 0;
+               return;
+       }
+
+       /* The player is singing? */
+       if (!p_ptr->magic_num1[0]) return;
+
+       /* Hack -- if called from set_action(), avoid recursive loop */
+       if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
+
+       /* Message text of each song or etc. */
+       do_singing(p_ptr->magic_num1[0], SPELL_STOP);
+
+       p_ptr->magic_num1[0] = MUSIC_NONE;
+       p_ptr->magic_num2[0] = 0;
+
+       /* Recalculate bonuses */
+       p_ptr->update |= (PU_BONUS);
+
+       /* Redraw status bar */
+       p_ptr->redraw |= (PR_STATUS);
+}
+
+
+/*
+ * Do everything for each spell
+ */
+cptr do_spell(int spell, int 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;
+
+#ifdef JP
+       static const char s_dam[] = "»½ý:";
+       static const char s_random[] = "¥é¥ó¥À¥à";
+       static const char s_rng[] = "¼ÍÄø";
+#else
+       static const char s_dam[] = "dam ";
+       static const char s_random[] = "random";
+       static const char s_rng[] = "rng ";
+#endif
+
+       int dir;
+       int plev = p_ptr->lev;
+
+
+       switch (spell)
+       {
+       case LIFE_SPEL_CURE_LIGHT_WOUNDS:  
+#ifdef JP
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure Light Wounds";
+               if (desc) return "Heals cut and HP a little.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = 10;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut(p_ptr->cut - 10);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_BLESS:  
+#ifdef JP
+               if (name) return "½ËÊ¡";
+               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Bless";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
+#endif
+    
+               {
+                       int base = 12;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_blessed(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CAUSE_LIGHT_WOUNDS:  
+#ifdef JP
+               if (name) return "·Ú½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤Ë¾®¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Cause Light Wounds";
+               if (desc) return "Wounds a monster a little unless resisted.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CALL_LIGHT:  
+#ifdef JP
+               if (name) return "¸÷¤Î¾¤´­";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Call Light";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_DETECT_DOORS_AND_TRAPS:  
+#ifdef JP
+               if (name) return "æ« & ±£¤·Èâ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Doors & Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CURE_MEDIUM_WOUNDS:  
+#ifdef JP
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure Medium Wounds";
+               if (desc) return "Heals cut and HP more.";
+#endif
+    
+               {
+                       int dice = 4;
+                       int sides = 10;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut((p_ptr->cut / 2) - 20);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CURE_POISON:  
+#ifdef JP
+               if (name) return "²òÆÇ";
+               if (desc) return "ÂÎÆâ¤ÎÆǤò¼è¤ê½ü¤¯¡£";
+#else
+               if (name) return "Cure Poison";
+               if (desc) return "Cure poison status.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_poisoned(0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_SATISFY_HUNGER:  
+#ifdef JP
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_food(PY_FOOD_MAX - 1);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_REMOVE_CURSE:  
+#ifdef JP
+               if (name) return "²ò¼ö";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Remove Curse";
+               if (desc) return "Removes normal curses from equipped items.";
+#endif
+
+               {
+                       if (cast)
+                       {
+                               if (remove_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CAUSE_MEDIUM_WOUNDS:  
+#ifdef JP
+               if (name) return "½Å½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÃæ¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Cause Medium Wounds";
+               if (desc) return "Wounds a monster unless resisted.";
+#endif
+    
+               {
+                       int sides = 8 + (plev - 5) / 4;
+                       int dice = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(sides, dice), 0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CURE_CRITICAL_WOUNDS: 
+#ifdef JP
+               if (name) return "Ã×Ì¿½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤòÂçÉý¤Ë²óÉü¤µ¤»¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Cure Critical Wounds";
+               if (desc) return "Heals cut, stun and HP greatly.";
+#endif
+    
+               {
+                       int dice = 8;
+                       int sides = 10;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_RESIST_HEAT_AND_COLD: 
+#ifdef JP
+               if (name) return "ÂÑÇ®ÂÑ´¨";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ð±ê¤ÈÎ䵤¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Heat and Cold";
+               if (desc) return "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_SENSE_SURROUNDINGS: 
+#ifdef JP
+               if (name) return "¼þÊÕ´¶ÃÎ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Sense Surroundings";
+               if (desc) return "Maps nearby area.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_MAP;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               map_area(rad);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_TURN_UNDEAD: 
+#ifdef JP
+               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥¢¥ó¥Ç¥Ã¥É";
+               if (desc) return "»ë³¦Æâ¤Î¥¢¥ó¥Ç¥Ã¥É¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Turn Undead";
+               if (desc) return "Attempts to scare undead monsters in sight.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               turn_undead();
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_HEALING: 
+#ifdef JP
+               if (name) return "ÂÎÎϲóÉü";
+               if (desc) return "¶Ë¤á¤Æ¶¯ÎϤʲóÉü¼öʸ¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Healing";
+               if (desc) return "Much powerful healing magic, and heals cut and stun completely.";
+#endif
+    
+               {
+                       int heal = 300;
+
+                       if (info) return info_heal(0, 0, heal);
+
+                       if (cast)
+                       {
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_GLYPH_OF_WARDING: 
+#ifdef JP
+               if (name) return "·ë³¦¤ÎÌæ¾Ï";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+#else
+               if (name) return "Glyph of Warding";
+               if (desc) return "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               warding_glyph();
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_DISPEL_CURSE: 
+#ifdef JP
+               if (name) return "*²ò¼ö*";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Dispel Curse";
+               if (desc) return "Removes normal and heavy curse from equipped items.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (remove_all_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_PERCEPTION: 
+#ifdef JP
+               if (name) return "´Õ¼±";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+#else
+               if (name) return "Perception";
+               if (desc) return "Identifies an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!ident_spell(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_DISPEL_UNDEAD: 
+#ifdef JP
+               if (name) return "¥¢¥ó¥Ç¥Ã¥ÉÂ໶";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥É¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Dispel Undead";
+               if (desc) return "Damages all undead monsters in sight.";
+#endif
+    
+               {
+                       int dice = 1;
+                       int sides = plev * 5;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_undead(damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_DAY_OF_THE_DOVE: 
+#ifdef JP
+               if (name) return "Æä¤Î¹ï";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Day of the Dove";
+               if (desc) return "Attempts to charm all monsters in sight.";
+#endif
+    
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               charm_monsters(power);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CAUSE_CRITICAL_WOUNDS: 
+#ifdef JP
+               if (name) return "Ã×Ì¿½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Cause Critical Wounds";
+               if (desc) return "Wounds a monster critically unless resisted.";
+#endif
+    
+               {
+                       int dice = 5 + (plev - 5) / 3;
+                       int sides = 15;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_WORD_OF_RECALL: 
+#ifdef JP
+               if (name) return "µ¢´Ô¤Î¾Û";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Word of Recall";
+               if (desc) return "Recalls player from dungeon to town, or from town to the deepest level of dungeon.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               if (!word_of_recall()) return NULL;
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_ALTER_REALITY: 
+#ifdef JP
+               if (name) return "¿¿¼Â¤Îº×ÃÅ";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
+#else
+               if (name) return "Alter Reality";
+               if (desc) return "Recreates current dungeon level.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               alter_reality();
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_WARDING_TRUE: 
+#ifdef JP
+               if (name) return "¿¿¡¦·ë³¦";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤È¼þ°Ï8¥Þ¥¹¤Î¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+#else
+               if (name) return "Warding True";
+               if (desc) return "Creates glyphs in all adjacent squares and under you.";
+#endif
+    
+               {
+                       int rad = 1;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               warding_glyph();
+                               glyph_creation();
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_STERILIZATION: 
+#ifdef JP
+               if (name) return "ÉÔÌÓ²½";
+               if (desc) return "¤³¤Î³¬¤ÎÁý¿£¤¹¤ë¥â¥ó¥¹¥¿¡¼¤¬Áý¿£¤Ç¤­¤Ê¤¯¤Ê¤ë¡£";
+#else
+               if (name) return "Sterilization";
+               if (desc) return "Prevents any breeders on current level from breeding.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               num_repro += MAX_REPRO;
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_DETECTION: 
+#ifdef JP
+               if (name) return "Á´´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detection";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
+#endif
+
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_all(rad);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_ANNIHILATE_UNDEAD: 
+#ifdef JP
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É¾ÃÌÇ";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥¢¥ó¥Ç¥Ã¥É¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Annihilate Undead";
+               if (desc) return "Eliminates all nearby undead monsters, exhausting you.  Powerful or unique monsters may be able to resist.";
+#endif
+    
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               mass_genocide_undead(power, TRUE);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_CLAIRVOYANCE: 
+#ifdef JP
+               if (name) return "ÀéΤ´ã";
+               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Clairvoyance";
+               if (desc) return "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               wiz_lite(FALSE);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_RESTORATION: 
+#ifdef JP
+               if (name) return "Á´Éü³è";
+               if (desc) return "¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¿¥¹¤È·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Restoration";
+               if (desc) return "Restores all stats and experience.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               do_res_stat(A_STR);
+                               do_res_stat(A_INT);
+                               do_res_stat(A_WIS);
+                               do_res_stat(A_DEX);
+                               do_res_stat(A_CON);
+                               do_res_stat(A_CHR);
+                               restore_level();
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_HEALING_TRUE: 
+#ifdef JP
+               if (name) return "*ÂÎÎϲóÉü*";
+               if (desc) return "ºÇ¶¯¤Î¼£Ìþ¤ÎËâË¡¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Healing True";
+               if (desc) return "The greatest healing magic. Heals all HP, cut and stun.";
+#endif
+    
+               {
+                       int heal = 2000;
+
+                       if (info) return info_heal(0, 0, heal);
+
+                       if (cast)
+                       {
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_HOLY_VISION: 
+#ifdef JP
+               if (name) return "À»¤Ê¤ë¥Ó¥¸¥ç¥ó";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+#else
+               if (name) return "Holy Vision";
+               if (desc) return "*Identifies* an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!identify_fully(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case LIFE_SPEL_ULTIMATE_RESISTANCE: 
+#ifdef JP
+               if (name) return "µæ¶Ë¤ÎÂÑÀ­";
+               if (desc) return "°ìÄê»þ´Ö¡¢¤¢¤é¤æ¤ëÂÑÀ­¤òÉÕ¤±¡¢AC¤ÈËâË¡ËɸæǽÎϤò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Ultimate Resistance";
+               if (desc) return "Gives ultimate resistance, bonus to AC and speed.";
+#endif
+    
+               {
+                       int base = plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               int v = randint1(base) + base;
+                               set_fast(v, FALSE);
+                               set_oppose_acid(v, FALSE);
+                               set_oppose_elec(v, FALSE);
+                               set_oppose_fire(v, FALSE);
+                               set_oppose_cold(v, FALSE);
+                               set_oppose_pois(v, FALSE);
+                               set_ultimate_res(v, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_DETECT_MONSTERS: 
+#ifdef JP
+               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Monsters";
+               if (desc) return "Detects all monsters in your vicinity unless invisible.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_normal(rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_PHASE_DOOR: 
+#ifdef JP
+               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Phase Door";
+               if (desc) return "Teleport short distance.";
+#endif
+    
+               {
+                       int range = 10;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_DETECT_DOORS_AND_TRAPS: 
+#ifdef JP
+               if (name) return "櫤ÈÈâ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤ÎÈâ¤È櫤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Doors and Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_LIGHT_AREA: 
+#ifdef JP
+               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Light Area";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_CONFUSE_MONSTER: 
+#ifdef JP
+               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Confuse Monster";
+               if (desc) return "Attempts to confuse a monster.";
+#endif
+    
+               {
+                       int power = (plev * 3) / 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               confuse_monster(dir, power);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_TELEPORT: 
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
+#endif
+    
+               {
+                       int range = plev * 5;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_SLEEP_MONSTER: 
+#ifdef JP
+               if (name) return "¥¹¥ê¡¼¥×¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Sleep Monster";
+               if (desc) return "Attempts to sleep a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               sleep_monster(dir);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_RECHARGING: 
+#ifdef JP
+               if (name) return "ËâÎϽ¼Å¶";
+               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
+#else
+               if (name) return "Recharging";
+               if (desc) return "Recharges staffs, wands or rods.";
+#endif
+    
+               {
+                       int power = plev * 4;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!recharge(power)) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_MAGIC_MAPPING: 
+#ifdef JP
+               if (name) return "ËâË¡¤ÎÃÏ¿Þ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Magic Mapping";
+               if (desc) return "Maps nearby area.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_MAP;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               map_area(rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_IDENTIFY: 
+#ifdef JP
+               if (name) return "´ÕÄê";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+#else
+               if (name) return "Identify";
+               if (desc) return "Identifies an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!ident_spell(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_SLOW_MONSTER: 
+#ifdef JP
+               if (name) return "¥¹¥í¥¦¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¸ºÂ®¤µ¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Slow Monster";
+               if (desc) return "Attempts to slow a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               slow_monster(dir);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_MASS_SLEEP: 
+#ifdef JP
+               if (name) return "¼þÊÕ¥¹¥ê¡¼¥×";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Mass Sleep";
+               if (desc) return "Attempts to sleep all monsters in sight.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               sleep_monsters();
+                       }
+               }
+               break;
+
+       case SORC_SPEL_TELEPORT_AWAY: 
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_HASTE_SELF: 
+#ifdef JP
+               if (name) return "¥¹¥Ô¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
+#else
+               if (name) return "Haste Self";
+               if (desc) return "Hastes you for a while.";
+#endif
+    
+               {
+                       int base = plev;
+                       int sides = 20 + plev;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_fast(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_DETECTION_TRUE: 
+#ifdef JP
+               if (name) return "¿¿¡¦´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detection True";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_all(rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_IDENTIFY_TRUE: 
+#ifdef JP
+               if (name) return "¿¿¡¦´ÕÄê";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+#else
+               if (name) return "Identify True";
+               if (desc) return "*Identifies* an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!identify_fully(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_DETECT_ITEMS_AND_TREASURE: 
+#ifdef JP
+               if (name) return "ʪÂΤȺâÊõ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ÈºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect items and Treasure";
+               if (desc) return "Detects all treasures and items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_objects_normal(rad);
+                               detect_treasure(rad);
+                               detect_objects_gold(rad);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_CHARM_MONSTER: 
+#ifdef JP
+               if (name) return "¥Á¥ã¡¼¥à¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Charm Monster";
+               if (desc) return "Attempts to charm a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               charm_monster(dir, power);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_SENSE_MINDS: 
+#ifdef JP
+               if (name) return "Àº¿À´¶ÃÎ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Sense Minds";
+               if (desc) return "Gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_tim_esp(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_TELEPORT_TO_TOWN: 
+#ifdef JP
+               if (name) return "³¹°ÜÆ°";
+               if (desc) return "³¹¤Ø°ÜÆ°¤¹¤ë¡£ÃϾå¤Ë¤¤¤ë¤È¤­¤·¤«»È¤¨¤Ê¤¤¡£";
+#else
+               if (name) return "Teleport to town";
+               if (desc) return "Teleport to a town which you choose in a moment. Can only be used outdoors.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!tele_town()) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_SELF_KNOWLEDGE: 
+#ifdef JP
+               if (name) return "¼«¸ÊʬÀÏ";
+               if (desc) return "¸½ºß¤Î¼«Ê¬¤Î¾õÂÖ¤ò´°Á´¤ËÃΤ롣";
+#else
+               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.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               self_knowledge();
+                       }
+               }
+               break;
+
+       case SORC_SPEL_TELEPORT_LEVEL: 
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
+               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+#else
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+#ifdef JP
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+#endif
+                               teleport_level(0);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_WORD_OF_RECALL: 
+#ifdef JP
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Word of Recall";
+               if (desc) return "Recalls player from dungeon to town, or from town to the deepest level of dungeon.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               if (!word_of_recall()) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_DIMENSION_DOOR: 
+#ifdef JP
+               if (name) return "¼¡¸µ¤ÎÈâ";
+               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+#else
+               if (name) return "Dimension Door";
+               if (desc) return "Teleport to given location.";
+#endif
+    
+               {
+                       int range = plev / 2 + 10;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
+#else
+                               msg_print("You open a dimensional gate. Choose a destination.");
+#endif
+
+                               if (!dimension_door()) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_PROBING: 
+#ifdef JP
+               if (name) return "Ä´ºº";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Î°À­¡¢»Ä¤êÂÎÎÏ¡¢ºÇÂçÂÎÎÏ¡¢¥¹¥Ô¡¼¥É¡¢ÀµÂΤòÃΤ롣";
+#else
+               if (name) return "Probing";
+               if (desc) return "Proves all monsters' alignment, HP, speed and their true character.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               probing();
+                       }
+               }
+               break;
+
+       case SORC_SPEL_EXPLOSIVE_RUNE: 
+#ifdef JP
+               if (name) return "Çúȯ¤Î¥ë¡¼¥ó";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤ë¤ÈÇúȯ¤·¤Æ¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+#else
+               if (name) return "Explosive Rune";
+               if (desc) return "Sets a glyph under you. The glyph will explode when a monster moves on it.";
+#endif
+    
+               {
+                       int dice = 7;
+                       int sides = 7;
+                       int base = plev;
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               explosive_rune();
+                       }
+               }
+               break;
+
+       case SORC_SPEL_TELEKINESIS: 
+#ifdef JP
+               if (name) return "Ç°Æ°ÎÏ";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼«Ê¬¤Î­¸µ¤Ø°ÜÆ°¤µ¤»¤ë¡£";
+#else
+               if (name) return "Telekinesis";
+               if (desc) return "Pulls a distant item close to you.";
+#endif
+    
+               {
+                       int weight = plev * 15;
+
+                       if (info) return info_weight(weight);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fetch(dir, weight, FALSE);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_CLAIRVOYANCE: 
+#ifdef JP
+               if (name) return "ÀéΤ´ã";
+               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤µ¤é¤Ë¡¢°ìÄê»þ´Ö¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Clairvoyance";
+               if (desc) return "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               chg_virtue(V_KNOWLEDGE, 1);
+                               chg_virtue(V_ENLIGHTEN, 1);
+
+                               wiz_lite(FALSE);
+
+                               if (!p_ptr->telepathy)
+                               {
+                                       set_tim_esp(randint1(sides) + base, FALSE);
+                               }
+                       }
+               }
+               break;
+
+       case SORC_SPEL_CHARM_MONSTERS: 
+#ifdef JP
+               if (name) return "̥λ¤Î»ëÀþ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Charm monsters";
+               if (desc) return "Attempts to charm all monsters in sight.";
+#endif
+    
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               charm_monsters(power);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_ALCHEMY: 
+#ifdef JP
+               if (name) return "Ï£¶â½Ñ";
+               if (desc) return "¥¢¥¤¥Æ¥à1¤Ä¤ò¤ª¶â¤ËÊѤ¨¤ë¡£";
+#else
+               if (name) return "Alchemy";
+               if (desc) return "Turns an item into 1/3 of its value in gold.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!alchemy()) return NULL;
+                       }
+               }
+               break;
+
+       case SORC_SPEL_BANISHMENT: 
+#ifdef JP
+               if (name) return "²øʪÄÉÊü";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Banishment";
+               if (desc) return "Teleports all monsters in sight away unless resisted.";
+#endif
+    
+               {
+                       int power = plev * 4;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               banish_monsters(power);
+                       }
+               }
+               break;
+
+       case SORC_SPEL_GLOBE_OF_INVULNERABILITY: 
+#ifdef JP
+               if (name) return "̵½ý¤Îµå";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¯¤Ê¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£Àڤ줿½Ö´Ö¤Ë¾¯¤·¥¿¡¼¥ó¤ò¾ÃÈñ¤¹¤ë¤Î¤ÇÃí°Õ¡£";
+#else
+               if (name) return "Globe of Invulnerability";
+               if (desc) return "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.";
+#endif
+    
+               {
+                       int base = 4;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_invuln(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_DETECT_CREATURES: 
+#ifdef JP
+               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Creatures";
+               if (desc) return "Detects all monsters in your vicinity unless invisible.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_normal(rad);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_LIGHTNING: 
+#ifdef JP
+               if (name) return "°ðºÊ";
+               if (desc) return "ÅÅ·â¤Îû¤¤¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Lightning";
+               if (desc) return "Fires a short beam of lightning.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+                       int range = plev / 6 + 2;
+
+                       if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
+
+                       if (cast)
+                       {
+                               project_length = range;
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_ELEC, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case NATU_SPEL_DETECT_DOORS_AND_TRAPS: 
+#ifdef JP
+               if (name) return "櫤ÈÈâ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Doors and Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_PRODUCE_FOOD: 
+#ifdef JP
+               if (name) return "¿©ÎÈÀ¸À®";
+               if (desc) return "ËþÊ¢¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Produce Food";
+               if (desc) return "Satisfies hunger.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               object_type forge, *q_ptr = &forge;
+
+#ifdef JP
+                               msg_print("¿©ÎÁ¤òÀ¸À®¤·¤¿¡£");
+#else
+                               msg_print("A food ration is produced.");
+#endif
+
+                               /* Create the food ration */
+                               object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+
+                               /* Drop the object from heaven */
+                               drop_near(q_ptr, -1, py, px);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_DAYLIGHT: 
+#ifdef JP
+               if (name) return "Æü¤Î¸÷";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Daylight";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = (plev / 10) + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               lite_area(damroll(dice, sides), rad);
+
+                               if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
+                               {
+#ifdef JP
+                                       msg_print("Æü¤Î¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
+#else
+                                       msg_print("The daylight scorches your flesh!");
+#endif
+
+#ifdef JP
+                                       take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "Æü¤Î¸÷", -1);
+#else
+                                       take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "daylight", -1);
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case NATU_SPEL_ANIMAL_TAMING: 
+#ifdef JP
+               if (name) return "ưʪ½¬¤·";
+               if (desc) return "ưʪ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Animal Taming";
+               if (desc) return "Attempts to charm an animal.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               charm_animal(dir, power);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_RESIST_ENVIRONMENT: 
+#ifdef JP
+               if (name) return "´Ä¶­¤Ø¤ÎÂÑÀ­";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Environment";
+               if (desc) return "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_CURE_WOUNDS_AND_POISON: 
+#ifdef JP
+               if (name) return "½ý¤ÈÆǼ£ÎÅ";
+               if (desc) return "²ø²æ¤òÁ´²÷¤µ¤»¡¢ÆǤòÂΤ«¤é´°Á´¤Ë¼è¤ê½ü¤­¡¢ÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure Wounds & Poison";
+               if (desc) return "Heals all cut and poison status. Heals HP a little.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = 8;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut(0);
+                               set_poisoned(0);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_STONE_TO_MUD: 
+#ifdef JP
+               if (name) return "´äÀÐÍϲò";
+               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Stone to Mud";
+               if (desc) return "Turns one rock square to mud.";
+#endif
+    
+               {
+                       int dice = 1;
+                       int sides = 30;
+                       int base = 20;
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               wall_to_mud(dir);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_FROST_BOLT: 
+#ifdef JP
+               if (name) return "¥¢¥¤¥¹¡¦¥Ü¥ë¥È";
+               if (desc) return "Î䵤¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Frost Bolt";
+               if (desc) return "Fires a bolt or beam of cold.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case NATU_SPEL_NATURE_AWARENESS: 
+#ifdef JP
+               if (name) return "¼«Á³¤Î³ÐÀÃ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ·¡¢¶á¤¯¤Îæ«¡¢Èâ¡¢³¬ÃÊ¡¢Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Nature Awareness";
+               if (desc) return "Maps nearby area. Detects all monsters, traps, doors and stairs.";
+#endif
+    
+               {
+                       int rad1 = DETECT_RAD_MAP;
+                       int rad2 = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(MAX(rad1, rad2));
+
+                       if (cast)
+                       {
+                               map_area(rad1);
+                               detect_traps(rad2, TRUE);
+                               detect_doors(rad2);
+                               detect_stairs(rad2);
+                               detect_monsters_normal(rad2);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_FIRE_BOLT: 
+#ifdef JP
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";
+               if (desc) return "²Ð±ê¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Fire Bolt";
+               if (desc) return "Fires a bolt or beam of fire.";
+#endif
+    
+               {
+                       int dice = 5 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case NATU_SPEL_RAY_OF_SUNLIGHT: 
+#ifdef JP
+               if (name) return "ÂÀÍÛ¸÷Àþ";
+               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
+#else
+               if (name) return "Ray of Sunlight";
+               if (desc) return "Fires a beam of light which damages to light-sensitive monsters.";
+#endif
+    
+               {
+                       int dice = 6;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               msg_print("ÂÀÍÛ¸÷Àþ¤¬¸½¤ì¤¿¡£");
+#else
+                               msg_print("A line of sunlight appears.");
+#endif
+
+                               lite_line(dir);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_ENTANGLE: 
+#ifdef JP
+               if (name) return "­¤«¤»";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Entangle";
+               if (desc) return "Attempts to slow all monsters in sight.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               slow_monsters();
+                       }
+               }
+               break;
+
+       case NATU_SPEL_SUMMON_ANIMAL: 
+#ifdef JP
+               if (name) return "ưʪ¾¤´­";
+               if (desc) return "ưʪ¤ò1Âξ¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Summon Animal";
+               if (desc) return "Summons an animal.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
+                               {
+#ifdef JP
+                                       msg_print("ưʪ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No animals arrive.");
+#endif
+                               }
+                               break;
+                       }
+               }
+               break;
+
+       case NATU_SPEL_HERBAL_HEALING: 
+#ifdef JP
+               if (name) return "ÌôÁð¼£ÎÅ";
+               if (desc) return "ÂÎÎϤòÂçÉý¤Ë²óÉü¤µ¤»¡¢Éé½ý¡¢Û¯Û°¾õÂÖ¡¢ÆǤ«¤éÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Herbal Healing";
+               if (desc) return "Heals HP greatly. And heals cut, stun and poison completely.";
+#endif
+    
+               {
+                       int heal = 500;
+
+                       if (info) return info_heal(0, 0, heal);
+
+                       if (cast)
+                       {
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
+                               set_poisoned(0);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_STAIR_BUILDING: 
+#ifdef JP
+               if (name) return "³¬ÃÊÀ¸À®";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë°ÌÃ֤˳¬Ãʤòºî¤ë¡£";
+#else
+               if (name) return "Stair Building";
+               if (desc) return "Creates a stair which goes down or up.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               stair_creation();
+                       }
+               }
+               break;
+
+       case NATU_SPEL_STONE_SKIN: 
+#ifdef JP
+               if (name) return "È©Àв½";
+               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Stone Skin";
+               if (desc) return "Gives bonus to AC for a while.";
+#endif
+    
+               {
+                       int base = 20;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_shield(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_RESISTANCE_TRUE: 
+#ifdef JP
+               if (name) return "¿¿¡¦ÂÑÀ­";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               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 which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_acid(randint1(base) + base, FALSE);
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_pois(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_FOREST_CREATION: 
+#ifdef JP
+               if (name) return "¿¹ÎÓÁϤ";
+               if (desc) return "¼þ°Ï¤ËÌÚ¤òºî¤ê½Ð¤¹¡£";
+#else
+               if (name) return "Forest Creation";
+               if (desc) return "Creates trees in all adjacent squares.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               tree_creation();
+                       }
+               }
+               break;
+
+       case NATU_SPEL_ANIMAL_FRIENDSHIP: 
+#ifdef JP
+               if (name) return "ưʪͧÏÂ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Îưʪ¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Animal Friendship";
+               if (desc) return "Attempts to charm all animals in sight.";
+#endif
+    
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               charm_animals(power);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_STONE_TELL: 
+#ifdef JP
+               if (name) return "»î¶âÀÐ";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+#else
+               if (name) return "Stone Tell";
+               if (desc) return "*Identifies* an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!identify_fully(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case NATU_SPEL_WALL_OF_STONE: 
+#ifdef JP
+               if (name) return "ÀФÎÊÉ";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë²ÖÖ¾´ä¤ÎÊɤòºî¤ë¡£";
+#else
+               if (name) return "Wall of Stone";
+               if (desc) return "Creates granite walls in all adjacent squares.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               wall_stone();
+                       }
+               }
+               break;
+
+       case NATU_SPEL_PROTECT_FROM_CORROSION: 
+#ifdef JP
+               if (name) return "Éå¿©ËÉ»ß";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò»À¤Ç½ý¤Ä¤«¤Ê¤¤¤è¤¦²Ã¹©¤¹¤ë¡£";
+#else
+               if (name) return "Protect from Corrosion";
+               if (desc) return "Makes an equipment acid-proof.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!rustproof()) return NULL;
+                       }
+               }
+               break;
+
+       case NATU_SPEL_EARTHQUAKE: 
+#ifdef JP
+               if (name) return "ÃÏ¿Ì";
+               if (desc) return "¼þ°Ï¤Î¥À¥ó¥¸¥ç¥ó¤òÍɤ餷¡¢ÊɤȾ²¤ò¥é¥ó¥À¥à¤ËÆþ¤ìÊѤ¨¤ë¡£";
+#else
+               if (name) return "Earthquake";
+               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
+#endif
+    
+               {
+                       int rad = 10;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               earthquake(py, px, rad);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_CYCLONE: 
+#ifdef JP
+               if (name) return "¥«¥Þ¥¤¥¿¥Á";
+               if (desc) return "Á´Êý¸þ¤Ë¸þ¤«¤Ã¤Æ¹¶·â¤¹¤ë¡£";
+#else
+               if (name) return "Cyclone";
+               if (desc) return "Attacks all adjacent monsters.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int y = 0, x = 0;
+                               cave_type       *c_ptr;
+                               monster_type    *m_ptr;
+
+                               for (dir = 0; dir < 8; dir++)
+                               {
+                                       y = py + ddy_ddd[dir];
+                                       x = px + ddx_ddd[dir];
+                                       c_ptr = &cave[y][x];
+
+                                       /* Get the monster */
+                                       m_ptr = &m_list[c_ptr->m_idx];
+
+                                       /* Hack -- attack monsters */
+                                       if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
+                                               py_attack(y, x, 0);
+                               }
+                       }
+               }
+               break;
+
+       case NATU_SPEL_BLIZZARD: 
+#ifdef JP
+               if (name) return "¥Ö¥ê¥¶¡¼¥É";
+               if (desc) return "µðÂç¤ÊÎ䵤¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Blizzard";
+               if (desc) return "Fires a huge ball of cold.";
+#endif
+    
+               {
+                       int dam = 70 + plev * 3 / 2;
+                       int rad = plev / 12 + 1;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_COLD, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_LIGHTNING_STORM: 
+#ifdef JP
+               if (name) return "°ðºÊÍò";
+               if (desc) return "µðÂç¤ÊÅÅ·â¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Lightning Storm";
+               if (desc) return "Fires a huge electric ball.";
+#endif
+    
+               {
+                       int dam = 90 + plev * 3 / 2;
+                       int rad = plev / 12 + 1;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_ELEC, dir, dam, rad);
+                               break;
+                       }
+               }
+               break;
+
+       case NATU_SPEL_WHIRLPOOL: 
+#ifdef JP
+               if (name) return "±²Ä¬";
+               if (desc) return "µðÂç¤Ê¿å¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Whirlpool";
+               if (desc) return "Fires a huge ball of water.";
+#endif
+    
+               {
+                       int dam = 100 + plev * 3 / 2;
+                       int rad = plev / 12 + 1;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_WATER, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case NATU_SPEL_CALL_SUNLIGHT: 
+#ifdef JP
+               if (name) return "ÍÛ¸÷¾¤´­";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¸÷¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£¤µ¤é¤Ë¡¢¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               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.";
+#endif
+    
+               {
+                       int dam = 150;
+                       int rad = 8;
+
+                       if (info) return info_damage(0, 0, dam/2);
+
+                       if (cast)
+                       {
+                               fire_ball(GF_LITE, 0, dam, rad);
+                               chg_virtue(V_KNOWLEDGE, 1);
+                               chg_virtue(V_ENLIGHTEN, 1);
+                               wiz_lite(FALSE);
+
+                               if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
+                               {
+#ifdef JP
+                                       msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
+#else
+                                       msg_print("The sunlight scorches your flesh!");
+#endif
+
+#ifdef JP
+                                       take_hit(DAMAGE_NOESCAPE, 50, "Æü¸÷", -1);
+#else
+                                       take_hit(DAMAGE_NOESCAPE, 50, "sunlight", -1);
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case NATU_SPEL_ELEMENTAL_BRANDING: 
+#ifdef JP
+               if (name) return "ÀºÎî¤Î¿Ï";
+               if (desc) return "Éð´ï¤Ë±ê¤«Î䵤¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Elemental Branding";
+               if (desc) return "Makes current weapon fire or frost branded.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(randint0(2));
+                       }
+               }
+               break;
+
+       case NATU_SPEL_NATURES_WRATH: 
+#ifdef JP
+               if (name) return "¼«Á³¤Î¶¼°Ò";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÃϿ̤òµ¯¤³¤·¡¢¼«Ê¬¤òÃæ¿´¤È¤·¤¿Ê¬²ò¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+#else
+               if (name) return "Nature's Wrath";
+               if (desc) return "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.";
+#endif
+    
+               {
+                       int d_dam = 4 * plev;
+                       int b_dam = (100 + plev) * 2;
+                       int b_rad = 1 + plev / 12;
+                       int q_rad = 20 + plev / 2;
+
+                       if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
+
+                       if (cast)
+                       {
+                               dispel_monsters(d_dam);
+                               earthquake(py, px, q_rad);
+                               project(0, b_rad, py, px, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_MAGIC_MISSILE: 
+#ifdef JP
+               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë";
+               if (desc) return "¼å¤¤ËâË¡¤ÎÌð¤òÊü¤Ä¡£";
+#else
+               if (name) return "Magic Missile";
+               if (desc) return "Fires a weak bolt of magic.";
+#endif
+    
+               {
+                       int dice = 3 + ((plev - 1) / 5);
+                       int sides = 4;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_TRAP_DOOR_DESTRUCTION: 
+#ifdef JP
+               if (name) return "¥È¥é¥Ã¥×/¥É¥¢Ç˲õ";
+               if (desc) return "ÎÙÀܤ¹¤ë櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Trap / Door Destruction";
+               if (desc) return "Destroys all traps in adjacent squares.";
+#endif
+    
+               {
+                       int rad = 1;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               destroy_doors_touch();
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_FLASH_OF_LIGHT: 
+#ifdef JP
+               if (name) return "Á®¸÷";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Flash of Light";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = (plev / 10) + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_TOUCH_OF_CONFUSION: 
+#ifdef JP
+               if (name) return "º®Íð¤Î¼ê";
+               if (desc) return "Áê¼ê¤òº®Í𤵤»¤ë¹¶·â¤ò¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Touch of Confusion";
+               if (desc) return "Attempts to confuse the next monster that you hit.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!(p_ptr->special_attack & ATTACK_CONFUSE))
+                               {
+#ifdef JP
+                                       msg_print("¤¢¤Ê¤¿¤Î¼ê¤Ï¸÷¤ê»Ï¤á¤¿¡£");
+#else
+                                       msg_print("Your hands start glowing.");
+#endif
+
+                                       p_ptr->special_attack |= ATTACK_CONFUSE;
+                                       p_ptr->redraw |= (PR_STATUS);
+                               }
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_MANA_BURST:
+#ifdef JP
+               if (name) return "ËâÎÏßÚÎö";
+               if (desc) return "ËâË¡¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Mana Burst";
+               if (desc) return "Fires a ball of magic.";
+#endif
+    
+               {
+                       int dice = 3;
+                       int sides = 5;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
+
+                       if (p_ptr->pclass == CLASS_MAGE ||
+                           p_ptr->pclass == CLASS_HIGH_MAGE ||
+                           p_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(&dir)) return NULL;
+
+                               fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
+
+                               /*
+                                * Shouldn't actually use GF_MANA, as
+                                * it will destroy all items on the
+                                * floor
+                                */
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_FIRE_BOLT:
+#ifdef JP
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";
+               if (desc) return "±ê¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Fire Bolt";
+               if (desc) return "Fires a bolt or beam of fire.";
+#endif
+    
+               {
+                       int dice = 8 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_FIST_OF_FORCE:
+#ifdef JP
+               if (name) return "ÎϤηý";
+               if (desc) return "¤´¤¯¾®¤µ¤Êʬ²ò¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Fist of Force";
+               if (desc) return "Fires a tiny ball of disintegration.";
+#endif
+    
+               {
+                       int dice = 8 + ((plev - 5) / 4);
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DISINTEGRATE, dir,
+                                       damroll(dice, sides), 0);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_TELEPORT_SELF:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Teleport Self";
+               if (desc) return "Teleport long distance.";
+#endif
+    
+               {
+                       int range = plev * 5;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_WONDER:
+#ifdef JP
+               if (name) return "¥ï¥ó¥À¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Ë¥é¥ó¥À¥à¤Ê¸ú²Ì¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Wonder";
+               if (desc) return "Fires something with random effects.";
+#endif
+    
+               {
+                       if (info) return s_random;
+
+                       if (cast)
+                       {
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               cast_wonder(dir);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_CHAOS_BOLT:
+#ifdef JP
+               if (name) return "¥«¥ª¥¹¡¦¥Ü¥ë¥È";
+               if (desc) return "¥«¥ª¥¹¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Chaos Bolt";
+               if (desc) return "Fires a bolt or ball of chaos.";
+#endif
+    
+               {
+                       int dice = 10 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_SONIC_BOOM:
+#ifdef JP
+               if (name) return "¥½¥Ë¥Ã¥¯¡¦¥Ö¡¼¥à";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¹ì²»¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+#else
+               if (name) return "Sonic Boom";
+               if (desc) return "Generates a ball of sound centered on you.";
+#endif
+    
+               {
+                       int dam = 60 + plev;
+                       int rad = plev / 10 + 2;
+
+                       if (info) return info_damage(0, 0, dam/2);
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("¥É¡¼¥ó¡ªÉô²°¤¬Íɤ줿¡ª");
+#else
+                               msg_print("BOOM! Shake the room!");
+#endif
+
+                               project(0, rad, py, px, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_DOOM_BOLT:
+#ifdef JP
+               if (name) return "ÇËÌǤÎÌð";
+               if (desc) return "½ã¿è¤ÊËâÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Doom Bolt";
+               if (desc) return "Fires a beam of pure mana.";
+#endif
+    
+               {
+                       int dice = 11 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_MANA, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_FIRE_BALL:
+#ifdef JP
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";
+               if (desc) return "±ê¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Fire Ball";
+               if (desc) return "Fires a ball of fire.";
+#endif
+    
+               {
+                       int dam = plev + 55;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_FIRE, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_TELEPORT_OTHER:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥¢¥¦¥§¥¤";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Teleport Other";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_WORD_OF_DESTRUCTION:
+#ifdef JP
+               if (name) return "Ç˲õ¤Î¸ÀÍÕ";
+               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Word of Destruction";
+               if (desc) return "Destroy everything in nearby area.";
+#endif
+    
+               {
+                       int base = 12;
+                       int sides = 4;
+
+                       if (cast)
+                       {
+                               destroy_area(py, px, base + randint1(sides), FALSE);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_INVOKE_LOGRUS:
+#ifdef JP
+               if (name) return "¥í¥°¥ë¥¹È¯Æ°";
+               if (desc) return "µðÂç¤Ê¥«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Invoke Logrus";
+               if (desc) return "Fires a huge ball of chaos.";
+#endif
+    
+               {
+                       int dam = plev * 2 + 99;
+                       int rad = plev / 5;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_CHAOS, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_POLYMORPH_OTHER:
+#ifdef JP
+               if (name) return "¾¼ÔÊÑÍÆ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòÊѿȤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Polymorph Other";
+               if (desc) return "Attempts to polymorph a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               poly_monster(dir);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_CHAIN_LIGHTNING:
+#ifdef JP
+               if (name) return "Ï¢º¿°ðºÊ";
+               if (desc) return "Á´Êý¸þ¤ËÂФ·¤ÆÅÅ·â¤Î¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Chain Lightning";
+               if (desc) return "Fires lightning beams in all directions.";
+#endif
+    
+               {
+                       int dice = 5 + plev / 10;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               for (dir = 0; dir <= 9; dir++)
+                                       fire_beam(GF_ELEC, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_ARCANE_BINDING:
+#ifdef JP
+               if (name) return "ËâÎÏÉõÆþ";
+               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
+#else
+               if (name) return "Arcane Binding";
+               if (desc) return "Recharges staffs, wands or rods.";
+#endif
+    
+               {
+                       int power = 90;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!recharge(power)) return NULL;
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_DISINTEGRATE:
+#ifdef JP
+               if (name) return "¸¶»Òʬ²ò";
+               if (desc) return "µðÂç¤Êʬ²ò¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Disintegrate";
+               if (desc) return "Fires a huge ball of disintegration.";
+#endif
+    
+               {
+                       int dam = plev + 70;
+                       int rad = 3 + plev / 40;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DISINTEGRATE, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_ALTER_REALITY:
+#ifdef JP
+               if (name) return "¸½¼ÂÊÑÍÆ";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
+#else
+               if (name) return "Alter Reality";
+               if (desc) return "Recreates current dungeon level.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               alter_reality();
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_MAGIC_ROCKET:
+#ifdef JP
+               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥í¥±¥Ã¥È";
+               if (desc) return "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë¡£";
+#else
+               if (name) return "Magic Rocket";
+               if (desc) return "Fires a magic rocket.";
+#endif
+    
+               {
+                       int dam = 120 + plev * 2;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+#ifdef JP
+                               msg_print("¥í¥±¥Ã¥Èȯ¼Í¡ª");
+#else
+                               msg_print("You launch a rocket!");
+#endif
+
+                               fire_rocket(GF_ROCKET, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_CHAOS_BRANDING:
+#ifdef JP
+               if (name) return "º®Æ٤οÏ";
+               if (desc) return "Éð´ï¤Ë¥«¥ª¥¹¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Chaos Branding";
+               if (desc) return "Makes current weapon a Chaotic weapon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(2);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_SUMMON_DEMON:
+#ifdef JP
+               if (name) return "°­Ë⾤´­";
+               if (desc) return "°­Ëâ¤ò1Âξ¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Summon Demon";
+               if (desc) return "Summons a demon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               u32b mode = 0L;
+                               bool pet = !one_in_(3);
+
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= PM_NO_PET;
+                               if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
+
+                               if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, mode))
+                               {
+#ifdef JP
+                                       msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
+#else
+                                       msg_print("The area fills with a stench of sulphur and brimstone.");
+#endif
+
+                                       if (pet)
+                                       {
+#ifdef JP
+                                               msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
+#else
+                                               msg_print("'What is thy bidding... Master?'");
+#endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×");
+#else
+                                               msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_BEAM_OF_GRAVITY:
+#ifdef JP
+               if (name) return "½ÅÎϸ÷Àþ";
+               if (desc) return "½ÅÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Beam of Gravity";
+               if (desc) return "Fires a beam of gravity.";
+#endif
+    
+               {
+                       int dice = 9 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_METEOR_SWARM:
+#ifdef JP
+               if (name) return "ήÀ±·²";
+               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
+#else
+               if (name) return "Meteor Swarm";
+               if (desc) return "Makes meteor balls fall down to nearby random locations.";
+#endif
+    
+               {
+                       int dam = plev * 2;
+                       int rad = 2;
+
+                       if (info) return info_multi_damage(dam);
+
+                       if (cast)
+                       {
+                               cast_meteor(dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_FLAME_STRIKE:
+#ifdef JP
+               if (name) return "±ë¤Î°ì·â";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿Ä¶µðÂç¤Ê±ê¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+#else
+               if (name) return "Flame Strike";
+               if (desc) return "Generate a huge ball of fire centered on you.";
+#endif
+    
+               {
+                       int dam = 300 + 3 * plev;
+                       int rad = 8;
+
+                       if (info) return info_damage(0, 0, dam/2);
+
+                       if (cast)
+                       {
+                               fire_ball(GF_FIRE, 0, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_CALL_CHAOS:
+#ifdef JP
+               if (name) return "º®ÆÙ¾¤Íè";
+               if (desc) return "¥é¥ó¥À¥à¤Ê°À­¤Îµå¤ä¥Ó¡¼¥à¤òȯÀ¸¤µ¤»¤ë¡£";
+#else
+               if (name) return "Call Chaos";
+               if (desc) return "Generate random kind of balls or beams.";
+#endif
+    
+               {
+                       if (info) return format("%s150 / 250", s_dam);
+
+                       if (cast)
+                       {
+                               call_chaos();
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_POLYMORPH_SELF:
+#ifdef JP
+               if (name) return "¼«¸ÊÊÑÍÆ";
+               if (desc) return "¼«Ê¬¤òÊѿȤµ¤»¤è¤¦¤È¤¹¤ë¡£";
+#else
+               if (name) return "Polymorph Self";
+               if (desc) return "Polymorphs yourself.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+#ifdef JP
+                               if (!get_check("ÊѿȤ·¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("You will polymorph yourself. Are you sure? ")) return NULL;
+#endif
+                               do_poly_self();
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_MANA_STORM:
+#ifdef JP
+               if (name) return "ËâÎϤÎÍò";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤǵðÂç¤Ê½ã¿è¤ÊËâÎϤεå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Mana Storm";
+               if (desc) return "Fires an extremely powerful huge ball of pure mana.";
+#endif
+    
+               {
+                       int dam = 300 + plev * 4;
+                       int rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_MANA, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_BREATHE_LOGRUS:
+#ifdef JP
+               if (name) return "¥í¥°¥ë¥¹¤Î¥Ö¥ì¥¹";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤʥ«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Breathe Logrus";
+               if (desc) return "Fires an extremely powerful ball of chaos.";
+#endif
+    
+               {
+                       int dam = p_ptr->chp;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_CHAOS, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CHAO_SPEL_CALL_THE_VOID:
+#ifdef JP
+               if (name) return "µõ̵¾¤Íè";
+               if (desc) return "¼«Ê¬¤Ë¼þ°Ï¤Ë¸þ¤«¤Ã¤Æ¡¢¥í¥±¥Ã¥È¡¢½ã¿è¤ÊËâÎϤε塢Êü¼ÍÀ­ÇÑ´þʪ¤Îµå¤òÊü¤Ä¡£¤¿¤À¤·¡¢ÊɤËÎÙÀܤ·¤Æ»ÈÍѤ¹¤ë¤È¹­ÈϰϤòÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Call the Void";
+               if (desc) return "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.";
+#endif
+    
+               {
+                       if (info) return format("%s3 * 175", s_dam);
+
+                       if (cast)
+                       {
+                               call_the_();
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_DETECT_UNLIFE:
+#ifdef JP
+               if (name) return "̵À¸Ì¿´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Unlife";
+               if (desc) return "Detects all nonliving monsters in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_nonliving(rad);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_MALEDICTION:
+#ifdef JP
+               if (name) return "¼ö»¦ÃÆ";
+               if (desc) return "¤´¤¯¾®¤µ¤Ê¼Ù°­¤ÊÎϤò»ý¤Ä¥Ü¡¼¥ë¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Malediction";
+               if (desc) return "Fires a tiny ball of evil power which hurts good monsters greatly.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+                       int rad = 0;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&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(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(GF_DEATH_RAY, dir, plev * 200, 0);
+                                       else if (effect < 500)
+                                               fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
+                                       else if (effect < 800)
+                                               fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
+                                       else
+                                               fire_ball_hide(GF_STUN, dir, plev, 0);
+                               }
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_DETECT_EVIL:
+#ifdef JP
+               if (name) return "¼Ù°­´¶ÃÎ";
+               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Evil";
+               if (desc) return "Detects all evil monsters in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_evil(rad);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_STINKING_CLOUD:
+#ifdef JP
+               if (name) return "°­½­±À";
+               if (desc) return "ÆǤεå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Stinking Cloud";
+               if (desc) return "Fires a ball of poison.";
+#endif
+    
+               {
+                       int dam = 10 + plev / 2;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_POIS, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_BLACK_SLEEP:
+#ifdef JP
+               if (name) return "¹õ¤¤Ì²¤ê";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Black Sleep";
+               if (desc) return "Attempts to sleep a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               sleep_monster(dir);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_RESIST_POISON:
+#ifdef JP
+               if (name) return "ÂÑÆÇ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÆǤؤÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Poison";
+               if (desc) return "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_pois(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_HORRIFY:
+#ifdef JP
+               if (name) return "¶²¹²";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Horrify";
+               if (desc) return "Attempts to scare and stun a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fear_monster(dir, power);
+                               stun_monster(dir, power);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_ENSLAVE_UNDEAD:
+#ifdef JP
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É½¾Â°";
+               if (desc) return "¥¢¥ó¥Ç¥Ã¥É1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Enslave Undead";
+               if (desc) return "Attempts to charm an undead monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               control_one_undead(dir, power);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_ORB_OF_ENTROPY:
+#ifdef JP
+               if (name) return "¥¨¥ó¥È¥í¥Ô¡¼¤Îµå";
+               if (desc) return "À¸Ì¿¤Î¤¢¤ë¼Ô¤Ë¸ú²Ì¤Î¤¢¤ëµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Orb of Entropy";
+               if (desc) return "Fires a ball which damages living monsters.";
+#endif
+    
+               {
+                       int dice = 3;
+                       int sides = 6;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
+
+                       if (p_ptr->pclass == CLASS_MAGE ||
+                           p_ptr->pclass == CLASS_HIGH_MAGE ||
+                           p_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(&dir)) return NULL;
+
+                               fire_ball(GF_OLD_DRAIN, dir, damroll(dice, dice) + base, rad);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_NETHER_BOLT:
+#ifdef JP
+               if (name) return "ÃϹö¤ÎÌð";
+               if (desc) return "ÃϹö¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Nether Bolt";
+               if (desc) return "Fires a bolt or beam of nether.";
+#endif
+    
+               {
+                       int dice = 8 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_CLOUD_KILL:
+#ifdef JP
+               if (name) return "»¦Ù¤±À";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿ÆǤεå¤òȯÀ¸¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cloud kill";
+               if (desc) return "Generate a ball of poison centered on you.";
+#endif
+    
+               {
+                       int dam = (30 + plev) * 2;
+                       int rad = plev / 10 + 2;
+
+                       if (info) return info_damage(0, 0, dam/2);
+
+                       if (cast)
+                       {
+                               project(0, rad, py, px, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_GENOCIDE_ONE:
+#ifdef JP
+               if (name) return "¥â¥ó¥¹¥¿¡¼¾ÃÌÇ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¾Ã¤·µî¤ë¡£·Ð¸³Ãͤ䥢¥¤¥Æ¥à¤Ï¼ê¤ËÆþ¤é¤Ê¤¤¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Genocide One";
+               if (desc) return "Attempts to vanish a monster.";
+#endif
+    
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball_hide(GF_GENOCIDE, dir, power, 0);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_POISON_BRANDING:
+#ifdef JP
+               if (name) return "ÆǤοÏ";
+               if (desc) return "Éð´ï¤ËÆǤΰÀ­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Poison Branding";
+               if (desc) return "Makes current weapon poison branded.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(3);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_VAMPIRIC_DRAIN:
+#ifdef JP
+               if (name) return "µÛ·ì¥É¥ì¥¤¥ó";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆËþÊ¢ÅÙ¤¬¾å¤¬¤ë¡£";
+#else
+               if (name) return "Vampiric Drain";
+               if (desc) return "Absorbs some HP from a monster and gives them to you. You will also gain nutritional sustenance from this.";
+#endif
+    
+               {
+                       int dice = 1;
+                       int sides = plev * 2;
+                       int base = plev * 2;
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               int dam = base + damroll(dice, sides);
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               if (drain_life(dir, dam))
+                               {
+                                       chg_virtue(V_SACRIFICE, -1);
+                                       chg_virtue(V_VITALITY, -1);
+
+                                       hp_player(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 = p_ptr->food + MIN(5000, 100 * dam);
+
+                                       /* Not gorged already */
+                                       if (p_ptr->food < PY_FOOD_MAX)
+                                               set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
+                               }
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_ANIMATE_DEAD:
+#ifdef JP
+               if (name) return "È¿º²¤Î½Ñ";
+               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
+#else
+               if (name) return "Animate dead";
+               if (desc) return "Resurrects nearby corpse and skeletons. And makes these your pets.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               animate_dead(0, py, px);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_GENOCIDE:
+#ifdef JP
+               if (name) return "Ëõ»¦";
+               if (desc) return "»ØÄꤷ¤¿Ê¸»ú¤Î¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Genocide";
+               if (desc) return "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.";
+#endif
+    
+               {
+                       int power = plev+50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               symbol_genocide(power, TRUE);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_BERSERK:
+#ifdef JP
+               if (name) return "¶¸Àï»Î²½";
+               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤¹¤ë¡£";
+#else
+               if (name) return "Berserk";
+               if (desc) return "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.";
+#endif
+    
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_shero(randint1(base) + base, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_INVOKE_SPIRITS:
+#ifdef JP
+               if (name) return "°­Î´­";
+               if (desc) return "¥é¥ó¥À¥à¤ÇÍÍ¡¹¤Ê¸ú²Ì¤¬µ¯¤³¤ë¡£";
+#else
+               if (name) return "Invoke Spirits";
+               if (desc) return "Causes random effects.";
+#endif
+    
+               {
+                       if (info) return s_random;
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               cast_invoke_spirits(dir);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_DARK_BOLT:
+#ifdef JP
+               if (name) return "°Å¹õ¤ÎÌð";
+               if (desc) return "°Å¹õ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Dark Bolt";
+               if (desc) return "Fires a bolt or beam of darkness.";
+#endif
+    
+               {
+                       int dice = 4 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_BATTLE_FRENZY:
+#ifdef JP
+               if (name) return "¶¸ÍðÀï»Î";
+               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤·¡¢²Ã®¤¹¤ë¡£";
+#else
+               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.";
+#endif
+    
+               {
+                       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)
+                       {
+                               set_shero(randint1(25) + 25, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
+                               set_fast(randint1(sp_sides) + sp_base, FALSE);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_VAMPIRIC_BRANDING:
+#ifdef JP
+               if (name) return "µÛ·ì¤Î¿Ï";
+               if (desc) return "Éð´ï¤ËµÛ·ì¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Vampiric Branding";
+               if (desc) return "Makes current weapon Vampiric.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(4);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_VAMPIRISM_TRUE:
+#ifdef JP
+               if (name) return "¿¿¡¦µÛ·ì";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆÂÎÎϤ¬²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Vampirism True";
+               if (desc) return "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.";
+#endif
+    
+               {
+                       int dam = 100;
+
+                       if (info) return format("%s3*%d", s_dam, dam);
+
+                       if (cast)
+                       {
+                               int i;
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               chg_virtue(V_SACRIFICE, -1);
+                               chg_virtue(V_VITALITY, -1);
+
+                               for (i = 0; i < 3; i++)
+                               {
+                                       if (drain_life(dir, dam))
+                                               hp_player(dam);
+                               }
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_NETHER_WAVE:
+#ifdef JP
+               if (name) return "»à¤Î¸Àº²";
+               if (desc) return "»ë³¦Æâ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Nether Wave";
+               if (desc) return "Damages all living monsters in sight.";
+#endif
+    
+               {
+                       int sides = plev * 3;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_living(randint1(sides));
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_DARKNESS_STORM:
+#ifdef JP
+               if (name) return "°Å¹õ¤ÎÍò";
+               if (desc) return "µðÂç¤Ê°Å¹õ¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Darkness Storm";
+               if (desc) return "Fires a huge ball of darkness.";
+#endif
+    
+               {
+                       int dam = 100 + plev * 2;
+                       int rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DARK, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_DEATH_RAY:
+#ifdef JP
+               if (name) return "»à¤Î¸÷Àþ";
+               if (desc) return "»à¤Î¸÷Àþ¤òÊü¤Ä¡£";
+#else
+               if (name) return "Death Ray";
+               if (desc) return "Fires a beam of death.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               death_ray(dir, plev);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_RAISE_THE_DEAD:
+#ifdef JP
+               if (name) return "»à¼Ô¾¤´­";
+               if (desc) return "1ÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Raise the Dead";
+               if (desc) return "Summons an undead monster.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int type;
+                               bool pet = one_in_(3);
+                               u32b mode = 0L;
+
+                               type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
+
+                               if (!pet || (pet && (plev > 24) && one_in_(3)))
+                                       mode |= PM_ALLOW_GROUP;
+
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
+
+                               if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, mode))
+                               {
+#ifdef JP
+                                       msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
+#else
+                                       msg_print("Cold winds begin to blow around you, carrying with them the stench of decay...");
+#endif
+
+
+                                       if (pet)
+                                       {
+#ifdef JP
+                                               msg_print("¸Å¤¨¤Î»à¤»¤ë¼Ô¶¦¤¬¤¢¤Ê¤¿¤Ë»Å¤¨¤ë¤¿¤áÅÚ¤«¤éᴤä¿¡ª");
+#else
+                                               msg_print("Ancient, long-dead forms arise from the ground to serve you!");
+#endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               msg_print("»à¼Ô¤¬á´¤Ã¤¿¡£Ì²¤ê¤ò˸¤²¤ë¤¢¤Ê¤¿¤òȳ¤¹¤ë¤¿¤á¤Ë¡ª");
+#else
+                                               msg_print("'The dead arise... to punish you for disturbing them!'");
+#endif
+                                       }
+
+                                       chg_virtue(V_UNLIFE, 1);
+                               }
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_ESOTERIA:
+#ifdef JP
+               if (name) return "»à¼Ô¤ÎÈëÅÁ";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò1¤Ä¼±Ê̤¹¤ë¡£¥ì¥Ù¥ë¤¬¹â¤¤¤È¥¢¥¤¥Æ¥à¤ÎǽÎϤò´°Á´¤ËÃΤ뤳¤È¤¬¤Ç¤­¤ë¡£";
+#else
+               if (name) return "Esoteria";
+               if (desc) return "Identifies an item. Or *identifies* an item at higher level.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (randint1(50) > plev)
+                               {
+                                       if (!ident_spell(FALSE)) return NULL;
+                               }
+                               else
+                               {
+                                       if (!identify_fully(FALSE)) return NULL;
+                               }
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_POLYMORPH_VAMPIRE:
+#ifdef JP
+               if (name) return "µÛ·ìµ´ÊѲ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢µÛ·ìµ´¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤ËµÛ·ìµ´¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Polymorph Vampire";
+               if (desc) return "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.";
+#endif
+    
+               {
+                       int base = 10 + plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_RESTORE_LIFE:
+#ifdef JP
+               if (name) return "À¸Ì¿ÎÏÉü³è";
+               if (desc) return "¼º¤Ã¤¿·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Restore Life";
+               if (desc) return "Restore lost experience.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               restore_level();
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_MASS_GENOCIDE:
+#ifdef JP
+               if (name) return "¼þÊÕËõ»¦";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Mass Genocide";
+               if (desc) return "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.";
+#endif
+    
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               mass_genocide(power, TRUE);
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_HELLFIRE:
+#ifdef JP
+               if (name) return "ÃϹö¤Î¹å²Ð";
+               if (desc) return "¼Ù°­¤ÊÎϤò»ý¤ÄÊõ¼î¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Hellfire";
+               if (desc) return "Fires a powerful ball of evil power. Hurts good monsters greatly.";
+#endif
+    
+               {
+                       int dam = 666;
+                       int rad = 3;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_HELL_FIRE, dir, dam, rad);
+#ifdef JP
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "ÃϹö¤Î¹å²Ð¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
+#else
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "the strain of casting Hellfire", -1);
+#endif
+                       }
+               }
+               break;
+
+       case DEAT_SPEL_WRAITHFORM:
+#ifdef JP
+               if (name) return "Í©Âβ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÊɤòÄ̤êÈ´¤±¤ë¤³¤È¤¬¤Ç¤­¼õ¤±¤ë¥À¥á¡¼¥¸¤¬·Ú¸º¤µ¤ì¤ëÍ©ÂΤξõÂÖ¤ËÊѿȤ¹¤ë¡£";
+#else
+               if (name) return "Wraithform";
+               if (desc) return "Becomes wraith form which gives ability to pass walls and makes all damages half.";
+#endif
+    
+               {
+                       int base = plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_wraith_form(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_PHASE_DOOR:
+#ifdef JP
+               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Phase Door";
+               if (desc) return "Teleport short distance.";
+#endif
+    
+               {
+                       int range = 10;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_SPIDERS:
+#ifdef JP
+               if (name) return "ÃØéá¤Î¥«¡¼¥É";
+               if (desc) return "ÃØéá¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Spiders";
+               if (desc) return "Summons spiders.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an spider...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿ÃØéá¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned spiders get angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_SHUFFLE:
+#ifdef JP
+               if (name) return "¥·¥ã¥Ã¥Õ¥ë";
+               if (desc) return "¥«¡¼¥É¤ÎÀꤤ¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Shuffle";
+               if (desc) return "Causes random effects.";
+#endif
+    
+               {
+                       if (info) return s_random;
+
+                       if (cast)
+                       {
+                               cast_shuffle();
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_RESET_RECALL:
+#ifdef JP
+               if (name) return "¥Õ¥í¥¢¡¦¥ê¥»¥Ã¥È";
+               if (desc) return "ºÇ¿¼³¬¤òÊѹ¹¤¹¤ë¡£";
+#else
+               if (name) return "Reset Recall";
+               if (desc) return "Resets the 'deepest' level for recall spell.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!reset_recall()) return NULL;
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TELEPORT:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
+#endif
+    
+               {
+                       int range = plev * 4;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_SPYING:
+#ifdef JP
+               if (name) return "´¶ÃΤΥ«¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Trump Spying";
+               if (desc) return "Gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_tim_esp(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TELEPORT_AWAY:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_ANIMALS:
+#ifdef JP
+               if (name) return "ưʪ¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤÎưʪ¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Animals";
+               if (desc) return "Summons an animal.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+                               int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
+
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ïưʪ¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an animal...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, type, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿Æ°Êª¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned animal gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_REACH:
+#ifdef JP
+               if (name) return "°ÜÆ°¤Î¥«¡¼¥É";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼«Ê¬¤Î­¸µ¤Ø°ÜÆ°¤µ¤»¤ë¡£";
+#else
+               if (name) return "Trump Reach";
+               if (desc) return "Pulls a distant item close to you.";
+#endif
+    
+               {
+                       int weight = plev * 15;
+
+                       if (info) return info_weight(weight);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fetch(dir, weight, FALSE);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_KAMIKAZE:
+#ifdef JP
+               if (name) return "¥«¥ß¥«¥¼¤Î¥«¡¼¥É";
+               if (desc) return "Ê£¿ô¤ÎÇúȯ¤¹¤ë¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Kamikaze";
+               if (desc) return "Summons monsters which explode by itself.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+                               int x, y;
+                               int type;
+
+                               if (cast)
+                               {
+                                       if (!target_set(TARGET_KILL)) return NULL;
+                                       x = target_col;
+                                       y = target_row;
+                               }
+                               else
+                               {
+                                       /* Summons near player when failed */
+                                       x = px;
+                                       y = py;
+                               }
+
+                               if (p_ptr->pclass == CLASS_BEASTMASTER)
+                                       type = SUMMON_KAMIKAZE_LIVING;
+                               else
+                                       type = SUMMON_KAMIKAZE;
+
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥«¥ß¥«¥¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on several trumps at once...");
+#endif
+
+                               if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned creatures get angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_PHANTASMAL_SERVANT:
+#ifdef JP
+               if (name) return "¸¸Î´­";
+               if (desc) return "1ÂΤÎÍ©Îî¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Phantasmal Servant";
+               if (desc) return "Summons a ghost.";
+#endif
+    
+               {
+                       /* Phantasmal Servant is not summoned as enemy when failed */
+                       if (cast)
+                       {
+                               int summon_lev = plev * 2 / 3 + randint1(plev / 2);
+
+                               if (trump_summoning(1, !fail, py, px, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
+                               {
+#ifdef JP
+                                       msg_print("¸æÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¸æ¼ç¿ÍÍÍ¡©");
+#else
+                                       msg_print("'Your wish, master?'");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_HASTE_MONSTER:
+#ifdef JP
+               if (name) return "¥¹¥Ô¡¼¥É¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò²Ã®¤µ¤»¤ë¡£";
+#else
+               if (name) return "Haste Monster";
+               if (desc) return "Hastes a monster.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               bool result;
+
+                               /* Temporary enable target_pet option */
+                               bool old_target_pet = target_pet;
+                               target_pet = TRUE;
+
+                               result = get_aim_dir(&dir);
+
+                               /* Restore target_pet option */
+                               target_pet = old_target_pet;
+
+                               if (!result) return NULL;
+
+                               speed_monster(dir);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TELEPORT_LEVEL:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
+               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+#else
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+#ifdef JP
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+#endif
+                               teleport_level(0);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_DIMENSION_DOOR:
+#ifdef JP
+               if (name) return "¼¡¸µ¤ÎÈâ";
+               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+#else
+               if (name) return "Dimension Door";
+               if (desc) return "Teleport to given location.";
+#endif
+    
+               {
+                       int range = plev / 2 + 10;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
+#else
+                               msg_print("You open a dimensional gate. Choose a destination.");
+#endif
+
+                               if (!dimension_door()) return NULL;
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_WORD_OF_RECALL:
+#ifdef JP
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Word of Recall";
+               if (desc) return "Recalls player from dungeon to town, or from town to the deepest level of dungeon.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               if (!word_of_recall()) return NULL;
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_BANISH:
+#ifdef JP
+               if (name) return "²øʪÄÉÊü";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Banish";
+               if (desc) return "Teleports all monsters in sight away unless resisted.";
+#endif
+    
+               {
+                       int power = plev * 4;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               banish_monsters(power);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_SWAP_POSITION:
+#ifdef JP
+               if (name) return "°ÌÃÖ¸ò´¹¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤È°ÌÃÖ¤ò¸ò´¹¤¹¤ë¡£";
+#else
+               if (name) return "Swap Position";
+               if (desc) return "Swap positions of you and a monster.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               bool result;
+
+                               /* HACK -- No range limit */
+                               project_length = -1;
+
+                               result = get_aim_dir(&dir);
+
+                               /* Restore range to default */
+                               project_length = 0;
+
+                               if (!result) return NULL;
+
+                               teleport_swap(dir);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_UNDEAD:
+#ifdef JP
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Undead";
+               if (desc) return "Summons an undead monster.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an undead creature...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_UNDEAD, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned undead creature gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_REPTILES:
+#ifdef JP
+               if (name) return "à¨ÃîÎà¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥҥɥé¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Reptiles";
+               if (desc) return "Summons a hydra.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ïà¨ÃîÎà¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a reptile...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_HYDRA, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿à¨ÃîÎà¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned reptile gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_MONSTERS:
+#ifdef JP
+               if (name) return "¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É";
+               if (desc) return "Ê£¿ô¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Monsters";
+               if (desc) return "Summons some monsters.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+                               int type;
+
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on several trumps at once...");
+#endif
+
+                               if (p_ptr->pclass == CLASS_BEASTMASTER)
+                                       type = SUMMON_LIVING;
+                               else
+                                       type = 0;
+
+                               if (trump_summoning((1 + (plev - 15)/ 10), !fail, py, px, 0, type, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned creatures get angry!");
+#endif
+                                       }
+                               }
+
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_HOUNDS:
+#ifdef JP
+               if (name) return "¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É";
+               if (desc) return "1¥°¥ë¡¼¥×¤Î¥Ï¥¦¥ó¥É¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Hounds";
+               if (desc) return "Summons a group of hounds.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a hound...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned hounds get angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_BRANDING:
+#ifdef JP
+               if (name) return "¥È¥é¥ó¥×¤Î¿Ï";
+               if (desc) return "Éð´ï¤Ë¥È¥é¥ó¥×¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Trump Branding";
+               if (desc) return "Makes current weapon a Trump weapon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(5);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_LIVING_TRUMP:
+#ifdef JP
+               if (name) return "¿Í´Ö¥È¥é¥ó¥×";
+               if (desc) return "¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤«¡¢¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤¬¿È¤Ë¤Ä¤¯¡£";
+#else
+               if (name) return "Living Trump";
+               if (desc) return "Gives mutation which makes you teleport randomly or makes you able to teleport at will.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int mutation;
+
+                               if (one_in_(7))
+                                       /* Teleport control */
+                                       mutation = 12;
+                               else
+                                       /* Random teleportation (uncontrolled) */
+                                       mutation = 77;
+
+                               /* Gain the mutation */
+                               if (gain_random_mutation(mutation))
+                               {
+#ifdef JP
+                                       msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
+#else
+                                       msg_print("You have turned into a Living Trump.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_CYBERDEMON:
+#ifdef JP
+               if (name) return "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥµ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Cyberdemon";
+               if (desc) return "Summons a cyber demon.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a Cyberdemon...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_CYBER, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned Cyberdemon gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_DIVINATION:
+#ifdef JP
+               if (name) return "ͽ¸«¤Î¥«¡¼¥É";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Trump Divination";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_all(rad);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_LORE:
+#ifdef JP
+               if (name) return "Ãμ±¤Î¥«¡¼¥É";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+#else
+               if (name) return "Trump Lore";
+               if (desc) return "*Identifies* an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!identify_fully(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_HEAL_MONSTER:
+#ifdef JP
+               if (name) return "²óÉü¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤÎÂÎÎϤò²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Heal Monster";
+               if (desc) return "Heal a monster.";
+#endif
+    
+               {
+                       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(&dir);
+
+                               /* Restore target_pet option */
+                               target_pet = old_target_pet;
+
+                               if (!result) return NULL;
+
+                               heal_monster(dir, heal);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_DRAGON:
+#ifdef JP
+               if (name) return "¥É¥é¥´¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥɥ饴¥ó¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Dragon";
+               if (desc) return "Summons a dragon.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a dragon...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_DRAGON, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned dragon gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_METEOR:
+#ifdef JP
+               if (name) return "ð¨ÀФΥ«¡¼¥É";
+               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
+#else
+               if (name) return "Trump Meteor";
+               if (desc) return "Makes meteor balls fall down to nearby random locations.";
+#endif
+    
+               {
+                       int dam = plev * 2;
+                       int rad = 2;
+
+                       if (info) return info_multi_damage(dam);
+
+                       if (cast)
+                       {
+                               cast_meteor(dam, rad);
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_DEMON:
+#ifdef JP
+               if (name) return "¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΰ­Ëâ¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Demon";
+               if (desc) return "Summons a demon.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a demon...");
+#endif
+
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_DEMON, 0L))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned demon gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_GREATER_UNDEAD:
+#ifdef JP
+               if (name) return "ÃϹö¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤξåµé¥¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Greater Undead";
+               if (desc) return "Summons a greater undead.";
+#endif
+    
+               {
+                       if (cast || fail)
+                       {
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a greater undead being...");
+#endif
+                               /* May allow unique depend on level and dice roll */
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¾åµé¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned greater undead creature gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case TRUM_SPEL_TRUMP_ANCIENT_DRAGON:
+#ifdef JP
+               if (name) return "¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤθÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Trump Ancient Dragon";
+               if (desc) return "Summons an ancient dragon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int type;
+
+                               if (p_ptr->pclass == CLASS_BEASTMASTER)
+                                       type = SUMMON_HI_DRAGON_LIVING;
+                               else
+                                       type = SUMMON_HI_DRAGON;
+
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an ancient dragon...");
+#endif
+
+                               /* May allow unique depend on level and dice roll */
+                               if (trump_summoning(1, !fail, py, px, 0, type, PM_ALLOW_UNIQUE))
+                               {
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿¸ÅÂå¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned ancient dragon gets angry!");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_ZAP:
+#ifdef JP
+               if (name) return "ÅÅ·â";
+               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Zap";
+               if (desc) return "Fires a bolt or beam of lightning.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 3;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_WIZARD_LOCK:
+#ifdef JP
+               if (name) return "ËâË¡¤Î»Ü¾û";
+               if (desc) return "Èâ¤Ë¸°¤ò¤«¤±¤ë¡£";
+#else
+               if (name) return "Wizard Lock";
+               if (desc) return "Locks a door.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               wizard_lock(dir);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_INVISIBILITY:
+#ifdef JP
+               if (name) return "Æ©ÌÀÂδ¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÆ©ÌÀ¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Invisibility";
+               if (desc) return "Detects all invisible monsters in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_invis(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_MONSTERS:
+#ifdef JP
+               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Monsters";
+               if (desc) return "Detects all monsters in your vicinity unless invisible.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_normal(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_BLINK:
+#ifdef JP
+               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Blink";
+               if (desc) return "Teleport short distance.";
+#endif
+    
+               {
+                       int range = 10;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_LIGHT_AREA:
+#ifdef JP
+               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Light Area";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_TRAP_AND_DOOR_DESTRUCTION:
+#ifdef JP
+               if (name) return "櫤ÈÈâ Ç˲õ";
+               if (desc) return "°ìľÀþ¾å¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Trap & Door Destruction";
+               if (desc) return "Fires a beam which destroy traps and doors.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               destroy_door(dir);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_CURE_LIGHT_WOUNDS:
+#ifdef JP
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure Light Wounds";
+               if (desc) return "Heals cut and HP a little.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = 8;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut(p_ptr->cut - 10);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_DOORS_AND_TRAPS:
+#ifdef JP
+               if (name) return "櫤ÈÈâ ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Doors & Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_PHLOGISTON:
+#ifdef JP
+               if (name) return "dzÁÇ";
+               if (desc) return "¸÷¸»¤ËdzÎÁ¤òÊäµë¤¹¤ë¡£";
+#else
+               if (name) return "Phlogiston";
+               if (desc) return "Adds more turns of light to a lantern or torch.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               phlogiston();
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_TREASURE:
+#ifdef JP
+               if (name) return "ºâÊõ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Treasure";
+               if (desc) return "Detects all treasures in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_treasure(rad);
+                               detect_objects_gold(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_ENCHANTMENT:
+#ifdef JP
+               if (name) return "ËâË¡ ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎËâË¡¤¬¤«¤«¤Ã¤¿¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Enchantment";
+               if (desc) return "Detects all magical items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_objects_magic(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECT_OBJECTS:
+#ifdef JP
+               if (name) return "¥¢¥¤¥Æ¥à´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Objects";
+               if (desc) return "Detects all items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_objects_normal(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_CURE_POISON:
+#ifdef JP
+               if (name) return "²òÆÇ";
+               if (desc) return "ÆǤòÂÎÆ⤫¤é´°Á´¤Ë¼è¤ê½ü¤¯¡£";
+#else
+               if (name) return "Cure Poison";
+               if (desc) return "Cures poison status.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_poisoned(0);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_RESIST_COLD:
+#ifdef JP
+               if (name) return "ÂÑÎä";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Cold";
+               if (desc) return "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_RESIST_FIRE:
+#ifdef JP
+               if (name) return "ÂѲÐ";
+               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Fire";
+               if (desc) return "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_RESIST_LIGHTNING:
+#ifdef JP
+               if (name) return "ÂÑÅÅ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÅÅ·â¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Lightning";
+               if (desc) return "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_RESIST_ACID:
+#ifdef JP
+               if (name) return "ÂÑ»À";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Acid";
+               if (desc) return "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_acid(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_CURE_MEDIUM_WOUNDS:
+#ifdef JP
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure Medium Wounds";
+               if (desc) return "Heals cut and HP more.";
+#endif
+    
+               {
+                       int dice = 4;
+                       int sides = 8;
+
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut((p_ptr->cut / 2) - 50);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_TELEPORT:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
+#endif
+    
+               {
+                       int range = plev * 5;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_IDENTIFY:
+#ifdef JP
+               if (name) return "´ÕÄê";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+#else
+               if (name) return "Identify";
+               if (desc) return "Identifies an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!ident_spell(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_STONE_TO_MUD:
+#ifdef JP
+               if (name) return "´äÀÐÍϲò";
+               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Stone to Mud";
+               if (desc) return "Turns one rock square to mud.";
+#endif
+    
+               {
+                       int dice = 1;
+                       int sides = 30;
+                       int base = 20;
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               wall_to_mud(dir);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_RAY_OF_LIGHT:
+#ifdef JP
+               if (name) return "Á®¸÷";
+               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
+#else
+               if (name) return "Ray of Light";
+               if (desc) return "Fires a beam of light which damages to light-sensitive monsters.";
+#endif
+    
+               {
+                       int dice = 6;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+#ifdef JP
+                               msg_print("¸÷Àþ¤¬Êü¤¿¤ì¤¿¡£");
+#else
+                               msg_print("A line of light appears.");
+#endif
+
+                               lite_line(dir);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_SATISFY_HUNGER:
+#ifdef JP
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_food(PY_FOOD_MAX - 1);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_SEE_INVISIBLE:
+#ifdef JP
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "See Invisible";
+               if (desc) return "Gives see invisible for a while.";
+#endif
+    
+               {
+                       int base = 24;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_invis(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_CONJURE_ELEMENTAL:
+#ifdef JP
+               if (name) return "¥¨¥ì¥á¥ó¥¿¥ë¾¤´­";
+               if (desc) return "1ÂΤΥ¨¥ì¥á¥ó¥¿¥ë¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Conjure Elemental";
+               if (desc) return "Summons an elemental.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
+                               {
+#ifdef JP
+                                       msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No Elementals arrive.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_TELEPORT_LEVEL:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
+               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+#else
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+#ifdef JP
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+#endif
+                               teleport_level(0);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_TELEPORT_AWAY:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_ELEMENTAL_BALL:
+#ifdef JP
+               if (name) return "¸µÁǤεå";
+               if (desc) return "±ê¡¢ÅÅ·â¡¢Î䵤¡¢»À¤Î¤É¤ì¤«¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Elemental Ball";
+               if (desc) return "Fires a ball of some elements.";
+#endif
+    
+               {
+                       int dam = 75 + plev;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               int type;
+
+                               if (!get_aim_dir(&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(type, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_DETECTION:
+#ifdef JP
+               if (name) return "Á´´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detection";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_all(rad);
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_WORD_OF_RECALL:
+#ifdef JP
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Word of Recall";
+               if (desc) return "Recalls player from dungeon to town, or from town to the deepest level of dungeon.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       if (cast)
+                       {
+                               if (!word_of_recall()) return NULL;
+                       }
+               }
+               break;
+
+       case ARCA_SPEL_CLAIRVOYANCE:
+#ifdef JP
+               if (name) return "ÀéΤ´ã";
+               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤µ¤é¤Ë¡¢°ìÄê»þ´Ö¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Clairvoyance";
+               if (desc) return "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               chg_virtue(V_KNOWLEDGE, 1);
+                               chg_virtue(V_ENLIGHTEN, 1);
+
+                               wiz_lite(FALSE);
+
+                               if (!p_ptr->telepathy)
+                               {
+                                       set_tim_esp(randint1(sides) + base, FALSE);
+                               }
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_INFRAVISION:
+#ifdef JP
+               if (name) return "ÀÖ³°Àþ»ëÎÏ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÀÖ³°Àþ»ëÎϤ¬Áý¶¯¤µ¤ì¤ë¡£";
+#else
+               if (name) return "Infravision";
+               if (desc) return "Gives infravision for a while.";
+#endif
+    
+               {
+                       int base = 100;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_infra(base + randint1(base), FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_REGENERATION:
+#ifdef JP
+               if (name) return "²óÉüÎ϶¯²½";
+               if (desc) return "°ìÄê»þ´Ö¡¢²óÉüÎϤ¬Áý¶¯¤µ¤ì¤ë¡£";
+#else
+               if (name) return "Regeneration";
+               if (desc) return "Gives regeneration ability for a while.";
+#endif
+    
+               {
+                       int base = 80;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_regen(base + randint1(base), FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_SATISFY_HUNGER:
+#ifdef JP
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_food(PY_FOOD_MAX - 1);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESIST_COLD:
+#ifdef JP
+               if (name) return "ÂÑÎ䵤";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Cold";
+               if (desc) return "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESIST_FIRE:
+#ifdef JP
+               if (name) return "ÂѲбê";
+               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Fire";
+               if (desc) return "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_HEROISM:
+#ifdef JP
+               if (name) return "»Îµ¤¹âÍÈ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Heroism";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+#endif
+    
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESIST_LIGHTNING:
+#ifdef JP
+               if (name) return "ÂÑÅÅ·â";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÅÅ·â¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Lightning";
+               if (desc) return "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESIST_ACID:
+#ifdef JP
+               if (name) return "ÂÑ»À";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Acid";
+               if (desc) return "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_acid(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_SEE_INVISIBILITY:
+#ifdef JP
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "See Invisibility";
+               if (desc) return "Gives see invisible for a while.";
+#endif
+    
+               {
+                       int base = 24;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_invis(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_REMOVE_CURSE:
+#ifdef JP
+               if (name) return "²ò¼ö";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Remove Curse";
+               if (desc) return "Removes normal curses from equipped items.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (remove_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESIST_POISON:
+#ifdef JP
+               if (name) return "ÂÑÆÇ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÆǤؤÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Poison";
+               if (desc) return "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_pois(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_BERSERK:
+#ifdef JP
+               if (name) return "¶¸Àï»Î²½";
+               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤¹¤ë¡£";
+#else
+               if (name) return "Berserk";
+               if (desc) return "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.";
+#endif
+    
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_shero(randint1(base) + base, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_SELF_KNOWLEDGE:
+#ifdef JP
+               if (name) return "¼«¸ÊʬÀÏ";
+               if (desc) return "¸½ºß¤Î¼«Ê¬¤Î¾õÂÖ¤ò´°Á´¤ËÃΤ롣";
+#else
+               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.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               self_knowledge();
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_PROTECTION_FROM_EVIL:
+#ifdef JP
+               if (name) return "Âмٰ­·ë³¦";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Î¹¶·â¤òËɤ°¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Protection from Evil";
+               if (desc) return "Gives aura which protect you from evil monster's physical attack.";
+#endif
+    
+               {
+                       int base = 3 * plev;
+                       int sides = 25;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_protevil(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_CURE:
+#ifdef JP
+               if (name) return "Ìþ¤·";
+               if (desc) return "ÆÇ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤òÁ´²÷¤µ¤»¡¢¸¸³Ð¤òľ¤¹¡£";
+#else
+               if (name) return "Cure";
+               if (desc) return "Heals poison, stun, cut and hallucination completely.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_poisoned(0);
+                               set_stun(0);
+                               set_cut(0);
+                               set_image(0);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_MANA_BRANDING:
+#ifdef JP
+               if (name) return "ËâË¡·õ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Éð´ï¤ËÎ䵤¡¢±ê¡¢ÅÅ·â¡¢»À¡¢ÆǤΤ¤¤º¤ì¤«¤Î°À­¤ò¤Ä¤±¤ë¡£Éð´ï¤ò»ý¤¿¤Ê¤¤¤È»È¤¨¤Ê¤¤¡£";
+#else
+               if (name) return "Mana Branding";
+               if (desc) return "Makes current weapon some elemental branded. You must wield weapons.";
+#endif
+    
+               {
+                       int base = plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               if (!choose_ele_attack()) return NULL;
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_TELEPATHY:
+#ifdef JP
+               if (name) return "¥Æ¥ì¥Ñ¥·¡¼";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Telepathy";
+               if (desc) return "Gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 30;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_tim_esp(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_STONE_SKIN:
+#ifdef JP
+               if (name) return "È©Àв½";
+               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Stone Skin";
+               if (desc) return "Gives bonus to AC for a while.";
+#endif
+    
+               {
+                       int base = 30;
+                       int sides = 20;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_shield(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_RESISTANCE:
+#ifdef JP
+               if (name) return "Á´ÂÑÀ­";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resistance";
+               if (desc) return "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_acid(randint1(base) + base, FALSE);
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_pois(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_HASTE_SELF:
+#ifdef JP
+               if (name) return "¥¹¥Ô¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
+#else
+               if (name) return "Haste Self";
+               if (desc) return "Hastes you for a while.";
+#endif
+    
+               {
+                       int base = plev;
+                       int sides = 20 + plev;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_fast(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_WALK_THROUGH_WALL:
+#ifdef JP
+               if (name) return "ÊÉÈ´¤±";
+               if (desc) return "°ìÄê»þ´Ö¡¢È¾Êª¼Á²½¤·ÊɤòÄ̤êÈ´¤±¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Walk through Wall";
+               if (desc) return "Gives ability to pass walls for a while.";
+#endif
+    
+               {
+                       int base = plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_kabenuke(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_POLISH_SHIELD:
+#ifdef JP
+               if (name) return "½âË᤭";
+               if (desc) return "½â¤ËÈ¿¼Í¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Polish Shield";
+               if (desc) return "Makes a shield a shield of reflection.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               pulish_shield();
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_CREATE_GOLEM:
+#ifdef JP
+               if (name) return "¥´¡¼¥ì¥àÀ½Â¤";
+               if (desc) return "1ÂΤΥ´¡¼¥ì¥à¤òÀ½Â¤¤¹¤ë¡£";
+#else
+               if (name) return "Create Golem";
+               if (desc) return "Creates a golem.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, PM_FORCE_PET))
+                               {
+#ifdef JP
+                                       msg_print("¥´¡¼¥ì¥à¤òºî¤Ã¤¿¡£");
+#else
+                                       msg_print("You make a golem.");
+#endif
+                               }
+                               else
+                               {
+#ifdef JP
+                                       msg_print("¤¦¤Þ¤¯¥´¡¼¥ì¥à¤òºî¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No Golems arrive.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_MAGICAL_ARMOR:
+#ifdef JP
+               if (name) return "ËâË¡¤Î³»";
+               if (desc) return "°ìÄê»þ´Ö¡¢ËâË¡ËɸæÎϤÈAC¤¬¾å¤¬¤ê¡¢º®Íð¤ÈÌÕÌܤÎÂÑÀ­¡¢È¿¼ÍǽÎÏ¡¢ËãáãÃΤ餺¡¢ÉâÍ·¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Magical armor";
+               if (desc) return "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_magicdef(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_REMOVE_ENCHANTMENT:
+#ifdef JP
+               if (name) return "ÁõÈ÷̵Îϲ½";
+               if (desc) return "Éð´ï¡¦Ëɶñ¤Ë¤«¤±¤é¤ì¤¿¤¢¤é¤æ¤ëËâÎϤò´°Á´¤Ë²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Remove Enchantment";
+               if (desc) return "Removes all magics completely from any weapon or armor.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!mundane_spell(TRUE)) return NULL;
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_REMOVE_ALL_CURSE:
+#ifdef JP
+               if (name) return "¼ö¤¤Ê´ºÕ";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Remove All Curse";
+               if (desc) return "Removes normal and heavy curse from equipped items.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (remove_all_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_KNOWLEDGE_TRUE:
+#ifdef JP
+               if (name) return "´°Á´¤Ê¤ëÃμ±";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+#else
+               if (name) return "Knowledge True";
+               if (desc) return "*Identifies* an item.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!identify_fully(FALSE)) return NULL;
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_ENCHANT_WEAPON:
+#ifdef JP
+               if (name) return "Éð´ï¶¯²½";
+               if (desc) return "Éð´ï¤ÎÌ¿ÃæΨ½¤Àµ¤È¥À¥á¡¼¥¸½¤Àµ¤ò¶¯²½¤¹¤ë¡£";
+#else
+               if (name) return "Enchant Weapon";
+               if (desc) return "Attempts to increase +to-hit, +to-dam of a weapon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_ENCHANT_ARMOR:
+#ifdef JP
+               if (name) return "Ëɶñ¶¯²½";
+               if (desc) return "³»¤ÎËɸ潤Àµ¤ò¶¯²½¤¹¤ë¡£";
+#else
+               if (name) return "Enchant Armor";
+               if (desc) return "Attempts to increase +AC of an armor.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_BRAND_WEAPON:
+#ifdef JP
+               if (name) return "Éð´ï°À­ÉÕÍ¿";
+               if (desc) return "Éð´ï¤Ë¥é¥ó¥À¥à¤Ë°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Brand Weapon";
+               if (desc) return "Makes current weapon a random ego weapon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(randint0(18));
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_LIVING_TRUMP:
+#ifdef JP
+               if (name) return "¿Í´Ö¥È¥é¥ó¥×";
+               if (desc) return "¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤«¡¢¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤¬¿È¤Ë¤Ä¤¯¡£";
+#else
+               if (name) return "Living Trump";
+               if (desc) return "Gives mutation which makes you teleport randomly or makes you able to teleport at will.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int mutation;
+
+                               if (one_in_(7))
+                                       /* Teleport control */
+                                       mutation = 12;
+                               else
+                                       /* Random teleportation (uncontrolled) */
+                                       mutation = 77;
+
+                               /* Gain the mutation */
+                               if (gain_random_mutation(mutation))
+                               {
+#ifdef JP
+                                       msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
+#else
+                                       msg_print("You have turned into a Living Trump.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRAF_SPEL_IMMUNITY:
+#ifdef JP
+               if (name) return "°À­¤Ø¤ÎÌȱÖ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¡¢»À¤Î¤¤¤º¤ì¤«¤ËÂФ¹¤ëÌȱ֤òÆÀ¤ë¡£";
+#else
+               if (name) return "Immunity";
+               if (desc) return "Gives an immunity to fire, cold, electricity or acid for a while.";
+#endif
+    
+               {
+                       int base = 13;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               if (!choose_ele_immune(base + randint1(base))) return NULL;
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_MAGIC_MISSILE:
+#ifdef JP
+               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë";
+               if (desc) return "¼å¤¤ËâË¡¤ÎÌð¤òÊü¤Ä¡£";
+#else
+               if (name) return "Magic Missile";
+               if (desc) return "Fires a weak bolt of magic.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_DETECT_UNLIFE:
+#ifdef JP
+               if (name) return "̵À¸Ì¿´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Unlife";
+               if (desc) return "Detects all nonliving monsters in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_nonliving(rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_EVIL_BLESS:
+#ifdef JP
+               if (name) return "¼Ù¤Ê¤ë½ËÊ¡";
+               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Evil Bless";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
+#endif
+    
+               {
+                       int base = 12;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_blessed(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_RESIST_FIRE:
+#ifdef JP
+               if (name) return "ÂѲбê";
+               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Resist Fire";
+               if (desc) return "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_HORRIFY:
+#ifdef JP
+               if (name) return "¶²¹²";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Horrify";
+               if (desc) return "Attempts to scare and stun a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fear_monster(dir, power);
+                               stun_monster(dir, power);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_NETHER_BOLT:
+#ifdef JP
+               if (name) return "ÃϹö¤ÎÌð";
+               if (desc) return "ÃϹö¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Nether Bolt";
+               if (desc) return "Fires a bolt or beam of nether.";
+#endif
+    
+               {
+                       int dice = 6 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_SUMMON_MANES:
+#ifdef JP
+               if (name) return "¸ÅÂå¤Î»àÎ´­";
+               if (desc) return "¸ÅÂå¤Î»àÎî¤ò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Summon Manes";
+               if (desc) return "Summons a manes.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
+                               {
+#ifdef JP
+                                       msg_print("¸ÅÂå¤Î»àÎî¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No Manes arrive.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_HELLISH_FLAME:
+#ifdef JP
+               if (name) return "ÃϹö¤Î±ë";
+               if (desc) return "¼Ù°­¤ÊÎϤò»ý¤Ä¥Ü¡¼¥ë¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Hellish Flame";
+               if (desc) return "Fires a ball of evil power. Hurts good monsters greatly.";
+#endif
+    
+               {
+                       int dice = 3;
+                       int sides = 6;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
+
+                       if (p_ptr->pclass == CLASS_MAGE ||
+                           p_ptr->pclass == CLASS_HIGH_MAGE ||
+                           p_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(&dir)) return NULL;
+
+                               fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_DOMINATE_DEMON:
+#ifdef JP
+               if (name) return "¥Ç¡¼¥â¥ó»ÙÇÛ";
+               if (desc) return "°­Ëâ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú";
+#else
+               if (name) return "Dominate Demon";
+               if (desc) return "Attempts to charm a demon.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               control_one_demon(dir, power);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_VISION:
+#ifdef JP
+               if (name) return "¥Ó¥¸¥ç¥ó";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Vision";
+               if (desc) return "Maps nearby area.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_MAP;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               map_area(rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_RESIST_NETHER:
+#ifdef JP
+               if (name) return "ÂÑÃϹö";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÃϹö¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Resist Nether";
+               if (desc) return "Gives resistance to nether for a while.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_res_nether(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_PLASMA_BOLT:
+#ifdef JP
+               if (name) return "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È";
+               if (desc) return "¥×¥é¥º¥Þ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Plasma bolt";
+               if (desc) return "Fires a bolt or beam of plasma.";
+#endif
+    
+               {
+                       int dice = 11 + (plev - 5) / 4;
+                       int sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_FIRE_BALL:
+#ifdef JP
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";
+               if (desc) return "±ê¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Fire Ball";
+               if (desc) return "Fires a ball of fire.";
+#endif
+    
+               {
+                       int dam = plev + 55;
+                       int rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_FIRE, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_FIRE_BRANDING:
+#ifdef JP
+               if (name) return "±ê¤Î¿Ï";
+               if (desc) return "Éð´ï¤Ë±ê¤Î°À­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Fire Branding";
+               if (desc) return "Makes current weapon fire branded.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(1);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_NETHER_BALL:
+#ifdef JP
+               if (name) return "ÃϹöµå";
+               if (desc) return "Â礭¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Nether Ball";
+               if (desc) return "Fires a huge ball of nether.";
+#endif
+    
+               {
+                       int dam = plev * 3 / 2 + 100;
+                       int rad = plev / 20 + 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_NETHER, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_SUMMON_DEMON:
+#ifdef JP
+               if (name) return "¥Ç¡¼¥â¥ó¾¤´­";
+               if (desc) return "°­Ëâ1ÂΤò¾¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Summon Demon";
+               if (desc) return "Summons a demon.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               bool pet = !one_in_(3);
+                               u32b mode = 0L;
+
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= PM_NO_PET;
+                               if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
+
+                               if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint1(plev/2), SUMMON_DEMON, mode))
+                               {
+#ifdef JP
+                                       msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
+#else
+                                       msg_print("The area fills with a stench of sulphur and brimstone.");
+#endif
+
+
+                                       if (pet)
+                                       {
+#ifdef JP
+                                               msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
+#else
+                                               msg_print("'What is thy bidding... Master?'");
+#endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×");
+#else
+                                               msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'");
+#endif
+                                       }
+                               }
+                               else
+                               {
+#ifdef JP
+                                       msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No demons arrive.");
+#endif
+                               }
+                               break;
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_DEVILISH_EYE:
+#ifdef JP
+               if (name) return "°­Ëâ¤ÎÌÜ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Devilish Eye";
+               if (desc) return "Gives telepathy for a while.";
+#endif
+    
+               {
+                       int base = 30;
+                       int sides = 25;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_tim_esp(randint1(base) + sides, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_DEVIL_CLOAK:
+#ifdef JP
+               if (name) return "°­Ëâ¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "¶²Éݤò¼è¤ê½ü¤­¡¢°ìÄê»þ´Ö¡¢±ê¤ÈÎ䵤¤ÎÂÑÀ­¡¢±ê¤Î¥ª¡¼¥é¤òÆÀ¤ë¡£ÂÑÀ­¤ÏÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               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 which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               int dur = randint1(base) + base;
+                                       
+                               set_oppose_fire(dur, FALSE);
+                               set_oppose_cold(dur, FALSE);
+                               set_tim_sh_fire(dur, FALSE);
+                               set_afraid(0);
+                               break;
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_THE_FLOW_OF_LAVA:
+#ifdef JP
+               if (name) return "ÍÏ´äή";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿±ê¤Îµå¤òºî¤ê½Ð¤·¡¢¾²¤òÍÏ´ä¤ËÊѤ¨¤ë¡£";
+#else
+               if (name) return "The Flow of Lava";
+               if (desc) return "Generates a ball of fire centered on you which transforms floors to magma.";
+#endif
+    
+               {
+                       int dam = (55 + plev) * 2;
+                       int rad = 3;
+
+                       if (info) return info_damage(0, 0, dam/2);
+
+                       if (cast)
+                       {
+                               fire_ball(GF_FIRE, 0, dam, rad);
+                               fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_PLASMA_BALL:
+#ifdef JP
+               if (name) return "¥×¥é¥º¥Þµå";
+               if (desc) return "¥×¥é¥º¥Þ¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Plasma Ball";
+               if (desc) return "Fires a ball of plasma.";
+#endif
+    
+               {
+                       int dam = plev * 3 / 2 + 80;
+                       int rad = 2 + plev / 40;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_PLASMA, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_POLYMORPH_DEMON:
+#ifdef JP
+               if (name) return "°­ËâÊѲ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢°­Ëâ¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤Ë°­Ëâ¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
+#else
+               if (name) return "Polymorph Demon";
+               if (desc) return "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.";
+#endif
+    
+               {
+                       int base = 10 + plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_NATHER_WAVE:
+#ifdef JP
+               if (name) return "ÃϹö¤ÎÇÈÆ°";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Nather Wave";
+               if (desc) return "Damages all monsters in sight. Hurts good monsters greatly.";
+#endif
+    
+               {
+                       int sides1 = plev * 2;
+                       int sides2 = plev * 2;
+
+                       if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
+
+                       if (cast)
+                       {
+                               dispel_monsters(randint1(sides1));
+                               dispel_good(randint1(sides2));
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_KISS_OF_SUCCUBUS:
+#ifdef JP
+               if (name) return "¥µ¥­¥å¥Ð¥¹¤ÎÀÜÊ­";
+               if (desc) return "°ø²Ìº®Íð¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Kiss of Succubus";
+               if (desc) return "Fires a ball of nexus.";
+#endif
+    
+               {
+                       int dam = 100 + plev * 2;
+                       int rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_NEXUS, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_DOOM_HAND:
+#ifdef JP
+               if (name) return "ÇËÌǤμê";
+               if (desc) return "ÇËÌǤμê¤òÊü¤Ä¡£¿©¤é¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤Ï¤½¤Î¤È¤­¤ÎHP¤ÎȾʬÁ°¸å¤Î¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¡£";
+#else
+               if (name) return "Doom Hand";
+               if (desc) return "Attempts to make a monster's HP almost half.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               else msg_print("<ÇËÌǤμê>¤òÊü¤Ã¤¿¡ª");
+#else
+                               else msg_print("You invoke the Hand of Doom!");
+#endif
+
+                               fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_RAISE_THE_MORALE:
+#ifdef JP
+               if (name) return "»Îµ¤¹âÍÈ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Raise the Morale";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+#endif
+    
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_IMMORTAL_BODY:
+#ifdef JP
+               if (name) return "ÉÔÌǤÎÆùÂÎ";
+               if (desc) return "°ìÄê»þ´Ö¡¢»þ´ÖµÕž¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Immortal Body";
+               if (desc) return "Gives resistance to time for a while.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_res_time(randint1(base)+base, FALSE);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_INSANITY_CIRCLE:
+#ifdef JP
+               if (name) return "¶¸µ¤¤Î±ß´Ä";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¥«¥ª¥¹¤Îµå¡¢º®Íð¤Îµå¤òȯÀ¸¤µ¤»¡¢¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£";
+#else
+               if (name) return "Insanity Circle";
+               if (desc) return "Generate balls of chaos, confusion and charm centered on you.";
+#endif
+    
+               {
+                       int dam = 50 + plev;
+                       int power = 20 + plev;
+                       int rad = 3 + plev / 20;
+
+                       if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
+
+                       if (cast)
+                       {
+                               fire_ball(GF_CHAOS, 0, dam, rad);
+                               fire_ball(GF_CONFUSION, 0, dam, rad);
+                               fire_ball(GF_CHARM, 0, power, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_EXPLODE_PETS:
+#ifdef JP
+               if (name) return "¥Ú¥Ã¥ÈÇúÇË";
+               if (desc) return "Á´¤Æ¤Î¥Ú¥Ã¥È¤ò¶¯À©Åª¤ËÇúÇˤµ¤»¤ë¡£";
+#else
+               if (name) return "Explode Pets";
+               if (desc) return "Makes all pets explode.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               discharge_minion();
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_SUMMON_GREATER_DEMON:
+#ifdef JP
+               if (name) return "¥°¥ì¡¼¥¿¡¼¥Ç¡¼¥â¥ó¾¤´­";
+               if (desc) return "¾åµé¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£¾¤´­¤¹¤ë¤Ë¤Ï¿Í´Ö('p','h','t'¤Çɽ¤µ¤ì¤ë¥â¥ó¥¹¥¿¡¼)¤Î»àÂΤòÊû¤²¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£";
+#else
+               if (name) return "Summon Greater Demon";
+               if (desc) return "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!cast_summon_greater_demon()) return NULL;
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_NETHER_STORM:
+#ifdef JP
+               if (name) return "ÃϹöÍò";
+               if (desc) return "ĶµðÂç¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Nether Storm";
+               if (desc) return "Generate a huge ball of nether.";
+#endif
+    
+               {
+                       int dam = plev * 15;
+                       int rad = plev / 5;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_NETHER, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_BLOODY_CURSE:
+#ifdef JP
+               if (name) return "·ì¤Î¼ö¤¤";
+               if (desc) return "¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¤³¤È¤Ë¤è¤Ã¤ÆÂоݤ˼ö¤¤¤ò¤«¤±¡¢¥À¥á¡¼¥¸¤òÍ¿¤¨ÍÍ¡¹¤Ê¸ú²Ì¤ò°ú¤­µ¯¤³¤¹¡£";
+#else
+               if (name) return "Bloody Curse";
+               if (desc) return "Puts blood curse which damages and causes various effects on a monster. You also take damage.";
+#endif
+    
+               {
+                       int dam = 600;
+                       int rad = 0;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
+#ifdef JP
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "·ì¤Î¼ö¤¤", -1);
+#else
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "Blood curse", -1);
+#endif
+                       }
+               }
+               break;
+
+       case DAEM_SPEL_POLYMORPH_DEMONLORD:
+#ifdef JP
+               if (name) return "ËⲦÊѲ½";
+               if (desc) return "°­Ëâ¤Î²¦¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤Ë°­Ëâ¤Î²¦¤È¤·¤Æ¤ÎǽÎϤòÆÀ¡¢ÊɤòÇ˲õ¤·¤Ê¤¬¤éÊ⤯¡£";
+#else
+               if (name) return "Polymorph Demonlord";
+               if (desc) return "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.";
+#endif
+    
+               {
+                       int base = 15;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_PUNISHMENT:
+#ifdef JP
+               if (name) return "Ĩȳ";
+               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Punishment";
+               if (desc) return "Fires a bolt or beam of lightning.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_DETECT_EVIL:
+#ifdef JP
+               if (name) return "¼Ù°­Â¸ºß´¶ÃÎ";
+               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Evil";
+               if (desc) return "Detects all evil monsters in your vicinity.";
+#endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_evil(rad);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_REMOVE_FEAR:
+#ifdef JP
+               if (name) return "¶²Éݽüµî";
+               if (desc) return "¶²Éݤò¼è¤ê½ü¤¯¡£";
+#else
+               if (name) return "Remove Fear";
+               if (desc) return "Removes fear.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_SCARE_MONSTER:
+#ifdef JP
+               if (name) return "°Ò°µ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Scare Monster";
+               if (desc) return "Attempts to scare a monster.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fear_monster(dir, power);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_SANCTUARY:
+#ifdef JP
+               if (name) return "À»°è";
+               if (desc) return "ÎÙÀܤ·¤¿Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Sanctuary";
+               if (desc) return "Attempts to sleep monsters in the adjacent squares.";
+#endif
+    
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               sleep_monsters_touch();
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_PORTAL:
+#ifdef JP
+               if (name) return "Æþ¸ý";
+               if (desc) return "Ãæµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Portal";
+               if (desc) return "Teleport medium distance.";
+#endif
+    
+               {
+                       int range = 25 + plev / 2;
+
+                       if (info) return info_range(range);
+
+                       if (cast)
+                       {
+                               teleport_player(range, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_STAR_DUST:
+#ifdef JP
+               if (name) return "¥¹¥¿¡¼¥À¥¹¥È";
+               if (desc) return "¥¿¡¼¥²¥Ã¥ÈÉÕ¶á¤ËÁ®¸÷¤Î¥Ü¥ë¥È¤òÏ¢¼Í¤¹¤ë¡£";
+#else
+               if (name) return "Star Dust";
+               if (desc) return "Fires many bolts of light near the target.";
+#endif
+    
+               {
+                       int dice = 3 + (plev - 1) / 9;
+                       int sides = 2;
+
+                       if (info) return info_multi_damage_dice(dice, sides);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_blast(GF_LITE, dir, dice, sides, 10, 3);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_PURIFY:
+#ifdef JP
+               if (name) return "¿ÈÂξô²½";
+               if (desc) return "½ý¡¢ÆÇ¡¢Û¯Û°¤«¤éÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Purify";
+               if (desc) return "Heals all cut, stun and poison status.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               set_cut(0);
+                               set_poisoned(0);
+                               set_stun(0);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_SCATTER_EVIL:
+#ifdef JP
+               if (name) return "¼Ù°­Èô¤Ð¤·";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼1ÂΤò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Scatter Evil";
+               if (desc) return "Attempts to teleport an evil monster away.";
+#endif
+    
+               {
+                       int power = MAX_SIGHT * 5;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_AWAY_EVIL, dir, power, 0);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_HOLY_ORB:
+#ifdef JP
+               if (name) return "À»¤Ê¤ë¸÷µå";
+               if (desc) return "À»¤Ê¤ëÎϤò¤â¤ÄÊõ¼î¤òÊü¤Ä¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¤¬¡¢Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡£";
+#else
+               if (name) return "Holy Orb";
+               if (desc) return "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.";
+#endif
+    
+               {
+                       int dice = 3;
+                       int sides = 6;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
+
+                       if (p_ptr->pclass == CLASS_PRIEST ||
+                           p_ptr->pclass == CLASS_HIGH_MAGE ||
+                           p_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(&dir)) return NULL;
+
+                               fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_EXORCISM:
+#ifdef JP
+               if (name) return "°­Ëâʧ¤¤";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£";
+#else
+               if (name) return "Exorcism";
+               if (desc) return "Damages all undead and demons in sight, and scares all evil monsters in sight.";
+#endif
+    
+               {
+                       int sides = plev;
+                       int power = plev;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
+                               turn_evil(power);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_REMOVE_CURSE:
+#ifdef JP
+               if (name) return "²ò¼ö";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Remove Curse";
+               if (desc) return "Removes normal curses from equipped items.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (remove_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_SENSE_UNSEEN:
+#ifdef JP
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Sense Unseen";
+               if (desc) return "Gives see invisible for a while.";
+#endif
+    
+               {
+                       int base = 24;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_invis(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_PROTECTION_FROM_EVIL:
+#ifdef JP
+               if (name) return "Âмٰ­·ë³¦";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Î¹¶·â¤òËɤ°¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Protection from Evil";
+               if (desc) return "Gives aura which protect you from evil monster's physical attack.";
+#endif
+    
+               {
+                       int base = 25;
+                       int sides = 3 * plev;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_protevil(randint1(sides) + sides, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_JUDGMENT_THUNDER:
+#ifdef JP
+               if (name) return "ºÛ¤­¤ÎÍë";
+               if (desc) return "¶¯ÎϤÊÅÅ·â¤Î¥Ü¥ë¥È¤òÊü¤Ä¡£";
+#else
+               if (name) return "Judgment Thunder";
+               if (desc) return "Fires a powerful bolt of lightning.";
+#endif
+    
+               {
+                       int dam = plev * 5;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt(GF_ELEC, dir, dam);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_HOLY_WORD:
+#ifdef JP
+               if (name) return "À»¤Ê¤ë¸æ¸ÀÍÕ";
+               if (desc) return "»ë³¦Æâ¤Î¼Ù°­¤Ê¸ºß¤ËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÂÎÎϤò²óÉü¤·¡¢ÆÇ¡¢¶²ÉÝ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤«¤éÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Holy Word";
+               if (desc) return "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.";
+#endif
+    
+               {
+                       int dam_sides = plev * 6;
+                       int heal = 100;
+
+#ifdef JP
+                       if (info) return format("»:1d%d/²ó%d", dam_sides, heal);
+#else
+                       if (info) return format("dam:d%d/h%d", dam_sides, heal);
+#endif
+
+                       if (cast)
+                       {
+                               dispel_evil(randint1(dam_sides));
+                               hp_player(heal);
+                               set_afraid(0);
+                               set_poisoned(0);
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_UNBARRING_WAYS:
+#ifdef JP
+               if (name) return "³«¤«¤ì¤¿Æ»";
+               if (desc) return "°ìľÀþ¾å¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Unbarring Ways";
+               if (desc) return "Fires a beam which destroy traps and doors.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               destroy_door(dir);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_ARREST:
+#ifdef JP
+               if (name) return "ÉõËâ";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ÎÆ°¤­¤ò»ß¤á¤ë¡£";
+#else
+               if (name) return "Arrest";
+               if (desc) return "Attempts to paralyze an evil monster.";
+#endif
+    
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               stasis_evil(dir);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_HOLY_AURA:
+#ifdef JP
+               if (name) return "À»¤Ê¤ë¥ª¡¼¥é";
+               if (desc) return "°ìÄê»þ´Ö¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò½ý¤Ä¤±¤ëÀ»¤Ê¤ë¥ª¡¼¥é¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Holy Aura";
+               if (desc) return "Gives aura of holy power which injures evil monsters which attacked you for a while.";
+#endif
+    
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_sh_holy(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_DISPEL_UNDEAD_AND_DEMONS:
+#ifdef JP
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É&°­ËâÂ໶";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Dispel Undead & Demons";
+               if (desc) return "Damages all undead and demons in sight.";
+#endif
+    
+               {
+                       int sides = plev * 4;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_DISPEL_EVIL:
+#ifdef JP
+               if (name) return "¼Ù°­Â໶";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Dispel Evil";
+               if (desc) return "Damages all evil monsters in sight.";
+#endif
+    
+               {
+                       int sides = plev * 4;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_evil(randint1(sides));
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_HOLY_BLADE:
+#ifdef JP
+               if (name) return "À»¤Ê¤ë¿Ï";
+               if (desc) return "Ä̾ï¤ÎÉð´ï¤ËÌǼ٤ΰÀ­¤ò¤Ä¤±¤ë¡£";
+#else
+               if (name) return "Holy Blade";
+               if (desc) return "Makes current weapon especially deadly against evil monsters.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               brand_weapon(13);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_STAR_BURST:
+#ifdef JP
+               if (name) return "¥¹¥¿¡¼¥Ð¡¼¥¹¥È";
+               if (desc) return "µðÂç¤ÊÁ®¸÷¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Star Burst";
+               if (desc) return "Fires a huge ball of powerful light.";
+#endif
+    
+               {
+                       int dam = 100 + plev * 2;
+                       int rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_LITE, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_SUMMON_ANGEL:
+#ifdef JP
+               if (name) return "Å·»È¾¤´­";
+               if (desc) return "Å·»È¤ò1Âξ¤´­¤¹¤ë¡£";
+#else
+               if (name) return "Summon Angel";
+               if (desc) return "Summons an angel.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               bool pet = !one_in_(3);
+                               u32b mode = 0L;
+
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= PM_NO_PET;
+                               if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
+
+                               if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, mode))
+                               {
+                                       if (pet)
+                                       {
+#ifdef JP
+                                               msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
+#else
+                                               msg_print("'What is thy bidding... Master?'");
+#endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               msg_print("¡Ö²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª °­¹Ô¼Ô¤è¡¢²ù¤¤²þ¤á¤è¡ª¡×");
+#else
+                                               msg_print("Mortal! Repent of thy impiousness.");
+#endif
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_HEROISM:
+#ifdef JP
+               if (name) return "»Îµ¤¹âÍÈ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Heroism";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+#endif
+    
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_DISPEL_CURSE:
+#ifdef JP
+               if (name) return "¼ö¤¤Â໶";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+#else
+               if (name) return "Dispel Curse";
+               if (desc) return "Removes normal and heavy curse from equipped items.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               if (remove_all_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_BANISH_EVIL:
+#ifdef JP
+               if (name) return "¼Ù°­ÄÉÊü";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Banish Evil";
+               if (desc) return "Teleports all evil monsters in sight away unless resisted.";
+#endif
+    
+               {
+                       int power = 100;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (banish_evil(power))
+                               {
+#ifdef JP
+                                       msg_print("¿ÀÀ»¤ÊÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª");
+#else
+                                       msg_print("The holy power banishes evil!");
+#endif
+
+                               }
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_ARMAGEDDON:
+#ifdef JP
+               if (name) return "¥Ï¥ë¥Þ¥²¥É¥ó";
+               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
+#else
+               if (name) return "Armageddon";
+               if (desc) return "Destroy everything in nearby area.";
+#endif
+    
+               {
+                       int base = 12;
+                       int sides = 4;
+
+                       if (cast)
+                       {
+                               destroy_area(py, px, base + randint1(sides), FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_AN_EYE_FOR_AN_EYE:
+#ifdef JP
+               if (name) return "ÌܤˤÏÌܤò";
+               if (desc) return "°ìÄê»þ´Ö¡¢¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤¿¤È¤­¤Ë¹¶·â¤ò¹Ô¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆƱÅù¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               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 are injured with same amount of damage as you take.";
+#endif
+    
+               {
+                       int base = 10;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_eyeeye(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_WRATH_OF_THE_GOD:
+#ifdef JP
+               if (name) return "¿À¤ÎÅܤê";
+               if (desc) return "¥¿¡¼¥²¥Ã¥È¤Î¼þ°Ï¤Ëʬ²ò¤Îµå¤ò¿¿ôÍî¤È¤¹¡£";
+#else
+               if (name) return "Wrath of the God";
+               if (desc) return "Drops many balls of disintegration near the target.";
+#endif
+    
+               {
+                       int dam = plev * 3 + 25;
+                       int rad = 2;
+
+                       if (info) return info_multi_damage(dam);
+
+                       if (cast)
+                       {
+                               if (!cast_wrath_of_the_god(dam, rad)) return NULL;
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_DIVINE_INTERVENTION:
+#ifdef JP
+               if (name) return "¿À°Ò";
+               if (desc) return "ÎÙÀܤ¹¤ë¥â¥ó¥¹¥¿¡¼¤ËÀ»¤Ê¤ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¡¢¸ºÂ®¡¢Û¯Û°¡¢º®Í𡢶²ÉÝ¡¢Ì²¤ê¤òÍ¿¤¨¤ë¡£¤µ¤é¤ËÂÎÎϤò²óÉü¤¹¤ë¡£";
+#else
+               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.";
+#endif
+    
+               {
+                       int b_dam = plev * 11;
+                       int d_dam = plev * 4;
+                       int heal = 100;
+                       int power = plev * 4;
+
+#ifdef JP
+                       if (info) return format("²ó%d/»%d+%d", heal, d_dam, b_dam/2);
+#else
+                       if (info) return format("h%d/dm%d+%d", heal, d_dam, b_dam/2);
+#endif
+
+                       if (cast)
+                       {
+                               project(0, 1, py, px, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
+                               dispel_monsters(d_dam);
+                               slow_monsters();
+                               stun_monsters(power);
+                               confuse_monsters(power);
+                               turn_monsters(power);
+                               stasis_monsters(power);
+                               hp_player(heal);
+                       }
+               }
+               break;
+
+       case CRUS_SPEL_CRUSADE:
+#ifdef JP
+               if (name) return "À»Àï";
+               if (desc) return "»ë³¦Æâ¤ÎÁ±Îɤʥâ¥ó¥¹¥¿¡¼¤ò¥Ú¥Ã¥È¤Ë¤·¤è¤¦¤È¤·¡¢¤Ê¤é¤Ê¤«¤Ã¤¿¾ì¹çµÚ¤ÓÁ±ÎɤǤʤ¤¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£¤µ¤é¤Ë¿¿ô¤Î²Ã®¤µ¤ì¤¿µ³»Î¤ò¾¤´­¤·¡¢¥Ò¡¼¥í¡¼¡¢½ËÊ¡¡¢²Ã®¡¢Âмٰ­·ë³¦¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Crusade";
+               if (desc) return "Attempts to charm all good monsters in sight, and scare all non-charmed monsters, and summons great number of knights, and gives heroism, bless, speed and protection from evil.";
+#endif
+    
+               {
+                       if (cast)
+                       {
+                               int base = 25;
+                               int sp_sides = 20 + plev;
+                               int sp_base = plev;
+
+                               int i;
+                               crusade();
+                               for (i = 0; i < 12; i++)
+                               {
+                                       int attempt = 10;
+                                       int my, mx;
+
+                                       while (attempt--)
+                                       {
+                                               scatter(&my, &mx, py, px, 4, 0);
+
+                                               /* Require empty grids */
+                                               if (cave_empty_bold2(my, mx)) break;
+                                       }
+                                       if (attempt < 0) continue;
+                                       summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
+                               }
+                               set_hero(randint1(base) + base, FALSE);
+                               set_blessed(randint1(base) + base, FALSE);
+                               set_fast(randint1(sp_sides) + sp_base, FALSE);
+                               set_protevil(randint1(base) + base, FALSE);
+                               set_afraid(0);
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_HOLDING:
+#ifdef JP
+               if (name) return "ÃÙÆߤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Song of Holding";
+               if (desc) return "Attempts to slow all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_SLOW;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_BLESSING:
+#ifdef JP
+               if (name) return "½ËÊ¡¤Î²Î";
+               if (desc) return "Ì¿ÃæΨ¤ÈAC¤Î¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+#else
+               if (name) return "Song of Blessing";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
+#endif
+    
+               {
+                       int song = MUSIC_BLESS;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_WRECKING_NOTE:
+#ifdef JP
+               if (name) return "Êø²õ¤Î²»¿§";
+               if (desc) return "¹ì²»¤Î¥Ü¥ë¥È¤òÊü¤Ä¡£";
+#else
+               if (name) return "Wrecking Note";
+               if (desc) return "Fires a bolt of sound.";
+#endif
+    
+               {
+                       int dice = 4 + (plev - 1) / 5;
+                       int sides = 4;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt(GF_SOUND, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_STUN_PATTERN:
+#ifdef JP
+               if (name) return "Û¯Û°¤ÎÀûΧ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÛ¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Stun Pattern";
+               if (desc) return "Attempts to stun all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_STUN;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_FLOW_OF_LIFE:
+#ifdef JP
+               if (name) return "À¸Ì¿¤Îή¤ì";
+               if (desc) return "ÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Flow of Life";
+               if (desc) return "Heals HP a little.";
+#endif
+    
+               {
+                       int song = MUSIC_L_LIFE;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_THE_SUN:
+#ifdef JP
+               if (name) return "ÂÀÍۤβÎ";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+#else
+               if (name) return "Song of the Sun";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
+#endif
+    
+               {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("¸÷¤êµ±¤¯²Î¤¬ÊÕ¤ê¤ò¾È¤é¤·¤¿¡£");
+#else
+                               msg_print("Your uplifting song brings brightness to dark places...");
+#endif
+
+                               lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_FEAR:
+#ifdef JP
+               if (name) return "¶²ÉݤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Song of Fear";
+               if (desc) return "Attempts to scare all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_FEAR;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_HEROIC_BALLAD:
+#ifdef JP
+               if (name) return "À襤¤Î²Î";
+               if (desc) return "¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+#else
+               if (name) return "Heroic Ballad";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+#endif
+    
+               {
+                       int song = MUSIC_HERO;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_CLAIRAUDIENCE:
+#ifdef JP
+               if (name) return "ÎîŪÃγÐ";
+               if (desc) return "¶á¤¯¤Îæ«/Èâ/³¬Ãʤò´¶ÃΤ¹¤ë¡£¥ì¥Ù¥ë15¤ÇÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢20¤ÇºâÊõ¤È¥¢¥¤¥Æ¥à¤ò´¶ÃΤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¡£¥ì¥Ù¥ë25¤Ç¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ·¡¢40¤Ç¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆâ¤Î¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤³¤Î¸ú²Ì¤Ï²Î¤¤Â³¤±¤ë¤³¤È¤Ç½ç¤Ëµ¯¤³¤ë¡£";
+#else
+               if (name) return "Clairaudience";
+               if (desc) return "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at level 25. Lights and know the whole level at level 40. These effects occurs by turns while this song continues.";
+#endif
+    
+               {
+                       int song = MUSIC_DETECT;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SOUL_SHRIEK:
+#ifdef JP
+               if (name) return "º²¤Î²Î";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÀº¿À¹¶·â¤ò¹Ô¤¦¡£";
+#else
+               if (name) return "Soul Shriek";
+               if (desc) return "Damages all monsters in sight with PSI damages.";
+#endif
+    
+               {
+                       int song = MUSIC_PSI;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_LORE:
+#ifdef JP
+               if (name) return "Ãμ±¤Î²Î";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¥Þ¥¹¤ÈÎÙ¤ê¤Î¥Þ¥¹¤ËÍî¤Á¤Æ¤¤¤ë¥¢¥¤¥Æ¥à¤ò´ÕÄꤹ¤ë¡£";
+#else
+               if (name) return "Song of Lore";
+               if (desc) return "Identifies all items which are in the adjacent squares.";
+#endif
+    
+               {
+                       int song = MUSIC_ID;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_HIDING_TUNE:
+#ifdef JP
+               if (name) return "±£ÆۤβÎ";
+               if (desc) return "±£Ì©¹ÔưǽÎϤò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Hiding Tune";
+               if (desc) return "Gives improved stealth.";
+#endif
+    
+               {
+                       int song = MUSIC_STEALTH;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_ILLUSION_PATTERN:
+#ifdef JP
+               if (name) return "¸¸±Æ¤ÎÀûΧ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Illusion Pattern";
+               if (desc) return "Attempts to confuse all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_CONF;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_DOOMCALL:
+#ifdef JP
+               if (name) return "ÇËÌǤ櫤Ó";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤Æ¹ì²»¹¶·â¤ò¹Ô¤¦¡£";
+#else
+               if (name) return "Doomcall";
+               if (desc) return "Damages all monsters in sight with booming sound.";
+#endif
+    
+               {
+                       int song = MUSIC_SOUND;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_FIRIELS_SONG:
+#ifdef JP
+               if (name) return "¥Õ¥£¥ê¥¨¥ë¤Î²Î";
+               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
+#else
+               if (name) return "Firiel's Song";
+               if (desc) return "Resurrects nearby corpse and skeletons. And makes these your pets.";
+#endif
+    
+               {
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("À¸Ì¿¤ÈÉü³è¤Î¥Æ¡¼¥Þ¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                               msg_print("The themes of life and revival are woven into your song...");
+#endif
+
+                               animate_dead(0, py, px);
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_FELLOWSHIP_CHANT:
+#ifdef JP
+               if (name) return "ι¤ÎÃç´Ö";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Fellowship Chant";
+               if (desc) return "Attempts to charm all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_CHARM;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SOUND_OF_DISINTEGRATION:
+#ifdef JP
+               if (name) return "ʬ²ò²»ÇÈ";
+               if (desc) return "Êɤò·¡¤ê¿Ê¤à¡£¼«Ê¬¤Î­¸µ¤Î¥¢¥¤¥Æ¥à¤Ï¾øȯ¤¹¤ë¡£";
+#else
+               if (name) return "Sound of disintegration";
+               if (desc) return "Turns all rocks in the adjacent squares to mud.";
+#endif
+    
+               {
+                       int song = MUSIC_WALL;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_FINRODS_RESISTANCE:
+#ifdef JP
+               if (name) return "¸µÁÇÂÑÀ­";
+               if (desc) return "»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+#else
+               if (name) return "Finrod's Resistance";
+               if (desc) return "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.";
+#endif
+    
+               {
+                       int song = MUSIC_RESIST;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_HOBBIT_MELODIES:
+#ifdef JP
+               if (name) return "¥Û¥Ó¥Ã¥È¤Î¥á¥í¥Ç¥£";
+               if (desc) return "²Ã®¤¹¤ë¡£";
+#else
+               if (name) return "Hobbit Melodies";
+               if (desc) return "Hastes you.";
+#endif
+    
+               {
+                       int song = MUSIC_SPEED;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_WORLD_CONTORTION:
+#ifdef JP
+               if (name) return "ÏĤó¤ÀÀ¤³¦";
+               if (desc) return "¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "World Contortion";
+               if (desc) return "Teleports all nearby monsters away unless resisted.";
+#endif
+    
+               {
+                       int rad = plev / 15 + 1;
+                       int power = plev * 3 + 1;
+
+                       if (info) return info_radius(rad);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("²Î¤¬¶õ´Ö¤òÏĤ᤿¡¥¡¥¡¥");
+#else
+                               msg_print("Reality whirls wildly as you sing a dizzying melody...");
+#endif
+
+                               project(0, rad, py, px, power, GF_AWAY_ALL, PROJECT_KILL, -1);
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_DISPELLING_CHANT:
+#ifdef JP
+               if (name) return "Â໶¤Î²Î";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Dispelling chant";
+               if (desc) return "Damages all monsters in sight. Hurts evil monsters greatly.";
+#endif
+    
+               {
+                       int song = MUSIC_DISPEL;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_THE_VOICE_OF_SARUMAN:
+#ifdef JP
+               if (name) return "¥µ¥ë¥Þ¥ó¤Î´Å¸À";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¡¢Ì²¤é¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "The Voice of Saruman";
+               if (desc) return "Attempts to slow and sleep all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_SARUMAN;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_SONG_OF_THE_TEMPEST:
+#ifdef JP
+               if (name) return "Íò¤Î²»¿§";
+               if (desc) return "¹ì²»¤Î¥Ó¡¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Song of the Tempest";
+               if (desc) return "Fires a beam of sound.";
+#endif
+    
+               {
+                       int dice = 15 + (plev - 1) / 2;
+                       int sides = 10;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_SOUND, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_AMBARKANTA:
+#ifdef JP
+               if (name) return "¤â¤¦°ì¤Ä¤ÎÀ¤³¦";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
+#else
+               if (name) return "Ambarkanta";
+               if (desc) return "Recreates current dungeon level.";
+#endif
+    
+               {
+                       int base = 15;
+                       int sides = 20;
+
+                       if (info) return info_delay(base, sides);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("¼þ°Ï¤¬ÊѲ½¤·»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                               msg_print("You sing of the primeval shaping of Middle-earth...");
+#endif
+
+                               alter_reality();
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_WRECKING_PATTERN:
+#ifdef JP
+               if (name) return "Ç˲õ¤ÎÀûΧ";
+               if (desc) return "¼þ°Ï¤Î¥À¥ó¥¸¥ç¥ó¤òÍɤ餷¡¢ÊɤȾ²¤ò¥é¥ó¥À¥à¤ËÆþ¤ìÊѤ¨¤ë¡£";
+#else
+               if (name) return "Wrecking Pattern";
+               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
+#endif
+    
+               {
+                       int song = MUSIC_QUAKE;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_STATIONARY_SHRIEK:
+#ifdef JP
+               if (name) return "ÄäÂڤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òËãá㤵¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+#else
+               if (name) return "Stationary Shriek";
+               if (desc) return "Attempts to freeze all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_STASIS;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_ENDURANCE:
+#ifdef JP
+               if (name) return "¼é¤ê¤Î²Î";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+#else
+               if (name) return "Endurance";
+               if (desc) return "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.";
+#endif
+    
+               {
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("²Î¤¬¿ÀÀ»¤Ê¾ì¤òºî¤ê½Ð¤·¤¿¡¥¡¥¡¥");
+#else
+                               msg_print("The holy power of the Music is creating sacred field...");
+#endif
+
+                               warding_glyph();
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_THE_HEROS_POEM:
+#ifdef JP
+               if (name) return "±Ñͺ¤Î»í";
+               if (desc) return "²Ã®¤·¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ê¡¢»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "The Hero's Poem";
+               if (desc) return "Hastes you. Gives heroism. Damages all monsters in sight.";
+#endif
+    
+               {
+                       int song = MUSIC_SHERO;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_RELIEF_OF_YAVANNA:
+#ifdef JP
+               if (name) return "¥ä¥ô¥¡¥ó¥Ê¤Î½õ¤±";
+               if (desc) return "¶¯ÎϤʲóÉü¤Î²Î¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+#else
+               if (name) return "Relief of Yavanna";
+               if (desc) return "Powerful healing song. Also heals cut and stun completely.";
+#endif
+    
+               {
+                       int song = MUSIC_H_LIFE;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case MUSI_SPEL_GODDESS_REBIRTH:
+#ifdef JP
+               if (name) return "ºÆÀ¸¤Î²Î";
+               if (desc) return "¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¿¥¹¤È·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Goddess' rebirth";
+               if (desc) return "Restores all stats and experience.";
+#endif
+    
+               {
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+#ifdef JP
+                               msg_print("°Å¹õ¤ÎÃæ¤Ë¸÷¤ÈÈþ¤ò¤Õ¤ê¤Þ¤¤¤¿¡£ÂΤ¬¸µ¤Î³èÎϤò¼è¤êÌᤷ¤¿¡£");
+#else
+                               msg_print("You strewed light and beauty in the dark as you sing. You feel refreshed.");
+#endif
+                               (void)do_res_stat(A_STR);
+                               (void)do_res_stat(A_INT);
+                               (void)do_res_stat(A_WIS);
+                               (void)do_res_stat(A_DEX);
+                               (void)do_res_stat(A_CON);
+                               (void)do_res_stat(A_CHR);
+                               (void)restore_level();
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_WIZARDRY_OF_SAURON:
+#ifdef JP
+               if (name) return "¥µ¥¦¥í¥ó¤ÎËâ½Ñ";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤǤ´¤¯¾®¤µ¤¤¹ì²»¤Îµå¤òÊü¤Ä¡£";
+#else
+               if (name) return "Wizardry of Sauron";
+               if (desc) return "Fires an extremely powerful tiny ball of sound.";
+#endif
+    
+               {
+                       int dice = 50 + plev;
+                       int sides = 10;
+                       int rad = 0;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
+                       }
+               }
+               break;
+
+       case MUSI_SPEL_FINGOLFINS_CHALLENGE:
+#ifdef JP
+               if (name) return "¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤ÎÄ©Àï";
+               if (desc) return "¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¯¤Ê¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Fingolfin's Challenge";
+               if (desc) return "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.";
+#endif
+    
+               {
+                       int song = MUSIC_INVULN;
+
+                       if (info) return do_singing(song, SPELL_INFO);
+
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
+
+                       if (cast) start_singing(spell, song);
+               }
+               break;
+
+       case TECH_SPEL_TOBI_IZUNA:
+#ifdef JP
+               if (name) return "ÈôÈÓ¹Ë";
+               if (desc) return "2¥Þ¥¹Î¥¤ì¤¿¤È¤³¤í¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¡£";
+#else
+               if (name) return "Tobi-Izuna";
+               if (desc) return "Attacks a two squares distant monster.";
+#endif
+    
+               if (cast)
+               {
+                       project_length = 2;
+                       if (!get_aim_dir(&dir)) return NULL;
+
+                       project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
+               }
+               break;
+
+       case TECH_SPEL_3_WAY_ATTACK:
+#ifdef JP
+               if (name) return "¸Þ·î±«»Â¤ê";
+               if (desc) return "3Êý¸þ¤ËÂФ·¤Æ¹¶·â¤¹¤ë¡£";
+#else
+               if (name) return "3-Way Attack";
+               if (desc) return "Attacks in 3 directions in one time.";
+#endif
+    
+               if (cast)
+               {
+                       int cdir;
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       for (cdir = 0;cdir < 8; cdir++)
+                       {
+                               if (cdd[cdir] == dir) break;
+                       }
+
+                       if (cdir == 8) return NULL;
+
+                       y = py + ddy_cdd[cdir];
+                       x = px + ddx_cdd[cdir];
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, 0);
+                       else
+#ifdef JP
+                               msg_print("¹¶·â¤Ï¶õ¤òÀڤä¿¡£");
+#else
+                               msg_print("You attack the empty air.");
+#endif
+                       y = py + ddy_cdd[(cdir + 7) % 8];
+                       x = px + ddx_cdd[(cdir + 7) % 8];
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, 0);
+                       else
+#ifdef JP
+                               msg_print("¹¶·â¤Ï¶õ¤òÀڤä¿¡£");
+#else
+                               msg_print("You attack the empty air.");
+#endif
+                       y = py + ddy_cdd[(cdir + 1) % 8];
+                       x = px + ddx_cdd[(cdir + 1) % 8];
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, 0);
+                       else
+#ifdef JP
+                               msg_print("¹¶·â¤Ï¶õ¤òÀڤä¿¡£");
+#else
+                               msg_print("You attack the empty air.");
+#endif
+               }
+               break;
+
+       case TECH_SPEL_BOOMERANG:
+#ifdef JP
+               if (name) return "¥Ö¡¼¥á¥é¥ó";
+               if (desc) return "Éð´ï¤ò¼ê¸µ¤ËÌá¤Ã¤Æ¤¯¤ë¤è¤¦¤ËÅꤲ¤ë¡£Ìá¤Ã¤Æ¤³¤Ê¤¤¤³¤È¤â¤¢¤ë¡£";
+#else
+               if (name) return "Boomerang";
+               if (desc) return "Throws current weapon. And it'll return to your hand unless failed.";
+#endif
+    
+               if (cast)
+               {
+                       if (!do_cmd_throw_aux(1, TRUE, 0)) return NULL;
+               }
+               break;
+
+       case TECH_SPEL_BURNING_STRIKE:
+#ifdef JP
+               if (name) return "±ëÎî";
+               if (desc) return "²Ð±êÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Burning Strike";
+               if (desc) return "Attacks a monster with more damage unless it has resistance to fire.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_FIRE);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_DETECT_FEROCITY:
+#ifdef JP
+               if (name) return "»¦µ¤´¶ÃÎ";
+               if (desc) return "¶á¤¯¤Î»×¹Í¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Detect Ferocity";
+               if (desc) return "Detects all monsters except mindless in your vicinity.";
+#endif
+    
+               if (cast)
+               {
+                       detect_monsters_mind(DETECT_RAD_DEFAULT);
+               }
+               break;
+
+       case TECH_SPEL_STRIKE_TO_STUN:
+#ifdef JP
+               if (name) return "¤ß¤ÍÂǤÁ";
+               if (desc) return "Áê¼ê¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤Ê¤¤¤¬¡¢Û¯Û°¤È¤µ¤»¤ë¡£";
+#else
+               if (name) return "Strike to Stun";
+               if (desc) return "Attempts to stun a monster in the adjacent.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_MINEUCHI);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_COUNTER:
+#ifdef JP
+               if (name) return "¥«¥¦¥ó¥¿¡¼";
+               if (desc) return "Áê¼ê¤Ë¹¶·â¤µ¤ì¤¿¤È¤­¤ËÈ¿·â¤¹¤ë¡£È¿·â¤¹¤ë¤¿¤Ó¤ËMP¤ò¾ÃÈñ¡£";
+#else
+               if (name) return "Counter";
+               if (desc) return "Prepares to counterattack. When attack by a monster, strikes back using SP each time.";
+#endif
+    
+               if (cast)
+               {
+                       if (p_ptr->riding)
+                       {
+#ifdef JP
+                               msg_print("¾èÇÏÃæ¤Ë¤Ï̵Íý¤À¡£");
+#else
+                               msg_print("You cannot do it when riding.");
+#endif
+                               return NULL;
+                       }
+#ifdef JP
+                       msg_print("Áê¼ê¤Î¹¶·â¤ËÂФ·¤Æ¿È¹½¤¨¤¿¡£");
+#else
+                       msg_print("You prepare to counter blow.");
+#endif
+                       p_ptr->counter = TRUE;
+               }
+               break;
+
+       case TECH_SPEL_HARAINUKE:
+#ifdef JP
+               if (name) return "ʧ¤¤È´¤±";
+               if (desc) return "¹¶·â¤·¤¿¸å¡¢È¿ÂЦ¤ËÈ´¤±¤ë¡£";
+#else
+               if (name) return "Harainuke";
+               if (desc) return "Attacks monster with your weapons normally, then move through counter side of the monster.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (p_ptr->riding)
+                       {
+#ifdef JP
+                               msg_print("¾èÇÏÃæ¤Ë¤Ï̵Íý¤À¡£");
+#else
+                               msg_print("You cannot do it when riding.");
+#endif
+                               return NULL;
+                       }
+       
+                       if (!get_rep_dir2(&dir)) return NULL;
+       
+                       if (dir == 5) return NULL;
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+       
+                       if (!cave[y][x].m_idx)
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+       
+                       py_attack(y, x, 0);
+       
+                       if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
+                               break;
+       
+                       y += ddy[dir];
+                       x += ddx[dir];
+       
+                       if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
+                       {
+                               msg_print(NULL);
+       
+                               /* Move the player */
+                               (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
+                       }
+               }
+               break;
+
+       case TECH_SPEL_SERPENTS_TONGUE:
+#ifdef JP
+               if (name) return "¥µ¡¼¥Ú¥ó¥Ä¥¿¥ó";
+               if (desc) return "ÆÇÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Serpent's Tongue";
+               if (desc) return "Attacks a monster with more damage unless it has resistance to poison.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_POISON);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_ZAMMAKEN:
+#ifdef JP
+               if (name) return "»ÂËâ·õÆõ¤ÎÂÀÅá";
+               if (desc) return "À¸Ì¿¤Î¤Ê¤¤¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¤¬¡¢Â¾¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤ÏÁ´¤¯¸ú²Ì¤¬¤Ê¤¤¡£";
+#else
+               if (name) return "Zammaken";
+               if (desc) return "Attacks an evil unliving monster with great damage. No effect to other  monsters.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_ZANMA);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_WIND_BLAST:
+#ifdef JP
+               if (name) return "ÎöÉ÷·õ";
+               if (desc) return "¹¶·â¤·¤¿Áê¼ê¤ò¸åÊý¤Ø¿á¤­Èô¤Ð¤¹¡£";
+#else
+               if (name) return "Wind Blast";
+               if (desc) return "Attacks an adjacent monster, and blow it away.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, 0);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+                       if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
+                       {
+                               return "";
+                       }
+                       if (cave[y][x].m_idx)
+                       {
+                               int i;
+                               int ty = y, tx = x;
+                               int oy = y, ox = x;
+                               int m_idx = cave[y][x].m_idx;
+                               monster_type *m_ptr = &m_list[m_idx];
+                               char m_name[80];
+       
+                               monster_desc(m_name, m_ptr, 0);
+       
+                               for (i = 0; i < 5; i++)
+                               {
+                                       y += ddy[dir];
+                                       x += ddx[dir];
+                                       if (cave_empty_bold(y, x))
+                                       {
+                                               ty = y;
+                                               tx = x;
+                                       }
+                                       else break;
+                               }
+                               if ((ty != oy) || (tx != ox))
+                               {
+#ifdef JP
+                                       msg_format("%s¤ò¿á¤­Èô¤Ð¤·¤¿¡ª", m_name);
+#else
+                                       msg_format("You blow %s away!", m_name);
+#endif
+                                       cave[oy][ox].m_idx = 0;
+                                       cave[ty][tx].m_idx = m_idx;
+                                       m_ptr->fy = ty;
+                                       m_ptr->fx = tx;
+       
+                                       update_mon(m_idx, TRUE);
+                                       lite_spot(oy, ox);
+                                       lite_spot(ty, tx);
+       
+                                       if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
+                                               p_ptr->update |= (PU_MON_LITE);
+                               }
+                       }
+               }
+               break;
+
+       case TECH_SPEL_JUDGE:
+#ifdef JP
+               if (name) return "Åá¾¢¤ÎÌÜÍø¤­";
+               if (desc) return "Éð´ï¡¦Ëɶñ¤ò1¤Ä¼±Ê̤¹¤ë¡£¥ì¥Ù¥ë45°Ê¾å¤ÇÉð´ï¡¦Ëɶñ¤ÎǽÎϤò´°Á´¤ËÃΤ뤳¤È¤¬¤Ç¤­¤ë¡£";
+#else
+               if (name) return "Judge";
+               if (desc) return "Identifies a weapon or armor. Or *identifies* these at level 45.";
+#endif
+    
+               if (cast)
+               {
+                       if (p_ptr->lev > 44)
+                       {
+                               if (!identify_fully(TRUE)) return NULL;
+                       }
+                       else
+                       {
+                               if (!ident_spell(TRUE)) return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_ROCK_SMASH:
+#ifdef JP
+               if (name) return "ÇË´ä»Â";
+               if (desc) return "´ä¤ò²õ¤·¡¢´äÀзϤΥâ¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Rock Smash";
+               if (desc) return "Breaks rock. Or greatly damage a monster made by rocks.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_HAGAN);
+       
+                       if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
+       
+                       /* Destroy the feature */
+                       cave_alter_feat(y, x, FF_HURT_ROCK);
+       
+                       /* Update some things */
+                       p_ptr->update |= (PU_FLOW);
+               }
+               break;
+
+       case TECH_SPEL_MIDARE_SETSUGEKKA:
+#ifdef JP
+               if (name) return "Íð¤ìÀã·î²Ö";
+               if (desc) return "¹¶·â²ó¿ô¤¬Áý¤¨¡¢Î䵤ÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Midare-Setsugekka";
+               if (desc) return "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_COLD);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_SPOT_AIMING:
+#ifdef JP
+               if (name) return "µÞ½êÆͤ­";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò°ì·â¤ÇÅݤ¹¹¶·â¤ò·«¤ê½Ð¤¹¡£¼ºÇÔ¤¹¤ë¤È1ÅÀ¤·¤«¥À¥á¡¼¥¸¤òÍ¿¤¨¤é¤ì¤Ê¤¤¡£";
+#else
+               if (name) return "Spot Aiming";
+               if (desc) return "Attempts to kill a monster instantly. If failed cause only 1HP of damage.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_KYUSHO);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_MAJINGIRI:
+#ifdef JP
+               if (name) return "Ëâ¿À»Â¤ê";
+               if (desc) return "²ñ¿´¤Î°ì·â¤Ç¹¶·â¤¹¤ë¡£¹¶·â¤¬¤«¤ï¤µ¤ì¤ä¤¹¤¤¡£";
+#else
+               if (name) return "Majingiri";
+               if (desc) return "Attempts to attack with critical hit. But this attack is easy to evade for a monster.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_MAJIN);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_DESPERATE_ATTACK:
+#ifdef JP
+               if (name) return "¼Î¤Æ¿È";
+               if (desc) return "¶¯ÎϤʹ¶·â¤ò·«¤ê½Ð¤¹¡£¼¡¤Î¥¿¡¼¥ó¤Þ¤Ç¤Î´Ö¡¢¿©¤é¤¦¥À¥á¡¼¥¸¤¬Áý¤¨¤ë¡£";
+#else
+               if (name) return "Desperate Attack";
+               if (desc) return "Attacks with all of your power. But all damages you take will be doubled for one turn.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_SUTEMI);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+                       p_ptr->sutemi = TRUE;
+               }
+               break;
+
+       case TECH_SPEL_LIGHTNING_EAGLE:
+#ifdef JP
+               if (name) return "Íë·âÏÉÄÞ»Â";
+               if (desc) return "ÅÅ·âÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÈó¾ï¤ËÂ礭¤¤¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Lightning Eagle";
+               if (desc) return "Attacks a monster with more damage unless it has resistance to electricity.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_ELEC);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_RUSH_ATTACK:
+#ifdef JP
+               if (name) return "Æþ¿È";
+               if (desc) return "ÁÇÁ᤯Áê¼ê¤Ë¶á´ó¤ê¹¶·â¤¹¤ë¡£";
+#else
+               if (name) return "Rush Attack";
+               if (desc) return "Steps close to a monster and attacks at a time.";
+#endif
+    
+               if (cast)
+               {
+                       if (!rush_attack(NULL)) return NULL;
+               }
+               break;
+
+       case TECH_SPEL_BLOODY_MAELSTROM:
+#ifdef JP
+               if (name) return "ÀÖή±²";
+               if (desc) return "¼«Ê¬¼«¿È¤â½ý¤òºî¤ê¤Ä¤Ä¡¢¤½¤Î½ý¤¬¿¼¤¤¤Û¤ÉÂ礭¤¤°ÒÎϤÇÁ´Êý¸þ¤ÎŨ¤ò¹¶·â¤Ç¤­¤ë¡£À¸¤­¤Æ¤¤¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡£";
+#else
+               if (name) return "Bloody Maelstrom";
+               if (desc) return "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.";
+#endif
+    
+               if (cast)
+               {
+                       int y = 0, x = 0;
+
+                       cave_type       *c_ptr;
+                       monster_type    *m_ptr;
+       
+                       if (p_ptr->cut < 300)
+                               set_cut(p_ptr->cut + 300);
+                       else
+                               set_cut(p_ptr->cut * 2);
+       
+                       for (dir = 0; dir < 8; dir++)
+                       {
+                               y = py + ddy_ddd[dir];
+                               x = px + ddx_ddd[dir];
+                               c_ptr = &cave[y][x];
+       
+                               /* Get the monster */
+                               m_ptr = &m_list[c_ptr->m_idx];
+       
+                               /* Hack -- attack monsters */
+                               if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
+                               {
+                                       if (!monster_living(&r_info[m_ptr->r_idx]))
+                                       {
+                                               char m_name[80];
+       
+                                               monster_desc(m_name, m_ptr, 0);
+#ifdef JP
+                                               msg_format("%s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡ª", m_name);
+#else
+                                               msg_format("%s is unharmed!", m_name);
+#endif
+                                       }
+                                       else py_attack(y, x, HISSATSU_SEKIRYUKA);
+                               }
+                       }
+               }
+               break;
+
+       case TECH_SPEL_EARTHQUAKE_BLOW:
+#ifdef JP
+               if (name) return "·ã¿Ì·â";
+               if (desc) return "ÃϿ̤òµ¯¤³¤¹¡£";
+#else
+               if (name) return "Earthquake Blow";
+               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
+#endif
+    
+               if (cast)
+               {
+                       int y,x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_QUAKE);
+                       else
+                               earthquake(py, px, 10);
+               }
+               break;
+
+       case TECH_SPEL_CRACK:
+#ifdef JP
+               if (name) return "ÃÏÁö¤ê";
+               if (desc) return "¾×·âÇȤΥӡ¼¥à¤òÊü¤Ä¡£";
+#else
+               if (name) return "Crack";
+               if (desc) return "Fires a beam of shock wave.";
+#endif
+    
+               if (cast)
+               {
+                       int total_damage = 0, basedam, i;
+                       u32b flgs[TR_FLAG_SIZE];
+                       object_type *o_ptr;
+                       if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                       msg_print("Éð´ï¤òÂ礭¤¯¿¶¤ê²¼¤í¤·¤¿¡£");
+#else
+                       msg_print("You swing your weapon downward.");
+#endif
+                       for (i = 0; i < 2; i++)
+                       {
+                               int damage;
+       
+                               if (!buki_motteruka(INVEN_RARM+i)) break;
+                               o_ptr = &inventory[INVEN_RARM+i];
+                               basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
+                               damage = o_ptr->to_d * 100;
+                               object_flags(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 *= p_ptr->num_blow[i];
+                               total_damage += damage / 200;
+                               if (i) total_damage = total_damage*7/10;
+                       }
+                       fire_beam(GF_FORCE, dir, total_damage);
+               }
+               break;
+
+       case TECH_SPEL_WAR_CRY:
+#ifdef JP
+               if (name) return "µ¤Ç÷¤Îͺ¶«¤Ó";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤Æ¹ì²»¤Î¹¶·â¤ò¹Ô¤¦¡£¤µ¤é¤Ë¡¢¶á¤¯¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤òÅܤ餻¤ë¡£";
+#else
+               if (name) return "War Cry";
+               if (desc) return "Damages all monsters in sight with sound. Aggravate nearby monsters.";
+#endif
+    
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ͺ¶«¤Ó¤ò¤¢¤²¤¿¡ª");
+#else
+                       msg_print("You roar out!");
+#endif
+                       project_hack(GF_SOUND, randint1(p_ptr->lev * 3));
+                       aggravate_monsters(0);
+               }
+               break;
+
+       case TECH_SPEL_MUSOU_SANDAN:
+#ifdef JP
+               if (name) return "̵Áл°ÃÊ";
+               if (desc) return "¶¯ÎϤÊ3Ãʹ¶·â¤ò·«¤ê½Ð¤¹¡£";
+#else
+               if (name) return "Musou-Sandan";
+               if (desc) return "Attacks with powerful 3 strikes.";
+#endif
+    
+               if (cast)
+               {
+                       int i;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       for (i = 0; i < 3; i++)
+                       {
+                               int y, x;
+                               int ny, nx;
+                               int m_idx;
+                               cave_type *c_ptr;
+                               monster_type *m_ptr;
+       
+                               y = py + ddy[dir];
+                               x = px + ddx[dir];
+                               c_ptr = &cave[y][x];
+       
+                               if (c_ptr->m_idx)
+                                       py_attack(y, x, HISSATSU_3DAN);
+                               else
+                               {
+#ifdef JP
+                                       msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                                       msg_print("There is no monster.");
+#endif
+                                       return NULL;
+                               }
+       
+                               if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
+                               {
+                                       return "";
+                               }
+       
+                               /* Monster is dead? */
+                               if (!c_ptr->m_idx) break;
+       
+                               ny = y + ddy[dir];
+                               nx = x + ddx[dir];
+                               m_idx = c_ptr->m_idx;
+                               m_ptr = &m_list[m_idx];
+       
+                               /* Monster cannot move back? */
+                               if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
+                               {
+                                       /* -more- */
+                                       if (i < 2) msg_print(NULL);
+                                       continue;
+                               }
+       
+                               c_ptr->m_idx = 0;
+                               cave[ny][nx].m_idx = m_idx;
+                               m_ptr->fy = ny;
+                               m_ptr->fx = nx;
+       
+                               update_mon(m_idx, TRUE);
+       
+                               /* Redraw the old spot */
+                               lite_spot(y, x);
+       
+                               /* Redraw the new spot */
+                               lite_spot(ny, nx);
+       
+                               /* Player can move forward? */
+                               if (player_can_enter(c_ptr->feat, 0))
+                               {
+                                       /* Move the player */
+                                       if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
+                               }
+       
+                               /* -more- */
+                               if (i < 2) msg_print(NULL);
+                       }
+               }
+               break;
+
+       case TECH_SPEL_VAMPIRES_FANG:
+#ifdef JP
+               if (name) return "µÛ·ìµ´¤Î²ç";
+               if (desc) return "¹¶·â¤·¤¿Áê¼ê¤ÎÂÎÎϤòµÛ¤¤¤È¤ê¡¢¼«Ê¬¤ÎÂÎÎϤò²óÉü¤µ¤»¤ë¡£À¸Ì¿¤ò»ý¤¿¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤Ë¤ÏÄ̤¸¤Ê¤¤¡£";
+#else
+               if (name) return "Vampire's Fang";
+               if (desc) return "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_DRAIN);
+                       else
+                       {
+#ifdef JP
+                                       msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                                       msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_MOON_DAZZLING:
+#ifdef JP
+               if (name) return "¸¸ÏÇ";
+               if (desc) return "»ë³¦Æâ¤Îµ¯¤­¤Æ¤¤¤ëÁ´¥â¥ó¥¹¥¿¡¼¤ËÛ¯Û°¡¢º®Íð¡¢Ì²¤ê¤òÍ¿¤¨¤è¤¦¤È¤¹¤ë¡£";
+#else
+               if (name) return "Moon Dazzling";
+               if (desc) return "Attempts to stun, confuse and sleep all waking monsters.";
+#endif
+    
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Éð´ï¤òÉÔµ¬Â§¤ËÍɤ餷¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You irregularly wave your weapon...");
+#endif
+                       project_hack(GF_ENGETSU, p_ptr->lev * 4);
+                       project_hack(GF_ENGETSU, p_ptr->lev * 4);
+                       project_hack(GF_ENGETSU, p_ptr->lev * 4);
+               }
+               break;
+
+       case TECH_SPEL_HUNDRED_SLAUGHTER:
+#ifdef JP
+               if (name) return "É´¿Í»Â¤ê";
+               if (desc) return "Ϣ³¤·¤ÆÆþ¿È¤Ç¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¡£¹¶·â¤¹¤ë¤¿¤Ó¤ËMP¤ò¾ÃÈñ¡£MP¤¬¤Ê¤¯¤Ê¤ë¤«¡¢¥â¥ó¥¹¥¿¡¼¤òÅݤ»¤Ê¤«¤Ã¤¿¤éÉ´¿Í»Â¤ê¤Ï½ªÎ»¤¹¤ë¡£";
+#else
+               if (name) return "Hundred Slaughter";
+               if (desc) return "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.";
+#endif
+    
+               if (cast)
+               {
+                       const int mana_cost_per_monster = 8;
+                       bool new = TRUE;
+                       bool mdeath;
+
+                       do
+                       {
+                               if (!rush_attack(&mdeath)) break;
+                               if (new)
+                               {
+                                       /* Reserve needed mana point */
+                                       p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
+                                       new = FALSE;
+                               }
+                               else
+                                       p_ptr->csp -= mana_cost_per_monster;
+
+                               if (!mdeath) break;
+                               command_dir = 0;
+
+                               p_ptr->redraw |= PR_MANA;
+                               handle_stuff();
+                       }
+                       while (p_ptr->csp > mana_cost_per_monster);
+
+                       if (new) return NULL;
+       
+                       /* Restore reserved mana */
+                       p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
+               }
+               break;
+
+       case TECH_SPEL_DRAGONIC_FLASH:
+#ifdef JP
+               if (name) return "Å·æÆζÁ®";
+               if (desc) return "»ë³¦Æâ¤Î¾ì½ê¤ò»ØÄꤷ¤Æ¡¢¤½¤Î¾ì½ê¤È¼«Ê¬¤Î´Ö¤Ë¤¤¤ëÁ´¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤·¡¢¤½¤Î¾ì½ê¤Ë°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Dragonic Flash";
+               if (desc) return "Runs toward given location while attacking all monsters on the path.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!tgt_pt(&x, &y)) return NULL;
+
+                       if (!cave_player_teleportable_bold(y, x, FALSE, FALSE) ||
+                           (distance(y, x, py, px) > MAX_SIGHT / 2) ||
+                           !projectable(py, px, y, x))
+                       {
+#ifdef JP
+                               msg_print("¼ºÇÔ¡ª");
+#else
+                               msg_print("You cannot move to that place!");
+#endif
+                               break;
+                       }
+                       if (p_ptr->anti_tele)
+                       {
+#ifdef JP
+                               msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
+#else
+                               msg_print("A mysterious force prevents you from teleporting!");
+#endif
+       
+                               break;
+                       }
+                       project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
+                       teleport_player_to(y, x, TRUE, FALSE);
+               }
+               break;
+
+       case TECH_SPEL_TWIN_SLASH:
+#ifdef JP
+               if (name) return "Æó½Å¤Î·õ·â";
+               if (desc) return "1¥¿¡¼¥ó¤Ç2ÅÙ¹¶·â¤ò¹Ô¤¦¡£";
+#else
+               if (name) return "Twin Slash";
+               if (desc) return "double attacks at a time.";
+#endif
+    
+               if (cast)
+               {
+                       int x, y;
+       
+                       if (!get_rep_dir(&dir, FALSE)) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                       {
+                               py_attack(y, x, 0);
+                               if (cave[y][x].m_idx)
+                               {
+                                       handle_stuff();
+                                       py_attack(y, x, 0);
+                               }
+                       }
+                       else
+                       {
+#ifdef JP
+       msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("You don't see any monster in this direction");
+#endif
+                               return NULL;
+                       }
+               }
+               break;
+
+       case TECH_SPEL_KOFUKU_ZETTOUSEI:
+#ifdef JP
+               if (name) return "¸×ÉúÀäÅáÀª";
+               if (desc) return "¶¯ÎϤʹ¶·â¤ò¹Ô¤¤¡¢¶á¤¯¤Î¾ì½ê¤Ë¤â¸ú²Ì¤¬µÚ¤Ö¡£";
+#else
+               if (name) return "Kofuku-Zettousei";
+               if (desc) return "Performs a powerful attack which even effect nearby monsters.";
+#endif
+    
+               if (cast)
+               {
+                       int total_damage = 0, basedam, i;
+                       int y, x;
+                       u32b flgs[TR_FLAG_SIZE];
+                       object_type *o_ptr;
+       
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
+                       {
+#ifdef JP
+                               msg_print("¤Ê¤¼¤«¹¶·â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¡£");
+#else
+                               msg_print("Something prevent you from attacking.");
+#endif
+                               return "";
+                       }
+#ifdef JP
+                       msg_print("Éð´ï¤òÂ礭¤¯¿¶¤ê²¼¤í¤·¤¿¡£");
+#else
+                       msg_print("You swing your weapon downward.");
+#endif
+                       for (i = 0; i < 2; i++)
+                       {
+                               int damage;
+                               if (!buki_motteruka(INVEN_RARM+i)) break;
+                               o_ptr = &inventory[INVEN_RARM+i];
+                               basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
+                               damage = o_ptr->to_d * 100;
+                               object_flags(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 += p_ptr->to_d[i] * 100;
+                               damage *= p_ptr->num_blow[i];
+                               total_damage += (damage / 100);
+                       }
+                       project(0, (cave_have_flag_bold(y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
+               }
+               break;
+
+       case TECH_SPEL_KEIUN_KININKEN:
+#ifdef JP
+               if (name) return "·Ä±Àµ´Ç¦·õ";
+               if (desc) return "¼«Ê¬¤â¥À¥á¡¼¥¸¤ò¤¯¤é¤¦¤¬¡¢Áê¼ê¤ËÈó¾ï¤ËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£¥¢¥ó¥Ç¥Ã¥É¤Ë¤ÏÆä˸ú²Ì¤¬¤¢¤ë¡£";
+#else
+               if (name) return "Keiun-Kininken";
+               if (desc) return "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.";
+#endif
+    
+               if (cast)
+               {
+                       int y, x;
+
+                       if (!get_rep_dir2(&dir)) return NULL;
+                       if (dir == 5) return NULL;
+
+                       y = py + ddy[dir];
+                       x = px + ddx[dir];
+
+                       if (cave[y][x].m_idx)
+                               py_attack(y, x, HISSATSU_UNDEAD);
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+#else
+                               msg_print("There is no monster.");
+#endif
+                               return NULL;
+                       }
+#ifdef JP
+                       take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), "·Ä±Àµ´Ç¦·õ¤ò»È¤Ã¤¿¾×·â", -1);
+#else
+                       take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), "exhaustion on using Keiun-Kininken", -1);
+#endif
+               }
+               break;
+
+       case TECH_SPEL_HARAKIRI:
+#ifdef JP
+               if (name) return "ÀÚÊ¢";
+               if (desc) return "¡ÖÉð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£¡×";
+#else
+               if (name) return "Harakiri";
+               if (desc) return "'Busido is found in death'";
+#endif
+
+               if (cast)
+               {
+                       int i;
+#ifdef JP
+       if (!get_check("ËÜÅö¤Ë¼«»¦¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                       if (!get_check("Do you really want to commit suicide? ")) return NULL;
+#endif
+                               /* Special Verification for suicide */
+#ifdef JP
+       prt("³Îǧ¤Î¤¿¤á '@' ¤ò²¡¤·¤Æ²¼¤µ¤¤¡£", 0, 0);
+#else
+                       prt("Please verify SUICIDE by typing the '@' sign: ", 0, 0);
+#endif
+       
+                       flush();
+                       i = inkey();
+                       prt("", 0, 0);
+                       if (i != '@') return NULL;
+                       if (p_ptr->total_winner)
+                       {
+                               take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
+                               p_ptr->total_winner = TRUE;
+                       }
+                       else
+                       {
+#ifdef JP
+                               msg_print("Éð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£");
+                               take_hit(DAMAGE_FORCE, 9999, "ÀÚÊ¢", -1);
+#else
+                               msg_print("Meaning of Bushi-do is found in the death.");
+                               take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
+#endif
+                       }
+               }
+               break;
+       }
+
+       return "";
+}