OSDN Git Service

Add new option -- show_ammo_detail / show_ammo_no_crit
[hengband/hengband.git] / src / do-spell.c
index a68d17b..ceb204f 100644 (file)
@@ -4,837 +4,6 @@
 
 #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"
@@ -1108,15 +277,15 @@ static void cast_wonder(int dir)
        }
 
        if (die < 8) clone_monster(dir);
-       else if (die < 14) speed_monster(dir);
+       else if (die < 14) speed_monster(dir, plev);
        else if (die < 26) heal_monster(dir, damroll(4, 6));
-       else if (die < 31) poly_monster(dir);
+       else if (die < 31) poly_monster(dir, plev);
        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 < 51) (void)lite_line(dir, damroll(6, 8));
        else if (die < 56)
                fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
                                  damroll(3 + ((plev - 5) / 4), 8));
@@ -1151,8 +320,8 @@ static void cast_wonder(int dir)
        else /* RARE */
        {
                dispel_monsters(150);
-               slow_monsters();
-               sleep_monsters();
+               slow_monsters(plev);
+               sleep_monsters(plev);
                hp_player(300);
        }
 }
@@ -1227,7 +396,7 @@ static void cast_invoke_spirits(int dir)
        }
        else if (die < 31)
        {
-               poly_monster(dir);
+               poly_monster(dir, plev);
        }
        else if (die < 36)
        {
@@ -1244,7 +413,7 @@ static void cast_invoke_spirits(int dir)
        }
        else if (die < 51)
        {
-               (void)lite_line(dir);
+               (void)lite_line(dir, damroll(6, 8));
        }
        else if (die < 56)
        {
@@ -1309,8 +478,8 @@ static void cast_invoke_spirits(int dir)
        else
        { /* RARE */
                dispel_monsters(150);
-               slow_monsters();
-               sleep_monsters();
+               slow_monsters(plev);
+               sleep_monsters(plev);
                hp_player(300);
        }
 
@@ -1338,16 +507,16 @@ static void wild_magic(int spell)
        case 1:
        case 2:
        case 3:
-               teleport_player(10, TRUE);
+               teleport_player(10, TELEPORT_PASSIVE);
                break;
        case 4:
        case 5:
        case 6:
-               teleport_player(100, TRUE);
+               teleport_player(100, TELEPORT_PASSIVE);
                break;
        case 7:
        case 8:
-               teleport_player(200, TRUE);
+               teleport_player(200, TELEPORT_PASSIVE);
                break;
        case 9:
        case 10:
@@ -1553,7 +722,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(10, TRUE);
+               teleport_player(10, TELEPORT_PASSIVE);
        }
        else if (die < 42)
        {
@@ -1573,7 +742,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(100, TRUE);
+               teleport_player(100, TELEPORT_PASSIVE);
        }
        else if (die < 52)
        {
@@ -1583,7 +752,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(200, TRUE);
+               teleport_player(200, TELEPORT_PASSIVE);
        }
        else if (die < 60)
        {
@@ -1762,7 +931,8 @@ static void cast_meteor(int dam, int rad)
 
                        if (d >= 9) continue;
 
-                       if (!in_bounds(y, x) || !projectable(py, px, y, x)) continue;
+                       if (!in_bounds(y, x) || !projectable(py, px, y, x)
+                           || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
 
                        /* Valid position */
                        break;
@@ -1958,852 +1128,845 @@ static bool cast_summon_greater_demon(void)
 
 
 /*
- * Do everything for each spell
+ * 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;
+
+
+       /* 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 
  */
-cptr do_singing(int song, int mode)
+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_spell(REALM_MUSIC, p_ptr->magic_num2[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);
+}
+
+
+static cptr do_life_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 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 dir;
        int plev = p_ptr->lev;
 
-
-       switch (song)
+       switch (spell)
        {
-       case MUSIC_SLOW:
-               if (cast)
-               {
+       case 0:
 #ifdef JP
-                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
 #else
-                       msg_print("You start humming a slow, steady melody...");
+               if (name) return "Cure Light Wounds";
+               if (desc) return "Heals cut and HP a little.";
 #endif
-               }
-
+    
                {
-                       int power = plev;
+                       int dice = 2;
+                       int sides = 10;
 
-                       if (info) return info_power(power);
+                       if (info) return info_heal(dice, sides, 0);
 
-                       if (cont)
+                       if (cast)
                        {
-                               slow_monsters();
+                               hp_player(damroll(dice, sides));
+                               set_cut(p_ptr->cut - 10);
                        }
                }
                break;
 
-       case MUSIC_BLESS:
-               if (cast)
-               {
+       case 1:
 #ifdef JP
-                       msg_print("¸·¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "½ËÊ¡";
+               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
 #else
-                       msg_print("The holy power of the Music of the Ainur enters you...");
+               if (name) return "Bless";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
 #endif
-               }
-
-               if (stop)
+    
                {
-                       if (!p_ptr->blessed)
+                       int base = 12;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
-#else
-                               msg_print("The prayer has expired.");
-#endif
+                               set_blessed(randint1(base) + base, FALSE);
                        }
                }
-
                break;
 
-       case MUSIC_STUN:
-               if (cast)
-               {
+       case 2:
 #ifdef JP
-                       msg_print("âÁÏǤµ¤»¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "·Ú½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤Ë¾®¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("You weave a pattern of sounds to bewilder and daze...");
+               if (name) return "Cause Light Wounds";
+               if (desc) return "Wounds a monster a little unless resisted.";
 #endif
-               }
-
+    
                {
-                       int dice = plev / 10;
-                       int sides = 2;
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
 
-                       if (info) return info_power_dice(dice, sides);
+                       if (info) return info_damage(dice, sides, 0);
 
-                       if (cont)
+                       if (cast)
                        {
-                               stun_monsters(damroll(dice, sides));
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
                        }
                }
                break;
 
-       case MUSIC_L_LIFE:
-               if (cast)
-               {
+       case 3:
 #ifdef JP
-                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+               if (name) return "¸÷¤Î¾¤´­";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-                       msg_print("Life flows through you as you sing a song of healing...");
+               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 = 6;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_damage(dice, sides, 0);
 
-                       if (cont)
+                       if (cast)
                        {
-                               hp_player(damroll(dice, sides));
+                               lite_area(damroll(dice, sides), rad);
                        }
                }
                break;
 
-       case MUSIC_FEAR:
-               if (cast)
-               {
+       case 4:
 #ifdef JP
-                       msg_print("¤ª¤É¤í¤ª¤É¤í¤·¤¤¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "æ« & ±£¤·Èâ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
 #else
-                       msg_print("You start weaving a fearful pattern...");
+               if (name) return "Detect Doors & Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
 #endif
-               }
-
+    
                {
-                       int power = plev;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_power(power);
+                       if (info) return info_radius(rad);
 
-                       if (cont)
+                       if (cast)
                        {
-                               project_hack(GF_TURN_ALL, power);
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
                        }
                }
                break;
 
-       case MUSIC_HERO:
-               if (cast)
-               {
+       case 5:
 #ifdef JP
-                       msg_print("·ã¤·¤¤À襤¤Î²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
 #else
-                       msg_print("You start singing a song of intense fighting...");
+               if (name) return "Cure Medium Wounds";
+               if (desc) return "Heals cut and HP more.";
 #endif
+    
+               {
+                       int dice = 4;
+                       int sides = 10;
 
-                       (void)hp_player(10);
-                       (void)set_afraid(0);
-
-                       /* Recalculate hitpoints */
-                       p_ptr->update |= (PU_HP);
-               }
+                       if (info) return info_heal(dice, sides, 0);
 
-               if (stop)
-               {
-                       if (!p_ptr->hero)
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
-#else
-                               msg_print("The heroism wears off.");
-#endif
-                               /* Recalculate hitpoints */
-                               p_ptr->update |= (PU_HP);
+                               hp_player(damroll(dice, sides));
+                               set_cut((p_ptr->cut / 2) - 20);
                        }
                }
-
                break;
 
-       case MUSIC_DETECT:
-               if (cast)
-               {
+       case 6:
 #ifdef JP
-                       msg_print("ÀŤ«¤Ê²»³Ú¤¬´¶³Ð¤ò¸¦¤®À¡¤Þ¤µ¤»¤¿¡¥¡¥¡¥");
+               if (name) return "²òÆÇ";
+               if (desc) return "ÂÎÆâ¤ÎÆǤò¼è¤ê½ü¤¯¡£";
 #else
-                       msg_print("Your quiet music sharpens your sense of hearing...");
+               if (name) return "Cure Poison";
+               if (desc) return "Cure poison status.";
 #endif
-
-                       /* Hack -- Initialize the turn count */
-                       p_ptr->magic_num1[2] = 0;
+    
+               {
+                       if (cast)
+                       {
+                               set_poisoned(0);
+                       }
                }
+               break;
 
+       case 7:
+#ifdef JP
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
+#endif
+    
                {
-                       int rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
-                       if (cont)
+                       if (cast)
                        {
-                               int count = p_ptr->magic_num1[2];
+                               set_food(PY_FOOD_MAX - 1);
+                       }
+               }
+               break;
 
-                               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);
+       case 8:
+#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 (plev > 24 && count < 11)
-                                               p_ptr->magic_num1[2] = count + 1;
-                               }
-                               if (count >= 3)
+               {
+                       if (cast)
+                       {
+                               if (remove_curse())
                                {
-                                       detect_monsters_invis(rad);
-                                       detect_monsters_normal(rad);
-
-                                       if (plev > 19 && count < 6)
-                                               p_ptr->magic_num1[2] = count + 1;
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
                                }
-                               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)
-               {
+       case 9:
 #ifdef JP
-                       msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ë²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+               if (name) return "½Å½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÃæ¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("You start singing a song of soul in pain...");
+               if (name) return "Cause Medium Wounds";
+               if (desc) return "Wounds a monster unless resisted.";
 #endif
-               }
-
+    
                {
-                       int dice = 1;
-                       int sides = plev * 3 / 2;
+                       int sides = 8 + (plev - 5) / 4;
+                       int dice = 8;
 
                        if (info) return info_damage(dice, sides, 0);
 
-                       if (cont)
+                       if (cast)
                        {
-                               project_hack(GF_PSI, damroll(dice, sides));
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(sides, dice), 0);
                        }
                }
                break;
 
-       case MUSIC_ID:
-               if (cast)
-               {
+       case 10:
 #ifdef JP
-                       msg_print("¤³¤ÎÀ¤³¦¤ÎÃ챤¬Î®¤ì¹þ¤ó¤Ç¤­¤¿¡¥¡¥¡¥");
+               if (name) return "Ã×Ì¿½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤòÂçÉý¤Ë²óÉü¤µ¤»¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
 #else
-                       msg_print("You recall the rich lore of the world...");
+               if (name) return "Cure Critical Wounds";
+               if (desc) return "Heals cut, stun and HP greatly.";
 #endif
-               }
-
+    
                {
-                       int rad = 1;
+                       int dice = 8;
+                       int sides = 10;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_heal(dice, sides, 0);
 
-                       /*
-                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
-                        * MPÉÔ­¤Ç´ÕÄ꤬ȯư¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
-                        */
-                       if (cont || cast)
+                       if (cast)
                        {
-                               project(0, rad, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
+                               hp_player(damroll(dice, sides));
+                               set_stun(0);
+                               set_cut(0);
                        }
                }
                break;
 
-       case MUSIC_STEALTH:
-               if (cast)
-               {
+       case 11:
 #ifdef JP
-                       msg_print("¤¢¤Ê¤¿¤Î»Ñ¤¬·Ê¿§¤Ë¤È¤±¤³¤ó¤Ç¤¤¤Ã¤¿¡¥¡¥¡¥");
+               if (name) return "ÂÑÇ®ÂÑ´¨";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ð±ê¤ÈÎ䵤¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-                       msg_print("Your song carries you beyond the sight of mortal eyes...");
+               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
-               }
-
-               if (stop)
+    
                {
-                       if (!p_ptr->tim_stealth)
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("»Ñ¤¬¤Ï¤Ã¤­¤ê¤È¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£");
-#else
-                               msg_print("You are no longer hided.");
-#endif
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
                        }
                }
-
                break;
 
-       case MUSIC_CONF:
-               if (cast)
-               {
+       case 12:
 #ifdef JP
-                       msg_print("ÊÕ¤ê°ìÌ̤˸¸±Æ¤¬¸½¤ì¤¿¡¥¡¥¡¥");
+               if (name) return "¼þÊÕ´¶ÃÎ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
 #else
-                       msg_print("You weave a pattern of sounds to beguile and confuse...");
+               if (name) return "Sense Surroundings";
+               if (desc) return "Maps nearby area.";
 #endif
-               }
-
+    
                {
-                       int power = plev * 2;
+                       int rad = DETECT_RAD_MAP;
 
-                       if (info) return info_power(power);
+                       if (info) return info_radius(rad);
 
-                       if (cont)
+                       if (cast)
                        {
-                               confuse_monsters(power);
+                               map_area(rad);
                        }
                }
                break;
 
-       case MUSIC_SOUND:
-               if (cast)
-               {
+       case 13:
 #ifdef JP
-                       msg_print("¹ì²»¤¬¶Á¤¤¤¿¡¥¡¥¡¥");
+               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥¢¥ó¥Ç¥Ã¥É";
+               if (desc) return "»ë³¦Æâ¤Î¥¢¥ó¥Ç¥Ã¥É¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("The fury of the Downfall of Numenor lashes out...");
+               if (name) return "Turn Undead";
+               if (desc) return "Attempts to scare undead monsters in sight.";
 #endif
-               }
-
+    
                {
-                       int dice = 10 + plev / 5;
-                       int sides = 7;
-
-                       if (info) return info_damage(dice, sides, 0);
-
-                       if (cont)
+                       if (cast)
                        {
-                               project_hack(GF_SOUND, damroll(dice, sides));
+                               turn_undead();
                        }
                }
                break;
 
-       case MUSIC_CHARM:
-               if (cast)
-               {
+       case 14:
 #ifdef JP
-                       msg_print("°Â¤é¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "ÂÎÎϲóÉü";
+               if (desc) return "¶Ë¤á¤Æ¶¯ÎϤʲóÉü¼öʸ¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
 #else
-                       msg_print("You weave a slow, soothing melody of imploration...");
+               if (name) return "Healing";
+               if (desc) return "Much powerful healing magic, and heals cut and stun completely.";
 #endif
-               }
-
+    
                {
-                       int dice = 10 + plev / 15;
-                       int sides = 6;
+                       int heal = 300;
 
-                       if (info) return info_power_dice(dice, sides);
+                       if (info) return info_heal(0, 0, heal);
 
-                       if (cont)
+                       if (cast)
                        {
-                               charm_monsters(damroll(dice, sides));
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
                        }
                }
                break;
 
-       case MUSIC_WALL:
-               if (cast)
-               {
+       case 15:
 #ifdef JP
-                       msg_print("Ê´ºÕ¤¹¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "·ë³¦¤ÎÌæ¾Ï";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
 #else
-                       msg_print("You weave a violent pattern of sounds to break wall.");
+               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
-               }
-
+    
                {
-                       /*
-                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
-                        * MPÉÔ­¤Ç¸ú²Ì¤¬È¯Æ°¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
-                        */
-                       if (cont || cast)
+                       if (cast)
                        {
-                               project(0, 0, py, px,
-                                       0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
+                               warding_glyph();
                        }
                }
                break;
 
-       case MUSIC_RESIST:
-               if (cast)
-               {
+       case 16:
 #ifdef JP
-                       msg_print("¸µÁǤÎÎϤËÂФ¹¤ëǦÂѤβΤò²Î¤Ã¤¿¡£");
+               if (name) return "*²ò¼ö*";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
 #else
-                       msg_print("You sing a song of perseverance against powers...");
+               if (name) return "Dispel Curse";
+               if (desc) return "Removes normal and heavy curse from equipped items.";
 #endif
-               }
-
-               if (stop)
+    
                {
-                       if (!p_ptr->oppose_acid)
+                       if (cast)
                        {
+                               if (remove_all_curse())
+                               {
 #ifdef JP
-                               msg_print("»À¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
 #else
-                               msg_print("You feel less resistant to acid.");
+                                       msg_print("You feel as if someone is watching over you.");
 #endif
+                               }
                        }
+               }
+               break;
 
-                       if (!p_ptr->oppose_elec)
-                       {
+       case 17:
 #ifdef JP
-                               msg_print("ÅÅ·â¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+               if (name) return "´Õ¼±";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
 #else
-                               msg_print("You feel less resistant to elec.");
+               if (name) return "Perception";
+               if (desc) return "Identifies an item.";
 #endif
-                       }
-
-                       if (!p_ptr->oppose_fire)
+    
+               {
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("²Ð¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
-#else
-                               msg_print("You feel less resistant to fire.");
-#endif
+                               if (!ident_spell(FALSE)) return NULL;
                        }
+               }
+               break;
 
-                       if (!p_ptr->oppose_cold)
-                       {
+       case 18:
 #ifdef JP
-                               msg_print("Î䵤¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+               if (name) return "¥¢¥ó¥Ç¥Ã¥ÉÂ໶";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥É¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-                               msg_print("You feel less resistant to cold.");
+               if (name) return "Dispel Undead";
+               if (desc) return "Damages all undead monsters in sight.";
 #endif
-                       }
+    
+               {
+                       int dice = 1;
+                       int sides = plev * 5;
 
-                       if (!p_ptr->oppose_pois)
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("ÆǤؤÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
-#else
-                               msg_print("You feel less resistant to pois.");
-#endif
+                               dispel_undead(damroll(dice, sides));
                        }
                }
-
                break;
 
-       case MUSIC_SPEED:
-               if (cast)
-               {
+       case 19:
 #ifdef JP
-                       msg_print("·Ú²÷¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+               if (name) return "Æä¤Î¹ï";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("You start singing joyful pop song...");
+               if (name) return "Day of the Dove";
+               if (desc) return "Attempts to charm all monsters in sight.";
 #endif
-               }
-
-               if (stop)
+    
                {
-                       if (!p_ptr->fast)
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
-#else
-                               msg_print("You feel yourself slow down.");
-#endif
+                               charm_monsters(power);
                        }
                }
-
                break;
 
-       case MUSIC_DISPEL:
-               if (cast)
-               {
+       case 20:
 #ifdef JP
-                       msg_print("ÂѤ¨¤é¤ì¤Ê¤¤ÉÔ¶¨Ï²»¤¬Å¨¤òÀÕ¤áΩ¤Æ¤¿¡¥¡¥¡¥");
+               if (name) return "Ã×Ì¿½ý";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("You cry out in an ear-wracking voice...");
+               if (name) return "Cause Critical Wounds";
+               if (desc) return "Wounds a monster critically unless resisted.";
 #endif
-               }
-
+    
                {
-                       int m_sides = plev * 3;
-                       int e_sides = plev * 3;
+                       int dice = 5 + (plev - 5) / 3;
+                       int sides = 15;
 
-                       if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
+                       if (info) return info_damage(dice, sides, 0);
 
-                       if (cont)
+                       if (cast)
                        {
-                               dispel_monsters(randint1(m_sides));
-                               dispel_evil(randint1(e_sides));
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
                        }
                }
                break;
 
-       case MUSIC_SARUMAN:
-               if (cast)
-               {
+       case 21:
 #ifdef JP
-                       msg_print("Í¥¤·¤¯¡¢Ì¥ÎÏŪ¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+               if (name) return "µ¢´Ô¤Î¾Û";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
 #else
-                       msg_print("You start humming a gentle and attractive song...");
+               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 power = plev;
+                       int base = 15;
+                       int sides = 20;
 
-                       if (info) return info_power(power);
+                       if (info) return info_delay(base, sides);
 
-                       if (cont)
+                       if (cast)
                        {
-                               slow_monsters();
-                               sleep_monsters();
+                               if (!word_of_recall()) return NULL;
                        }
                }
                break;
 
-       case MUSIC_QUAKE:
-               if (cast)
-               {
+       case 22:
 #ifdef JP
-                       msg_print("Ç˲õŪ¤Ê²Î¤¬¶Á¤­¤ï¤¿¤Ã¤¿¡¥¡¥¡¥");
+               if (name) return "¿¿¼Â¤Îº×ÃÅ";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
 #else
-                       msg_print("You weave a pattern of sounds to contort and shatter...");
+               if (name) return "Alter Reality";
+               if (desc) return "Recreates current dungeon level.";
 #endif
-               }
-
+    
                {
-                       int rad = 10;
+                       int base = 15;
+                       int sides = 20;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_delay(base, sides);
 
-                       if (cont)
+                       if (cast)
                        {
-                               earthquake(py, px, 10);
+                               alter_reality();
                        }
                }
                break;
 
-       case MUSIC_STASIS:
-               if (cast)
-               {
+       case 23:
 #ifdef JP
-                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+               if (name) return "¿¿¡¦·ë³¦";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤È¼þ°Ï8¥Þ¥¹¤Î¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
 #else
-                       msg_print("You weave a very slow pattern which is almost likely to stop...");
+               if (name) return "Warding True";
+               if (desc) return "Creates glyphs in all adjacent squares and under you.";
 #endif
-               }
-
+    
                {
-                       int power = plev * 4;
+                       int rad = 1;
 
-                       if (info) return info_power(power);
+                       if (info) return info_radius(rad);
 
-                       if (cont)
+                       if (cast)
                        {
-                               stasis_monsters(power);
+                               warding_glyph();
+                               glyph_creation();
                        }
                }
                break;
 
-       case MUSIC_SHERO:
-               if (cast)
-               {
+       case 24:
 #ifdef JP
-                       msg_print("±Ñͺ¤Î²Î¤ò¸ý¤º¤µ¤ó¤À¡¥¡¥¡¥");
+               if (name) return "ÉÔÌÓ²½";
+               if (desc) return "¤³¤Î³¬¤ÎÁý¿£¤¹¤ë¥â¥ó¥¹¥¿¡¼¤¬Áý¿£¤Ç¤­¤Ê¤¯¤Ê¤ë¡£";
 #else
-                       msg_print("You chant a powerful, heroic call to arms...");
+               if (name) return "Sterilization";
+               if (desc) return "Prevents any breeders on current level from breeding.";
 #endif
-                       (void)hp_player(10);
-                       (void)set_afraid(0);
-
-                       /* Recalculate hitpoints */
-                       p_ptr->update |= (PU_HP);
-               }
-
-               if (stop)
+    
                {
-                       if (!p_ptr->hero)
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
-#else
-                               msg_print("The heroism wears off.");
-#endif
-                               /* Recalculate hitpoints */
-                               p_ptr->update |= (PU_HP);
+                               num_repro += MAX_REPRO;
                        }
+               }
+               break;
 
-                       if (!p_ptr->fast)
-                       {
+       case 25:
 #ifdef JP
-                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
+               if (name) return "Á´´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-                               msg_print("You feel yourself slow down.");
+               if (name) return "Detection";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
 #endif
-                       }
-               }
 
                {
-                       int dice = 1;
-                       int sides = plev * 3;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
-                       if (cont)
+                       if (cast)
                        {
-                               dispel_monsters(damroll(dice, sides));
+                               detect_all(rad);
                        }
                }
                break;
 
-       case MUSIC_H_LIFE:
-               if (cast)
-               {
+       case 26:
 #ifdef JP
-                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É¾ÃÌÇ";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥¢¥ó¥Ç¥Ã¥É¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-                       msg_print("Life flows through you as you sing the song...");
+               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 dice = 15;
-                       int sides = 10;
+                       int power = plev + 50;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_power(power);
 
-                       if (cont)
+                       if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_stun(0);
-                               set_cut(0);
+                               mass_genocide_undead(power, TRUE);
                        }
                }
                break;
 
-       case MUSIC_INVULN:
-               if (cast)
-               {
+       case 27:
 #ifdef JP
-                               msg_print("¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤Î̽²¦¤Ø¤ÎÄ©Àï¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+               if (name) return "ÀéΤ´ã";
+               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-                               msg_print("You recall the valor of Fingolfin's challenge to the Dark Lord...");
+               if (name) return "Clairvoyance";
+               if (desc) return "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.";
 #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 (cast)
+                       {
+                               wiz_lite(FALSE);
+                       }
                }
+               break;
 
-               if (stop)
+       case 28:
+#ifdef JP
+               if (name) return "Á´Éü³è";
+               if (desc) return "¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¿¥¹¤È·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Restoration";
+               if (desc) return "Restores all stats and experience.";
+#endif
+    
                {
-                       if (!p_ptr->invuln)
+                       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 29:
 #ifdef JP
-                               msg_print("̵Ũ¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
+               if (name) return "*ÂÎÎϲóÉü*";
+               if (desc) return "ºÇ¶¯¤Î¼£Ìþ¤ÎËâË¡¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
 #else
-                               msg_print("The invulnerability wears off.");
+               if (name) return "Healing True";
+               if (desc) return "The greatest healing magic. Heals all HP, cut and stun.";
 #endif
-                               /* Redraw map */
-                               p_ptr->redraw |= (PR_MAP);
+    
+               {
+                       int heal = 2000;
 
-                               /* Update monsters */
-                               p_ptr->update |= (PU_MONSTERS);
+                       if (info) return info_heal(0, 0, heal);
 
-                               /* Window stuff */
-                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+                       if (cast)
+                       {
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
                        }
                }
-
                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);
-}
+       case 30:
+#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 31:
+#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;
 
-/*
- * Stop singing if the player is a Bard 
- */
-void stop_singing(void)
-{
-       if (p_ptr->pclass != CLASS_BARD) return;
+                       if (info) return info_duration(base, base);
 
-       /* Are there interupted song? */
-       if (p_ptr->magic_num1[1])
-       {
-               /* Forget interupted song */
-               p_ptr->magic_num1[1] = 0;
-               return;
+                       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;
        }
 
-       /* 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);
+       return "";
 }
 
 
-/*
- * Do everything for each spell
- */
-cptr do_spell(int spell, int mode)
+static cptr do_sorcery_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:  
+       case 0:
 #ifdef JP
-               if (name) return "·Ú½ý¤Î¼£Ìþ";
-               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Cure Light Wounds";
-               if (desc) return "Heals cut and HP a little.";
+               if (name) return "Detect Monsters";
+               if (desc) return "Detects all monsters in your vicinity unless invisible.";
 #endif
     
                {
-                       int dice = 2;
-                       int sides = 10;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_cut(p_ptr->cut - 10);
+                               detect_monsters_normal(rad);
                        }
                }
                break;
 
-       case LIFE_SPEL_BLESS:  
+       case 1:
 #ifdef JP
-               if (name) return "½ËÊ¡";
-               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Bless";
-               if (desc) return "Gives bonus to hit and AC for a few turns.";
+               if (name) return "Phase Door";
+               if (desc) return "Teleport short distance.";
 #endif
     
                {
-                       int base = 12;
+                       int range = 10;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               set_blessed(randint1(base) + base, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case LIFE_SPEL_CAUSE_LIGHT_WOUNDS:  
+       case 2:
 #ifdef JP
-               if (name) return "·Ú½ý";
-               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤Ë¾®¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "櫤ÈÈâ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤ÎÈâ¤È櫤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Cause Light Wounds";
-               if (desc) return "Wounds a monster a little unless resisted.";
+               if (name) return "Detect Doors and Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
 #endif
     
                {
-                       int dice = 3 + (plev - 1) / 5;
-                       int sides = 4;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
                        }
                }
                break;
 
-       case LIFE_SPEL_CALL_LIGHT:  
+       case 3:
 #ifdef JP
-               if (name) return "¸÷¤Î¾¤´­";
+               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
                if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-               if (name) return "Call Light";
+               if (name) return "Light Area";
                if (desc) return "Lights up nearby area and the inside of a room permanently.";
 #endif
     
@@ -2821,393 +1984,390 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case LIFE_SPEL_DETECT_DOORS_AND_TRAPS:  
+       case 4:
 #ifdef JP
-               if (name) return "æ« & ±£¤·Èâ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
+               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Detect Doors & Traps";
-               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+               if (name) return "Confuse Monster";
+               if (desc) return "Attempts to confuse a monster.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
+                       int power = (plev * 3) / 2;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               detect_traps(rad, TRUE);
-                               detect_doors(rad);
-                               detect_stairs(rad);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               confuse_monster(dir, power);
                        }
                }
                break;
 
-       case LIFE_SPEL_CURE_MEDIUM_WOUNDS:  
+       case 5:
 #ifdef JP
-               if (name) return "½Å½ý¤Î¼£Ìþ";
-               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Cure Medium Wounds";
-               if (desc) return "Heals cut and HP more.";
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
 #endif
     
                {
-                       int dice = 4;
-                       int sides = 10;
+                       int range = plev * 5;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_cut((p_ptr->cut / 2) - 20);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case LIFE_SPEL_CURE_POISON:  
+       case 6:
 #ifdef JP
-               if (name) return "²òÆÇ";
-               if (desc) return "ÂÎÆâ¤ÎÆǤò¼è¤ê½ü¤¯¡£";
+               if (name) return "¥¹¥ê¡¼¥×¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Cure Poison";
-               if (desc) return "Cure poison status.";
+               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)
                        {
-                               set_poisoned(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               sleep_monster(dir, plev);
                        }
                }
                break;
 
-       case LIFE_SPEL_SATISFY_HUNGER:  
+       case 7:
 #ifdef JP
-               if (name) return "¶õÊ¢½¼Â­";
-               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
+               if (name) return "ËâÎϽ¼Å¶";
+               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
 #else
-               if (name) return "Satisfy Hunger";
-               if (desc) return "Satisfies hunger.";
+               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)
                        {
-                               set_food(PY_FOOD_MAX - 1);
+                               if (!recharge(power)) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_REMOVE_CURSE:  
+       case 8:
 #ifdef JP
-               if (name) return "²ò¼ö";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "ËâË¡¤ÎÃÏ¿Þ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Remove Curse";
-               if (desc) return "Removes normal curses from equipped items.";
+               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)
                        {
-                               if (remove_curse())
-                               {
-#ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
-#else
-                                       msg_print("You feel as if someone is watching over you.");
-#endif
-                               }
+                               map_area(rad);
                        }
                }
                break;
 
-       case LIFE_SPEL_CAUSE_MEDIUM_WOUNDS:  
+       case 9:
 #ifdef JP
-               if (name) return "½Å½ý";
-               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÃæ¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "´ÕÄê";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
 #else
-               if (name) return "Cause Medium Wounds";
-               if (desc) return "Wounds a monster unless resisted.";
+               if (name) return "Identify";
+               if (desc) return "Identifies an item.";
 #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);
+                               if (!ident_spell(FALSE)) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_CURE_CRITICAL_WOUNDS: 
+       case 10:
 #ifdef JP
-               if (name) return "Ã×Ì¿½ý¤Î¼£Ìþ";
-               if (desc) return "ÂÎÎϤòÂçÉý¤Ë²óÉü¤µ¤»¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+               if (name) return "¥¹¥í¥¦¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¸ºÂ®¤µ¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Cure Critical Wounds";
-               if (desc) return "Heals cut, stun and HP greatly.";
+               if (name) return "Slow Monster";
+               if (desc) return "Attempts to slow a monster.";
 #endif
     
                {
-                       int dice = 8;
-                       int sides = 10;
+                       int power = plev;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_stun(0);
-                               set_cut(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               slow_monster(dir, plev);
                        }
                }
                break;
 
-       case LIFE_SPEL_RESIST_HEAT_AND_COLD: 
+       case 11:
 #ifdef JP
-               if (name) return "ÂÑÇ®ÂÑ´¨";
-               if (desc) return "°ìÄê»þ´Ö¡¢²Ð±ê¤ÈÎ䵤¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Mass Sleep";
+               if (desc) return "Attempts to sleep all monsters in sight.";
 #endif
     
                {
-                       int base = 20;
+                       int power = plev;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               set_oppose_cold(randint1(base) + base, FALSE);
-                               set_oppose_fire(randint1(base) + base, FALSE);
+                               sleep_monsters(plev);
                        }
                }
                break;
 
-       case LIFE_SPEL_SENSE_SURROUNDINGS: 
+       case 12:
 #ifdef JP
-               if (name) return "¼þÊÕ´¶ÃÎ";
-               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Sense Surroundings";
-               if (desc) return "Maps nearby area.";
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
 #endif
     
                {
-                       int rad = DETECT_RAD_MAP;
+                       int power = plev;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               map_area(rad);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
                        }
                }
                break;
 
-       case LIFE_SPEL_TURN_UNDEAD: 
+       case 13:
 #ifdef JP
-               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥¢¥ó¥Ç¥Ã¥É";
-               if (desc) return "»ë³¦Æâ¤Î¥¢¥ó¥Ç¥Ã¥É¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥¹¥Ô¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
 #else
-               if (name) return "Turn Undead";
-               if (desc) return "Attempts to scare undead monsters in sight.";
+               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)
                        {
-                               turn_undead();
+                               set_fast(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case LIFE_SPEL_HEALING: 
+       case 14:
 #ifdef JP
-               if (name) return "ÂÎÎϲóÉü";
-               if (desc) return "¶Ë¤á¤Æ¶¯ÎϤʲóÉü¼öʸ¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+               if (name) return "¿¿¡¦´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Healing";
-               if (desc) return "Much powerful healing magic, and heals cut and stun completely.";
+               if (name) return "Detection True";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
 #endif
     
                {
-                       int heal = 300;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_heal(0, 0, heal);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               hp_player(heal);
-                               set_stun(0);
-                               set_cut(0);
+                               detect_all(rad);
                        }
                }
                break;
 
-       case LIFE_SPEL_GLYPH_OF_WARDING: 
+       case 15:
 #ifdef JP
-               if (name) return "·ë³¦¤ÎÌæ¾Ï";
-               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+               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.";
+               if (name) return "Identify True";
+               if (desc) return "*Identifies* an item.";
 #endif
     
                {
                        if (cast)
                        {
-                               warding_glyph();
+                               if (!identify_fully(FALSE)) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_DISPEL_CURSE: 
+       case 16:
 #ifdef JP
-               if (name) return "*²ò¼ö*";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "ʪÂΤȺâÊõ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ÈºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Dispel Curse";
-               if (desc) return "Removes normal and heavy curse from equipped items.";
+               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)
                        {
-                               if (remove_all_curse())
-                               {
-#ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
-#else
-                                       msg_print("You feel as if someone is watching over you.");
-#endif
-                               }
+                               detect_objects_normal(rad);
+                               detect_treasure(rad);
+                               detect_objects_gold(rad);
                        }
                }
                break;
 
-       case LIFE_SPEL_PERCEPTION: 
+       case 17:
 #ifdef JP
-               if (name) return "´Õ¼±";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+               if (name) return "¥Á¥ã¡¼¥à¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Perception";
-               if (desc) return "Identifies an item.";
+               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 (!ident_spell(FALSE)) return NULL;
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               charm_monster(dir, power);
                        }
                }
                break;
 
-       case LIFE_SPEL_DISPEL_UNDEAD: 
+       case 18:
 #ifdef JP
-               if (name) return "¥¢¥ó¥Ç¥Ã¥ÉÂ໶";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥É¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "Àº¿À´¶ÃÎ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Dispel Undead";
-               if (desc) return "Damages all undead monsters in sight.";
+               if (name) return "Sense Minds";
+               if (desc) return "Gives telepathy for a while.";
 #endif
     
                {
-                       int dice = 1;
-                       int sides = plev * 5;
+                       int base = 25;
+                       int sides = 30;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               dispel_undead(damroll(dice, sides));
+                               set_tim_esp(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case LIFE_SPEL_DAY_OF_THE_DOVE: 
+       case 19:
 #ifdef JP
-               if (name) return "Æä¤Î¹ï";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "³¹°ÜÆ°";
+               if (desc) return "³¹¤Ø°ÜÆ°¤¹¤ë¡£ÃϾå¤Ë¤¤¤ë¤È¤­¤·¤«»È¤¨¤Ê¤¤¡£";
 #else
-               if (name) return "Day of the Dove";
-               if (desc) return "Attempts to charm all monsters in sight.";
+               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
     
                {
-                       int power = plev * 2;
-
-                       if (info) return info_power(power);
-
                        if (cast)
                        {
-                               charm_monsters(power);
+                               if (!tele_town()) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_CAUSE_CRITICAL_WOUNDS: 
+       case 20:
 #ifdef JP
-               if (name) return "Ã×Ì¿½ý";
-               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¼«¸ÊʬÀÏ";
+               if (desc) return "¸½ºß¤Î¼«Ê¬¤Î¾õÂÖ¤ò´°Á´¤ËÃΤ롣";
 #else
-               if (name) return "Cause Critical Wounds";
-               if (desc) return "Wounds a monster critically unless resisted.";
+               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
     
                {
-                       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);
+                               self_knowledge();
                        }
                }
                break;
 
-       case LIFE_SPEL_WORD_OF_RECALL: 
+       case 21:
 #ifdef JP
-               if (name) return "µ¢´Ô¤Î¾Û";
-               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+               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.";
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
 #endif
     
                {
-                       int base = 15;
-                       int sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
                        if (cast)
                        {
-                               if (!word_of_recall()) return NULL;
+#ifdef JP
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+#endif
+                               teleport_level(0);
                        }
                }
                break;
 
-       case LIFE_SPEL_ALTER_REALITY: 
+       case 22:
 #ifdef JP
-               if (name) return "¿¿¼Â¤Îº×ÃÅ";
-               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
 #else
-               if (name) return "Alter Reality";
-               if (desc) return "Recreates current dungeon level.";
+               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
     
                {
@@ -3218,206 +2378,242 @@ cptr do_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               alter_reality();
+                               if (!word_of_recall()) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_WARDING_TRUE: 
+       case 23:
 #ifdef JP
-               if (name) return "¿¿¡¦·ë³¦";
-               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤È¼þ°Ï8¥Þ¥¹¤Î¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤êÈ´¤±¤¿¤ê¾¤´­¤µ¤ì¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+               if (name) return "¼¡¸µ¤ÎÈâ";
+               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
 #else
-               if (name) return "Warding True";
-               if (desc) return "Creates glyphs in all adjacent squares and under you.";
+               if (name) return "Dimension Door";
+               if (desc) return "Teleport to given location.";
 #endif
     
                {
-                       int rad = 1;
+                       int range = plev / 2 + 10;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               warding_glyph();
-                               glyph_creation();
+#ifdef JP
+                               msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
+#else
+                               msg_print("You open a dimensional gate. Choose a destination.");
+#endif
+
+                               if (!dimension_door()) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_STERILIZATION: 
+       case 24:
 #ifdef JP
-               if (name) return "ÉÔÌÓ²½";
-               if (desc) return "¤³¤Î³¬¤ÎÁý¿£¤¹¤ë¥â¥ó¥¹¥¿¡¼¤¬Áý¿£¤Ç¤­¤Ê¤¯¤Ê¤ë¡£";
+               if (name) return "Ä´ºº";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Î°À­¡¢»Ä¤êÂÎÎÏ¡¢ºÇÂçÂÎÎÏ¡¢¥¹¥Ô¡¼¥É¡¢ÀµÂΤòÃΤ롣";
 #else
-               if (name) return "Sterilization";
-               if (desc) return "Prevents any breeders on current level from breeding.";
+               if (name) return "Probing";
+               if (desc) return "Proves all monsters' alignment, HP, speed and their true character.";
 #endif
     
                {
                        if (cast)
                        {
-                               num_repro += MAX_REPRO;
+                               probing();
                        }
                }
                break;
 
-       case LIFE_SPEL_DETECTION: 
+       case 25:
 #ifdef JP
-               if (name) return "Á´´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int dice = 7;
+                       int sides = 7;
+                       int base = plev;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_damage(dice, sides, base);
 
                        if (cast)
                        {
-                               detect_all(rad);
+                               explosive_rune();
                        }
                }
                break;
 
-       case LIFE_SPEL_ANNIHILATE_UNDEAD: 
+       case 26:
 #ifdef JP
-               if (name) return "¥¢¥ó¥Ç¥Ã¥É¾ÃÌÇ";
-               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥¢¥ó¥Ç¥Ã¥É¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               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.";
+               if (name) return "Telekinesis";
+               if (desc) return "Pulls a distant item close to you.";
 #endif
     
                {
-                       int power = plev + 50;
+                       int weight = plev * 15;
 
-                       if (info) return info_power(power);
+                       if (info) return info_weight(weight);
 
                        if (cast)
                        {
-                               mass_genocide_undead(power, TRUE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fetch(dir, weight, FALSE);
                        }
                }
                break;
 
-       case LIFE_SPEL_CLAIRVOYANCE: 
+       case 27:
 #ifdef JP
                if (name) return "ÀéΤ´ã";
-               if (desc) 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 LIFE_SPEL_RESTORATION: 
+       case 28:
 #ifdef JP
-               if (name) return "Á´Éü³è";
-               if (desc) return "¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¿¥¹¤È·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+               if (name) return "̥λ¤Î»ëÀþ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Restoration";
-               if (desc) return "Restores all stats and experience.";
+               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)
                        {
-                               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();
+                               charm_monsters(power);
                        }
                }
                break;
 
-       case LIFE_SPEL_HEALING_TRUE: 
+       case 29:
 #ifdef JP
-               if (name) return "*ÂÎÎϲóÉü*";
-               if (desc) return "ºÇ¶¯¤Î¼£Ìþ¤ÎËâË¡¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+               if (name) return "Ï£¶â½Ñ";
+               if (desc) return "¥¢¥¤¥Æ¥à1¤Ä¤ò¤ª¶â¤ËÊѤ¨¤ë¡£";
 #else
-               if (name) return "Healing True";
-               if (desc) return "The greatest healing magic. Heals all HP, cut and stun.";
+               if (name) return "Alchemy";
+               if (desc) return "Turns an item into 1/3 of its value in gold.";
 #endif
     
                {
-                       int heal = 2000;
-
-                       if (info) return info_heal(0, 0, heal);
-
                        if (cast)
                        {
-                               hp_player(heal);
-                               set_stun(0);
-                               set_cut(0);
+                               if (!alchemy()) return NULL;
                        }
                }
                break;
 
-       case LIFE_SPEL_HOLY_VISION: 
+       case 30:
 #ifdef JP
-               if (name) return "À»¤Ê¤ë¥Ó¥¸¥ç¥ó";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+               if (name) return "²øʪÄÉÊü";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Holy Vision";
-               if (desc) return "*Identifies* an item.";
+               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)
                        {
-                               if (!identify_fully(FALSE)) return NULL;
+                               banish_monsters(power);
                        }
                }
                break;
 
-       case LIFE_SPEL_ULTIMATE_RESISTANCE: 
+       case 31:
 #ifdef JP
-               if (name) return "µæ¶Ë¤ÎÂÑÀ­";
-               if (desc) return "°ìÄê»þ´Ö¡¢¤¢¤é¤æ¤ëÂÑÀ­¤òÉÕ¤±¡¢AC¤ÈËâË¡ËɸæǽÎϤò¾å¾º¤µ¤»¤ë¡£";
+               if (name) return "̵½ý¤Îµå";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¯¤Ê¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£Àڤ줿½Ö´Ö¤Ë¾¯¤·¥¿¡¼¥ó¤ò¾ÃÈñ¤¹¤ë¤Î¤ÇÃí°Õ¡£";
 #else
-               if (name) return "Ultimate Resistance";
-               if (desc) return "Gives ultimate resistance, bonus to AC and speed.";
+               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 = plev / 2;
+                       int base = 4;
 
                        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);
+                               set_invuln(randint1(base) + base, FALSE);
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_nature_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;
+
+#ifdef JP
+       static const char s_dam[] = "»½ý:";
+       static const char s_rng[] = "¼ÍÄø";
+#else
+       static const char s_dam[] = "dam ";
+       static const char s_rng[] = "rng ";
+#endif
 
-       case SORC_SPEL_DETECT_MONSTERS: 
+       int dir;
+       int plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
                if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
                if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Detect Monsters";
+               if (name) return "Detect Creatures";
                if (desc) return "Detects all monsters in your vicinity unless invisible.";
 #endif
     
@@ -3433,31 +2629,37 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case SORC_SPEL_PHASE_DOOR: 
+       case 1:
 #ifdef JP
-               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "°ðºÊ";
+               if (desc) return "ÅÅ·â¤Îû¤¤¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Phase Door";
-               if (desc) return "Teleport short distance.";
+               if (name) return "Lightning";
+               if (desc) return "Fires a short beam of lightning.";
 #endif
     
                {
-                       int range = 10;
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+                       int range = plev / 6 + 2;
 
-                       if (info) return info_range(range);
+                       if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               project_length = range;
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_ELEC, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case SORC_SPEL_DETECT_DOORS_AND_TRAPS: 
+       case 2:
 #ifdef JP
                if (name) return "櫤ÈÈâ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤ÎÈâ¤È櫤ò´¶ÃΤ¹¤ë¡£";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤ò´¶ÃΤ¹¤ë¡£";
 #else
                if (name) return "Detect Doors and Traps";
                if (desc) return "Detects traps, doors, and stairs in your vicinity.";
@@ -3477,80 +2679,80 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case SORC_SPEL_LIGHT_AREA: 
+       case 3:
 #ifdef JP
-               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
-               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+               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.";
+               if (name) return "Produce Food";
+               if (desc) return "Produces a Ration of Food.";
 #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;
+                               object_type forge, *q_ptr = &forge;
 
-       case SORC_SPEL_CONFUSE_MONSTER: 
 #ifdef JP
-               if (name) return "¥Ñ¥Ë¥Ã¥¯¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+                               msg_print("¿©ÎÁ¤òÀ¸À®¤·¤¿¡£");
 #else
-               if (name) return "Confuse Monster";
-               if (desc) return "Attempts to confuse a monster.";
+                               msg_print("A food ration is produced.");
 #endif
-    
-               {
-                       int power = (plev * 3) / 2;
-
-                       if (info) return info_power(power);
 
-                       if (cast)
-                       {
-                               if (!get_aim_dir(&dir)) return NULL;
+                               /* Create the food ration */
+                               object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
 
-                               confuse_monster(dir, power);
+                               /* Drop the object from heaven */
+                               drop_near(q_ptr, -1, py, px);
                        }
                }
                break;
 
-       case SORC_SPEL_TELEPORT: 
+       case 4:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "Æü¤Î¸÷";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-               if (name) return "Teleport";
-               if (desc) return "Teleport long distance.";
+               if (name) return "Daylight";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
 #endif
     
                {
-                       int range = plev * 5;
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = (plev / 10) + 1;
 
-                       if (info) return info_range(range);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               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 SORC_SPEL_SLEEP_MONSTER: 
+       case 5:
 #ifdef JP
-               if (name) return "¥¹¥ê¡¼¥×¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ưʪ½¬¤·";
+               if (desc) return "ưʪ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Sleep Monster";
-               if (desc) return "Attempts to sleep a monster.";
+               if (name) return "Animal Taming";
+               if (desc) return "Attempts to charm an animal.";
 #endif
     
                {
@@ -3562,649 +2764,691 @@ cptr do_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               sleep_monster(dir);
+                               charm_animal(dir, power);
                        }
                }
                break;
 
-       case SORC_SPEL_RECHARGING: 
+       case 6:
 #ifdef JP
-               if (name) return "ËâÎϽ¼Å¶";
-               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
+               if (name) return "´Ä¶­¤Ø¤ÎÂÑÀ­";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Recharging";
-               if (desc) return "Recharges staffs, wands or rods.";
+               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 power = plev * 4;
+                       int base = 20;
 
-                       if (info) return info_power(power);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!recharge(power)) return NULL;
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_oppose_elec(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case SORC_SPEL_MAGIC_MAPPING: 
+       case 7:
 #ifdef JP
-               if (name) return "ËâË¡¤ÎÃÏ¿Þ";
-               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "½ý¤ÈÆǼ£ÎÅ";
+               if (desc) return "²ø²æ¤òÁ´²÷¤µ¤»¡¢ÆǤòÂΤ«¤é´°Á´¤Ë¼è¤ê½ü¤­¡¢ÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
 #else
-               if (name) return "Magic Mapping";
-               if (desc) return "Maps nearby area.";
+               if (name) return "Cure Wounds & Poison";
+               if (desc) return "Heals all cut and poison status. Heals HP a little.";
 #endif
     
                {
-                       int rad = DETECT_RAD_MAP;
+                       int dice = 2;
+                       int sides = 8;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_heal(dice, sides, 0);
 
                        if (cast)
                        {
-                               map_area(rad);
+                               hp_player(damroll(dice, sides));
+                               set_cut(0);
+                               set_poisoned(0);
                        }
                }
                break;
 
-       case SORC_SPEL_IDENTIFY: 
+       case 8:
 #ifdef JP
-               if (name) return "´ÕÄê";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+               if (name) return "´äÀÐÍϲò";
+               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
 #else
-               if (name) return "Identify";
-               if (desc) return "Identifies an item.";
+               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 (!ident_spell(FALSE)) return NULL;
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               wall_to_mud(dir, 20 + randint1(30));
                        }
                }
                break;
 
-       case SORC_SPEL_SLOW_MONSTER: 
+       case 9:
 #ifdef JP
-               if (name) return "¥¹¥í¥¦¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¸ºÂ®¤µ¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥¢¥¤¥¹¡¦¥Ü¥ë¥È";
+               if (desc) return "Î䵤¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Slow Monster";
-               if (desc) return "Attempts to slow a monster.";
+               if (name) return "Frost Bolt";
+               if (desc) return "Fires a bolt or beam of cold.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 3 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-
-                               slow_monster(dir);
+                               fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case SORC_SPEL_MASS_SLEEP: 
+       case 10:
 #ifdef JP
-               if (name) return "¼þÊÕ¥¹¥ê¡¼¥×";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¼«Á³¤Î³ÐÀÃ";
+               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ·¡¢¶á¤¯¤Îæ«¡¢Èâ¡¢³¬ÃÊ¡¢Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Mass Sleep";
-               if (desc) return "Attempts to sleep all monsters in sight.";
+               if (name) return "Nature Awareness";
+               if (desc) return "Maps nearby area. Detects all monsters, traps, doors and stairs.";
 #endif
     
                {
-                       int power = plev;
+                       int rad1 = DETECT_RAD_MAP;
+                       int rad2 = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_power(power);
+                       if (info) return info_radius(MAX(rad1, rad2));
 
                        if (cast)
                        {
-                               sleep_monsters();
+                               map_area(rad1);
+                               detect_traps(rad2, TRUE);
+                               detect_doors(rad2);
+                               detect_stairs(rad2);
+                               detect_monsters_normal(rad2);
                        }
                }
                break;
 
-       case SORC_SPEL_TELEPORT_AWAY: 
+       case 11:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";
+               if (desc) return "²Ð±ê¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Teleport Away";
-               if (desc) return "Teleports all monsters on the line away unless resisted.";
+               if (name) return "Fire Bolt";
+               if (desc) return "Fires a bolt or beam of fire.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 5 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_beam(GF_AWAY_ALL, dir, power);
+                               fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case SORC_SPEL_HASTE_SELF: 
+       case 12:
 #ifdef JP
-               if (name) return "¥¹¥Ô¡¼¥É";
-               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
+               if (name) return "ÂÀÍÛ¸÷Àþ";
+               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
 #else
-               if (name) return "Haste Self";
-               if (desc) return "Hastes you for a while.";
+               if (name) return "Ray of Sunlight";
+               if (desc) return "Fires a beam of light which damages to light-sensitive monsters.";
 #endif
     
                {
-                       int base = plev;
-                       int sides = 20 + plev;
+                       int dice = 6;
+                       int sides = 8;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               set_fast(randint1(sides) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               msg_print("ÂÀÍÛ¸÷Àþ¤¬¸½¤ì¤¿¡£");
+#else
+                               msg_print("A line of sunlight appears.");
+#endif
+
+                               lite_line(dir, damroll(6, 8));
                        }
                }
                break;
 
-       case SORC_SPEL_DETECTION_TRUE: 
+       case 13:
 #ifdef JP
-               if (name) return "¿¿¡¦´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               if (name) return "Entangle";
+               if (desc) return "Attempts to slow all monsters in sight.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
+                       int power = plev;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               detect_all(rad);
+                               slow_monsters(plev);
                        }
                }
                break;
 
-       case SORC_SPEL_IDENTIFY_TRUE: 
+       case 14:
 #ifdef JP
-               if (name) return "¿¿¡¦´ÕÄê";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+               if (name) return "ưʪ¾¤´­";
+               if (desc) return "ưʪ¤ò1Âξ¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Identify True";
-               if (desc) return "*Identifies* an item.";
+               if (name) return "Summon Animal";
+               if (desc) return "Summons an animal.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!identify_fully(FALSE)) return NULL;
+                               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 SORC_SPEL_DETECT_ITEMS_AND_TREASURE: 
+       case 15:
 #ifdef JP
-               if (name) return "ʪÂΤȺâÊõ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ÈºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               if (name) return "Herbal Healing";
+               if (desc) return "Heals HP greatly. And heals cut, stun and poison completely.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
+                       int heal = 500;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_heal(0, 0, heal);
 
                        if (cast)
                        {
-                               detect_objects_normal(rad);
-                               detect_treasure(rad);
-                               detect_objects_gold(rad);
+                               hp_player(heal);
+                               set_stun(0);
+                               set_cut(0);
+                               set_poisoned(0);
                        }
                }
                break;
 
-       case SORC_SPEL_CHARM_MONSTER: 
+       case 16:
 #ifdef JP
-               if (name) return "¥Á¥ã¡¼¥à¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "³¬ÃÊÀ¸À®";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë°ÌÃ֤˳¬Ãʤòºî¤ë¡£";
 #else
-               if (name) return "Charm Monster";
-               if (desc) return "Attempts to charm a monster.";
+               if (name) return "Stair Building";
+               if (desc) return "Creates a stair which goes down or up.";
 #endif
     
                {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               charm_monster(dir, power);
+                               stair_creation();
                        }
                }
                break;
 
-       case SORC_SPEL_SENSE_MINDS: 
+       case 17:
 #ifdef JP
-               if (name) return "Àº¿À´¶ÃÎ";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               if (name) return "È©Àв½";
+               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
 #else
-               if (name) return "Sense Minds";
-               if (desc) return "Gives telepathy for a while.";
+               if (name) return "Stone Skin";
+               if (desc) return "Gives bonus to AC for a while.";
 #endif
     
                {
-                       int base = 25;
+                       int base = 20;
                        int sides = 30;
 
                        if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               set_tim_esp(randint1(sides) + base, FALSE);
+                               set_shield(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case SORC_SPEL_TELEPORT_TO_TOWN: 
+       case 18:
 #ifdef JP
-               if (name) return "³¹°ÜÆ°";
-               if (desc) return "³¹¤Ø°ÜÆ°¤¹¤ë¡£ÃϾå¤Ë¤¤¤ë¤È¤­¤·¤«»È¤¨¤Ê¤¤¡£";
+               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.";
+               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)
                        {
-                               if (!tele_town()) return NULL;
+                               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 SORC_SPEL_SELF_KNOWLEDGE: 
+       case 19:
 #ifdef JP
-               if (name) return "¼«¸ÊʬÀÏ";
-               if (desc) return "¸½ºß¤Î¼«Ê¬¤Î¾õÂÖ¤ò´°Á´¤ËÃΤ롣";
+               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.";
+               if (name) return "Forest Creation";
+               if (desc) return "Creates trees in all adjacent squares.";
 #endif
     
                {
                        if (cast)
                        {
-                               self_knowledge();
+                               tree_creation();
                        }
                }
                break;
 
-       case SORC_SPEL_TELEPORT_LEVEL: 
+       case 20:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
-               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+               if (name) return "ưʪͧÏÂ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Îưʪ¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Teleport Level";
-               if (desc) return "Teleport to up or down stairs in a moment.";
+               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)
                        {
-#ifdef JP
-                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
-#else
-                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
-#endif
-                               teleport_level(0);
+                               charm_animals(power);
                        }
                }
                break;
 
-       case SORC_SPEL_WORD_OF_RECALL: 
+       case 21:
 #ifdef JP
-               if (name) return "µ¢´Ô¤Î¼öʸ";
-               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+               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.";
+               if (name) return "Stone Tell";
+               if (desc) return "*Identifies* an item.";
 #endif
     
                {
-                       int base = 15;
-                       int sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
                        if (cast)
                        {
-                               if (!word_of_recall()) return NULL;
+                               if (!identify_fully(FALSE)) return NULL;
                        }
                }
                break;
 
-       case SORC_SPEL_DIMENSION_DOOR: 
+       case 22:
 #ifdef JP
-               if (name) return "¼¡¸µ¤ÎÈâ";
-               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+               if (name) return "ÀФÎÊÉ";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë²ÖÖ¾´ä¤ÎÊɤòºî¤ë¡£";
 #else
-               if (name) return "Dimension Door";
-               if (desc) return "Teleport to given location.";
+               if (name) return "Wall of Stone";
+               if (desc) return "Creates granite walls in all adjacent squares.";
 #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;
+                               wall_stone();
                        }
                }
                break;
 
-       case SORC_SPEL_PROBING: 
+       case 23:
 #ifdef JP
-               if (name) return "Ä´ºº";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Î°À­¡¢»Ä¤êÂÎÎÏ¡¢ºÇÂçÂÎÎÏ¡¢¥¹¥Ô¡¼¥É¡¢ÀµÂΤòÃΤ롣";
+               if (name) return "Éå¿©ËÉ»ß";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò»À¤Ç½ý¤Ä¤«¤Ê¤¤¤è¤¦²Ã¹©¤¹¤ë¡£";
 #else
-               if (name) return "Probing";
-               if (desc) return "Proves all monsters' alignment, HP, speed and their true character.";
+               if (name) return "Protect from Corrosion";
+               if (desc) return "Makes an equipment acid-proof.";
 #endif
     
                {
                        if (cast)
                        {
-                               probing();
+                               if (!rustproof()) return NULL;
                        }
                }
                break;
 
-       case SORC_SPEL_EXPLOSIVE_RUNE: 
+       case 24:
 #ifdef JP
-               if (name) return "Çúȯ¤Î¥ë¡¼¥ó";
-               if (desc) return "¼«Ê¬¤Î¤¤¤ë¾²¤Î¾å¤Ë¡¢¥â¥ó¥¹¥¿¡¼¤¬Ä̤ë¤ÈÇúȯ¤·¤Æ¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¥ë¡¼¥ó¤òÉÁ¤¯¡£";
+               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.";
+               if (name) return "Earthquake";
+               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
 #endif
     
                {
-                       int dice = 7;
-                       int sides = 7;
-                       int base = plev;
+                       int rad = 10;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               explosive_rune();
+                               earthquake(py, px, rad);
                        }
                }
                break;
 
-       case SORC_SPEL_TELEKINESIS: 
+       case 25:
 #ifdef JP
-               if (name) return "Ç°Æ°ÎÏ";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼«Ê¬¤Î­¸µ¤Ø°ÜÆ°¤µ¤»¤ë¡£";
+               if (name) return "¥«¥Þ¥¤¥¿¥Á";
+               if (desc) return "Á´Êý¸þ¤Ë¸þ¤«¤Ã¤Æ¹¶·â¤¹¤ë¡£";
 #else
-               if (name) return "Telekinesis";
-               if (desc) return "Pulls a distant item close to you.";
+               if (name) return "Cyclone";
+               if (desc) return "Attacks all adjacent monsters.";
 #endif
     
                {
-                       int weight = plev * 15;
-
-                       if (info) return info_weight(weight);
-
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+                               int y = 0, x = 0;
+                               cave_type       *c_ptr;
+                               monster_type    *m_ptr;
 
-                               fetch(dir, weight, FALSE);
+                               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 SORC_SPEL_CLAIRVOYANCE: 
+       case 26:
 #ifdef JP
-               if (name) return "ÀéΤ´ã";
-               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤µ¤é¤Ë¡¢°ìÄê»þ´Ö¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               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.";
+               if (name) return "Blizzard";
+               if (desc) return "Fires a huge ball of cold.";
 #endif
     
                {
-                       int base = 25;
-                       int sides = 30;
+                       int dam = 70 + plev * 3 / 2;
+                       int rad = plev / 12 + 1;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               chg_virtue(V_KNOWLEDGE, 1);
-                               chg_virtue(V_ENLIGHTEN, 1);
-
-                               wiz_lite(FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               if (!p_ptr->telepathy)
-                               {
-                                       set_tim_esp(randint1(sides) + base, FALSE);
-                               }
+                               fire_ball(GF_COLD, dir, dam, rad);
                        }
                }
                break;
 
-       case SORC_SPEL_CHARM_MONSTERS: 
+       case 27:
 #ifdef JP
-               if (name) return "̥λ¤Î»ëÀþ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "°ðºÊÍò";
+               if (desc) return "µðÂç¤ÊÅÅ·â¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Charm monsters";
-               if (desc) return "Attempts to charm all monsters in sight.";
+               if (name) return "Lightning Storm";
+               if (desc) return "Fires a huge electric ball.";
 #endif
     
                {
-                       int power = plev * 2;
+                       int dam = 90 + plev * 3 / 2;
+                       int rad = plev / 12 + 1;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               charm_monsters(power);
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_ELEC, dir, dam, rad);
+                               break;
                        }
                }
                break;
 
-       case SORC_SPEL_ALCHEMY: 
+       case 28:
 #ifdef JP
-               if (name) return "Ï£¶â½Ñ";
-               if (desc) return "¥¢¥¤¥Æ¥à1¤Ä¤ò¤ª¶â¤ËÊѤ¨¤ë¡£";
+               if (name) return "±²Ä¬";
+               if (desc) return "µðÂç¤Ê¿å¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Alchemy";
-               if (desc) return "Turns an item into 1/3 of its value in gold.";
+               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 (!alchemy()) return NULL;
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_WATER, dir, dam, rad);
                        }
                }
                break;
 
-       case SORC_SPEL_BANISHMENT: 
+       case 29:
 #ifdef JP
-               if (name) return "²øʪÄÉÊü";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ÍÛ¸÷¾¤´­";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¸÷¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£¤µ¤é¤Ë¡¢¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Banishment";
-               if (desc) return "Teleports all monsters in sight away unless resisted.";
+               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 power = plev * 4;
+                       int dam = 150;
+                       int rad = 8;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(0, 0, dam/2);
 
                        if (cast)
                        {
-                               banish_monsters(power);
-                       }
-               }
-               break;
+                               fire_ball(GF_LITE, 0, dam, rad);
+                               chg_virtue(V_KNOWLEDGE, 1);
+                               chg_virtue(V_ENLIGHTEN, 1);
+                               wiz_lite(FALSE);
 
-       case SORC_SPEL_GLOBE_OF_INVULNERABILITY: 
+                               if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
+                               {
 #ifdef JP
-               if (name) return "̵½ý¤Îµå";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥À¥á¡¼¥¸¤ò¼õ¤±¤Ê¤¯¤Ê¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£Àڤ줿½Ö´Ö¤Ë¾¯¤·¥¿¡¼¥ó¤ò¾ÃÈñ¤¹¤ë¤Î¤ÇÃí°Õ¡£";
+                                       msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
 #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.";
+                                       msg_print("The sunlight scorches your flesh!");
 #endif
-    
-               {
-                       int base = 4;
 
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_invuln(randint1(base) + base, FALSE);
+#ifdef JP
+                                       take_hit(DAMAGE_NOESCAPE, 50, "Æü¸÷", -1);
+#else
+                                       take_hit(DAMAGE_NOESCAPE, 50, "sunlight", -1);
+#endif
+                               }
                        }
                }
                break;
 
-       case NATU_SPEL_DETECT_CREATURES: 
+       case 30:
 #ifdef JP
-               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÀºÎî¤Î¿Ï";
+               if (desc) return "Éð´ï¤Ë±ê¤«Î䵤¤Î°À­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Detect Creatures";
-               if (desc) return "Detects all monsters in your vicinity unless invisible.";
+               if (name) return "Elemental Branding";
+               if (desc) return "Makes current weapon fire or frost branded.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
                        if (cast)
                        {
-                               detect_monsters_normal(rad);
+                               brand_weapon(randint0(2));
                        }
                }
                break;
 
-       case NATU_SPEL_LIGHTNING: 
+       case 31:
 #ifdef JP
-               if (name) return "°ðºÊ";
-               if (desc) return "ÅÅ·â¤Îû¤¤¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¼«Á³¤Î¶¼°Ò";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÃϿ̤òµ¯¤³¤·¡¢¼«Ê¬¤òÃæ¿´¤È¤·¤¿Ê¬²ò¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
 #else
-               if (name) return "Lightning";
-               if (desc) return "Fires a short beam of lightning.";
+               if (name) return "Nature's Wrath";
+               if (desc) return "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.";
 #endif
     
                {
-                       int dice = 3 + (plev - 1) / 5;
-                       int sides = 4;
-                       int range = plev / 6 + 2;
+                       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%dd%d %s%d", s_dam, dice, sides, s_rng, range);
+                       if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
 
                        if (cast)
                        {
-                               project_length = range;
-
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_beam(GF_ELEC, dir, damroll(dice, sides));
+                               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;
+       }
+
+       return "";
+}
+
+
+static cptr do_chaos_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;
 
-       case NATU_SPEL_DETECT_DOORS_AND_TRAPS: 
 #ifdef JP
-               if (name) return "櫤ÈÈâ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤ò´¶ÃΤ¹¤ë¡£";
+       static const char s_dam[] = "»½ý:";
+       static const char s_random[] = "¥é¥ó¥À¥à";
 #else
-               if (name) return "Detect Doors and Traps";
-               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+       static const char s_dam[] = "dam ";
+       static const char s_random[] = "random";
+#endif
+
+       int dir;
+       int plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
+#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 rad = DETECT_RAD_DEFAULT;
+                       int dice = 3 + ((plev - 1) / 5);
+                       int sides = 4;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               detect_traps(rad, TRUE);
-                               detect_doors(rad);
-                               detect_stairs(rad);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_PRODUCE_FOOD: 
+       case 1:
 #ifdef JP
-               if (name) return "¿©ÎÈÀ¸À®";
-               if (desc) return "ËþÊ¢¤Ë¤Ê¤ë¡£";
+               if (name) return "¥È¥é¥Ã¥×/¥É¥¢Ç˲õ";
+               if (desc) return "ÎÙÀܤ¹¤ë櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
 #else
-               if (name) return "Produce Food";
-               if (desc) return "Satisfies hunger.";
+               if (name) return "Trap / Door Destruction";
+               if (desc) return "Destroys all traps in adjacent squares.";
 #endif
     
                {
-                       if (cast)
-                       {
-                               object_type forge, *q_ptr = &forge;
-
-#ifdef JP
-                               msg_print("¿©ÎÁ¤òÀ¸À®¤·¤¿¡£");
-#else
-                               msg_print("A food ration is produced.");
-#endif
+                       int rad = 1;
 
-                               /* Create the food ration */
-                               object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+                       if (info) return info_radius(rad);
 
-                               /* Drop the object from heaven */
-                               drop_near(q_ptr, -1, py, px);
+                       if (cast)
+                       {
+                               destroy_doors_touch();
                        }
                }
                break;
 
-       case NATU_SPEL_DAYLIGHT: 
+       case 2:
 #ifdef JP
-               if (name) return "Æü¤Î¸÷";
+               if (name) return "Á®¸÷";
                if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-               if (name) return "Daylight";
+               if (name) return "Flash of Light";
                if (desc) return "Lights up nearby area and the inside of a room permanently.";
 #endif
     
@@ -4218,180 +3462,180 @@ cptr do_spell(int spell, int mode)
                        if (cast)
                        {
                                lite_area(damroll(dice, sides), rad);
+                       }
+               }
+               break;
 
-                               if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
-                               {
+       case 3:
 #ifdef JP
-                                       msg_print("Æü¤Î¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª");
+               if (name) return "º®Íð¤Î¼ê";
+               if (desc) return "Áê¼ê¤òº®Í𤵤»¤ë¹¶·â¤ò¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¡£";
 #else
-                                       msg_print("The daylight scorches your flesh!");
+               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
-                                       take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "Æü¤Î¸÷", -1);
+                                       msg_print("¤¢¤Ê¤¿¤Î¼ê¤Ï¸÷¤ê»Ï¤á¤¿¡£");
 #else
-                                       take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "daylight", -1);
+                                       msg_print("Your hands start glowing.");
 #endif
+
+                                       p_ptr->special_attack |= ATTACK_CONFUSE;
+                                       p_ptr->redraw |= (PR_STATUS);
                                }
                        }
                }
                break;
 
-       case NATU_SPEL_ANIMAL_TAMING: 
+       case 4:
 #ifdef JP
-               if (name) return "ưʪ½¬¤·";
-               if (desc) return "ưʪ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ËâÎÏßÚÎö";
+               if (desc) return "ËâË¡¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Animal Taming";
-               if (desc) return "Attempts to charm an animal.";
+               if (name) return "Mana Burst";
+               if (desc) return "Fires a ball of magic.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 3;
+                       int sides = 5;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
 
-                       if (info) return info_power(power);
+                       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;
 
-                               charm_animal(dir, power);
+                               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 NATU_SPEL_RESIST_ENVIRONMENT: 
+       case 5:
 #ifdef JP
-               if (name) return "´Ä¶­¤Ø¤ÎÂÑÀ­";
-               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¤ËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Fire Bolt";
+               if (desc) return "Fires a bolt or beam of fire.";
 #endif
     
                {
-                       int base = 20;
+                       int dice = 8 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               set_oppose_cold(randint1(base) + base, FALSE);
-                               set_oppose_fire(randint1(base) + base, FALSE);
-                               set_oppose_elec(randint1(base) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_CURE_WOUNDS_AND_POISON: 
+       case 6:
 #ifdef JP
-               if (name) return "½ý¤ÈÆǼ£ÎÅ";
-               if (desc) return "²ø²æ¤òÁ´²÷¤µ¤»¡¢ÆǤòÂΤ«¤é´°Á´¤Ë¼è¤ê½ü¤­¡¢ÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+               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.";
+               if (name) return "Fist of Force";
+               if (desc) return "Fires a tiny ball of disintegration.";
 #endif
     
                {
-                       int dice = 2;
+                       int dice = 8 + ((plev - 5) / 4);
                        int sides = 8;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_cut(0);
-                               set_poisoned(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DISINTEGRATE, dir,
+                                       damroll(dice, sides), 0);
                        }
                }
                break;
 
-       case NATU_SPEL_STONE_TO_MUD: 
+       case 7:
 #ifdef JP
-               if (name) return "´äÀÐÍϲò";
-               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Stone to Mud";
-               if (desc) return "Turns one rock square to mud.";
+               if (name) return "Teleport Self";
+               if (desc) return "Teleport long distance.";
 #endif
     
                {
-                       int dice = 1;
-                       int sides = 30;
-                       int base = 20;
+                       int range = plev * 5;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               wall_to_mud(dir);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case NATU_SPEL_FROST_BOLT: 
+       case 8:
 #ifdef JP
-               if (name) return "¥¢¥¤¥¹¡¦¥Ü¥ë¥È";
-               if (desc) return "Î䵤¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥ï¥ó¥À¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Ë¥é¥ó¥À¥à¤Ê¸ú²Ì¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Frost Bolt";
-               if (desc) return "Fires a bolt or beam of cold.";
+               if (name) return "Wonder";
+               if (desc) return "Fires something with random effects.";
 #endif
     
                {
-                       int dice = 3 + (plev - 5) / 4;
-                       int sides = 8;
-
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return s_random;
 
                        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 (!get_aim_dir(&dir)) return NULL;
 
-                       if (cast)
-                       {
-                               map_area(rad1);
-                               detect_traps(rad2, TRUE);
-                               detect_doors(rad2);
-                               detect_stairs(rad2);
-                               detect_monsters_normal(rad2);
+                               cast_wonder(dir);
                        }
                }
                break;
 
-       case NATU_SPEL_FIRE_BOLT: 
+       case 9:
 #ifdef JP
-               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";
-               if (desc) return "²Ð±ê¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥«¥ª¥¹¡¦¥Ü¥ë¥È";
+               if (desc) return "¥«¥ª¥¹¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Fire Bolt";
-               if (desc) return "Fires a bolt or beam of fire.";
+               if (name) return "Chaos Bolt";
+               if (desc) return "Fires a bolt or ball of chaos.";
 #endif
     
                {
-                       int dice = 5 + (plev - 5) / 4;
+                       int dice = 10 + (plev - 5) / 4;
                        int sides = 8;
 
                        if (info) return info_damage(dice, sides, 0);
@@ -4399,618 +3643,598 @@ cptr do_spell(int spell, int mode)
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-                               fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
+
+                               fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_RAY_OF_SUNLIGHT: 
+       case 10:
 #ifdef JP
-               if (name) return "ÂÀÍÛ¸÷Àþ";
-               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
+               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.";
+               if (name) return "Sonic Boom";
+               if (desc) return "Generates a ball of sound centered on you.";
 #endif
     
                {
-                       int dice = 6;
-                       int sides = 8;
+                       int dam = 60 + plev;
+                       int rad = plev / 10 + 2;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_damage(0, 0, dam/2);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
 #ifdef JP
-                               msg_print("ÂÀÍÛ¸÷Àþ¤¬¸½¤ì¤¿¡£");
+                               msg_print("¥É¡¼¥ó¡ªÉô²°¤¬Íɤ줿¡ª");
 #else
-                               msg_print("A line of sunlight appears.");
+                               msg_print("BOOM! Shake the room!");
 #endif
 
-                               lite_line(dir);
+                               project(0, rad, py, px, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
                        }
                }
                break;
 
-       case NATU_SPEL_ENTANGLE: 
+       case 11:
 #ifdef JP
-               if (name) return "­¤«¤»";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ÇËÌǤÎÌð";
+               if (desc) return "½ã¿è¤ÊËâÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Entangle";
-               if (desc) return "Attempts to slow all monsters in sight.";
+               if (name) return "Doom Bolt";
+               if (desc) return "Fires a beam of pure mana.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 11 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               slow_monsters();
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_MANA, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_SUMMON_ANIMAL: 
+       case 12:
 #ifdef JP
-               if (name) return "ưʪ¾¤´­";
-               if (desc) return "ưʪ¤ò1Âξ¤´­¤¹¤ë¡£";
+               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";
+               if (desc) return "±ê¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Summon Animal";
-               if (desc) return "Summons an animal.";
+               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 (!(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;
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_FIRE, dir, dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_HERBAL_HEALING: 
+       case 13:
 #ifdef JP
-               if (name) return "ÌôÁð¼£ÎÅ";
-               if (desc) return "ÂÎÎϤòÂçÉý¤Ë²óÉü¤µ¤»¡¢Éé½ý¡¢Û¯Û°¾õÂÖ¡¢ÆǤ«¤éÁ´²÷¤¹¤ë¡£";
+               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.";
+               if (name) return "Teleport Other";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
 #endif
     
                {
-                       int heal = 500;
+                       int power = plev;
 
-                       if (info) return info_heal(0, 0, heal);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               hp_player(heal);
-                               set_stun(0);
-                               set_cut(0);
-                               set_poisoned(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_beam(GF_AWAY_ALL, dir, power);
                        }
                }
                break;
 
-       case NATU_SPEL_STAIR_BUILDING: 
+       case 14:
 #ifdef JP
-               if (name) return "³¬ÃÊÀ¸À®";
-               if (desc) return "¼«Ê¬¤Î¤¤¤ë°ÌÃ֤˳¬Ãʤòºî¤ë¡£";
+               if (name) return "Ç˲õ¤Î¸ÀÍÕ";
+               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
 #else
-               if (name) return "Stair Building";
-               if (desc) return "Creates a stair which goes down or up.";
+               if (name) return "Word of Destruction";
+               if (desc) return "Destroy everything in nearby area.";
 #endif
     
                {
+                       int base = 12;
+                       int sides = 4;
+
                        if (cast)
                        {
-                               stair_creation();
+                               destroy_area(py, px, base + randint1(sides), FALSE);
                        }
                }
                break;
 
-       case NATU_SPEL_STONE_SKIN: 
+       case 15:
 #ifdef JP
-               if (name) return "È©Àв½";
-               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
+               if (name) return "¥í¥°¥ë¥¹È¯Æ°";
+               if (desc) return "µðÂç¤Ê¥«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Stone Skin";
-               if (desc) return "Gives bonus to AC for a while.";
+               if (name) return "Invoke Logrus";
+               if (desc) return "Fires a huge ball of chaos.";
 #endif
     
                {
-                       int base = 20;
-                       int sides = 30;
+                       int dam = plev * 2 + 99;
+                       int rad = plev / 5;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               set_shield(randint1(sides) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_CHAOS, dir, dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_RESISTANCE_TRUE: 
+       case 16:
 #ifdef JP
-               if (name) return "¿¿¡¦ÂÑÀ­";
-               if (desc) return "°ìÄê»þ´Ö¡¢»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               if (name) return "¾¼ÔÊÑÍÆ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòÊѿȤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #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.";
+               if (name) return "Polymorph Other";
+               if (desc) return "Attempts to polymorph a monster.";
 #endif
     
                {
-                       int base = 20;
+                       int power = plev;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
                        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);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               poly_monster(dir, plev);
                        }
                }
                break;
 
-       case NATU_SPEL_FOREST_CREATION: 
+       case 17:
 #ifdef JP
-               if (name) return "¿¹ÎÓÁϤ";
-               if (desc) return "¼þ°Ï¤ËÌÚ¤òºî¤ê½Ð¤¹¡£";
+               if (name) return "Ï¢º¿°ðºÊ";
+               if (desc) return "Á´Êý¸þ¤ËÂФ·¤ÆÅÅ·â¤Î¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Forest Creation";
-               if (desc) return "Creates trees in all adjacent squares.";
+               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)
                        {
-                               tree_creation();
+                               for (dir = 0; dir <= 9; dir++)
+                                       fire_beam(GF_ELEC, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_ANIMAL_FRIENDSHIP: 
+       case 18:
 #ifdef JP
-               if (name) return "ưʪͧÏÂ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Îưʪ¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ËâÎÏÉõÆþ";
+               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
 #else
-               if (name) return "Animal Friendship";
-               if (desc) return "Attempts to charm all animals in sight.";
+               if (name) return "Arcane Binding";
+               if (desc) return "Recharges staffs, wands or rods.";
 #endif
     
                {
-                       int power = plev * 2;
+                       int power = 90;
 
                        if (info) return info_power(power);
 
                        if (cast)
                        {
-                               charm_animals(power);
+                               if (!recharge(power)) return NULL;
                        }
                }
                break;
 
-       case NATU_SPEL_STONE_TELL: 
+       case 19:
 #ifdef JP
-               if (name) return "»î¶âÀÐ";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+               if (name) return "¸¶»Òʬ²ò";
+               if (desc) return "µðÂç¤Êʬ²ò¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Stone Tell";
-               if (desc) return "*Identifies* an item.";
+               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 (!identify_fully(FALSE)) return NULL;
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DISINTEGRATE, dir, dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_WALL_OF_STONE: 
+       case 20:
 #ifdef JP
-               if (name) return "ÀФÎÊÉ";
-               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë²ÖÖ¾´ä¤ÎÊɤòºî¤ë¡£";
+               if (name) return "¸½¼ÂÊÑÍÆ";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
 #else
-               if (name) return "Wall of Stone";
-               if (desc) return "Creates granite walls in all adjacent squares.";
+               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)
                        {
-                               wall_stone();
+                               alter_reality();
                        }
                }
                break;
 
-       case NATU_SPEL_PROTECT_FROM_CORROSION: 
+       case 21:
 #ifdef JP
-               if (name) return "Éå¿©ËÉ»ß";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò»À¤Ç½ý¤Ä¤«¤Ê¤¤¤è¤¦²Ã¹©¤¹¤ë¡£";
+               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥í¥±¥Ã¥È";
+               if (desc) return "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë¡£";
 #else
-               if (name) return "Protect from Corrosion";
-               if (desc) return "Makes an equipment acid-proof.";
+               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 (!rustproof()) return NULL;
-                       }
-               }
-               break;
+                               if (!get_aim_dir(&dir)) return NULL;
 
-       case NATU_SPEL_EARTHQUAKE: 
 #ifdef JP
-               if (name) return "ÃÏ¿Ì";
-               if (desc) return "¼þ°Ï¤Î¥À¥ó¥¸¥ç¥ó¤òÍɤ餷¡¢ÊɤȾ²¤ò¥é¥ó¥À¥à¤ËÆþ¤ìÊѤ¨¤ë¡£";
+                               msg_print("¥í¥±¥Ã¥Èȯ¼Í¡ª");
 #else
-               if (name) return "Earthquake";
-               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
+                               msg_print("You launch a rocket!");
 #endif
-    
-               {
-                       int rad = 10;
 
-                       if (info) return info_radius(rad);
-
-                       if (cast)
-                       {
-                               earthquake(py, px, rad);
+                               fire_rocket(GF_ROCKET, dir, dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_CYCLONE: 
+       case 22:
 #ifdef JP
-               if (name) return "¥«¥Þ¥¤¥¿¥Á";
-               if (desc) return "Á´Êý¸þ¤Ë¸þ¤«¤Ã¤Æ¹¶·â¤¹¤ë¡£";
+               if (name) return "º®Æ٤οÏ";
+               if (desc) return "Éð´ï¤Ë¥«¥ª¥¹¤Î°À­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Cyclone";
-               if (desc) return "Attacks all adjacent monsters.";
+               if (name) return "Chaos Branding";
+               if (desc) return "Makes current weapon a Chaotic weapon.";
 #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);
-                               }
+                               brand_weapon(2);
                        }
                }
                break;
 
-       case NATU_SPEL_BLIZZARD: 
+       case 23:
 #ifdef JP
-               if (name) return "¥Ö¥ê¥¶¡¼¥É";
-               if (desc) return "µðÂç¤ÊÎ䵤¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "°­Ë⾤´­";
+               if (desc) return "°­Ëâ¤ò1Âξ¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Blizzard";
-               if (desc) return "Fires a huge ball of cold.";
+               if (name) return "Summon Demon";
+               if (desc) return "Summons a demon.";
 #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;
+                               u32b mode = 0L;
+                               bool pet = !one_in_(3);
 
-                               fire_ball(GF_COLD, dir, dam, rad);
+                               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 NATU_SPEL_LIGHTNING_STORM: 
+       case 24:
 #ifdef JP
-               if (name) return "°ðºÊÍò";
-               if (desc) return "µðÂç¤ÊÅÅ·â¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "½ÅÎϸ÷Àþ";
+               if (desc) return "½ÅÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Lightning Storm";
-               if (desc) return "Fires a huge electric ball.";
+               if (name) return "Beam of Gravity";
+               if (desc) return "Fires a beam of gravity.";
 #endif
     
                {
-                       int dam = 90 + plev * 3 / 2;
-                       int rad = plev / 12 + 1;
+                       int dice = 9 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-                               fire_ball(GF_ELEC, dir, dam, rad);
-                               break;
+
+                               fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case NATU_SPEL_WHIRLPOOL: 
+       case 25:
 #ifdef JP
-               if (name) return "±²Ä¬";
-               if (desc) return "µðÂç¤Ê¿å¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "ήÀ±·²";
+               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
 #else
-               if (name) return "Whirlpool";
-               if (desc) return "Fires a huge ball of water.";
+               if (name) return "Meteor Swarm";
+               if (desc) return "Makes meteor balls fall down to nearby random locations.";
 #endif
     
                {
-                       int dam = 100 + plev * 3 / 2;
-                       int rad = plev / 12 + 1;
+                       int dam = plev * 2;
+                       int rad = 2;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_multi_damage(dam);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               fire_ball(GF_WATER, dir, dam, rad);
+                               cast_meteor(dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_CALL_SUNLIGHT: 
+       case 26:
 #ifdef JP
-               if (name) return "ÍÛ¸÷¾¤´­";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¸÷¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£¤µ¤é¤Ë¡¢¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               if (name) return "Flame Strike";
+               if (desc) return "Generate a huge ball of fire centered on you.";
 #endif
     
                {
-                       int dam = 150;
+                       int dam = 300 + 3 * plev;
                        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
-                               }
+                               fire_ball(GF_FIRE, 0, dam, rad);
                        }
                }
                break;
 
-       case NATU_SPEL_ELEMENTAL_BRANDING: 
+       case 27:
 #ifdef JP
-               if (name) return "ÀºÎî¤Î¿Ï";
-               if (desc) return "Éð´ï¤Ë±ê¤«Î䵤¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "º®ÆÙ¾¤Íè";
+               if (desc) return "¥é¥ó¥À¥à¤Ê°À­¤Îµå¤ä¥Ó¡¼¥à¤òȯÀ¸¤µ¤»¤ë¡£";
 #else
-               if (name) return "Elemental Branding";
-               if (desc) return "Makes current weapon fire or frost branded.";
+               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)
                        {
-                               brand_weapon(randint0(2));
+                               call_chaos();
                        }
                }
                break;
 
-       case NATU_SPEL_NATURES_WRATH: 
+       case 28:
 #ifdef JP
-               if (name) return "¼«Á³¤Î¶¼°Ò";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÃϿ̤òµ¯¤³¤·¡¢¼«Ê¬¤òÃæ¿´¤È¤·¤¿Ê¬²ò¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+               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.";
+               if (name) return "Polymorph Self";
+               if (desc) return "Polymorphs yourself.";
 #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);
+#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_MAGIC_MISSILE: 
+       case 29:
 #ifdef JP
-               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë";
-               if (desc) return "¼å¤¤ËâË¡¤ÎÌð¤òÊü¤Ä¡£";
+               if (name) return "ËâÎϤÎÍò";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤǵðÂç¤Ê½ã¿è¤ÊËâÎϤεå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Magic Missile";
-               if (desc) return "Fires a weak bolt of magic.";
+               if (name) return "Mana Storm";
+               if (desc) return "Fires an extremely powerful huge ball of pure mana.";
 #endif
     
                {
-                       int dice = 3 + ((plev - 1) / 5);
-                       int sides = 4;
+                       int dam = 300 + plev * 4;
+                       int rad = 4;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
+                               fire_ball(GF_MANA, dir, dam, rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_TRAP_DOOR_DESTRUCTION: 
+       case 30:
 #ifdef JP
-               if (name) return "¥È¥é¥Ã¥×/¥É¥¢Ç˲õ";
-               if (desc) return "ÎÙÀܤ¹¤ë櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
+               if (name) return "¥í¥°¥ë¥¹¤Î¥Ö¥ì¥¹";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤʥ«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Trap / Door Destruction";
-               if (desc) return "Destroys all traps in adjacent squares.";
+               if (name) return "Breathe Logrus";
+               if (desc) return "Fires an extremely powerful ball of chaos.";
 #endif
     
                {
-                       int rad = 1;
+                       int dam = p_ptr->chp;
+                       int rad = 2;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               destroy_doors_touch();
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_CHAOS, dir, dam, rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_FLASH_OF_LIGHT: 
+       case 31:
 #ifdef JP
-               if (name) return "Á®¸÷";
-               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+               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.";
+               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
     
                {
-                       int dice = 2;
-                       int sides = plev / 2;
-                       int rad = (plev / 10) + 1;
-
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return format("%s3 * 175", s_dam);
 
                        if (cast)
                        {
-                               lite_area(damroll(dice, sides), rad);
+                               call_the_();
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_death_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;
 
-       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("¤¢¤Ê¤¿¤Î¼ê¤Ï¸÷¤ê»Ï¤á¤¿¡£");
+       static const char s_dam[] = "»½ý:";
+       static const char s_random[] = "¥é¥ó¥À¥à";
 #else
-                                       msg_print("Your hands start glowing.");
+       static const char s_dam[] = "dam ";
+       static const char s_random[] = "random";
 #endif
 
-                                       p_ptr->special_attack |= ATTACK_CONFUSE;
-                                       p_ptr->redraw |= (PR_STATUS);
-                               }
-                       }
-               }
-               break;
+       int dir;
+       int plev = p_ptr->lev;
 
-       case CHAO_SPEL_MANA_BURST:
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
-               if (name) return "ËâÎÏßÚÎö";
-               if (desc) return "ËâË¡¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "̵À¸Ì¿´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Mana Burst";
-               if (desc) return "Fires a ball of magic.";
+               if (name) return "Detect Unlife";
+               if (desc) return "Detects all nonliving monsters in your vicinity.";
 #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;
-
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_radius(rad);
 
                        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
-                                */
+                               detect_monsters_nonliving(rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_FIRE_BOLT:
+       case 1:
 #ifdef JP
-               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";
-               if (desc) return "±ê¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¼ö»¦ÃÆ";
+               if (desc) return "¤´¤¯¾®¤µ¤Ê¼Ù°­¤ÊÎϤò»ý¤Ä¥Ü¡¼¥ë¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Fire Bolt";
-               if (desc) return "Fires a bolt or beam of fire.";
+               if (name) return "Malediction";
+               if (desc) return "Fires a tiny ball of evil power which hurts good monsters greatly.";
 #endif
     
                {
-                       int dice = 8 + (plev - 5) / 4;
-                       int sides = 8;
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
+                       int rad = 0;
 
                        if (info) return info_damage(dice, sides, 0);
 
@@ -5018,732 +4242,736 @@ cptr do_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
+                               /*
+                                * 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 CHAO_SPEL_FIST_OF_FORCE:
+       case 2:
 #ifdef JP
-               if (name) return "ÎϤηý";
-               if (desc) return "¤´¤¯¾®¤µ¤Êʬ²ò¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "¼Ù°­´¶ÃÎ";
+               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Fist of Force";
-               if (desc) return "Fires a tiny ball of disintegration.";
+               if (name) return "Detect Evil";
+               if (desc) return "Detects all evil monsters in your vicinity.";
 #endif
     
                {
-                       int dice = 8 + ((plev - 5) / 4);
-                       int sides = 8;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_DISINTEGRATE, dir,
-                                       damroll(dice, sides), 0);
+                               detect_monsters_evil(rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_TELEPORT_SELF:
+       case 3:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "°­½­±À";
+               if (desc) return "ÆǤεå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Teleport Self";
-               if (desc) return "Teleport long distance.";
+               if (name) return "Stinking Cloud";
+               if (desc) return "Fires a ball of poison.";
 #endif
     
                {
-                       int range = plev * 5;
+                       int dam = 10 + plev / 2;
+                       int rad = 2;
 
-                       if (info) return info_range(range);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_POIS, dir, dam, rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_WONDER:
+       case 4:
 #ifdef JP
-               if (name) return "¥ï¥ó¥À¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤Ë¥é¥ó¥À¥à¤Ê¸ú²Ì¤òÍ¿¤¨¤ë¡£";
+               if (name) return "¹õ¤¤Ì²¤ê";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Wonder";
-               if (desc) return "Fires something with random effects.";
+               if (name) return "Black Sleep";
+               if (desc) return "Attempts to sleep a monster.";
 #endif
     
                {
-                       if (info) return s_random;
+                       int power = plev;
+
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               cast_wonder(dir);
+                               sleep_monster(dir, plev);
                        }
                }
                break;
 
-       case CHAO_SPEL_CHAOS_BOLT:
+       case 5:
 #ifdef JP
-               if (name) return "¥«¥ª¥¹¡¦¥Ü¥ë¥È";
-               if (desc) return "¥«¥ª¥¹¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "ÂÑÆÇ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÆǤؤÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Chaos Bolt";
-               if (desc) return "Fires a bolt or ball of chaos.";
+               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 dice = 10 + (plev - 5) / 4;
-                       int sides = 8;
+                       int base = 20;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
+                               set_oppose_pois(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case CHAO_SPEL_SONIC_BOOM:
+       case 6:
 #ifdef JP
-               if (name) return "¥½¥Ë¥Ã¥¯¡¦¥Ö¡¼¥à";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¹ì²»¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+               if (name) return "¶²¹²";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Sonic Boom";
-               if (desc) return "Generates a ball of sound centered on you.";
+               if (name) return "Horrify";
+               if (desc) return "Attempts to scare and stun a monster.";
 #endif
     
                {
-                       int dam = 60 + plev;
-                       int rad = plev / 10 + 2;
+                       int power = plev;
 
-                       if (info) return info_damage(0, 0, dam/2);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-#ifdef JP
-                               msg_print("¥É¡¼¥ó¡ªÉô²°¤¬Íɤ줿¡ª");
-#else
-                               msg_print("BOOM! Shake the room!");
-#endif
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               project(0, rad, py, px, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
+                               fear_monster(dir, power);
+                               stun_monster(dir, power);
                        }
                }
                break;
 
-       case CHAO_SPEL_DOOM_BOLT:
+       case 7:
 #ifdef JP
-               if (name) return "ÇËÌǤÎÌð";
-               if (desc) return "½ã¿è¤ÊËâÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É½¾Â°";
+               if (desc) return "¥¢¥ó¥Ç¥Ã¥É1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Doom Bolt";
-               if (desc) return "Fires a beam of pure mana.";
+               if (name) return "Enslave Undead";
+               if (desc) return "Attempts to charm an undead monster.";
 #endif
     
                {
-                       int dice = 11 + (plev - 5) / 4;
-                       int sides = 8;
+                       int power = plev;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_beam(GF_MANA, dir, damroll(dice, sides));
+                               control_one_undead(dir, power);
                        }
                }
                break;
 
-       case CHAO_SPEL_FIRE_BALL:
+       case 8:
 #ifdef JP
-               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";
-               if (desc) return "±ê¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "¥¨¥ó¥È¥í¥Ô¡¼¤Îµå";
+               if (desc) return "À¸Ì¿¤Î¤¢¤ë¼Ô¤Ë¸ú²Ì¤Î¤¢¤ëµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Fire Ball";
-               if (desc) return "Fires a ball of fire.";
+               if (name) return "Orb of Entropy";
+               if (desc) return "Fires a ball which damages living monsters.";
 #endif
     
                {
-                       int dam = plev + 55;
-                       int rad = 2;
+                       int dice = 3;
+                       int sides = 6;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
 
-                       if (info) return info_damage(0, 0, dam);
+                       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_FIRE, dir, dam, rad);
+                               fire_ball(GF_OLD_DRAIN, dir, damroll(dice, dice) + base, rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_TELEPORT_OTHER:
+       case 9:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥¢¥¦¥§¥¤";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ÃϹö¤ÎÌð";
+               if (desc) return "ÃϹö¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Teleport Other";
-               if (desc) return "Teleports all monsters on the line away unless resisted.";
+               if (name) return "Nether Bolt";
+               if (desc) return "Fires a bolt or beam of nether.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 8 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_beam(GF_AWAY_ALL, dir, power);
+                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CHAO_SPEL_WORD_OF_DESTRUCTION:
+       case 10:
 #ifdef JP
-               if (name) return "Ç˲õ¤Î¸ÀÍÕ";
-               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
+               if (name) return "»¦Ù¤±À";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿ÆǤεå¤òȯÀ¸¤µ¤»¤ë¡£";
 #else
-               if (name) return "Word of Destruction";
-               if (desc) return "Destroy everything in nearby area.";
+               if (name) return "Cloud kill";
+               if (desc) return "Generate a ball of poison centered on you.";
 #endif
     
                {
-                       int base = 12;
-                       int sides = 4;
+                       int dam = (30 + plev) * 2;
+                       int rad = plev / 10 + 2;
+
+                       if (info) return info_damage(0, 0, dam/2);
 
                        if (cast)
                        {
-                               destroy_area(py, px, base + randint1(sides), FALSE);
+                               project(0, rad, py, px, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
                        }
                }
                break;
 
-       case CHAO_SPEL_INVOKE_LOGRUS:
+       case 11:
 #ifdef JP
-               if (name) return "¥í¥°¥ë¥¹È¯Æ°";
-               if (desc) return "µðÂç¤Ê¥«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "¥â¥ó¥¹¥¿¡¼¾ÃÌÇ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¾Ã¤·µî¤ë¡£·Ð¸³Ãͤ䥢¥¤¥Æ¥à¤Ï¼ê¤ËÆþ¤é¤Ê¤¤¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Invoke Logrus";
-               if (desc) return "Fires a huge ball of chaos.";
+               if (name) return "Genocide One";
+               if (desc) return "Attempts to vanish a monster.";
 #endif
     
                {
-                       int dam = plev * 2 + 99;
-                       int rad = plev / 5;
+                       int power = plev + 50;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_ball(GF_CHAOS, dir, dam, rad);
+                               fire_ball_hide(GF_GENOCIDE, dir, power, 0);
                        }
                }
                break;
 
-       case CHAO_SPEL_POLYMORPH_OTHER:
+       case 12:
 #ifdef JP
-               if (name) return "¾¼ÔÊÑÍÆ";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤòÊѿȤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ÆǤοÏ";
+               if (desc) return "Éð´ï¤ËÆǤΰÀ­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Polymorph Other";
-               if (desc) return "Attempts to polymorph a monster.";
+               if (name) return "Poison Branding";
+               if (desc) return "Makes current weapon poison branded.";
 #endif
     
                {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               poly_monster(dir);
+                               brand_weapon(3);
                        }
                }
                break;
 
-       case CHAO_SPEL_CHAIN_LIGHTNING:
+       case 13:
 #ifdef JP
-               if (name) return "Ï¢º¿°ðºÊ";
-               if (desc) return "Á´Êý¸þ¤ËÂФ·¤ÆÅÅ·â¤Î¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "µÛ·ì¥É¥ì¥¤¥ó";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆËþÊ¢ÅÙ¤¬¾å¤¬¤ë¡£";
 #else
-               if (name) return "Chain Lightning";
-               if (desc) return "Fires lightning beams in all directions.";
+               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 = 5 + plev / 10;
-                       int sides = 8;
+                       int dice = 1;
+                       int sides = plev * 2;
+                       int base = plev * 2;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_damage(dice, sides, base);
 
                        if (cast)
                        {
-                               for (dir = 0; dir <= 9; dir++)
-                                       fire_beam(GF_ELEC, dir, damroll(dice, sides));
+                               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 CHAO_SPEL_ARCANE_BINDING:
+       case 14:
 #ifdef JP
-               if (name) return "ËâÎÏÉõÆþ";
-               if (desc) return "¾ó/ËâË¡ËÀ¤Î½¼Å¶²ó¿ô¤òÁý¤ä¤¹¤«¡¢½¼Å¶Ãæ¤Î¥í¥Ã¥É¤Î½¼Å¶»þ´Ö¤ò¸º¤é¤¹¡£";
+               if (name) return "È¿º²¤Î½Ñ";
+               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
 #else
-               if (name) return "Arcane Binding";
-               if (desc) return "Recharges staffs, wands or rods.";
+               if (name) return "Animate dead";
+               if (desc) return "Resurrects nearby corpse and skeletons. And makes these your pets.";
 #endif
     
                {
-                       int power = 90;
-
-                       if (info) return info_power(power);
-
                        if (cast)
                        {
-                               if (!recharge(power)) return NULL;
+                               animate_dead(0, py, px);
                        }
                }
                break;
 
-       case CHAO_SPEL_DISINTEGRATE:
+       case 15:
 #ifdef JP
-               if (name) return "¸¶»Òʬ²ò";
-               if (desc) return "µðÂç¤Êʬ²ò¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "Ëõ»¦";
+               if (desc) return "»ØÄꤷ¤¿Ê¸»ú¤Î¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Disintegrate";
-               if (desc) return "Fires a huge ball of disintegration.";
+               if (name) return "Genocide";
+               if (desc) return "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.";
 #endif
     
                {
-                       int dam = plev + 70;
-                       int rad = 3 + plev / 40;
+                       int power = plev+50;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_DISINTEGRATE, dir, dam, rad);
+                               symbol_genocide(power, TRUE);
                        }
                }
                break;
 
-       case CHAO_SPEL_ALTER_REALITY:
+       case 16:
 #ifdef JP
-               if (name) return "¸½¼ÂÊÑÍÆ";
-               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
+               if (name) return "¶¸Àï»Î²½";
+               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤¹¤ë¡£";
 #else
-               if (name) return "Alter Reality";
-               if (desc) return "Recreates current dungeon level.";
+               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 = 15;
-                       int sides = 20;
+                       int base = 25;
 
-                       if (info) return info_delay(base, sides);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               alter_reality();
+                               set_shero(randint1(base) + base, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
                        }
                }
                break;
 
-       case CHAO_SPEL_MAGIC_ROCKET:
+       case 17:
 #ifdef JP
-               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥í¥±¥Ã¥È";
-               if (desc) return "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë¡£";
+               if (name) return "°­Î´­";
+               if (desc) return "¥é¥ó¥À¥à¤ÇÍÍ¡¹¤Ê¸ú²Ì¤¬µ¯¤³¤ë¡£";
 #else
-               if (name) return "Magic Rocket";
-               if (desc) return "Fires a magic rocket.";
+               if (name) return "Invoke Spirits";
+               if (desc) return "Causes random effects.";
 #endif
     
                {
-                       int dam = 120 + plev * 2;
-                       int rad = 2;
-
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return s_random;
 
                        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);
+                               cast_invoke_spirits(dir);
                        }
                }
                break;
 
-       case CHAO_SPEL_CHAOS_BRANDING:
+       case 18:
 #ifdef JP
-               if (name) return "º®Æ٤οÏ";
-               if (desc) return "Éð´ï¤Ë¥«¥ª¥¹¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "°Å¹õ¤ÎÌð";
+               if (desc) return "°Å¹õ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Chaos Branding";
-               if (desc) return "Makes current weapon a Chaotic weapon.";
+               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)
                        {
-                               brand_weapon(2);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CHAO_SPEL_SUMMON_DEMON:
+       case 19:
 #ifdef JP
-               if (name) return "°­Ë⾤´­";
-               if (desc) return "°­Ëâ¤ò1Âξ¤´­¤¹¤ë¡£";
+               if (name) return "¶¸ÍðÀï»Î";
+               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤·¡¢²Ã®¤¹¤ë¡£";
 #else
-               if (name) return "Summon Demon";
-               if (desc) return "Summons a demon.";
+               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
     
                {
-                       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;
+                       int b_base = 25;
+                       int sp_base = plev / 2;
+                       int sp_sides = 20 + plev / 2;
 
-                               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 (info) return info_duration(b_base, b_base);
 
-                                       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
-                                       }
-                               }
+                       if (cast)
+                       {
+                               set_shero(randint1(25) + 25, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
+                               set_fast(randint1(sp_sides) + sp_base, FALSE);
                        }
                }
                break;
 
-       case CHAO_SPEL_BEAM_OF_GRAVITY:
+       case 20:
 #ifdef JP
-               if (name) return "½ÅÎϸ÷Àþ";
-               if (desc) return "½ÅÎϤΥӡ¼¥à¤òÊü¤Ä¡£";
+               if (name) return "µÛ·ì¤Î¿Ï";
+               if (desc) return "Éð´ï¤ËµÛ·ì¤Î°À­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Beam of Gravity";
-               if (desc) return "Fires a beam of gravity.";
+               if (name) return "Vampiric Branding";
+               if (desc) return "Makes current weapon Vampiric.";
 #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));
+                               brand_weapon(4);
                        }
                }
                break;
 
-       case CHAO_SPEL_METEOR_SWARM:
+       case 21:
 #ifdef JP
-               if (name) return "ήÀ±·²";
-               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
+               if (name) return "¿¿¡¦µÛ·ì";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆÂÎÎϤ¬²óÉü¤¹¤ë¡£";
 #else
-               if (name) return "Meteor Swarm";
-               if (desc) return "Makes meteor balls fall down to nearby random locations.";
+               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 = plev * 2;
-                       int rad = 2;
+                       int dam = 100;
 
-                       if (info) return info_multi_damage(dam);
+                       if (info) return format("%s3*%d", s_dam, dam);
 
                        if (cast)
                        {
-                               cast_meteor(dam, rad);
+                               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 CHAO_SPEL_FLAME_STRIKE:
+       case 22:
 #ifdef JP
-               if (name) return "±ë¤Î°ì·â";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿Ä¶µðÂç¤Ê±ê¤Îµå¤òȯÀ¸¤µ¤»¤ë¡£";
+               if (name) return "»à¤Î¸Àº²";
+               if (desc) return "»ë³¦Æâ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Flame Strike";
-               if (desc) return "Generate a huge ball of fire centered on you.";
+               if (name) return "Nether Wave";
+               if (desc) return "Damages all living monsters in sight.";
 #endif
     
                {
-                       int dam = 300 + 3 * plev;
-                       int rad = 8;
+                       int sides = plev * 3;
 
-                       if (info) return info_damage(0, 0, dam/2);
+                       if (info) return info_damage(1, sides, 0);
 
                        if (cast)
                        {
-                               fire_ball(GF_FIRE, 0, dam, rad);
+                               dispel_living(randint1(sides));
                        }
                }
                break;
 
-       case CHAO_SPEL_CALL_CHAOS:
+       case 23:
 #ifdef JP
-               if (name) return "º®ÆÙ¾¤Íè";
-               if (desc) return "¥é¥ó¥À¥à¤Ê°À­¤Îµå¤ä¥Ó¡¼¥à¤òȯÀ¸¤µ¤»¤ë¡£";
+               if (name) return "°Å¹õ¤ÎÍò";
+               if (desc) return "µðÂç¤Ê°Å¹õ¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Call Chaos";
-               if (desc) return "Generate random kind of balls or beams.";
+               if (name) return "Darkness Storm";
+               if (desc) return "Fires a huge ball of darkness.";
 #endif
     
                {
-                       if (info) return format("%s150 / 250", s_dam);
+                       int dam = 100 + plev * 2;
+                       int rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               call_chaos();
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DARK, dir, dam, rad);
                        }
                }
                break;
 
-       case CHAO_SPEL_POLYMORPH_SELF:
+       case 24:
 #ifdef JP
-               if (name) return "¼«¸ÊÊÑÍÆ";
-               if (desc) return "¼«Ê¬¤òÊѿȤµ¤»¤è¤¦¤È¤¹¤ë¡£";
+               if (name) return "»à¤Î¸÷Àþ";
+               if (desc) return "»à¤Î¸÷Àþ¤òÊü¤Ä¡£";
 #else
-               if (name) return "Polymorph Self";
-               if (desc) return "Polymorphs yourself.";
+               if (name) return "Death Ray";
+               if (desc) return "Fires a beam of death.";
 #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();
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               death_ray(dir, plev);
                        }
                }
                break;
 
-       case CHAO_SPEL_MANA_STORM:
+       case 25:
 #ifdef JP
-               if (name) return "ËâÎϤÎÍò";
-               if (desc) return "Èó¾ï¤Ë¶¯ÎϤǵðÂç¤Ê½ã¿è¤ÊËâÎϤεå¤òÊü¤Ä¡£";
+               if (name) return "»à¼Ô¾¤´­";
+               if (desc) return "1ÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Mana Storm";
-               if (desc) return "Fires an extremely powerful huge ball of pure mana.";
+               if (name) return "Raise the Dead";
+               if (desc) return "Summons an undead monster.";
 #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;
+                               int type;
+                               bool pet = one_in_(3);
+                               u32b mode = 0L;
 
-                               fire_ball(GF_MANA, dir, dam, rad);
-                       }
-               }
-               break;
+                               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);
 
-       case CHAO_SPEL_BREATHE_LOGRUS:
+                               if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, mode))
+                               {
 #ifdef JP
-               if (name) return "¥í¥°¥ë¥¹¤Î¥Ö¥ì¥¹";
-               if (desc) return "Èó¾ï¤Ë¶¯ÎϤʥ«¥ª¥¹¤Îµå¤òÊü¤Ä¡£";
+                                       msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
 #else
-               if (name) return "Breathe Logrus";
-               if (desc) return "Fires an extremely powerful ball of chaos.";
+                                       msg_print("Cold winds begin to blow around you, carrying with them the stench of decay...");
 #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;
+                                       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
+                                       }
 
-                               fire_ball(GF_CHAOS, dir, dam, rad);
+                                       chg_virtue(V_UNLIFE, 1);
+                               }
                        }
                }
                break;
 
-       case CHAO_SPEL_CALL_THE_VOID:
+       case 26:
 #ifdef JP
-               if (name) return "µõ̵¾¤Íè";
-               if (desc) return "¼«Ê¬¤Ë¼þ°Ï¤Ë¸þ¤«¤Ã¤Æ¡¢¥í¥±¥Ã¥È¡¢½ã¿è¤ÊËâÎϤε塢Êü¼ÍÀ­ÇÑ´þʪ¤Îµå¤òÊü¤Ä¡£¤¿¤À¤·¡¢ÊɤËÎÙÀܤ·¤Æ»ÈÍѤ¹¤ë¤È¹­ÈϰϤòÇ˲õ¤¹¤ë¡£";
+               if (name) return "»à¼Ô¤ÎÈëÅÁ";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò1¤Ä¼±Ê̤¹¤ë¡£¥ì¥Ù¥ë¤¬¹â¤¤¤È¥¢¥¤¥Æ¥à¤ÎǽÎϤò´°Á´¤ËÃΤ뤳¤È¤¬¤Ç¤­¤ë¡£";
 #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.";
+               if (name) return "Esoteria";
+               if (desc) return "Identifies an item. Or *identifies* an item at higher level.";
 #endif
     
                {
-                       if (info) return format("%s3 * 175", s_dam);
-
                        if (cast)
                        {
-                               call_the_();
+                               if (randint1(50) > plev)
+                               {
+                                       if (!ident_spell(FALSE)) return NULL;
+                               }
+                               else
+                               {
+                                       if (!identify_fully(FALSE)) return NULL;
+                               }
                        }
                }
                break;
 
-       case DEAT_SPEL_DETECT_UNLIFE:
+       case 27:
 #ifdef JP
-               if (name) return "̵À¸Ì¿´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "µÛ·ìµ´ÊѲ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢µÛ·ìµ´¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤ËµÛ·ìµ´¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Detect Unlife";
-               if (desc) return "Detects all nonliving monsters in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 10 + plev / 2;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_monsters_nonliving(rad);
+                               set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
                        }
                }
                break;
 
-       case DEAT_SPEL_MALEDICTION:
+       case 28:
 #ifdef JP
-               if (name) return "¼ö»¦ÃÆ";
-               if (desc) return "¤´¤¯¾®¤µ¤Ê¼Ù°­¤ÊÎϤò»ý¤Ä¥Ü¡¼¥ë¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               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.";
+               if (name) return "Restore Life";
+               if (desc) return "Restore lost experience.";
 #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);
-                               }
+                               restore_level();
                        }
                }
                break;
 
-       case DEAT_SPEL_DETECT_EVIL:
+       case 29:
 #ifdef JP
-               if (name) return "¼Ù°­´¶ÃÎ";
-               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "¼þÊÕËõ»¦";
+               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Detect Evil";
-               if (desc) return "Detects all evil monsters in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int power = plev + 50;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               detect_monsters_evil(rad);
+                               mass_genocide(power, TRUE);
                        }
                }
                break;
 
-       case DEAT_SPEL_STINKING_CLOUD:
+       case 30:
 #ifdef JP
-               if (name) return "°­½­±À";
-               if (desc) return "ÆǤεå¤òÊü¤Ä¡£";
+               if (name) return "ÃϹö¤Î¹å²Ð";
+               if (desc) return "¼Ù°­¤ÊÎϤò»ý¤ÄÊõ¼î¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Stinking Cloud";
-               if (desc) return "Fires a ball of poison.";
+               if (name) return "Hellfire";
+               if (desc) return "Fires a powerful ball of evil power. Hurts good monsters greatly.";
 #endif
     
                {
-                       int dam = 10 + plev / 2;
-                       int rad = 2;
+                       int dam = 666;
+                       int rad = 3;
 
                        if (info) return info_damage(0, 0, dam);
 
@@ -5751,193 +4979,205 @@ cptr do_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_ball(GF_POIS, dir, dam, rad);
+                               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_BLACK_SLEEP:
+       case 31:
 #ifdef JP
-               if (name) return "¹õ¤¤Ì²¤ê";
-               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "Í©Âβ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÊɤòÄ̤êÈ´¤±¤ë¤³¤È¤¬¤Ç¤­¼õ¤±¤ë¥À¥á¡¼¥¸¤¬·Ú¸º¤µ¤ì¤ëÍ©ÂΤξõÂÖ¤ËÊѿȤ¹¤ë¡£";
 #else
-               if (name) return "Black Sleep";
-               if (desc) return "Attempts to sleep a monster.";
+               if (name) return "Wraithform";
+               if (desc) return "Becomes wraith form which gives ability to pass walls and makes all damages half.";
 #endif
     
                {
-                       int power = plev;
+                       int base = plev / 2;
 
-                       if (info) return info_power(power);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               sleep_monster(dir);
+                               set_wraith_form(randint1(base) + base, FALSE);
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_trump_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;
 
-       case DEAT_SPEL_RESIST_POISON:
 #ifdef JP
-               if (name) return "ÂÑÆÇ";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÆǤؤÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+       static const char s_random[] = "¥é¥ó¥À¥à";
 #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.";
+       static const char s_random[] = "random";
+#endif
+
+       int dir;
+       int plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
+#ifdef JP
+               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+#else
+               if (name) return "Phase Door";
+               if (desc) return "Teleport short distance.";
 #endif
     
                {
-                       int base = 20;
+                       int range = 10;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               set_oppose_pois(randint1(base) + base, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case DEAT_SPEL_HORRIFY:
+       case 1:
 #ifdef JP
-               if (name) return "¶²¹²";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ÃØéá¤Î¥«¡¼¥É";
+               if (desc) return "ÃØéá¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Horrify";
-               if (desc) return "Attempts to scare and stun a monster.";
+               if (name) return "Trump Spiders";
+               if (desc) return "Summons spiders.";
 #endif
     
                {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
-                       if (cast)
+                       if (cast || fail)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an spider...");
+#endif
 
-                               fear_monster(dir, power);
-                               stun_monster(dir, power);
+                               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 DEAT_SPEL_ENSLAVE_UNDEAD:
+       case 2:
 #ifdef JP
-               if (name) return "¥¢¥ó¥Ç¥Ã¥É½¾Â°";
-               if (desc) return "¥¢¥ó¥Ç¥Ã¥É1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥·¥ã¥Ã¥Õ¥ë";
+               if (desc) return "¥«¡¼¥É¤ÎÀꤤ¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Enslave Undead";
-               if (desc) return "Attempts to charm an undead monster.";
+               if (name) return "Shuffle";
+               if (desc) return "Causes random effects.";
 #endif
     
                {
-                       int power = plev;
-
-                       if (info) return info_power(power);
+                       if (info) return s_random;
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               control_one_undead(dir, power);
+                               cast_shuffle();
                        }
                }
                break;
 
-       case DEAT_SPEL_ORB_OF_ENTROPY:
+       case 3:
 #ifdef JP
-               if (name) return "¥¨¥ó¥È¥í¥Ô¡¼¤Îµå";
-               if (desc) return "À¸Ì¿¤Î¤¢¤ë¼Ô¤Ë¸ú²Ì¤Î¤¢¤ëµå¤òÊü¤Ä¡£";
+               if (name) return "¥Õ¥í¥¢¡¦¥ê¥»¥Ã¥È";
+               if (desc) return "ºÇ¿¼³¬¤òÊѹ¹¤¹¤ë¡£";
 #else
-               if (name) return "Orb of Entropy";
-               if (desc) return "Fires a ball which damages living monsters.";
+               if (name) return "Reset Recall";
+               if (desc) return "Resets the 'deepest' level for recall spell.";
 #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);
+                               if (!reset_recall()) return NULL;
                        }
                }
                break;
 
-       case DEAT_SPEL_NETHER_BOLT:
+       case 4:
 #ifdef JP
-               if (name) return "ÃϹö¤ÎÌð";
-               if (desc) return "ÃϹö¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
+               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Nether Bolt";
-               if (desc) return "Fires a bolt or beam of nether.";
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
 #endif
     
                {
-                       int dice = 8 + (plev - 5) / 4;
-                       int sides = 8;
+                       int range = plev * 4;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case DEAT_SPEL_CLOUD_KILL:
+       case 5:
 #ifdef JP
-               if (name) return "»¦Ù¤±À";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿ÆǤεå¤òȯÀ¸¤µ¤»¤ë¡£";
+               if (name) return "´¶ÃΤΥ«¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Cloud kill";
-               if (desc) return "Generate a ball of poison centered on you.";
+               if (name) return "Trump Spying";
+               if (desc) return "Gives telepathy for a while.";
 #endif
     
                {
-                       int dam = (30 + plev) * 2;
-                       int rad = plev / 10 + 2;
+                       int base = 25;
+                       int sides = 30;
 
-                       if (info) return info_damage(0, 0, dam/2);
+                       if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               project(0, rad, py, px, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
+                               set_tim_esp(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case DEAT_SPEL_GENOCIDE_ONE:
+       case 6:
 #ifdef JP
-               if (name) return "¥â¥ó¥¹¥¿¡¼¾ÃÌÇ";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¾Ã¤·µî¤ë¡£·Ð¸³Ãͤ䥢¥¤¥Æ¥à¤Ï¼ê¤ËÆþ¤é¤Ê¤¤¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Genocide One";
-               if (desc) return "Attempts to vanish a monster.";
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
 #endif
     
                {
-                       int power = plev + 50;
+                       int power = plev;
 
                        if (info) return info_power(power);
 
@@ -5945,559 +5185,518 @@ cptr do_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_ball_hide(GF_GENOCIDE, dir, power, 0);
+                               fire_beam(GF_AWAY_ALL, dir, power);
                        }
                }
                break;
 
-       case DEAT_SPEL_POISON_BRANDING:
+       case 7:
 #ifdef JP
-               if (name) return "ÆǤοÏ";
-               if (desc) return "Éð´ï¤ËÆǤΰÀ­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "ưʪ¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤÎưʪ¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Poison Branding";
-               if (desc) return "Makes current weapon poison branded.";
+               if (name) return "Trump Animals";
+               if (desc) return "Summons an animal.";
 #endif
     
                {
-                       if (cast)
+                       if (cast || fail)
                        {
-                               brand_weapon(3);
+                               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 DEAT_SPEL_VAMPIRIC_DRAIN:
+       case 8:
 #ifdef JP
-               if (name) return "µÛ·ì¥É¥ì¥¤¥ó";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆËþÊ¢ÅÙ¤¬¾å¤¬¤ë¡£";
+               if (name) return "°ÜÆ°¤Î¥«¡¼¥É";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼«Ê¬¤Î­¸µ¤Ø°ÜÆ°¤µ¤»¤ë¡£";
 #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.";
+               if (name) return "Trump Reach";
+               if (desc) return "Pulls a distant item close to you.";
 #endif
     
                {
-                       int dice = 1;
-                       int sides = plev * 2;
-                       int base = plev * 2;
+                       int weight = plev * 15;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_weight(weight);
 
                        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);
-                               }
+                               fetch(dir, weight, FALSE);
                        }
                }
                break;
 
-       case DEAT_SPEL_ANIMATE_DEAD:
+       case 9:
 #ifdef JP
-               if (name) return "È¿º²¤Î½Ñ";
-               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
+               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 (name) return "Trump Kamikaze";
+               if (desc) return "Summons monsters which explode by itself.";
+#endif
     
                {
-                       if (cast)
+                       if (cast || fail)
                        {
-                               animate_dead(0, py, px);
-                       }
-               }
-               break;
+                               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;
 
-       case DEAT_SPEL_GENOCIDE:
 #ifdef JP
-               if (name) return "Ëõ»¦";
-               if (desc) return "»ØÄꤷ¤¿Ê¸»ú¤Î¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+                               msg_print("¤¢¤Ê¤¿¤Ï¥«¥ß¥«¥¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
 #else
-               if (name) return "Genocide";
-               if (desc) return "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.";
+                               msg_print("You concentrate on several trumps at once...");
 #endif
-    
-               {
-                       int power = plev+50;
-
-                       if (info) return info_power(power);
 
-                       if (cast)
-                       {
-                               symbol_genocide(power, TRUE);
-                       }
-               }
-               break;
-
-       case DEAT_SPEL_BERSERK:
+                               if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
+                               {
+                                       if (fail)
+                                       {
 #ifdef JP
-               if (name) return "¶¸Àï»Î²½";
-               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤¹¤ë¡£";
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-               if (name) return "Berserk";
-               if (desc) return "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.";
+                                               msg_print("The summoned creatures get angry!");
 #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:
+       case 10:
 #ifdef JP
-               if (name) return "°­Î´­";
-               if (desc) return "¥é¥ó¥À¥à¤ÇÍÍ¡¹¤Ê¸ú²Ì¤¬µ¯¤³¤ë¡£";
+               if (name) return "¸¸Î´­";
+               if (desc) return "1ÂΤÎÍ©Îî¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Invoke Spirits";
-               if (desc) return "Causes random effects.";
+               if (name) return "Phantasmal Servant";
+               if (desc) return "Summons a ghost.";
 #endif
     
                {
-                       if (info) return s_random;
-
+                       /* Phantasmal Servant is not summoned as enemy when failed */
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+                               int summon_lev = plev * 2 / 3 + randint1(plev / 2);
 
-                               cast_invoke_spirits(dir);
+                               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 DEAT_SPEL_DARK_BOLT:
+       case 11:
 #ifdef JP
-               if (name) return "°Å¹õ¤ÎÌð";
-               if (desc) return "°Å¹õ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥¹¥Ô¡¼¥É¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò²Ã®¤µ¤»¤ë¡£";
 #else
-               if (name) return "Dark Bolt";
-               if (desc) return "Fires a bolt or beam of darkness.";
+               if (name) return "Haste Monster";
+               if (desc) return "Hastes a monster.";
 #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;
+                               bool result;
 
-                               fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
-                       }
-               }
-               break;
+                               /* Temporary enable target_pet option */
+                               bool old_target_pet = target_pet;
+                               target_pet = TRUE;
 
-       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;
+                               result = get_aim_dir(&dir);
 
-                       if (info) return info_duration(b_base, b_base);
+                               /* Restore target_pet option */
+                               target_pet = old_target_pet;
 
-                       if (cast)
-                       {
-                               set_shero(randint1(25) + 25, FALSE);
-                               hp_player(30);
-                               set_afraid(0);
-                               set_fast(randint1(sp_sides) + sp_base, FALSE);
+                               if (!result) return NULL;
+
+                               speed_monster(dir, plev);
                        }
                }
                break;
 
-       case DEAT_SPEL_VAMPIRIC_BRANDING:
+       case 12:
 #ifdef JP
-               if (name) return "µÛ·ì¤Î¿Ï";
-               if (desc) return "Éð´ï¤ËµÛ·ì¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
+               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
 #else
-               if (name) return "Vampiric Branding";
-               if (desc) return "Makes current weapon Vampiric.";
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
 #endif
     
                {
                        if (cast)
                        {
-                               brand_weapon(4);
+#ifdef JP
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+#else
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+#endif
+                               teleport_level(0);
                        }
                }
                break;
 
-       case DEAT_SPEL_VAMPIRISM_TRUE:
+       case 13:
 #ifdef JP
-               if (name) return "¿¿¡¦µÛ·ì";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤ«¤éÀ¸Ì¿ÎϤòµÛ¤¤¤È¤ë¡£µÛ¤¤¤È¤Ã¤¿À¸Ì¿ÎϤˤè¤Ã¤ÆÂÎÎϤ¬²óÉü¤¹¤ë¡£";
+               if (name) return "¼¡¸µ¤ÎÈâ";
+               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
 #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.";
+               if (name) return "Dimension Door";
+               if (desc) return "Teleport to given location.";
 #endif
     
                {
-                       int dam = 100;
+                       int range = plev / 2 + 10;
 
-                       if (info) return format("%s3*%d", s_dam, dam);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               int i;
-
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               chg_virtue(V_SACRIFICE, -1);
-                               chg_virtue(V_VITALITY, -1);
+#ifdef JP
+                               msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
+#else
+                               msg_print("You open a dimensional gate. Choose a destination.");
+#endif
 
-                               for (i = 0; i < 3; i++)
-                               {
-                                       if (drain_life(dir, dam))
-                                               hp_player(dam);
-                               }
+                               if (!dimension_door()) return NULL;
                        }
                }
                break;
 
-       case DEAT_SPEL_NETHER_WAVE:
+       case 14:
 #ifdef JP
-               if (name) return "»à¤Î¸Àº²";
-               if (desc) return "»ë³¦Æâ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
 #else
-               if (name) return "Nether Wave";
-               if (desc) return "Damages all living monsters in sight.";
+               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 sides = plev * 3;
+                       int base = 15;
+                       int sides = 20;
 
-                       if (info) return info_damage(1, sides, 0);
+                       if (info) return info_delay(base, sides);
 
                        if (cast)
                        {
-                               dispel_living(randint1(sides));
+                               if (!word_of_recall()) return NULL;
                        }
                }
                break;
 
-       case DEAT_SPEL_DARKNESS_STORM:
+       case 15:
 #ifdef JP
-               if (name) return "°Å¹õ¤ÎÍò";
-               if (desc) return "µðÂç¤Ê°Å¹õ¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "²øʪÄÉÊü";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Darkness Storm";
-               if (desc) return "Fires a huge ball of darkness.";
+               if (name) return "Banish";
+               if (desc) return "Teleports all monsters in sight away unless resisted.";
 #endif
     
                {
-                       int dam = 100 + plev * 2;
-                       int rad = 4;
+                       int power = plev * 4;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_DARK, dir, dam, rad);
+                               banish_monsters(power);
                        }
                }
                break;
 
-       case DEAT_SPEL_DEATH_RAY:
+       case 16:
 #ifdef JP
-               if (name) return "»à¤Î¸÷Àþ";
-               if (desc) return "»à¤Î¸÷Àþ¤òÊü¤Ä¡£";
+               if (name) return "°ÌÃÖ¸ò´¹¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤È°ÌÃÖ¤ò¸ò´¹¤¹¤ë¡£";
 #else
-               if (name) return "Death Ray";
-               if (desc) return "Fires a beam of death.";
+               if (name) return "Swap Position";
+               if (desc) return "Swap positions of you and a monster.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+                               bool result;
 
-                               death_ray(dir, plev);
+                               /* 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 DEAT_SPEL_RAISE_THE_DEAD:
+       case 17:
 #ifdef JP
-               if (name) return "»à¼Ô¾¤´­";
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É";
                if (desc) return "1ÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Raise the Dead";
+               if (name) return "Trump Undead";
                if (desc) return "Summons an undead monster.";
 #endif
     
                {
-                       if (cast)
+                       if (cast || fail)
                        {
-                               int type;
-                               bool pet = one_in_(3);
-                               u32b mode = 0L;
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of an undead creature...");
+#endif
 
-                               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))
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_UNDEAD, 0L))
                                {
-#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
+                                       if (fail)
                                        {
 #ifdef JP
-                                               msg_print("»à¼Ô¤¬á´¤Ã¤¿¡£Ì²¤ê¤ò˸¤²¤ë¤¢¤Ê¤¿¤òȳ¤¹¤ë¤¿¤á¤Ë¡ª");
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-                                               msg_print("'The dead arise... to punish you for disturbing them!'");
+                                               msg_print("The summoned undead creature gets angry!");
 #endif
                                        }
-
-                                       chg_virtue(V_UNLIFE, 1);
                                }
                        }
                }
                break;
 
-       case DEAT_SPEL_ESOTERIA:
+       case 18:
 #ifdef JP
-               if (name) return "»à¼Ô¤ÎÈëÅÁ";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò1¤Ä¼±Ê̤¹¤ë¡£¥ì¥Ù¥ë¤¬¹â¤¤¤È¥¢¥¤¥Æ¥à¤ÎǽÎϤò´°Á´¤ËÃΤ뤳¤È¤¬¤Ç¤­¤ë¡£";
+               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.";
+               if (name) return "Trump Reptiles";
+               if (desc) return "Summons a hydra.";
 #endif
     
                {
-                       if (cast)
+                       if (cast || fail)
                        {
-                               if (randint1(50) > plev)
-                               {
-                                       if (!ident_spell(FALSE)) return NULL;
-                               }
-                               else
+#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 (!identify_fully(FALSE)) return NULL;
+                                       if (fail)
+                                       {
+#ifdef JP
+                                               msg_print("¾¤´­¤µ¤ì¤¿à¨ÃîÎà¤ÏÅܤäƤ¤¤ë¡ª");
+#else
+                                               msg_print("The summoned reptile gets angry!");
+#endif
+                                       }
                                }
                        }
                }
                break;
 
-       case DEAT_SPEL_POLYMORPH_VAMPIRE:
+       case 19:
 #ifdef JP
-               if (name) return "µÛ·ìµ´ÊѲ½";
-               if (desc) return "°ìÄê»þ´Ö¡¢µÛ·ìµ´¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤ËµÛ·ìµ´¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
+               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.";
+               if (name) return "Trump Monsters";
+               if (desc) return "Summons some monsters.";
 #endif
     
                {
-                       int base = 10 + plev / 2;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
+                       if (cast || fail)
                        {
-                               set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
-                       }
-               }
-               break;
+                               int type;
 
-       case DEAT_SPEL_RESTORE_LIFE:
 #ifdef JP
-               if (name) return "À¸Ì¿ÎÏÉü³è";
-               if (desc) return "¼º¤Ã¤¿·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
+                               msg_print("¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
 #else
-               if (name) return "Restore Life";
-               if (desc) return "Restore lost experience.";
+                               msg_print("You concentrate on several trumps at once...");
 #endif
-    
-               {
-                       if (cast)
-                       {
-                               restore_level();
-                       }
-               }
-               break;
 
-       case DEAT_SPEL_MASS_GENOCIDE:
+                               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
-               if (name) return "¼þÊÕËõ»¦";
-               if (desc) return "¼«Ê¬¤Î¼þ°Ï¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¸½ºß¤Î³¬¤«¤é¾Ã¤·µî¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-               if (name) return "Mass Genocide";
-               if (desc) return "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.";
+                                               msg_print("The summoned creatures get angry!");
 #endif
-    
-               {
-                       int power = plev + 50;
-
-                       if (info) return info_power(power);
+                                       }
+                               }
 
-                       if (cast)
-                       {
-                               mass_genocide(power, TRUE);
                        }
                }
                break;
 
-       case DEAT_SPEL_HELLFIRE:
+       case 20:
 #ifdef JP
-               if (name) return "ÃϹö¤Î¹å²Ð";
-               if (desc) return "¼Ù°­¤ÊÎϤò»ý¤ÄÊõ¼î¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É";
+               if (desc) return "1¥°¥ë¡¼¥×¤Î¥Ï¥¦¥ó¥É¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Hellfire";
-               if (desc) return "Fires a powerful ball of evil power. Hurts good monsters greatly.";
+               if (name) return "Trump Hounds";
+               if (desc) return "Summons a group of hounds.";
 #endif
     
                {
-                       int dam = 666;
-                       int rad = 3;
-
-                       if (info) return info_damage(0, 0, dam);
-
-                       if (cast)
+                       if (cast || fail)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+#else
+                               msg_print("You concentrate on the trump of a hound...");
+#endif
 
-                               fire_ball(GF_HELL_FIRE, dir, dam, rad);
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
+                               {
+                                       if (fail)
+                                       {
 #ifdef JP
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "ÃϹö¤Î¹å²Ð¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "the strain of casting Hellfire", -1);
+                                               msg_print("The summoned hounds get angry!");
 #endif
+                                       }
+                               }
                        }
                }
                break;
 
-       case DEAT_SPEL_WRAITHFORM:
+       case 21:
 #ifdef JP
-               if (name) return "Í©Âβ½";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÊɤòÄ̤êÈ´¤±¤ë¤³¤È¤¬¤Ç¤­¼õ¤±¤ë¥À¥á¡¼¥¸¤¬·Ú¸º¤µ¤ì¤ëÍ©ÂΤξõÂÖ¤ËÊѿȤ¹¤ë¡£";
+               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.";
+               if (name) return "Trump Branding";
+               if (desc) return "Makes current weapon a Trump weapon.";
 #endif
     
                {
-                       int base = plev / 2;
-
-                       if (info) return info_duration(base, base);
-
                        if (cast)
                        {
-                               set_wraith_form(randint1(base) + base, FALSE);
+                               brand_weapon(5);
                        }
                }
                break;
 
-       case TRUM_SPEL_PHASE_DOOR:
+       case 22:
 #ifdef JP
-               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "¿Í´Ö¥È¥é¥ó¥×";
+               if (desc) return "¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤«¡¢¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤¬¿È¤Ë¤Ä¤¯¡£";
 #else
-               if (name) return "Phase Door";
-               if (desc) return "Teleport short distance.";
+               if (name) return "Living Trump";
+               if (desc) return "Gives mutation which makes you teleport randomly or makes you able to teleport at will.";
 #endif
     
                {
-                       int range = 10;
-
-                       if (info) return info_range(range);
-
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               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_SPIDERS:
+       case 23:
 #ifdef JP
-               if (name) return "ÃØéá¤Î¥«¡¼¥É";
-               if (desc) return "ÃØéá¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥµ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Spiders";
-               if (desc) return "Summons spiders.";
+               if (name) return "Trump Cyberdemon";
+               if (desc) return "Summons a cyber demon.";
 #endif
     
                {
                        if (cast || fail)
                        {
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+                               msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
 #else
-                               msg_print("You concentrate on the trump of an spider...");
+                               msg_print("You concentrate on the trump of a Cyberdemon...");
 #endif
 
-                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_CYBER, 0L))
                                {
                                        if (fail)
                                        {
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿ÃØéá¤ÏÅܤäƤ¤¤ë¡ª");
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-                                               msg_print("The summoned spiders get angry!");
+                                               msg_print("The summoned Cyberdemon gets angry!");
 #endif
                                        }
                                }
@@ -6505,136 +5704,159 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TRUM_SPEL_SHUFFLE:
+       case 24:
 #ifdef JP
-               if (name) return "¥·¥ã¥Ã¥Õ¥ë";
-               if (desc) return "¥«¡¼¥É¤ÎÀꤤ¤ò¤¹¤ë¡£";
+               if (name) return "ͽ¸«¤Î¥«¡¼¥É";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Shuffle";
-               if (desc) return "Causes random effects.";
+               if (name) return "Trump Divination";
+               if (desc) return "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.";
 #endif
     
                {
-                       if (info) return s_random;
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               cast_shuffle();
+                               detect_all(rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_RESET_RECALL:
+       case 25:
 #ifdef JP
-               if (name) return "¥Õ¥í¥¢¡¦¥ê¥»¥Ã¥È";
-               if (desc) return "ºÇ¿¼³¬¤òÊѹ¹¤¹¤ë¡£";
+               if (name) return "Ãμ±¤Î¥«¡¼¥É";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
 #else
-               if (name) return "Reset Recall";
-               if (desc) return "Resets the 'deepest' level for recall spell.";
+               if (name) return "Trump Lore";
+               if (desc) return "*Identifies* an item.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!reset_recall()) return NULL;
+                               if (!identify_fully(FALSE)) return NULL;
                        }
                }
                break;
 
-       case TRUM_SPEL_TELEPORT:
+       case 26:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "²óÉü¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤÎÂÎÎϤò²óÉü¤µ¤»¤ë¡£";
 #else
-               if (name) return "Teleport";
-               if (desc) return "Teleport long distance.";
-#endif
+               if (name) return "Heal Monster";
+               if (desc) return "Heal a monster.";
+#endif
     
                {
-                       int range = plev * 4;
+                       int heal = plev * 10 + 200;
 
-                       if (info) return info_range(range);
+                       if (info) return info_heal(0, 0, heal);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               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_SPYING:
+       case 27:
 #ifdef JP
-               if (name) return "´¶ÃΤΥ«¡¼¥É";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               if (name) return "¥É¥é¥´¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΥɥ饴¥ó¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Spying";
-               if (desc) return "Gives telepathy for a while.";
+               if (name) return "Trump Dragon";
+               if (desc) return "Summons a dragon.";
 #endif
     
                {
-                       int base = 25;
-                       int sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
-                       if (cast)
+                       if (cast || fail)
                        {
-                               set_tim_esp(randint1(sides) + base, FALSE);
+#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_TELEPORT_AWAY:
+       case 28:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ð¨ÀФΥ«¡¼¥É";
+               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
 #else
-               if (name) return "Teleport Away";
-               if (desc) return "Teleports all monsters on the line away unless resisted.";
+               if (name) return "Trump Meteor";
+               if (desc) return "Makes meteor balls fall down to nearby random locations.";
 #endif
     
                {
-                       int power = plev;
+                       int dam = plev * 2;
+                       int rad = 2;
 
-                       if (info) return info_power(power);
+                       if (info) return info_multi_damage(dam);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_beam(GF_AWAY_ALL, dir, power);
+                               cast_meteor(dam, rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_ANIMALS:
+       case 29:
 #ifdef JP
-               if (name) return "ưʪ¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤÎưʪ¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤΰ­Ëâ¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Animals";
-               if (desc) return "Summons an animal.";
+               if (name) return "Trump Demon";
+               if (desc) return "Summons a demon.";
 #endif
     
                {
                        if (cast || fail)
                        {
-                               int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
-
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ïưʪ¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+                               msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
 #else
-                               msg_print("You concentrate on the trump of an animal...");
+                               msg_print("You concentrate on the trump of a demon...");
 #endif
 
-                               if (trump_summoning(1, !fail, py, px, 0, type, 0L))
+                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_DEMON, 0L))
                                {
                                        if (fail)
                                        {
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿ưʪ¤ÏÅܤäƤ¤¤ë¡ª");
+                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-                                               msg_print("The summoned animal gets angry!");
+                                               msg_print("The summoned demon gets angry!");
 #endif
                                        }
                                }
@@ -6642,1018 +5864,1037 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TRUM_SPEL_TRUMP_REACH:
+       case 30:
 #ifdef JP
-               if (name) return "°ÜÆ°¤Î¥«¡¼¥É";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼«Ê¬¤Î­¸µ¤Ø°ÜÆ°¤µ¤»¤ë¡£";
+               if (name) return "ÃϹö¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤξåµé¥¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Reach";
-               if (desc) return "Pulls a distant item close to you.";
+               if (name) return "Trump Greater Undead";
+               if (desc) return "Summons a greater undead.";
 #endif
     
                {
-                       int weight = plev * 15;
-
-                       if (info) return info_weight(weight);
-
-                       if (cast)
+                       if (cast || fail)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fetch(dir, weight, FALSE);
+#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_KAMIKAZE:
+       case 31:
 #ifdef JP
-               if (name) return "¥«¥ß¥«¥¼¤Î¥«¡¼¥É";
-               if (desc) return "Ê£¿ô¤ÎÇúȯ¤¹¤ë¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É";
+               if (desc) return "1ÂΤθÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Kamikaze";
-               if (desc) return "Summons monsters which explode by itself.";
+               if (name) return "Trump Ancient Dragon";
+               if (desc) return "Summons an ancient dragon.";
 #endif
     
                {
-                       if (cast || fail)
+                       if (cast)
                        {
-                               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;
+                                       type = SUMMON_HI_DRAGON_LIVING;
                                else
-                                       type = SUMMON_KAMIKAZE;
+                                       type = SUMMON_HI_DRAGON;
 
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¥«¥ß¥«¥¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+                               msg_print("¤¢¤Ê¤¿¤Ï¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
 #else
-                               msg_print("You concentrate on several trumps at once...");
+                               msg_print("You concentrate on the trump of an ancient dragon...");
 #endif
 
-                               if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
+                               /* 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("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª");
+                                               msg_print("¾¤´­¤µ¤ì¤¿¸ÅÂå¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
 #else
-                                               msg_print("The summoned creatures get angry!");
+                                               msg_print("The summoned ancient dragon gets angry!");
 #endif
                                        }
                                }
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_arcane_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;
 
-       case TRUM_SPEL_PHANTASMAL_SERVANT:
+       int dir;
+       int plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
-               if (name) return "¸¸Î´­";
-               if (desc) return "1ÂΤÎÍ©Îî¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "ÅÅ·â";
+               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Phantasmal Servant";
-               if (desc) return "Summons a ghost.";
+               if (name) return "Zap";
+               if (desc) return "Fires a bolt or beam of lightning.";
 #endif
     
                {
-                       /* Phantasmal Servant is not summoned as enemy when failed */
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 3;
+
+                       if (info) return info_damage(dice, sides, 0);
+
                        if (cast)
                        {
-                               int summon_lev = plev * 2 / 3 + randint1(plev / 2);
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               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
-                               }
+                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case TRUM_SPEL_HASTE_MONSTER:
+       case 1:
 #ifdef JP
-               if (name) return "¥¹¥Ô¡¼¥É¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò²Ã®¤µ¤»¤ë¡£";
+               if (name) return "ËâË¡¤Î»Ü¾û";
+               if (desc) return "Èâ¤Ë¸°¤ò¤«¤±¤ë¡£";
 #else
-               if (name) return "Haste Monster";
-               if (desc) return "Hastes a monster.";
+               if (name) return "Wizard Lock";
+               if (desc) return "Locks a door.";
 #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;
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               speed_monster(dir);
+                               wizard_lock(dir);
                        }
                }
                break;
 
-       case TRUM_SPEL_TELEPORT_LEVEL:
+       case 2:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
-               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+               if (name) return "Æ©ÌÀÂδ¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÆ©ÌÀ¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Teleport Level";
-               if (desc) return "Teleport to up or down stairs in a moment.";
+               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)
                        {
-#ifdef JP
-                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
-#else
-                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
-#endif
-                               teleport_level(0);
+                               detect_monsters_invis(rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_DIMENSION_DOOR:
+       case 3:
 #ifdef JP
-               if (name) return "¼¡¸µ¤ÎÈâ";
-               if (desc) return "ûµ÷Î¥Æâ¤Î»ØÄꤷ¤¿¾ì½ê¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Dimension Door";
-               if (desc) return "Teleport to given location.";
+               if (name) return "Detect Monsters";
+               if (desc) return "Detects all monsters in your vicinity unless invisible.";
 #endif
     
                {
-                       int range = plev / 2 + 10;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_range(range);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-#ifdef JP
-                               msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£");
-#else
-                               msg_print("You open a dimensional gate. Choose a destination.");
-#endif
-
-                               if (!dimension_door()) return NULL;
+                               detect_monsters_normal(rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_WORD_OF_RECALL:
+       case 4:
 #ifdef JP
-               if (name) return "µ¢´Ô¤Î¼öʸ";
-               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+               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.";
+               if (name) return "Blink";
+               if (desc) return "Teleport short distance.";
 #endif
     
                {
-                       int base = 15;
-                       int sides = 20;
+                       int range = 10;
 
-                       if (info) return info_delay(base, sides);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               if (!word_of_recall()) return NULL;
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case TRUM_SPEL_BANISH:
+       case 5:
 #ifdef JP
-               if (name) return "²øʪÄÉÊü";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-               if (name) return "Banish";
-               if (desc) return "Teleports all monsters in sight away unless resisted.";
+               if (name) return "Light Area";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
 #endif
     
                {
-                       int power = plev * 4;
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               banish_monsters(power);
+                               lite_area(damroll(dice, sides), rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_SWAP_POSITION:
+       case 6:
 #ifdef JP
-               if (name) return "°ÌÃÖ¸ò´¹¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΥâ¥ó¥¹¥¿¡¼¤È°ÌÃÖ¤ò¸ò´¹¤¹¤ë¡£";
+               if (name) return "櫤ÈÈâ Ç˲õ";
+               if (desc) return "°ìľÀþ¾å¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
 #else
-               if (name) return "Swap Position";
-               if (desc) return "Swap positions of you and a monster.";
+               if (name) return "Trap & Door Destruction";
+               if (desc) return "Fires a beam which destroy traps and doors.";
 #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;
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               teleport_swap(dir);
+                               destroy_door(dir);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_UNDEAD:
+       case 7:
 #ifdef JP
-               if (name) return "¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΥ¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
 #else
-               if (name) return "Trump Undead";
-               if (desc) return "Summons an undead monster.";
+               if (name) return "Cure Light Wounds";
+               if (desc) return "Heals cut and HP a little.";
 #endif
     
                {
-                       if (cast || fail)
-                       {
-#ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
-#else
-                               msg_print("You concentrate on the trump of an undead creature...");
-#endif
+                       int dice = 2;
+                       int sides = 8;
 
-                               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
-                                       }
-                               }
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_cut(p_ptr->cut - 10);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_REPTILES:
+       case 8:
 #ifdef JP
-               if (name) return "à¨ÃîÎà¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΥҥɥé¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "櫤ÈÈâ ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Trump Reptiles";
-               if (desc) return "Summons a hydra.";
+               if (name) return "Detect Doors & Traps";
+               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
 #endif
     
                {
-                       if (cast || fail)
-                       {
-#ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ïà¨ÃîÎà¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
-#else
-                               msg_print("You concentrate on the trump of a reptile...");
-#endif
+                       int rad = DETECT_RAD_DEFAULT;
 
-                               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
-                                       }
-                               }
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_traps(rad, TRUE);
+                               detect_doors(rad);
+                               detect_stairs(rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_MONSTERS:
+       case 9:
 #ifdef JP
-               if (name) return "¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É";
-               if (desc) return "Ê£¿ô¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "dzÁÇ";
+               if (desc) return "¸÷¸»¤ËdzÎÁ¤òÊäµë¤¹¤ë¡£";
 #else
-               if (name) return "Trump Monsters";
-               if (desc) return "Summons some monsters.";
+               if (name) return "Phlogiston";
+               if (desc) return "Adds more turns of light to a lantern or torch.";
 #endif
     
                {
-                       if (cast || fail)
+                       if (cast)
                        {
-                               int type;
+                               phlogiston();
+                       }
+               }
+               break;
 
+       case 10:
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+               if (name) return "ºâÊõ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
 #else
-                               msg_print("You concentrate on several trumps at once...");
+               if (name) return "Detect Treasure";
+               if (desc) return "Detects all treasures in your vicinity.";
 #endif
+    
+               {
+                       int rad = DETECT_RAD_DEFAULT;
 
-                               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
-                                       }
-                               }
+                       if (info) return info_radius(rad);
 
+                       if (cast)
+                       {
+                               detect_treasure(rad);
+                               detect_objects_gold(rad);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_HOUNDS:
+       case 11:
 #ifdef JP
-               if (name) return "¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É";
-               if (desc) return "1¥°¥ë¡¼¥×¤Î¥Ï¥¦¥ó¥É¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "ËâË¡ ´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎËâË¡¤¬¤«¤«¤Ã¤¿¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Trump Hounds";
-               if (desc) return "Summons a group of hounds.";
+               if (name) return "Detect Enchantment";
+               if (desc) return "Detects all magical items in your vicinity.";
 #endif
     
                {
-                       if (cast || fail)
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
                        {
-#ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
-#else
-                               msg_print("You concentrate on the trump of a hound...");
-#endif
+                               detect_objects_magic(rad);
+                       }
+               }
+               break;
 
-                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
-                               {
-                                       if (fail)
-                                       {
+       case 12:
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª");
+               if (name) return "¥¢¥¤¥Æ¥à´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-                                               msg_print("The summoned hounds get angry!");
+               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 TRUM_SPEL_TRUMP_BRANDING:
+       case 13:
 #ifdef JP
-               if (name) return "¥È¥é¥ó¥×¤Î¿Ï";
-               if (desc) return "Éð´ï¤Ë¥È¥é¥ó¥×¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "²òÆÇ";
+               if (desc) return "ÆǤòÂÎÆ⤫¤é´°Á´¤Ë¼è¤ê½ü¤¯¡£";
 #else
-               if (name) return "Trump Branding";
-               if (desc) return "Makes current weapon a Trump weapon.";
+               if (name) return "Cure Poison";
+               if (desc) return "Cures poison status.";
 #endif
     
                {
                        if (cast)
                        {
-                               brand_weapon(5);
+                               set_poisoned(0);
                        }
                }
                break;
 
-       case TRUM_SPEL_LIVING_TRUMP:
+       case 14:
 #ifdef JP
-               if (name) return "¿Í´Ö¥È¥é¥ó¥×";
-               if (desc) return "¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤«¡¢¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤¬¿È¤Ë¤Ä¤¯¡£";
+               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.";
+               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)
                        {
-                               int mutation;
-
-                               if (one_in_(7))
-                                       /* Teleport control */
-                                       mutation = 12;
-                               else
-                                       /* Random teleportation (uncontrolled) */
-                                       mutation = 77;
+                               set_oppose_cold(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
 
-                               /* Gain the mutation */
-                               if (gain_random_mutation(mutation))
-                               {
+       case 15:
 #ifdef JP
-                                       msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
+               if (name) return "ÂѲÐ";
+               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-                                       msg_print("You have turned into a Living Trump.");
+               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 TRUM_SPEL_TRUMP_CYBERDEMON:
+       case 16:
 #ifdef JP
-               if (name) return "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΥµ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "ÂÑÅÅ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÅÅ·â¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Trump Cyberdemon";
-               if (desc) return "Summons a cyber demon.";
+               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
     
                {
-                       if (cast || fail)
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
                        {
+                               set_oppose_elec(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 17:
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+               if (name) return "ÂÑ»À";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-                               msg_print("You concentrate on the trump of a Cyberdemon...");
+               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 (trump_summoning(1, !fail, py, px, 0, SUMMON_CYBER, 0L))
-                               {
-                                       if (fail)
-                                       {
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_acid(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 18:
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
 #else
-                                               msg_print("The summoned Cyberdemon gets angry!");
+               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 TRUM_SPEL_TRUMP_DIVINATION:
+       case 19:
 #ifdef JP
-               if (name) return "ͽ¸«¤Î¥«¡¼¥É";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               if (name) return "Teleport";
+               if (desc) return "Teleport long distance.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
+                       int range = plev * 5;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               detect_all(rad);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_LORE:
+       case 20:
 #ifdef JP
-               if (name) return "Ãμ±¤Î¥«¡¼¥É";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+               if (name) return "´ÕÄê";
+               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
 #else
-               if (name) return "Trump Lore";
-               if (desc) return "*Identifies* an item.";
+               if (name) return "Identify";
+               if (desc) return "Identifies an item.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!identify_fully(FALSE)) return NULL;
+                               if (!ident_spell(FALSE)) return NULL;
                        }
                }
                break;
 
-       case TRUM_SPEL_HEAL_MONSTER:
+       case 21:
 #ifdef JP
-               if (name) return "²óÉü¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤÎÂÎÎϤò²óÉü¤µ¤»¤ë¡£";
+               if (name) return "´äÀÐÍϲò";
+               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
 #else
-               if (name) return "Heal Monster";
-               if (desc) return "Heal a monster.";
+               if (name) return "Stone to Mud";
+               if (desc) return "Turns one rock square to mud.";
 #endif
     
                {
-                       int heal = plev * 10 + 200;
+                       int dice = 1;
+                       int sides = 30;
+                       int base = 20;
 
-                       if (info) return info_heal(0, 0, heal);
+                       if (info) return info_damage(dice, sides, base);
 
                        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;
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               heal_monster(dir, heal);
+                               wall_to_mud(dir, 20 + randint1(30));
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_DRAGON:
+       case 22:
 #ifdef JP
-               if (name) return "¥É¥é¥´¥ó¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΥɥ饴¥ó¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "Á®¸÷";
+               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
 #else
-               if (name) return "Trump Dragon";
-               if (desc) return "Summons a dragon.";
+               if (name) return "Ray of Light";
+               if (desc) return "Fires a beam of light which damages to light-sensitive monsters.";
 #endif
     
                {
-                       if (cast || fail)
+                       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("¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+                               msg_print("¸÷Àþ¤¬Êü¤¿¤ì¤¿¡£");
 #else
-                               msg_print("You concentrate on the trump of a dragon...");
+                               msg_print("A line of light appears.");
 #endif
 
-                               if (trump_summoning(1, !fail, py, px, 0, SUMMON_DRAGON, 0L))
-                               {
-                                       if (fail)
-                                       {
+                               lite_line(dir, damroll(6, 8));
+                       }
+               }
+               break;
+
+       case 23:
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
 #else
-                                               msg_print("The summoned dragon gets angry!");
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
 #endif
-                                       }
-                               }
+    
+               {
+                       if (cast)
+                       {
+                               set_food(PY_FOOD_MAX - 1);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_METEOR:
+       case 24:
 #ifdef JP
-               if (name) return "ð¨ÀФΥ«¡¼¥É";
-               if (desc) return "¼«Ê¬¤Î¼þÊÕ¤Ëð¨ÀФòÍî¤È¤¹¡£";
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Trump Meteor";
-               if (desc) return "Makes meteor balls fall down to nearby random locations.";
+               if (name) return "See Invisible";
+               if (desc) return "Gives see invisible for a while.";
 #endif
     
                {
-                       int dam = plev * 2;
-                       int rad = 2;
+                       int base = 24;
 
-                       if (info) return info_multi_damage(dam);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               cast_meteor(dam, rad);
+                               set_tim_invis(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_DEMON:
+       case 25:
 #ifdef JP
-               if (name) return "¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤΰ­Ëâ¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¥¨¥ì¥á¥ó¥¿¥ë¾¤´­";
+               if (desc) return "1ÂΤΥ¨¥ì¥á¥ó¥¿¥ë¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Trump Demon";
-               if (desc) return "Summons a demon.";
+               if (name) return "Conjure Elemental";
+               if (desc) return "Summons an elemental.";
 #endif
     
                {
-                       if (cast || fail)
+                       if (cast)
                        {
-#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 (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                                {
-                                       if (fail)
-                                       {
 #ifdef JP
-                                               msg_print("¾¤´­¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª");
+                                       msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
 #else
-                                               msg_print("The summoned demon gets angry!");
+                                       msg_print("No Elementals arrive.");
 #endif
-                                       }
                                }
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_GREATER_UNDEAD:
+       case 26:
 #ifdef JP
-               if (name) return "ÃϹö¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤξåµé¥¢¥ó¥Ç¥Ã¥É¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
+               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
 #else
-               if (name) return "Trump Greater Undead";
-               if (desc) return "Summons a greater undead.";
+               if (name) return "Teleport Level";
+               if (desc) return "Teleport to up or down stairs in a moment.";
 #endif
     
                {
-                       if (cast || fail)
+                       if (cast)
                        {
 #ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
+                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
 #else
-                               msg_print("You concentrate on the trump of a greater undead being...");
+                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
 #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
-                                       }
-                               }
+                               teleport_level(0);
                        }
                }
                break;
 
-       case TRUM_SPEL_TRUMP_ANCIENT_DRAGON:
+       case 27:
 #ifdef JP
-               if (name) return "¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É";
-               if (desc) return "1ÂΤθÅÂå¥É¥é¥´¥ó¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Trump Ancient Dragon";
-               if (desc) return "Summons an ancient dragon.";
+               if (name) return "Teleport Away";
+               if (desc) return "Teleports all monsters on the line away unless resisted.";
 #endif
     
                {
-                       if (cast)
-                       {
-                               int type;
+                       int power = plev;
 
-                               if (p_ptr->pclass == CLASS_BEASTMASTER)
-                                       type = SUMMON_HI_DRAGON_LIVING;
-                               else
-                                       type = SUMMON_HI_DRAGON;
+                       if (info) return info_power(power);
 
-#ifdef JP
-                               msg_print("¤¢¤Ê¤¿¤Ï¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
-#else
-                               msg_print("You concentrate on the trump of an ancient dragon...");
-#endif
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               /* 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
-                                       }
-                               }
+                               fire_beam(GF_AWAY_ALL, dir, power);
                        }
                }
                break;
 
-       case ARCA_SPEL_ZAP:
+       case 28:
 #ifdef JP
-               if (name) return "ÅÅ·â";
-               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¸µÁǤεå";
+               if (desc) return "±ê¡¢ÅÅ·â¡¢Î䵤¡¢»À¤Î¤É¤ì¤«¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Zap";
-               if (desc) return "Fires a bolt or beam of lightning.";
+               if (name) return "Elemental Ball";
+               if (desc) return "Fires a ball of some elements.";
 #endif
     
                {
-                       int dice = 3 + (plev - 1) / 5;
-                       int sides = 3;
+                       int dam = 75 + plev;
+                       int rad = 2;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
+                               int type;
+
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
+                               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_WIZARD_LOCK:
+       case 29:
 #ifdef JP
-               if (name) return "ËâË¡¤Î»Ü¾û";
-               if (desc) return "Èâ¤Ë¸°¤ò¤«¤±¤ë¡£";
+               if (name) return "Á´´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Wizard Lock";
-               if (desc) return "Locks a door.";
+               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)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               wizard_lock(dir);
+                               detect_all(rad);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_INVISIBILITY:
+       case 30:
 #ifdef JP
-               if (name) return "Æ©ÌÀÂδ¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÆ©ÌÀ¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "µ¢´Ô¤Î¼öʸ";
+               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
 #else
-               if (name) return "Detect Invisibility";
-               if (desc) return "Detects all invisible monsters in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 15;
+                       int sides = 20;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_delay(base, sides);
 
                        if (cast)
                        {
-                               detect_monsters_invis(rad);
+                               if (!word_of_recall()) return NULL;
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_MONSTERS:
+       case 31:
 #ifdef JP
-               if (name) return "¥â¥ó¥¹¥¿¡¼´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¸«¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÀéΤ´ã";
+               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤µ¤é¤Ë¡¢°ìÄê»þ´Ö¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Detect Monsters";
-               if (desc) return "Detects all monsters in your vicinity unless invisible.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 25;
+                       int sides = 30;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               detect_monsters_normal(rad);
+                               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;
+       }
+
+       return "";
+}
+
+
+static cptr do_craft_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;
+
+       int plev = p_ptr->lev;
 
-       case ARCA_SPEL_BLINK:
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
-               if (name) return "¥·¥ç¡¼¥È¡¦¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "¶áµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "ÀÖ³°Àþ»ëÎÏ";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÀÖ³°Àþ»ëÎϤ¬Áý¶¯¤µ¤ì¤ë¡£";
 #else
-               if (name) return "Blink";
-               if (desc) return "Teleport short distance.";
+               if (name) return "Infravision";
+               if (desc) return "Gives infravision for a while.";
 #endif
     
                {
-                       int range = 10;
+                       int base = 100;
 
-                       if (info) return info_range(range);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               set_tim_infra(base + randint1(base), FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_LIGHT_AREA:
+       case 1:
 #ifdef JP
-               if (name) return "¥é¥¤¥È¡¦¥¨¥ê¥¢";
-               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+               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.";
+               if (name) return "Regeneration";
+               if (desc) return "Gives regeneration ability for a while.";
 #endif
     
                {
-                       int dice = 2;
-                       int sides = plev / 2;
-                       int rad = plev / 10 + 1;
+                       int base = 80;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               lite_area(damroll(dice, sides), rad);
+                               set_tim_regen(base + randint1(base), FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_TRAP_AND_DOOR_DESTRUCTION:
+       case 2:
 #ifdef JP
-               if (name) return "櫤ÈÈâ Ç˲õ";
-               if (desc) return "°ìľÀþ¾å¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤òÇ˲õ¤¹¤ë¡£";
+               if (name) return "¶õÊ¢½¼Â­";
+               if (desc) return "ËþÊ¢¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Trap & Door Destruction";
-               if (desc) return "Fires a beam which destroy traps and doors.";
+               if (name) return "Satisfy Hunger";
+               if (desc) return "Satisfies hunger.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               destroy_door(dir);
+                               set_food(PY_FOOD_MAX - 1);
                        }
                }
                break;
 
-       case ARCA_SPEL_CURE_LIGHT_WOUNDS:
+       case 3:
 #ifdef JP
-               if (name) return "·Ú½ý¤Î¼£Ìþ";
-               if (desc) return "²ø²æ¤ÈÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+               if (name) return "ÂÑÎ䵤";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Cure Light Wounds";
-               if (desc) return "Heals cut and HP a little.";
+               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 dice = 2;
-                       int sides = 8;
+                       int base = 20;
 
-                       if (info) return info_heal(dice, sides, 0);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               hp_player(damroll(dice, sides));
-                               set_cut(p_ptr->cut - 10);
+                               set_oppose_cold(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_DOORS_AND_TRAPS:
+       case 4:
 #ifdef JP
-               if (name) return "櫤ÈÈâ ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î櫤ÈÈâ¤È³¬Ãʤò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÂѲбê";
+               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Detect Doors & Traps";
-               if (desc) return "Detects traps, doors, and stairs in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 20;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_traps(rad, TRUE);
-                               detect_doors(rad);
-                               detect_stairs(rad);
+                               set_oppose_fire(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_PHLOGISTON:
+       case 5:
 #ifdef JP
-               if (name) return "dzÁÇ";
-               if (desc) return "¸÷¸»¤ËdzÎÁ¤òÊäµë¤¹¤ë¡£";
+               if (name) return "»Îµ¤¹âÍÈ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Phlogiston";
-               if (desc) return "Adds more turns of light to a lantern or torch.";
+               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)
                        {
-                               phlogiston();
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_TREASURE:
+       case 6:
 #ifdef JP
-               if (name) return "ºâÊõ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎºâÊõ¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÂÑÅÅ·â";
+               if (desc) return "°ìÄê»þ´Ö¡¢ÅÅ·â¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Detect Treasure";
-               if (desc) return "Detects all treasures in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 20;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_treasure(rad);
-                               detect_objects_gold(rad);
+                               set_oppose_elec(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_ENCHANTMENT:
+       case 7:
 #ifdef JP
-               if (name) return "ËâË¡ ´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎËâË¡¤¬¤«¤«¤Ã¤¿¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÂÑ»À";
+               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Detect Enchantment";
-               if (desc) return "Detects all magical items in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 20;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_objects_magic(rad);
+                               set_oppose_acid(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECT_OBJECTS:
+       case 8:
 #ifdef JP
-               if (name) return "¥¢¥¤¥Æ¥à´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Detect Objects";
-               if (desc) return "Detects all items in your vicinity.";
+               if (name) return "See Invisibility";
+               if (desc) return "Gives see invisible for a while.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
+                       int base = 24;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_objects_normal(rad);
+                               set_tim_invis(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_CURE_POISON:
+       case 9:
 #ifdef JP
-               if (name) return "²òÆÇ";
-               if (desc) return "ÆǤòÂÎÆ⤫¤é´°Á´¤Ë¼è¤ê½ü¤¯¡£";
+               if (name) return "²ò¼ö";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
 #else
-               if (name) return "Cure Poison";
-               if (desc) return "Cures poison status.";
+               if (name) return "Remove Curse";
+               if (desc) return "Removes normal curses from equipped items.";
 #endif
     
                {
                        if (cast)
                        {
-                               set_poisoned(0);
+                               if (remove_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
                        }
                }
                break;
 
-       case ARCA_SPEL_RESIST_COLD:
+       case 10:
 #ifdef JP
-               if (name) return "ÂÑÎä";
-               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               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
     
                {
@@ -7663,491 +6904,556 @@ cptr do_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_oppose_pois(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_RESIST_FIRE:
+       case 11:
 #ifdef JP
-               if (name) return "ÂѲÐ";
-               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               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 = 20;
+                       int base = 25;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_shero(randint1(base) + base, FALSE);
+                               hp_player(30);
+                               set_afraid(0);
                        }
                }
                break;
 
-       case ARCA_SPEL_RESIST_LIGHTNING:
+       case 12:
 #ifdef JP
-               if (name) return "ÂÑÅÅ";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÅÅ·â¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               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
     
                {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
                        if (cast)
                        {
-                               set_oppose_elec(randint1(base) + base, FALSE);
+                               self_knowledge();
                        }
                }
                break;
 
-       case ARCA_SPEL_RESIST_ACID:
+       case 13:
 #ifdef JP
-               if (name) return "ÂÑ»À";
-               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Protection from Evil";
+               if (desc) return "Gives aura which protect you from evil monster's physical attack.";
 #endif
     
                {
-                       int base = 20;
+                       int base = 3 * plev;
+                       int sides = 25;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               set_oppose_acid(randint1(base) + base, FALSE);
+                               set_protevil(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_CURE_MEDIUM_WOUNDS:
+       case 14:
 #ifdef JP
-               if (name) return "½Å½ý¤Î¼£Ìþ";
-               if (desc) return "²ø²æ¤ÈÂÎÎϤòÃæÄøÅÙ²óÉü¤µ¤»¤ë¡£";
+               if (name) return "Ìþ¤·";
+               if (desc) return "ÆÇ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤òÁ´²÷¤µ¤»¡¢¸¸³Ð¤òľ¤¹¡£";
 #else
-               if (name) return "Cure Medium Wounds";
-               if (desc) return "Heals cut and HP more.";
+               if (name) return "Cure";
+               if (desc) return "Heals poison, stun, cut and hallucination completely.";
 #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);
+                               set_poisoned(0);
+                               set_stun(0);
+                               set_cut(0);
+                               set_image(0);
                        }
                }
                break;
 
-       case ARCA_SPEL_TELEPORT:
+       case 15:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È";
-               if (desc) return "±óµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+               if (name) return "ËâË¡·õ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Éð´ï¤ËÎ䵤¡¢±ê¡¢ÅÅ·â¡¢»À¡¢ÆǤΤ¤¤º¤ì¤«¤Î°À­¤ò¤Ä¤±¤ë¡£Éð´ï¤ò»ý¤¿¤Ê¤¤¤È»È¤¨¤Ê¤¤¡£";
 #else
-               if (name) return "Teleport";
-               if (desc) return "Teleport long distance.";
+               if (name) return "Mana Branding";
+               if (desc) return "Makes current weapon some elemental branded. You must wield weapons.";
 #endif
     
                {
-                       int range = plev * 5;
+                       int base = plev / 2;
 
-                       if (info) return info_range(range);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               if (!choose_ele_attack()) return NULL;
                        }
                }
                break;
 
-       case ARCA_SPEL_IDENTIFY:
+       case 16:
 #ifdef JP
-               if (name) return "´ÕÄê";
-               if (desc) return "¥¢¥¤¥Æ¥à¤ò¼±Ê̤¹¤ë¡£";
+               if (name) return "¥Æ¥ì¥Ñ¥·¡¼";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Identify";
-               if (desc) return "Identifies an item.";
+               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)
                        {
-                               if (!ident_spell(FALSE)) return NULL;
+                               set_tim_esp(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_STONE_TO_MUD:
+       case 17:
 #ifdef JP
-               if (name) return "´äÀÐÍϲò";
-               if (desc) return "ÊɤòÍϤ«¤·¤Æ¾²¤Ë¤¹¤ë¡£";
+               if (name) return "È©Àв½";
+               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
 #else
-               if (name) return "Stone to Mud";
-               if (desc) return "Turns one rock square to mud.";
+               if (name) return "Stone Skin";
+               if (desc) return "Gives bonus to AC for a while.";
 #endif
     
                {
-                       int dice = 1;
-                       int sides = 30;
-                       int base = 20;
+                       int base = 30;
+                       int sides = 20;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               wall_to_mud(dir);
+                               set_shield(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_RAY_OF_LIGHT:
+       case 18:
 #ifdef JP
-               if (name) return "Á®¸÷";
-               if (desc) return "¸÷Àþ¤òÊü¤Ä¡£¸÷¤ê¤ò·ù¤¦¥â¥ó¥¹¥¿¡¼¤Ë¸ú²Ì¤¬¤¢¤ë¡£";
+               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.";
+               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 dice = 6;
-                       int sides = 8;
+                       int base = 20;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_duration(base, base);
 
                        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);
+                               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 ARCA_SPEL_SATISFY_HUNGER:
+       case 19:
 #ifdef JP
-               if (name) return "¶õÊ¢½¼Â­";
-               if (desc) return "ËþÊ¢¤Ë¤¹¤ë¡£";
+               if (name) return "¥¹¥Ô¡¼¥É";
+               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
 #else
-               if (name) return "Satisfy Hunger";
-               if (desc) return "Satisfies hunger.";
+               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_food(PY_FOOD_MAX - 1);
+                               set_fast(randint1(sides) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_SEE_INVISIBLE:
+       case 20:
 #ifdef JP
-               if (name) return "Æ©ÌÀ»ëǧ";
-               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+               if (name) return "ÊÉÈ´¤±";
+               if (desc) return "°ìÄê»þ´Ö¡¢È¾Êª¼Á²½¤·ÊɤòÄ̤êÈ´¤±¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "See Invisible";
-               if (desc) return "Gives see invisible for a while.";
+               if (name) return "Walk through Wall";
+               if (desc) return "Gives ability to pass walls for a while.";
 #endif
     
                {
-                       int base = 24;
+                       int base = plev / 2;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_tim_invis(randint1(base) + base, FALSE);
+                               set_kabenuke(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_CONJURE_ELEMENTAL:
+       case 21:
 #ifdef JP
-               if (name) return "¥¨¥ì¥á¥ó¥¿¥ë¾¤´­";
-               if (desc) return "1ÂΤΥ¨¥ì¥á¥ó¥¿¥ë¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "½âË᤭";
+               if (desc) return "½â¤ËÈ¿¼Í¤Î°À­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Conjure Elemental";
-               if (desc) return "Summons an elemental.";
+               if (name) return "Polish Shield";
+               if (desc) return "Makes a shield a shield of reflection.";
 #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
-                               }
+                               pulish_shield();
                        }
                }
                break;
 
-       case ARCA_SPEL_TELEPORT_LEVEL:
+       case 22:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";
-               if (desc) return "½Ö»þ¤Ë¾å¤«²¼¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
+               if (name) return "¥´¡¼¥ì¥àÀ½Â¤";
+               if (desc) return "1ÂΤΥ´¡¼¥ì¥à¤òÀ½Â¤¤¹¤ë¡£";
 #else
-               if (name) return "Teleport Level";
-               if (desc) return "Teleport to up or down stairs in a moment.";
+               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
-                               if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return NULL;
+                                       msg_print("¥´¡¼¥ì¥à¤òºî¤Ã¤¿¡£");
 #else
-                               if (!get_check("Are you sure? (Teleport Level)")) return NULL;
+                                       msg_print("You make a golem.");
 #endif
-                               teleport_level(0);
+                               }
+                               else
+                               {
+#ifdef JP
+                                       msg_print("¤¦¤Þ¤¯¥´¡¼¥ì¥à¤òºî¤ì¤Ê¤«¤Ã¤¿¡£");
+#else
+                                       msg_print("No Golems arrive.");
+#endif
+                               }
                        }
                }
                break;
 
-       case ARCA_SPEL_TELEPORT_AWAY:
+       case 23:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ý¡¼¥È¡¦¥â¥ó¥¹¥¿¡¼";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¥Ó¡¼¥à¤òÊü¤Ä¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ËâË¡¤Î³»";
+               if (desc) return "°ìÄê»þ´Ö¡¢ËâË¡ËɸæÎϤÈAC¤¬¾å¤¬¤ê¡¢º®Íð¤ÈÌÕÌܤÎÂÑÀ­¡¢È¿¼ÍǽÎÏ¡¢ËãáãÃΤ餺¡¢ÉâÍ·¤òÆÀ¤ë¡£";
 #else
-               if (name) return "Teleport Away";
-               if (desc) return "Teleports all monsters on the line away unless resisted.";
+               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 power = plev;
+                       int base = 20;
 
-                       if (info) return info_power(power);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_beam(GF_AWAY_ALL, dir, power);
+                               set_magicdef(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case ARCA_SPEL_ELEMENTAL_BALL:
+       case 24:
 #ifdef JP
-               if (name) return "¸µÁǤεå";
-               if (desc) return "±ê¡¢ÅÅ·â¡¢Î䵤¡¢»À¤Î¤É¤ì¤«¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "ÁõÈ÷̵Îϲ½";
+               if (desc) return "Éð´ï¡¦Ëɶñ¤Ë¤«¤±¤é¤ì¤¿¤¢¤é¤æ¤ëËâÎϤò´°Á´¤Ë²ò½ü¤¹¤ë¡£";
 #else
-               if (name) return "Elemental Ball";
-               if (desc) return "Fires a ball of some elements.";
+               if (name) return "Remove Enchantment";
+               if (desc) return "Removes all magics completely from any weapon or armor.";
 #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;
+                               if (!mundane_spell(TRUE)) return NULL;
+                       }
+               }
+               break;
 
-                               switch (randint1(4))
+       case 25:
+#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())
                                {
-                                       case 1:  type = GF_FIRE;break;
-                                       case 2:  type = GF_ELEC;break;
-                                       case 3:  type = GF_COLD;break;
-                                       default: type = GF_ACID;break;
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
                                }
-
-                               fire_ball(type, dir, dam, rad);
                        }
                }
                break;
 
-       case ARCA_SPEL_DETECTION:
+       case 26:
 #ifdef JP
-               if (name) return "Á´´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢æ«¡¢Èâ¡¢³¬ÃÊ¡¢ºâÊõ¡¢¤½¤·¤Æ¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£";
+               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.";
+               if (name) return "Knowledge True";
+               if (desc) return "*Identifies* an item.";
 #endif
     
                {
-                       int rad = DETECT_RAD_DEFAULT;
-
-                       if (info) return info_radius(rad);
-
                        if (cast)
                        {
-                               detect_all(rad);
+                               if (!identify_fully(FALSE)) return NULL;
                        }
                }
                break;
 
-       case ARCA_SPEL_WORD_OF_RECALL:
+       case 27:
 #ifdef JP
-               if (name) return "µ¢´Ô¤Î¼öʸ";
-               if (desc) return "ÃϾå¤Ë¤¤¤ë¤È¤­¤Ï¥À¥ó¥¸¥ç¥ó¤ÎºÇ¿¼³¬¤Ø¡¢¥À¥ó¥¸¥ç¥ó¤Ë¤¤¤ë¤È¤­¤ÏÃϾå¤Ø¤È°ÜÆ°¤¹¤ë¡£";
+               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.";
+               if (name) return "Enchant Weapon";
+               if (desc) return "Attempts to increase +to-hit, +to-dam of a weapon.";
 #endif
     
                {
-                       int base = 15;
-                       int sides = 20;
-
-                       if (info) return info_delay(base, sides);
-
                        if (cast)
                        {
-                               if (!word_of_recall()) return NULL;
+                               if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
                        }
                }
                break;
 
-       case ARCA_SPEL_CLAIRVOYANCE:
+       case 28:
 #ifdef JP
-               if (name) return "ÀéΤ´ã";
-               if (desc) return "¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆ⤹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤µ¤é¤Ë¡¢°ìÄê»þ´Ö¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               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.";
+               if (name) return "Enchant Armor";
+               if (desc) return "Attempts to increase +AC of an armor.";
 #endif
     
                {
-                       int base = 25;
-                       int sides = 30;
+                       if (cast)
+                       {
+                               if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
+                       }
+               }
+               break;
 
-                       if (info) return info_duration(base, sides);
+       case 29:
+#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 30:
+#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)
                        {
-                               chg_virtue(V_KNOWLEDGE, 1);
-                               chg_virtue(V_ENLIGHTEN, 1);
+                               int mutation;
 
-                               wiz_lite(FALSE);
+                               if (one_in_(7))
+                                       /* Teleport control */
+                                       mutation = 12;
+                               else
+                                       /* Random teleportation (uncontrolled) */
+                                       mutation = 77;
 
-                               if (!p_ptr->telepathy)
+                               /* Gain the mutation */
+                               if (gain_random_mutation(mutation))
                                {
-                                       set_tim_esp(randint1(sides) + base, FALSE);
+#ifdef JP
+                                       msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£");
+#else
+                                       msg_print("You have turned into a Living Trump.");
+#endif
                                }
                        }
                }
                break;
 
-       case CRAF_SPEL_INFRAVISION:
+       case 31:
 #ifdef JP
-               if (name) return "ÀÖ³°Àþ»ëÎÏ";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÀÖ³°Àþ»ëÎϤ¬Áý¶¯¤µ¤ì¤ë¡£";
+               if (name) return "°À­¤Ø¤ÎÌȱÖ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¡¢»À¤Î¤¤¤º¤ì¤«¤ËÂФ¹¤ëÌȱ֤òÆÀ¤ë¡£";
 #else
-               if (name) return "Infravision";
-               if (desc) return "Gives infravision for a while.";
+               if (name) return "Immunity";
+               if (desc) return "Gives an immunity to fire, cold, electricity or acid for a while.";
 #endif
     
                {
-                       int base = 100;
+                       int base = 13;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_tim_infra(base + randint1(base), FALSE);
+                               if (!choose_ele_immune(base + randint1(base))) return NULL;
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_daemon_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;
 
-       case CRAF_SPEL_REGENERATION:
 #ifdef JP
-               if (name) return "²óÉüÎ϶¯²½";
-               if (desc) return "°ìÄê»þ´Ö¡¢²óÉüÎϤ¬Áý¶¯¤µ¤ì¤ë¡£";
+       static const char s_dam[] = "»½ý:";
 #else
-               if (name) return "Regeneration";
-               if (desc) return "Gives regeneration ability for a while.";
+       static const char s_dam[] = "dam ";
+#endif
+
+       int dir;
+       int plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
+#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 base = 80;
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
-                               set_tim_regen(base + randint1(base), FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CRAF_SPEL_SATISFY_HUNGER:
+       case 1:
 #ifdef JP
-               if (name) return "¶õÊ¢½¼Â­";
-               if (desc) return "ËþÊ¢¤Ë¤Ê¤ë¡£";
+               if (name) return "̵À¸Ì¿´¶ÃÎ";
+               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Satisfy Hunger";
-               if (desc) return "Satisfies hunger.";
+               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)
                        {
-                               set_food(PY_FOOD_MAX - 1);
+                               detect_monsters_nonliving(rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_RESIST_COLD:
+       case 2:
 #ifdef JP
-               if (name) return "ÂÑÎ䵤";
-               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               if (name) return "¼Ù¤Ê¤ë½ËÊ¡";
+               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
 #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.";
+               if (name) return "Evil Bless";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
 #endif
     
                {
-                       int base = 20;
+                       int base = 12;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_oppose_cold(randint1(base) + base, FALSE);
+                               set_blessed(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case CRAF_SPEL_RESIST_FIRE:
+       case 3:
 #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.";
+               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
     
                {
@@ -8162,786 +7468,797 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case CRAF_SPEL_HEROISM:
+       case 4:
 #ifdef JP
-               if (name) return "»Îµ¤¹âÍÈ";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+               if (name) return "¶²¹²";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Heroism";
-               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+               if (name) return "Horrify";
+               if (desc) return "Attempts to scare and stun a monster.";
 #endif
     
                {
-                       int base = 25;
+                       int power = plev;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
                        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 (!get_aim_dir(&dir)) return NULL;
 
-                       if (cast)
-                       {
-                               set_oppose_elec(randint1(base) + base, FALSE);
+                               fear_monster(dir, power);
+                               stun_monster(dir, power);
                        }
                }
                break;
 
-       case CRAF_SPEL_RESIST_ACID:
+       case 5:
 #ifdef JP
-               if (name) return "ÂÑ»À";
-               if (desc) return "°ìÄê»þ´Ö¡¢»À¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Nether Bolt";
+               if (desc) return "Fires a bolt or beam of nether.";
 #endif
     
                {
-                       int base = 20;
+                       int dice = 6 + (plev - 5) / 4;
+                       int sides = 8;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(dice, sides, 0);
 
                        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 (!get_aim_dir(&dir)) return NULL;
 
-                       if (cast)
-                       {
-                               set_tim_invis(randint1(base) + base, FALSE);
+                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CRAF_SPEL_REMOVE_CURSE:
+       case 6:
 #ifdef JP
-               if (name) return "²ò¼ö";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "¸ÅÂå¤Î»àÎ´­";
+               if (desc) return "¸ÅÂå¤Î»àÎî¤ò¾¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Remove Curse";
-               if (desc) return "Removes normal curses from equipped items.";
+               if (name) return "Summon Manes";
+               if (desc) return "Summons a manes.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (remove_curse())
+                               if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                                {
 #ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+                                       msg_print("¸ÅÂå¤Î»àÎî¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
 #else
-                                       msg_print("You feel as if someone is watching over you.");
+                                       msg_print("No Manes arrive.");
 #endif
                                }
                        }
                }
                break;
 
-       case CRAF_SPEL_RESIST_POISON:
+       case 7:
 #ifdef JP
-               if (name) return "ÂÑÆÇ";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÆǤؤÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Hellish Flame";
+               if (desc) return "Fires a ball of evil power. Hurts good monsters greatly.";
 #endif
     
                {
-                       int base = 20;
+                       int dice = 3;
+                       int sides = 6;
+                       int rad = (plev < 30) ? 2 : 3;
+                       int base;
 
-                       if (info) return info_duration(base, 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)
                        {
-                               set_oppose_pois(randint1(base) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_BERSERK:
+       case 8:
 #ifdef JP
-               if (name) return "¶¸Àï»Î²½";
-               if (desc) return "¶¸Àï»Î²½¤·¡¢¶²Éݤò½üµî¤¹¤ë¡£";
+               if (name) return "¥Ç¡¼¥â¥ó»ÙÇÛ";
+               if (desc) return "°­Ëâ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú";
 #else
-               if (name) return "Berserk";
-               if (desc) return "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.";
+               if (name) return "Dominate Demon";
+               if (desc) return "Attempts to charm a demon.";
 #endif
     
                {
-                       int base = 25;
+                       int power = plev;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               set_shero(randint1(base) + base, FALSE);
-                               hp_player(30);
-                               set_afraid(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               control_one_demon(dir, power);
                        }
                }
                break;
 
-       case CRAF_SPEL_SELF_KNOWLEDGE:
+       case 9:
 #ifdef JP
-               if (name) return "¼«¸ÊʬÀÏ";
-               if (desc) return "¸½ºß¤Î¼«Ê¬¤Î¾õÂÖ¤ò´°Á´¤ËÃΤ롣";
+               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.";
+               if (name) return "Vision";
+               if (desc) return "Maps nearby area.";
 #endif
     
                {
+                       int rad = DETECT_RAD_MAP;
+
+                       if (info) return info_radius(rad);
+
                        if (cast)
                        {
-                               self_knowledge();
+                               map_area(rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_PROTECTION_FROM_EVIL:
+       case 10:
 #ifdef JP
-               if (name) return "Âмٰ­·ë³¦";
-               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Î¹¶·â¤òËɤ°¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+               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.";
+               if (name) return "Resist Nether";
+               if (desc) return "Gives resistance to nether for a while.";
 #endif
     
                {
-                       int base = 3 * plev;
-                       int sides = 25;
+                       int base = 20;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_protevil(randint1(sides) + base, FALSE);
+                               set_tim_res_nether(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case CRAF_SPEL_CURE:
+       case 11:
 #ifdef JP
-               if (name) return "Ìþ¤·";
-               if (desc) return "ÆÇ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤òÁ´²÷¤µ¤»¡¢¸¸³Ð¤òľ¤¹¡£";
+               if (name) return "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È";
+               if (desc) return "¥×¥é¥º¥Þ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Cure";
-               if (desc) return "Heals poison, stun, cut and hallucination completely.";
+               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)
                        {
-                               set_poisoned(0);
-                               set_stun(0);
-                               set_cut(0);
-                               set_image(0);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CRAF_SPEL_MANA_BRANDING:
+       case 12:
 #ifdef JP
-               if (name) return "ËâË¡·õ";
-               if (desc) return "°ìÄê»þ´Ö¡¢Éð´ï¤ËÎ䵤¡¢±ê¡¢ÅÅ·â¡¢»À¡¢ÆǤΤ¤¤º¤ì¤«¤Î°À­¤ò¤Ä¤±¤ë¡£Éð´ï¤ò»ý¤¿¤Ê¤¤¤È»È¤¨¤Ê¤¤¡£";
+               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.";
+               if (name) return "Fire Ball";
+               if (desc) return "Fires a ball of fire.";
 #endif
     
                {
-                       int base = plev / 2;
+                       int dam = plev + 55;
+                       int rad = 2;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               if (!choose_ele_attack()) return NULL;
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_FIRE, dir, dam, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_TELEPATHY:
+       case 13:
 #ifdef JP
-               if (name) return "¥Æ¥ì¥Ñ¥·¡¼";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               if (name) return "±ê¤Î¿Ï";
+               if (desc) return "Éð´ï¤Ë±ê¤Î°À­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Telepathy";
-               if (desc) return "Gives telepathy for a while.";
+               if (name) return "Fire Branding";
+               if (desc) return "Makes current weapon fire branded.";
 #endif
     
                {
-                       int base = 25;
-                       int sides = 30;
-
-                       if (info) return info_duration(base, sides);
-
                        if (cast)
                        {
-                               set_tim_esp(randint1(sides) + base, FALSE);
+                               brand_weapon(1);
                        }
                }
                break;
 
-       case CRAF_SPEL_STONE_SKIN:
+       case 14:
 #ifdef JP
-               if (name) return "È©Àв½";
-               if (desc) return "°ìÄê»þ´Ö¡¢AC¤ò¾å¾º¤µ¤»¤ë¡£";
+               if (name) return "ÃϹöµå";
+               if (desc) return "Â礭¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Stone Skin";
-               if (desc) return "Gives bonus to AC for a while.";
+               if (name) return "Nether Ball";
+               if (desc) return "Fires a huge ball of nether.";
 #endif
     
                {
-                       int base = 30;
-                       int sides = 20;
+                       int dam = plev * 3 / 2 + 100;
+                       int rad = plev / 20 + 2;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               set_shield(randint1(sides) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_NETHER, dir, dam, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_RESISTANCE:
+       case 15:
 #ifdef JP
-               if (name) return "Á´ÂÑÀ­";
-               if (desc) return "°ìÄê»þ´Ö¡¢»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               if (name) return "¥Ç¡¼¥â¥ó¾¤´­";
+               if (desc) return "°­Ëâ1ÂΤò¾¤´­¤¹¤ë¡£";
 #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.";
+               if (name) return "Summon Demon";
+               if (desc) return "Summons a demon.";
 #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);
+                               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 CRAF_SPEL_HASTE_SELF:
+       case 16:
 #ifdef JP
-               if (name) return "¥¹¥Ô¡¼¥É";
-               if (desc) return "°ìÄê»þ´Ö¡¢²Ã®¤¹¤ë¡£";
+               if (name) return "°­Ëâ¤ÎÌÜ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
 #else
-               if (name) return "Haste Self";
-               if (desc) return "Hastes you for a while.";
+               if (name) return "Devilish Eye";
+               if (desc) return "Gives telepathy for a while.";
 #endif
     
                {
-                       int base = plev;
-                       int sides = 20 + plev;
+                       int base = 30;
+                       int sides = 25;
 
                        if (info) return info_duration(base, sides);
 
                        if (cast)
                        {
-                               set_fast(randint1(sides) + base, FALSE);
+                               set_tim_esp(randint1(base) + sides, FALSE);
                        }
                }
                break;
 
-       case CRAF_SPEL_WALK_THROUGH_WALL:
+       case 17:
 #ifdef JP
-               if (name) return "ÊÉÈ´¤±";
-               if (desc) return "°ìÄê»þ´Ö¡¢È¾Êª¼Á²½¤·ÊɤòÄ̤êÈ´¤±¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+               if (name) return "°­Ëâ¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "¶²Éݤò¼è¤ê½ü¤­¡¢°ìÄê»þ´Ö¡¢±ê¤ÈÎ䵤¤ÎÂÑÀ­¡¢±ê¤Î¥ª¡¼¥é¤òÆÀ¤ë¡£ÂÑÀ­¤ÏÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
 #else
-               if (name) return "Walk through Wall";
-               if (desc) return "Gives ability to pass walls for a while.";
+               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 = plev / 2;
+                       int base = 20;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_kabenuke(randint1(base) + base, FALSE);
+                               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 CRAF_SPEL_POLISH_SHIELD:
+       case 18:
 #ifdef JP
-               if (name) return "½âË᤭";
-               if (desc) return "½â¤ËÈ¿¼Í¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "ÍÏ´äή";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿±ê¤Îµå¤òºî¤ê½Ð¤·¡¢¾²¤òÍÏ´ä¤ËÊѤ¨¤ë¡£";
 #else
-               if (name) return "Polish Shield";
-               if (desc) return "Makes a shield a shield of reflection.";
+               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)
                        {
-                               pulish_shield();
+                               fire_ball(GF_FIRE, 0, dam, rad);
+                               fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_CREATE_GOLEM:
+       case 19:
 #ifdef JP
-               if (name) return "¥´¡¼¥ì¥àÀ½Â¤";
-               if (desc) return "1ÂΤΥ´¡¼¥ì¥à¤òÀ½Â¤¤¹¤ë¡£";
+               if (name) return "¥×¥é¥º¥Þµå";
+               if (desc) return "¥×¥é¥º¥Þ¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Create Golem";
-               if (desc) return "Creates a golem.";
+               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 (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
-                               }
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_PLASMA, dir, dam, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_MAGICAL_ARMOR:
+       case 20:
 #ifdef JP
-               if (name) return "ËâË¡¤Î³»";
-               if (desc) return "°ìÄê»þ´Ö¡¢ËâË¡ËɸæÎϤÈAC¤¬¾å¤¬¤ê¡¢º®Íð¤ÈÌÕÌܤÎÂÑÀ­¡¢È¿¼ÍǽÎÏ¡¢ËãáãÃΤ餺¡¢ÉâÍ·¤òÆÀ¤ë¡£";
+               if (name) return "°­ËâÊѲ½";
+               if (desc) return "°ìÄê»þ´Ö¡¢°­Ëâ¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤Ë°­Ëâ¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
 #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.";
+               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 = 20;
+                       int base = 10 + plev / 2;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_magicdef(randint1(base) + base, FALSE);
+                               set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
                        }
                }
                break;
 
-       case CRAF_SPEL_REMOVE_ENCHANTMENT:
+       case 21:
 #ifdef JP
-               if (name) return "ÁõÈ÷̵Îϲ½";
-               if (desc) return "Éð´ï¡¦Ëɶñ¤Ë¤«¤±¤é¤ì¤¿¤¢¤é¤æ¤ëËâÎϤò´°Á´¤Ë²ò½ü¤¹¤ë¡£";
+               if (name) return "ÃϹö¤ÎÇÈÆ°";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Remove Enchantment";
-               if (desc) return "Removes all magics completely from any weapon or armor.";
+               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)
                        {
-                               if (!mundane_spell(TRUE)) return NULL;
+                               dispel_monsters(randint1(sides1));
+                               dispel_good(randint1(sides2));
                        }
                }
                break;
 
-       case CRAF_SPEL_REMOVE_ALL_CURSE:
+       case 22:
 #ifdef JP
-               if (name) return "¼ö¤¤Ê´ºÕ";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "¥µ¥­¥å¥Ð¥¹¤ÎÀÜÊ­";
+               if (desc) return "°ø²Ìº®Íð¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Remove All Curse";
-               if (desc) return "Removes normal and heavy curse from equipped items.";
+               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 (remove_all_curse())
-                               {
-#ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
-#else
-                                       msg_print("You feel as if someone is watching over you.");
-#endif
-                               }
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_NEXUS, dir, dam, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_KNOWLEDGE_TRUE:
+       case 23:
 #ifdef JP
-               if (name) return "´°Á´¤Ê¤ëÃμ±";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Î»ý¤ÄǽÎϤò´°Á´¤ËÃΤ롣";
+               if (name) return "ÇËÌǤμê";
+               if (desc) return "ÇËÌǤμê¤òÊü¤Ä¡£¿©¤é¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤Ï¤½¤Î¤È¤­¤ÎHP¤ÎȾʬÁ°¸å¤Î¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¡£";
 #else
-               if (name) return "Knowledge True";
-               if (desc) return "*Identifies* an item.";
+               if (name) return "Doom Hand";
+               if (desc) return "Attempts to make a monster's HP almost half.";
 #endif
     
                {
                        if (cast)
                        {
-                               if (!identify_fully(FALSE)) return NULL;
+                               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 CRAF_SPEL_ENCHANT_WEAPON:
+       case 24:
 #ifdef JP
-               if (name) return "Éð´ï¶¯²½";
-               if (desc) return "Éð´ï¤ÎÌ¿ÃæΨ½¤Àµ¤È¥À¥á¡¼¥¸½¤Àµ¤ò¶¯²½¤¹¤ë¡£";
+               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.";
+               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)
                        {
-                               if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
                        }
                }
                break;
 
-       case CRAF_SPEL_ENCHANT_ARMOR:
+       case 25:
 #ifdef JP
-               if (name) return "Ëɶñ¶¯²½";
-               if (desc) return "³»¤ÎËɸ潤Àµ¤ò¶¯²½¤¹¤ë¡£";
+               if (name) return "ÉÔÌǤÎÆùÂÎ";
+               if (desc) return "°ìÄê»þ´Ö¡¢»þ´ÖµÕž¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£";
 #else
-               if (name) return "Enchant Armor";
-               if (desc) return "Attempts to increase +AC of an armor.";
+               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)
                        {
-                               if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
+                               set_tim_res_time(randint1(base)+base, FALSE);
                        }
                }
                break;
 
-       case CRAF_SPEL_BRAND_WEAPON:
+       case 26:
 #ifdef JP
-               if (name) return "Éð´ï°À­ÉÕÍ¿";
-               if (desc) return "Éð´ï¤Ë¥é¥ó¥À¥à¤Ë°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "¶¸µ¤¤Î±ß´Ä";
+               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¥«¥ª¥¹¤Îµå¡¢º®Íð¤Îµå¤òȯÀ¸¤µ¤»¡¢¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£";
 #else
-               if (name) return "Brand Weapon";
-               if (desc) return "Makes current weapon a random ego weapon.";
+               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)
                        {
-                               brand_weapon(randint0(18));
+                               fire_ball(GF_CHAOS, 0, dam, rad);
+                               fire_ball(GF_CONFUSION, 0, dam, rad);
+                               fire_ball(GF_CHARM, 0, power, rad);
                        }
                }
                break;
 
-       case CRAF_SPEL_LIVING_TRUMP:
+       case 27:
 #ifdef JP
-               if (name) return "¿Í´Ö¥È¥é¥ó¥×";
-               if (desc) return "¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤«¡¢¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤¹¤ëÆÍÁ³ÊÑ°Û¤¬¿È¤Ë¤Ä¤¯¡£";
+               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.";
+               if (name) return "Explode Pets";
+               if (desc) return "Makes all pets explode.";
 #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
-                               }
+                               discharge_minion();
                        }
                }
                break;
 
-       case CRAF_SPEL_IMMUNITY:
+       case 28:
 #ifdef JP
-               if (name) return "°À­¤Ø¤ÎÌȱÖ";
-               if (desc) return "°ìÄê»þ´Ö¡¢Î䵤¡¢±ê¡¢ÅÅ·â¡¢»À¤Î¤¤¤º¤ì¤«¤ËÂФ¹¤ëÌȱ֤òÆÀ¤ë¡£";
+               if (name) return "¥°¥ì¡¼¥¿¡¼¥Ç¡¼¥â¥ó¾¤´­";
+               if (desc) return "¾åµé¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£¾¤´­¤¹¤ë¤Ë¤Ï¿Í´Ö('p','h','t'¤Çɽ¤µ¤ì¤ë¥â¥ó¥¹¥¿¡¼)¤Î»àÂΤòÊû¤²¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£";
 #else
-               if (name) return "Immunity";
-               if (desc) return "Gives an immunity to fire, cold, electricity or acid for a while.";
+               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
     
                {
-                       int base = 13;
-
-                       if (info) return info_duration(base, base);
-
                        if (cast)
                        {
-                               if (!choose_ele_immune(base + randint1(base))) return NULL;
+                               if (!cast_summon_greater_demon()) return NULL;
                        }
                }
                break;
 
-       case DAEM_SPEL_MAGIC_MISSILE:
+       case 29:
 #ifdef JP
-               if (name) return "¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë";
-               if (desc) return "¼å¤¤ËâË¡¤ÎÌð¤òÊü¤Ä¡£";
+               if (name) return "ÃϹöÍò";
+               if (desc) return "ĶµðÂç¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Magic Missile";
-               if (desc) return "Fires a weak bolt of magic.";
+               if (name) return "Nether Storm";
+               if (desc) return "Generate a huge ball of nether.";
 #endif
     
                {
-                       int dice = 3 + (plev - 1) / 5;
-                       int sides = 4;
+                       int dam = plev * 15;
+                       int rad = plev / 5;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
+                               fire_ball(GF_NETHER, dir, dam, rad);
                        }
                }
                break;
 
-       case DAEM_SPEL_DETECT_UNLIFE:
+       case 30:
 #ifdef JP
-               if (name) return "̵À¸Ì¿´¶ÃÎ";
-               if (desc) return "¶á¤¯¤ÎÀ¸Ì¿¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "·ì¤Î¼ö¤¤";
+               if (desc) return "¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¤³¤È¤Ë¤è¤Ã¤ÆÂоݤ˼ö¤¤¤ò¤«¤±¡¢¥À¥á¡¼¥¸¤òÍ¿¤¨ÍÍ¡¹¤Ê¸ú²Ì¤ò°ú¤­µ¯¤³¤¹¡£";
 #else
-               if (name) return "Detect Unlife";
-               if (desc) return "Detects all nonliving monsters in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int dam = 600;
+                       int rad = 0;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               detect_monsters_nonliving(rad);
-                       }
-               }
-               break;
+                               if (!get_aim_dir(&dir)) return NULL;
 
-       case DAEM_SPEL_EVIL_BLESS:
+                               fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
 #ifdef JP
-               if (name) return "¼Ù¤Ê¤ë½ËÊ¡";
-               if (desc) return "°ìÄê»þ´Ö¡¢Ì¿ÃæΨ¤ÈAC¤Ë¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "·ì¤Î¼ö¤¤", -1);
 #else
-               if (name) return "Evil Bless";
-               if (desc) return "Gives bonus to hit and AC for a few turns.";
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "Blood curse", -1);
 #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:
+       case 31:
 #ifdef JP
-               if (name) return "ÂѲбê";
-               if (desc) return "°ìÄê»þ´Ö¡¢±ê¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               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 = 20;
+                       int base = 15;
 
                        if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_oppose_fire(randint1(base) + base, FALSE);
+                               set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
                        }
                }
                break;
+       }
+
+       return "";
+}
+
+
+static cptr do_crusade_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;
+
+       int dir;
+       int plev = p_ptr->lev;
 
-       case DAEM_SPEL_HORRIFY:
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
-               if (name) return "¶²¹²";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¡¢Û¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "Ĩȳ";
+               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
 #else
-               if (name) return "Horrify";
-               if (desc) return "Attempts to scare and stun a monster.";
+               if (name) return "Punishment";
+               if (desc) return "Fires a bolt or beam of lightning.";
 #endif
     
                {
-                       int power = plev;
+                       int dice = 3 + (plev - 1) / 5;
+                       int sides = 4;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fear_monster(dir, power);
-                               stun_monster(dir, power);
+                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case DAEM_SPEL_NETHER_BOLT:
+       case 1:
 #ifdef JP
-               if (name) return "ÃϹö¤ÎÌð";
-               if (desc) return "ÃϹö¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¼Ù°­Â¸ºß´¶ÃÎ";
+               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
 #else
-               if (name) return "Nether Bolt";
-               if (desc) return "Fires a bolt or beam of nether.";
+               if (name) return "Detect Evil";
+               if (desc) return "Detects all evil monsters in your vicinity.";
 #endif
     
                {
-                       int dice = 6 + (plev - 5) / 4;
-                       int sides = 8;
+                       int rad = DETECT_RAD_DEFAULT;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
+                               detect_monsters_evil(rad);
                        }
                }
                break;
 
-       case DAEM_SPEL_SUMMON_MANES:
+       case 2:
 #ifdef JP
-               if (name) return "¸ÅÂå¤Î»àÎ´­";
-               if (desc) return "¸ÅÂå¤Î»àÎî¤ò¾¤´­¤¹¤ë¡£";
+               if (name) return "¶²Éݽüµî";
+               if (desc) return "¶²Éݤò¼è¤ê½ü¤¯¡£";
 #else
-               if (name) return "Summon Manes";
-               if (desc) return "Summons a manes.";
+               if (name) return "Remove Fear";
+               if (desc) return "Removes fear.";
 #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
-                               }
+                               set_afraid(0);
                        }
                }
                break;
 
-       case DAEM_SPEL_HELLISH_FLAME:
+       case 3:
 #ifdef JP
-               if (name) return "ÃϹö¤Î±ë";
-               if (desc) return "¼Ù°­¤ÊÎϤò»ý¤Ä¥Ü¡¼¥ë¤òÊü¤Ä¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤ÏÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "°Ò°µ";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Hellish Flame";
-               if (desc) return "Fires a ball of evil power. Hurts good monsters greatly.";
+               if (name) return "Scare Monster";
+               if (desc) return "Attempts to scare a monster.";
 #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;
-
+                       int power = plev;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
+                               fear_monster(dir, power);
                        }
                }
                break;
 
-       case DAEM_SPEL_DOMINATE_DEMON:
+       case 4:
 #ifdef JP
-               if (name) return "¥Ç¡¼¥â¥ó»ÙÇÛ";
-               if (desc) return "°­Ëâ1ÂΤò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú";
+               if (name) return "À»°è";
+               if (desc) return "ÎÙÀܤ·¤¿Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Dominate Demon";
-               if (desc) return "Attempts to charm a demon.";
+               if (name) return "Sanctuary";
+               if (desc) return "Attempts to sleep monsters in the adjacent squares.";
 #endif
     
                {
@@ -8951,1463 +8268,1558 @@ cptr do_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               control_one_demon(dir, power);
+                               sleep_monsters_touch();
                        }
                }
                break;
 
-       case DAEM_SPEL_VISION:
+       case 5:
 #ifdef JP
-               if (name) return "¥Ó¥¸¥ç¥ó";
-               if (desc) return "¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "Æþ¸ý";
+               if (desc) return "Ãæµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
 #else
-               if (name) return "Vision";
-               if (desc) return "Maps nearby area.";
+               if (name) return "Portal";
+               if (desc) return "Teleport medium distance.";
 #endif
     
                {
-                       int rad = DETECT_RAD_MAP;
+                       int range = 25 + plev / 2;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_range(range);
 
                        if (cast)
                        {
-                               map_area(rad);
+                               teleport_player(range, 0L);
                        }
                }
                break;
 
-       case DAEM_SPEL_RESIST_NETHER:
+       case 6:
 #ifdef JP
-               if (name) return "ÂÑÃϹö";
-               if (desc) return "°ìÄê»þ´Ö¡¢ÃϹö¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£";
+               if (name) return "¥¹¥¿¡¼¥À¥¹¥È";
+               if (desc) return "¥¿¡¼¥²¥Ã¥ÈÉÕ¶á¤ËÁ®¸÷¤Î¥Ü¥ë¥È¤òÏ¢¼Í¤¹¤ë¡£";
 #else
-               if (name) return "Resist Nether";
-               if (desc) return "Gives resistance to nether for a while.";
+               if (name) return "Star Dust";
+               if (desc) return "Fires many bolts of light near the target.";
 #endif
     
                {
-                       int base = 20;
+                       int dice = 3 + (plev - 1) / 9;
+                       int sides = 2;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_multi_damage_dice(dice, sides);
 
                        if (cast)
                        {
-                               set_tim_res_nether(randint1(base) + base, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_blast(GF_LITE, dir, dice, sides, 10, 3);
                        }
                }
                break;
 
-       case DAEM_SPEL_PLASMA_BOLT:
+       case 7:
 #ifdef JP
-               if (name) return "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È";
-               if (desc) return "¥×¥é¥º¥Þ¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¿ÈÂξô²½";
+               if (desc) return "½ý¡¢ÆÇ¡¢Û¯Û°¤«¤éÁ´²÷¤¹¤ë¡£";
 #else
-               if (name) return "Plasma bolt";
-               if (desc) return "Fires a bolt or beam of plasma.";
+               if (name) return "Purify";
+               if (desc) return "Heals all cut, stun and poison status.";
 #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));
+                               set_cut(0);
+                               set_poisoned(0);
+                               set_stun(0);
                        }
                }
                break;
 
-       case DAEM_SPEL_FIRE_BALL:
+       case 8:
 #ifdef JP
-               if (name) return "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";
-               if (desc) return "±ê¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "¼Ù°­Èô¤Ð¤·";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼1ÂΤò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Fire Ball";
-               if (desc) return "Fires a ball of fire.";
+               if (name) return "Scatter Evil";
+               if (desc) return "Attempts to teleport an evil monster away.";
 #endif
     
                {
-                       int dam = plev + 55;
-                       int rad = 2;
+                       int power = MAX_SIGHT * 5;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_FIRE, dir, dam, rad);
+                               fire_ball(GF_AWAY_EVIL, dir, power, 0);
                        }
                }
                break;
 
-       case DAEM_SPEL_FIRE_BRANDING:
+       case 9:
 #ifdef JP
-               if (name) return "±ê¤Î¿Ï";
-               if (desc) return "Éð´ï¤Ë±ê¤Î°À­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "À»¤Ê¤ë¸÷µå";
+               if (desc) return "À»¤Ê¤ëÎϤò¤â¤ÄÊõ¼î¤òÊü¤Ä¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¤¬¡¢Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡£";
 #else
-               if (name) return "Fire Branding";
-               if (desc) return "Makes current weapon fire branded.";
+               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)
                        {
-                               brand_weapon(1);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
                        }
                }
                break;
 
-       case DAEM_SPEL_NETHER_BALL:
+       case 10:
 #ifdef JP
-               if (name) return "ÃϹöµå";
-               if (desc) return "Â礭¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "°­Ëâʧ¤¤";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£";
 #else
-               if (name) return "Nether Ball";
-               if (desc) return "Fires a huge ball of nether.";
+               if (name) return "Exorcism";
+               if (desc) return "Damages all undead and demons in sight, and scares all evil monsters in sight.";
 #endif
     
                {
-                       int dam = plev * 3 / 2 + 100;
-                       int rad = plev / 20 + 2;
+                       int sides = plev;
+                       int power = plev;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_damage(1, sides, 0);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_NETHER, dir, dam, rad);
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
+                               turn_evil(power);
                        }
                }
                break;
 
-       case DAEM_SPEL_SUMMON_DEMON:
+       case 11:
 #ifdef JP
-               if (name) return "¥Ç¡¼¥â¥ó¾¤´­";
-               if (desc) return "°­Ëâ1ÂΤò¾¤´­¤¹¤ë¡£";
+               if (name) return "²ò¼ö";
+               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
 #else
-               if (name) return "Summon Demon";
-               if (desc) return "Summons a demon.";
+               if (name) return "Remove Curse";
+               if (desc) return "Removes normal curses from equipped items.";
 #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
+                               if (remove_curse())
                                {
 #ifdef JP
-                                       msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
 #else
-                                       msg_print("No demons arrive.");
+                                       msg_print("You feel as if someone is watching over you.");
 #endif
                                }
-                               break;
                        }
                }
                break;
 
-       case DAEM_SPEL_DEVILISH_EYE:
+       case 12:
 #ifdef JP
-               if (name) return "°­Ëâ¤ÎÌÜ";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤòÆÀ¤ë¡£";
+               if (name) return "Æ©ÌÀ»ëǧ";
+               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Devilish Eye";
-               if (desc) return "Gives telepathy for a while.";
+               if (name) return "Sense Unseen";
+               if (desc) return "Gives see invisible for a while.";
 #endif
     
                {
-                       int base = 30;
-                       int sides = 25;
+                       int base = 24;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               set_tim_esp(randint1(base) + sides, FALSE);
+                               set_tim_invis(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case DAEM_SPEL_DEVIL_CLOAK:
+       case 13:
 #ifdef JP
-               if (name) return "°­Ëâ¤Î¥¯¥í¡¼¥¯";
-               if (desc) return "¶²Éݤò¼è¤ê½ü¤­¡¢°ìÄê»þ´Ö¡¢±ê¤ÈÎ䵤¤ÎÂÑÀ­¡¢±ê¤Î¥ª¡¼¥é¤òÆÀ¤ë¡£ÂÑÀ­¤ÏÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+               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.";
+               if (name) return "Protection from Evil";
+               if (desc) return "Gives aura which protect you from evil monster's physical attack.";
 #endif
     
                {
-                       int base = 20;
+                       int base = 25;
+                       int sides = 3 * plev;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_duration(base, sides);
 
                        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;
+                               set_protevil(randint1(sides) + sides, FALSE);
                        }
                }
                break;
 
-       case DAEM_SPEL_THE_FLOW_OF_LAVA:
+       case 14:
 #ifdef JP
-               if (name) return "ÍÏ´äή";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿±ê¤Îµå¤òºî¤ê½Ð¤·¡¢¾²¤òÍÏ´ä¤ËÊѤ¨¤ë¡£";
+               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.";
+               if (name) return "Judgment Thunder";
+               if (desc) return "Fires a powerful bolt of lightning.";
 #endif
     
                {
-                       int dam = (55 + plev) * 2;
-                       int rad = 3;
+                       int dam = plev * 5;
 
-                       if (info) return info_damage(0, 0, dam/2);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               fire_ball(GF_FIRE, 0, dam, rad);
-                               fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt(GF_ELEC, dir, dam);
                        }
                }
                break;
 
-       case DAEM_SPEL_PLASMA_BALL:
+       case 15:
 #ifdef JP
-               if (name) return "¥×¥é¥º¥Þµå";
-               if (desc) return "¥×¥é¥º¥Þ¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "À»¤Ê¤ë¸æ¸ÀÍÕ";
+               if (desc) return "»ë³¦Æâ¤Î¼Ù°­¤Ê¸ºß¤ËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÂÎÎϤò²óÉü¤·¡¢ÆÇ¡¢¶²ÉÝ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤«¤éÁ´²÷¤¹¤ë¡£";
 #else
-               if (name) return "Plasma Ball";
-               if (desc) return "Fires a ball of plasma.";
+               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 = plev * 3 / 2 + 80;
-                       int rad = 2 + plev / 40;
+                       int dam_sides = plev * 6;
+                       int heal = 100;
 
-                       if (info) return info_damage(0, 0, dam);
+#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)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_PLASMA, dir, dam, rad);
+                               dispel_evil(randint1(dam_sides));
+                               hp_player(heal);
+                               set_afraid(0);
+                               set_poisoned(0);
+                               set_stun(0);
+                               set_cut(0);
                        }
                }
                break;
 
-       case DAEM_SPEL_POLYMORPH_DEMON:
+       case 16:
 #ifdef JP
-               if (name) return "°­ËâÊѲ½";
-               if (desc) return "°ìÄê»þ´Ö¡¢°­Ëâ¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤Ë°­Ëâ¤È¤·¤Æ¤ÎǽÎϤòÆÀ¤ë¡£";
+               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.";
+               if (name) return "Unbarring Ways";
+               if (desc) return "Fires a beam which destroy traps and doors.";
 #endif
     
                {
-                       int base = 10 + plev / 2;
-
-                       if (info) return info_duration(base, base);
-
                        if (cast)
                        {
-                               set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               destroy_door(dir);
                        }
                }
                break;
 
-       case DAEM_SPEL_NATHER_WAVE:
+       case 17:
 #ifdef JP
-               if (name) return "ÃϹö¤ÎÇÈÆ°";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Á±Îɤʥâ¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "ÉõËâ";
+               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ÎÆ°¤­¤ò»ß¤á¤ë¡£";
 #else
-               if (name) return "Nather Wave";
-               if (desc) return "Damages all monsters in sight. Hurts good monsters greatly.";
+               if (name) return "Arrest";
+               if (desc) return "Attempts to paralyze an evil monster.";
 #endif
     
                {
-                       int sides1 = plev * 2;
-                       int sides2 = plev * 2;
+                       int power = plev * 2;
 
-                       if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               dispel_monsters(randint1(sides1));
-                               dispel_good(randint1(sides2));
+                               if (!get_aim_dir(&dir)) return NULL;
+                               stasis_evil(dir);
                        }
                }
                break;
 
-       case DAEM_SPEL_KISS_OF_SUCCUBUS:
+       case 18:
 #ifdef JP
-               if (name) return "¥µ¥­¥å¥Ð¥¹¤ÎÀÜÊ­";
-               if (desc) return "°ø²Ìº®Íð¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "À»¤Ê¤ë¥ª¡¼¥é";
+               if (desc) return "°ìÄê»þ´Ö¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò½ý¤Ä¤±¤ëÀ»¤Ê¤ë¥ª¡¼¥é¤òÆÀ¤ë¡£";
 #else
-               if (name) return "Kiss of Succubus";
-               if (desc) return "Fires a ball of nexus.";
+               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 dam = 100 + plev * 2;
-                       int rad = 4;
+                       int base = 20;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               fire_ball(GF_NEXUS, dir, dam, rad);
+                               set_tim_sh_holy(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case DAEM_SPEL_DOOM_HAND:
+       case 19:
 #ifdef JP
-               if (name) return "ÇËÌǤμê";
-               if (desc) return "ÇËÌǤμê¤òÊü¤Ä¡£¿©¤é¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤Ï¤½¤Î¤È¤­¤ÎHP¤ÎȾʬÁ°¸å¤Î¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¡£";
+               if (name) return "¥¢¥ó¥Ç¥Ã¥É&°­ËâÂ໶";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Doom Hand";
-               if (desc) return "Attempts to make a monster's HP almost half.";
+               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)
                        {
-                               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);
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
                        }
                }
                break;
 
-       case DAEM_SPEL_RAISE_THE_MORALE:
+       case 20:
 #ifdef JP
-               if (name) return "»Îµ¤¹âÍÈ";
-               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+               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.";
+               if (name) return "Dispel Evil";
+               if (desc) return "Damages all evil monsters in sight.";
 #endif
     
                {
-                       int base = 25;
+                       int sides = plev * 4;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(1, sides, 0);
 
                        if (cast)
                        {
-                               set_hero(randint1(base) + base, FALSE);
-                               hp_player(10);
-                               set_afraid(0);
+                               dispel_evil(randint1(sides));
                        }
                }
                break;
 
-       case DAEM_SPEL_IMMORTAL_BODY:
+       case 21:
 #ifdef JP
-               if (name) return "ÉÔÌǤÎÆùÂÎ";
-               if (desc) return "°ìÄê»þ´Ö¡¢»þ´ÖµÕž¤Ø¤ÎÂÑÀ­¤òÆÀ¤ë¡£";
+               if (name) return "À»¤Ê¤ë¿Ï";
+               if (desc) return "Ä̾ï¤ÎÉð´ï¤ËÌǼ٤ΰÀ­¤ò¤Ä¤±¤ë¡£";
 #else
-               if (name) return "Immortal Body";
-               if (desc) return "Gives resistance to time for a while.";
+               if (name) return "Holy Blade";
+               if (desc) return "Makes current weapon especially deadly against evil monsters.";
 #endif
     
                {
-                       int base = 20;
-
-                       if (info) return info_duration(base, base);
-
                        if (cast)
                        {
-                               set_tim_res_time(randint1(base)+base, FALSE);
+                               brand_weapon(13);
                        }
                }
                break;
 
-       case DAEM_SPEL_INSANITY_CIRCLE:
+       case 22:
 #ifdef JP
-               if (name) return "¶¸µ¤¤Î±ß´Ä";
-               if (desc) return "¼«Ê¬¤òÃæ¿´¤È¤·¤¿¥«¥ª¥¹¤Îµå¡¢º®Íð¤Îµå¤òȯÀ¸¤µ¤»¡¢¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£";
+               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.";
+               if (name) return "Star Burst";
+               if (desc) return "Fires a huge ball of powerful light.";
 #endif
     
                {
-                       int dam = 50 + plev;
-                       int power = 20 + plev;
-                       int rad = 3 + plev / 20;
+                       int dam = 100 + plev * 2;
+                       int rad = 4;
 
-                       if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
+                       if (info) return info_damage(0, 0, dam);
 
                        if (cast)
                        {
-                               fire_ball(GF_CHAOS, 0, dam, rad);
-                               fire_ball(GF_CONFUSION, 0, dam, rad);
-                               fire_ball(GF_CHARM, 0, power, rad);
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_LITE, dir, dam, rad);
                        }
                }
                break;
 
-       case DAEM_SPEL_EXPLODE_PETS:
+       case 23:
 #ifdef JP
-               if (name) return "¥Ú¥Ã¥ÈÇúÇË";
-               if (desc) return "Á´¤Æ¤Î¥Ú¥Ã¥È¤ò¶¯À©Åª¤ËÇúÇˤµ¤»¤ë¡£";
+               if (name) return "Å·»È¾¤´­";
+               if (desc) return "Å·»È¤ò1Âξ¤´­¤¹¤ë¡£";
 #else
-               if (name) return "Explode Pets";
-               if (desc) return "Makes all pets explode.";
+               if (name) return "Summon Angel";
+               if (desc) return "Summons an angel.";
 #endif
     
                {
                        if (cast)
                        {
-                               discharge_minion();
-                       }
-               }
-               break;
+                               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;
 
-       case DAEM_SPEL_SUMMON_GREATER_DEMON:
+                               if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, mode))
+                               {
+                                       if (pet)
+                                       {
 #ifdef JP
-               if (name) return "¥°¥ì¡¼¥¿¡¼¥Ç¡¼¥â¥ó¾¤´­";
-               if (desc) return "¾åµé¥Ç¡¼¥â¥ó¤ò¾¤´­¤¹¤ë¡£¾¤´­¤¹¤ë¤Ë¤Ï¿Í´Ö('p','h','t'¤Çɽ¤µ¤ì¤ë¥â¥ó¥¹¥¿¡¼)¤Î»àÂΤòÊû¤²¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£";
+                                               msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×");
 #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').";
+                                               msg_print("'What is thy bidding... Master?'");
 #endif
-    
-               {
-                       if (cast)
-                       {
-                               if (!cast_summon_greater_demon()) return NULL;
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               msg_print("¡Ö²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª °­¹Ô¼Ô¤è¡¢²ù¤¤²þ¤á¤è¡ª¡×");
+#else
+                                               msg_print("Mortal! Repent of thy impiousness.");
+#endif
+                                       }
+                               }
                        }
                }
                break;
 
-       case DAEM_SPEL_NETHER_STORM:
+       case 24:
 #ifdef JP
-               if (name) return "ÃϹöÍò";
-               if (desc) return "ĶµðÂç¤ÊÃϹö¤Îµå¤òÊü¤Ä¡£";
+               if (name) return "»Îµ¤¹âÍÈ";
+               if (desc) return "°ìÄê»þ´Ö¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Nether Storm";
-               if (desc) return "Generate a huge ball of nether.";
+               if (name) return "Heroism";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
 #endif
     
                {
-                       int dam = plev * 15;
-                       int rad = plev / 5;
+                       int base = 25;
 
-                       if (info) return info_damage(0, 0, dam);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_NETHER, dir, dam, rad);
+                               set_hero(randint1(base) + base, FALSE);
+                               hp_player(10);
+                               set_afraid(0);
                        }
                }
                break;
 
-       case DAEM_SPEL_BLOODY_CURSE:
+       case 25:
 #ifdef JP
-               if (name) return "·ì¤Î¼ö¤¤";
-               if (desc) return "¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤ë¤³¤È¤Ë¤è¤Ã¤ÆÂоݤ˼ö¤¤¤ò¤«¤±¡¢¥À¥á¡¼¥¸¤òÍ¿¤¨ÍÍ¡¹¤Ê¸ú²Ì¤ò°ú¤­µ¯¤³¤¹¡£";
+               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.";
+               if (name) return "Dispel Curse";
+               if (desc) return "Removes normal and heavy curse from equipped items.";
 #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);
+                               if (remove_all_curse())
+                               {
 #ifdef JP
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "·ì¤Î¼ö¤¤", -1);
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
 #else
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), "Blood curse", -1);
+                                       msg_print("You feel as if someone is watching over you.");
 #endif
+                               }
                        }
                }
                break;
 
-       case DAEM_SPEL_POLYMORPH_DEMONLORD:
+       case 26:
 #ifdef JP
-               if (name) return "ËⲦÊѲ½";
-               if (desc) return "°­Ëâ¤Î²¦¤ËÊѲ½¤¹¤ë¡£ÊѲ½¤·¤Æ¤¤¤ë´Ö¤ÏËÜÍè¤Î¼ï²¤ÎǽÎϤò¼º¤¤¡¢Âå¤ï¤ê¤Ë°­Ëâ¤Î²¦¤È¤·¤Æ¤ÎǽÎϤòÆÀ¡¢ÊɤòÇ˲õ¤·¤Ê¤¬¤éÊ⤯¡£";
+               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.";
+               if (name) return "Banish Evil";
+               if (desc) return "Teleports all evil monsters in sight away unless resisted.";
 #endif
     
                {
-                       int base = 15;
+                       int power = 100;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
                        if (cast)
                        {
-                               set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
+                               if (banish_evil(power))
+                               {
+#ifdef JP
+                                       msg_print("¿ÀÀ»¤ÊÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª");
+#else
+                                       msg_print("The holy power banishes evil!");
+#endif
+
+                               }
                        }
                }
                break;
 
-       case CRUS_SPEL_PUNISHMENT:
+       case 27:
 #ifdef JP
-               if (name) return "Ĩȳ";
-               if (desc) return "ÅÅ·â¤Î¥Ü¥ë¥È¤â¤·¤¯¤Ï¥Ó¡¼¥à¤òÊü¤Ä¡£";
+               if (name) return "¥Ï¥ë¥Þ¥²¥É¥ó";
+               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
 #else
-               if (name) return "Punishment";
-               if (desc) return "Fires a bolt or beam of lightning.";
+               if (name) return "Armageddon";
+               if (desc) return "Destroy everything in nearby area.";
 #endif
     
                {
-                       int dice = 3 + (plev - 1) / 5;
+                       int base = 12;
                        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));
+                               destroy_area(py, px, base + randint1(sides), FALSE);
                        }
                }
                break;
 
-       case CRUS_SPEL_DETECT_EVIL:
+       case 28:
 #ifdef JP
-               if (name) return "¼Ù°­Â¸ºß´¶ÃÎ";
-               if (desc) return "¶á¤¯¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+               if (name) return "ÌܤˤÏÌܤò";
+               if (desc) return "°ìÄê»þ´Ö¡¢¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤¿¤È¤­¤Ë¹¶·â¤ò¹Ô¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆƱÅù¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Detect Evil";
-               if (desc) return "Detects all evil monsters in your vicinity.";
+               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 rad = DETECT_RAD_DEFAULT;
+                       int base = 10;
 
-                       if (info) return info_radius(rad);
+                       if (info) return info_duration(base, base);
 
                        if (cast)
                        {
-                               detect_monsters_evil(rad);
+                               set_tim_eyeeye(randint1(base) + base, FALSE);
                        }
                }
                break;
 
-       case CRUS_SPEL_REMOVE_FEAR:
+       case 29:
 #ifdef JP
-               if (name) return "¶²Éݽüµî";
-               if (desc) return "¶²Éݤò¼è¤ê½ü¤¯¡£";
+               if (name) return "¿À¤ÎÅܤê";
+               if (desc) return "¥¿¡¼¥²¥Ã¥È¤Î¼þ°Ï¤Ëʬ²ò¤Îµå¤ò¿¿ôÍî¤È¤¹¡£";
 #else
-               if (name) return "Remove Fear";
-               if (desc) return "Removes fear.";
+               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)
                        {
-                               set_afraid(0);
+                               if (!cast_wrath_of_the_god(dam, rad)) return NULL;
                        }
                }
                break;
 
-       case CRUS_SPEL_SCARE_MONSTER:
+       case 30:
 #ifdef JP
-               if (name) return "°Ò°µ";
-               if (desc) return "¥â¥ó¥¹¥¿¡¼1ÂΤò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¿À°Ò";
+               if (desc) return "ÎÙÀܤ¹¤ë¥â¥ó¥¹¥¿¡¼¤ËÀ»¤Ê¤ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¡¢¸ºÂ®¡¢Û¯Û°¡¢º®Í𡢶²ÉÝ¡¢Ì²¤ê¤òÍ¿¤¨¤ë¡£¤µ¤é¤ËÂÎÎϤò²óÉü¤¹¤ë¡£";
 #else
-               if (name) return "Scare Monster";
-               if (desc) return "Attempts to scare a monster.";
+               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 power = plev;
+                       int b_dam = plev * 11;
+                       int d_dam = plev * 4;
+                       int heal = 100;
+                       int power = plev * 4;
 
-                       if (info) return info_power(power);
+#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)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fear_monster(dir, power);
+                               project(0, 1, py, px, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
+                               dispel_monsters(d_dam);
+                               slow_monsters(plev);
+                               stun_monsters(power);
+                               confuse_monsters(power);
+                               turn_monsters(power);
+                               stasis_monsters(power);
+                               hp_player(heal);
                        }
                }
                break;
 
-       case CRUS_SPEL_SANCTUARY:
+       case 31:
 #ifdef JP
-               if (name) return "À»°è";
-               if (desc) return "ÎÙÀܤ·¤¿Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̲¤é¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "À»Àï";
+               if (desc) return "»ë³¦Æâ¤ÎÁ±Îɤʥâ¥ó¥¹¥¿¡¼¤ò¥Ú¥Ã¥È¤Ë¤·¤è¤¦¤È¤·¡¢¤Ê¤é¤Ê¤«¤Ã¤¿¾ì¹çµÚ¤ÓÁ±ÎɤǤʤ¤¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£¤µ¤é¤Ë¿¿ô¤Î²Ã®¤µ¤ì¤¿µ³»Î¤ò¾¤´­¤·¡¢¥Ò¡¼¥í¡¼¡¢½ËÊ¡¡¢²Ã®¡¢Âмٰ­·ë³¦¤òÆÀ¤ë¡£";
 #else
-               if (name) return "Sanctuary";
-               if (desc) return "Attempts to sleep monsters in the adjacent squares.";
+               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
     
                {
-                       int power = plev;
-
-                       if (info) return info_power(power);
-
                        if (cast)
                        {
-                               sleep_monsters_touch();
+                               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;
+       }
+
+       return "";
+}
+
+
+static cptr do_music_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;
+       bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
+       bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
 
-       case CRUS_SPEL_PORTAL:
 #ifdef JP
-               if (name) return "Æþ¸ý";
-               if (desc) return "Ãæµ÷Î¥¤Î¥Æ¥ì¥Ý¡¼¥È¤ò¤¹¤ë¡£";
+       static const char s_dam[] = "»½ý:";
 #else
-               if (name) return "Portal";
-               if (desc) return "Teleport medium distance.";
+       static const char s_dam[] = "dam ";
 #endif
-    
-               {
-                       int range = 25 + plev / 2;
-
-                       if (info) return info_range(range);
 
-                       if (cast)
-                       {
-                               teleport_player(range, FALSE);
-                       }
-               }
-               break;
+       int dir;
+       int plev = p_ptr->lev;
 
-       case CRUS_SPEL_STAR_DUST:
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
-               if (name) return "¥¹¥¿¡¼¥À¥¹¥È";
-               if (desc) return "¥¿¡¼¥²¥Ã¥ÈÉÕ¶á¤ËÁ®¸÷¤Î¥Ü¥ë¥È¤òÏ¢¼Í¤¹¤ë¡£";
+               if (name) return "ÃÙÆߤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Star Dust";
-               if (desc) return "Fires many bolts of light near the target.";
+               if (name) return "Song of Holding";
+               if (desc) return "Attempts to slow all monsters in sight.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int dice = 3 + (plev - 1) / 9;
-                       int sides = 2;
+#ifdef JP
+                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start humming a slow, steady melody...");
+#endif
+                       start_singing(spell, MUSIC_SLOW);
+               }
 
-                       if (info) return info_multi_damage_dice(dice, sides);
+               {
+                       int power = plev;
 
-                       if (cast)
+                       if (info) return info_power(power);
+
+                       if (cont)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               fire_blast(GF_LITE, dir, dice, sides, 10, 3);
+                               slow_monsters(plev);
                        }
                }
                break;
 
-       case CRUS_SPEL_PURIFY:
+       case 1:
 #ifdef JP
-               if (name) return "¿ÈÂξô²½";
-               if (desc) return "½ý¡¢ÆÇ¡¢Û¯Û°¤«¤éÁ´²÷¤¹¤ë¡£";
+               if (name) return "½ËÊ¡¤Î²Î";
+               if (desc) return "Ì¿ÃæΨ¤ÈAC¤Î¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
 #else
-               if (name) return "Purify";
-               if (desc) return "Heals all cut, stun and poison status.";
+               if (name) return "Song of Blessing";
+               if (desc) return "Gives bonus to hit and AC for a few turns.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       if (cast)
+#ifdef JP
+                       msg_print("¸·¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("The holy power of the Music of the Ainur enters you...");
+#endif
+                       start_singing(spell, MUSIC_BLESS);
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->blessed)
                        {
-                               set_cut(0);
-                               set_poisoned(0);
-                               set_stun(0);
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The prayer has expired.");
+#endif
                        }
                }
+
                break;
 
-       case CRUS_SPEL_SCATTER_EVIL:
+       case 2:
 #ifdef JP
-               if (name) return "¼Ù°­Èô¤Ð¤·";
-               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼1ÂΤò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "Êø²õ¤Î²»¿§";
+               if (desc) return "¹ì²»¤Î¥Ü¥ë¥È¤òÊü¤Ä¡£";
 #else
-               if (name) return "Scatter Evil";
-               if (desc) return "Attempts to teleport an evil monster away.";
+               if (name) return "Wrecking Note";
+               if (desc) return "Fires a bolt of sound.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
                {
-                       int power = MAX_SIGHT * 5;
+                       int dice = 4 + (plev - 1) / 5;
+                       int sides = 4;
 
-                       if (info) return info_power(power);
+                       if (info) return info_damage(dice, sides, 0);
 
                        if (cast)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
-                               fire_ball(GF_AWAY_EVIL, dir, power, 0);
+
+                               fire_bolt(GF_SOUND, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case CRUS_SPEL_HOLY_ORB:
+       case 3:
 #ifdef JP
-               if (name) return "À»¤Ê¤ë¸÷µå";
-               if (desc) return "À»¤Ê¤ëÎϤò¤â¤ÄÊõ¼î¤òÊü¤Ä¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¤¬¡¢Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡£";
+               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.";
+               if (name) return "Stun Pattern";
+               if (desc) return "Attempts to stun all monsters in sight.";
 #endif
     
-               {
-                       int dice = 3;
-                       int sides = 6;
-                       int rad = (plev < 30) ? 2 : 3;
-                       int base;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                       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 (cast)
+               {
+#ifdef JP
+                       msg_print("âÁÏǤµ¤»¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a pattern of sounds to bewilder and daze...");
+#endif
+                       start_singing(spell, MUSIC_STUN);
+               }
 
+               {
+                       int dice = plev / 10;
+                       int sides = 2;
 
-                       if (info) return info_damage(dice, sides, base);
+                       if (info) return info_power_dice(dice, sides);
 
-                       if (cast)
+                       if (cont)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
+                               stun_monsters(damroll(dice, sides));
                        }
                }
+
                break;
 
-       case CRUS_SPEL_EXORCISM:
+       case 4:
 #ifdef JP
-               if (name) return "°­Ëâʧ¤¤";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£";
+               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.";
+               if (name) return "Flow of Life";
+               if (desc) return "Heals HP a little.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int sides = plev;
-                       int power = plev;
+#ifdef JP
+                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Life flows through you as you sing a song of healing...");
+#endif
+                       start_singing(spell, MUSIC_L_LIFE);
+               }
 
-                       if (info) return info_damage(1, sides, 0);
+               {
+                       int dice = 2;
+                       int sides = 6;
 
-                       if (cast)
+                       if (info) return info_heal(dice, sides, 0);
+
+                       if (cont)
                        {
-                               dispel_undead(randint1(sides));
-                               dispel_demons(randint1(sides));
-                               turn_evil(power);
+                               hp_player(damroll(dice, sides));
                        }
                }
+
                break;
 
-       case CRUS_SPEL_REMOVE_CURSE:
+       case 5:
 #ifdef JP
-               if (name) return "²ò¼ö";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¼å¤¤¼ö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "ÂÀÍۤβÎ";
+               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
 #else
-               if (name) return "Remove Curse";
-               if (desc) return "Removes normal curses from equipped items.";
+               if (name) return "Song of the Sun";
+               if (desc) return "Lights up nearby area and the inside of a room permanently.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
                {
+                       int dice = 2;
+                       int sides = plev / 2;
+                       int rad = plev / 10 + 1;
+
+                       if (info) return info_damage(dice, sides, 0);
+
                        if (cast)
                        {
-                               if (remove_curse())
-                               {
 #ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+                               msg_print("¸÷¤êµ±¤¯²Î¤¬ÊÕ¤ê¤ò¾È¤é¤·¤¿¡£");
 #else
-                                       msg_print("You feel as if someone is watching over you.");
+                               msg_print("Your uplifting song brings brightness to dark places...");
 #endif
-                               }
+
+                               lite_area(damroll(dice, sides), rad);
                        }
                }
                break;
 
-       case CRUS_SPEL_SENSE_UNSEEN:
+       case 6:
 #ifdef JP
-               if (name) return "Æ©ÌÀ»ëǧ";
-               if (desc) return "°ìÄê»þ´Ö¡¢Æ©ÌÀ¤Ê¤â¤Î¤¬¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡£";
+               if (name) return "¶²ÉݤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Sense Unseen";
-               if (desc) return "Gives see invisible for a while.";
+               if (name) return "Song of Fear";
+               if (desc) return "Attempts to scare all monsters in sight.";
 #endif
     
-               {
-                       int base = 24;
-
-                       if (info) return info_duration(base, base);
-
-                       if (cast)
-                       {
-                               set_tim_invis(randint1(base) + base, FALSE);
-                       }
-               }
-               break;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case CRUS_SPEL_PROTECTION_FROM_EVIL:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "Âмٰ­·ë³¦";
-               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Î¹¶·â¤òËɤ°¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+                       msg_print("¤ª¤É¤í¤ª¤É¤í¤·¤¤¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
 #else
-               if (name) return "Protection from Evil";
-               if (desc) return "Gives aura which protect you from evil monster's physical attack.";
+                       msg_print("You start weaving a fearful pattern...");
 #endif
-    
+                       start_singing(spell, MUSIC_FEAR);                       
+               }
+
                {
-                       int base = 25;
-                       int sides = 3 * plev;
+                       int power = plev;
 
-                       if (info) return info_duration(base, sides);
+                       if (info) return info_power(power);
 
-                       if (cast)
+                       if (cont)
                        {
-                               set_protevil(randint1(sides) + sides, FALSE);
+                               project_hack(GF_TURN_ALL, power);
                        }
                }
+
                break;
 
-       case CRUS_SPEL_JUDGMENT_THUNDER:
+       case 7:
 #ifdef JP
-               if (name) return "ºÛ¤­¤ÎÍë";
-               if (desc) return "¶¯ÎϤÊÅÅ·â¤Î¥Ü¥ë¥È¤òÊü¤Ä¡£";
+               if (name) return "À襤¤Î²Î";
+               if (desc) return "¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
 #else
-               if (name) return "Judgment Thunder";
-               if (desc) return "Fires a powerful bolt of lightning.";
+               if (name) return "Heroic Ballad";
+               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
 #endif
-    
+
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int dam = plev * 5;
+#ifdef JP
+                       msg_print("·ã¤·¤¤À襤¤Î²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start singing a song of intense fighting...");
+#endif
 
-                       if (info) return info_damage(0, 0, dam);
+                       (void)hp_player(10);
+                       (void)set_afraid(0);
 
-                       if (cast)
+                       /* Recalculate hitpoints */
+                       p_ptr->update |= (PU_HP);
+
+                       start_singing(spell, MUSIC_HERO);
+               }
+
+               if (stop)
+               {
+                       if (!p_ptr->hero)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               fire_bolt(GF_ELEC, dir, dam);
+#ifdef JP
+                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The heroism wears off.");
+#endif
+                               /* Recalculate hitpoints */
+                               p_ptr->update |= (PU_HP);
                        }
                }
+
                break;
 
-       case CRUS_SPEL_HOLY_WORD:
+       case 8:
 #ifdef JP
-               if (name) return "À»¤Ê¤ë¸æ¸ÀÍÕ";
-               if (desc) return "»ë³¦Æâ¤Î¼Ù°­¤Ê¸ºß¤ËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢ÂÎÎϤò²óÉü¤·¡¢ÆÇ¡¢¶²ÉÝ¡¢Û¯Û°¾õÂÖ¡¢Éé½ý¤«¤éÁ´²÷¤¹¤ë¡£";
+               if (name) return "ÎîŪÃγÐ";
+               if (desc) return "¶á¤¯¤Îæ«/Èâ/³¬Ãʤò´¶ÃΤ¹¤ë¡£¥ì¥Ù¥ë15¤ÇÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢20¤ÇºâÊõ¤È¥¢¥¤¥Æ¥à¤ò´¶ÃΤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¡£¥ì¥Ù¥ë25¤Ç¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ·¡¢40¤Ç¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆâ¤Î¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤³¤Î¸ú²Ì¤Ï²Î¤¤Â³¤±¤ë¤³¤È¤Ç½ç¤Ëµ¯¤³¤ë¡£";
 #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.";
+               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 dam_sides = plev * 6;
-                       int heal = 100;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
+               if (cast)
+               {
 #ifdef JP
-                       if (info) return format("»:1d%d/²ó%d", dam_sides, heal);
+                       msg_print("ÀŤ«¤Ê²»³Ú¤¬´¶³Ð¤ò¸¦¤®À¡¤Þ¤µ¤»¤¿¡¥¡¥¡¥");
 #else
-                       if (info) return format("dam:d%d/h%d", dam_sides, heal);
+                       msg_print("Your quiet music sharpens your sense of hearing...");
 #endif
 
-                       if (cast)
-                       {
-                               dispel_evil(randint1(dam_sides));
-                               hp_player(heal);
-                               set_afraid(0);
-                               set_poisoned(0);
-                               set_stun(0);
-                               set_cut(0);
-                       }
+                       /* Hack -- Initialize the turn count */
+                       p_ptr->magic_num1[2] = 0;
+
+                       start_singing(spell, MUSIC_DETECT);
                }
-               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)
+                       int rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cont)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+                               int count = p_ptr->magic_num1[2];
 
-                               destroy_door(dir);
+                               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 CRUS_SPEL_ARREST:
+       case 9:
 #ifdef JP
-               if (name) return "ÉõËâ";
-               if (desc) return "¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ÎÆ°¤­¤ò»ß¤á¤ë¡£";
+               if (name) return "º²¤Î²Î";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÀº¿À¹¶·â¤ò¹Ô¤¦¡£";
 #else
-               if (name) return "Arrest";
-               if (desc) return "Attempts to paralyze an evil monster.";
+               if (name) return "Soul Shriek";
+               if (desc) return "Damages all monsters in sight with PSI damages.";
 #endif
-    
-               {
-                       int power = plev * 2;
 
-                       if (info) return info_power(power);
-
-                       if (cast)
-                       {
-                               if (!get_aim_dir(&dir)) return NULL;
-                               stasis_evil(dir);
-                       }
-               }
-               break;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case CRUS_SPEL_HOLY_AURA:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "À»¤Ê¤ë¥ª¡¼¥é";
-               if (desc) return "°ìÄê»þ´Ö¡¢¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò½ý¤Ä¤±¤ëÀ»¤Ê¤ë¥ª¡¼¥é¤òÆÀ¤ë¡£";
+                       msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ë²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Holy Aura";
-               if (desc) return "Gives aura of holy power which injures evil monsters which attacked you for a while.";
+                       msg_print("You start singing a song of soul in pain...");
 #endif
-    
+                       start_singing(spell, MUSIC_PSI);
+               }
+
                {
-                       int base = 20;
+                       int dice = 1;
+                       int sides = plev * 3 / 2;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_damage(dice, sides, 0);
 
-                       if (cast)
+                       if (cont)
                        {
-                               set_tim_sh_holy(randint1(base) + base, FALSE);
+                               project_hack(GF_PSI, damroll(dice, sides));
                        }
                }
+
                break;
 
-       case CRUS_SPEL_DISPEL_UNDEAD_AND_DEMONS:
+       case 10:
 #ifdef JP
-               if (name) return "¥¢¥ó¥Ç¥Ã¥É&°­ËâÂ໶";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥¢¥ó¥Ç¥Ã¥ÉµÚ¤Ó°­Ëâ¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "Ãμ±¤Î²Î";
+               if (desc) return "¼«Ê¬¤Î¤¤¤ë¥Þ¥¹¤ÈÎÙ¤ê¤Î¥Þ¥¹¤ËÍî¤Á¤Æ¤¤¤ë¥¢¥¤¥Æ¥à¤ò´ÕÄꤹ¤ë¡£";
 #else
-               if (name) return "Dispel Undead & Demons";
-               if (desc) return "Damages all undead and demons in sight.";
+               if (name) return "Song of Lore";
+               if (desc) return "Identifies all items which are in the adjacent squares.";
 #endif
     
-               {
-                       int sides = plev * 4;
-
-                       if (info) return info_damage(1, sides, 0);
-
-                       if (cast)
-                       {
-                               dispel_undead(randint1(sides));
-                               dispel_demons(randint1(sides));
-                       }
-               }
-               break;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case CRUS_SPEL_DISPEL_EVIL:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "¼Ù°­Â໶";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+                       msg_print("¤³¤ÎÀ¤³¦¤ÎÃ챤¬Î®¤ì¹þ¤ó¤Ç¤­¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Dispel Evil";
-               if (desc) return "Damages all evil monsters in sight.";
+                       msg_print("You recall the rich lore of the world...");
 #endif
-    
+                       start_singing(spell, MUSIC_ID);
+               }
+
                {
-                       int sides = plev * 4;
+                       int rad = 1;
 
-                       if (info) return info_damage(1, sides, 0);
+                       if (info) return info_radius(rad);
 
-                       if (cast)
+                       /*
+                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
+                        * MPÉÔ­¤Ç´ÕÄ꤬ȯư¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
+                        */
+                       if (cont || cast)
                        {
-                               dispel_evil(randint1(sides));
+                               project(0, rad, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
                        }
                }
+
                break;
 
-       case CRUS_SPEL_HOLY_BLADE:
+       case 11:
 #ifdef JP
-               if (name) return "À»¤Ê¤ë¿Ï";
-               if (desc) return "Ä̾ï¤ÎÉð´ï¤ËÌǼ٤ΰÀ­¤ò¤Ä¤±¤ë¡£";
+               if (name) return "±£ÆۤβÎ";
+               if (desc) return "±£Ì©¹ÔưǽÎϤò¾å¾º¤µ¤»¤ë¡£";
 #else
-               if (name) return "Holy Blade";
-               if (desc) return "Makes current weapon especially deadly against evil monsters.";
+               if (name) return "Hiding Tune";
+               if (desc) return "Gives improved stealth.";
 #endif
-    
-               {
-                       if (cast)
-                       {
-                               brand_weapon(13);
-                       }
-               }
-               break;
 
-       case CRUS_SPEL_STAR_BURST:
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "¥¹¥¿¡¼¥Ð¡¼¥¹¥È";
-               if (desc) return "µðÂç¤ÊÁ®¸÷¤Îµå¤òÊü¤Ä¡£";
+                       msg_print("¤¢¤Ê¤¿¤Î»Ñ¤¬·Ê¿§¤Ë¤È¤±¤³¤ó¤Ç¤¤¤Ã¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Star Burst";
-               if (desc) return "Fires a huge ball of powerful light.";
+                       msg_print("Your song carries you beyond the sight of mortal eyes...");
 #endif
-    
-               {
-                       int dam = 100 + plev * 2;
-                       int rad = 4;
-
-                       if (info) return info_damage(0, 0, dam);
+                       start_singing(spell, MUSIC_STEALTH);
+               }
 
-                       if (cast)
+               if (stop)
+               {
+                       if (!p_ptr->tim_stealth)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
-
-                               fire_ball(GF_LITE, dir, dam, rad);
+#ifdef JP
+                               msg_print("»Ñ¤¬¤Ï¤Ã¤­¤ê¤È¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£");
+#else
+                               msg_print("You are no longer hided.");
+#endif
                        }
                }
+
                break;
 
-       case CRUS_SPEL_SUMMON_ANGEL:
+       case 12:
 #ifdef JP
-               if (name) return "Å·»È¾¤´­";
-               if (desc) return "Å·»È¤ò1Âξ¤´­¤¹¤ë¡£";
+               if (name) return "¸¸±Æ¤ÎÀûΧ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Summon Angel";
-               if (desc) return "Summons an angel.";
+               if (name) return "Illusion Pattern";
+               if (desc) return "Attempts to confuse all monsters in sight.";
 #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;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                               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
-                                       {
+               if (cast)
+               {
 #ifdef JP
-                                               msg_print("¡Ö²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª °­¹Ô¼Ô¤è¡¢²ù¤¤²þ¤á¤è¡ª¡×");
+                       msg_print("ÊÕ¤ê°ìÌ̤˸¸±Æ¤¬¸½¤ì¤¿¡¥¡¥¡¥");
 #else
-                                               msg_print("Mortal! Repent of thy impiousness.");
+                       msg_print("You weave a pattern of sounds to beguile and confuse...");
 #endif
-                                       }
-                               }
-                       }
+                       start_singing(spell, MUSIC_CONF);
                }
-               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;
+                       int power = plev * 2;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power(power);
 
-                       if (cast)
+                       if (cont)
                        {
-                               set_hero(randint1(base) + base, FALSE);
-                               hp_player(10);
-                               set_afraid(0);
+                               confuse_monsters(power);
                        }
                }
+
                break;
 
-       case CRUS_SPEL_DISPEL_CURSE:
+       case 13:
 #ifdef JP
-               if (name) return "¼ö¤¤Â໶";
-               if (desc) return "¥¢¥¤¥Æ¥à¤Ë¤«¤«¤Ã¤¿¶¯ÎϤʼö¤¤¤ò²ò½ü¤¹¤ë¡£";
+               if (name) return "ÇËÌǤ櫤Ó";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤Æ¹ì²»¹¶·â¤ò¹Ô¤¦¡£";
 #else
-               if (name) return "Dispel Curse";
-               if (desc) return "Removes normal and heavy curse from equipped items.";
+               if (name) return "Doomcall";
+               if (desc) return "Damages all monsters in sight with booming sound.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       if (cast)
-                       {
-                               if (remove_all_curse())
-                               {
 #ifdef JP
-                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+                       msg_print("¹ì²»¤¬¶Á¤¤¤¿¡¥¡¥¡¥");
 #else
-                                       msg_print("You feel as if someone is watching over you.");
+                       msg_print("The fury of the Downfall of Numenor lashes out...");
 #endif
-                               }
+                       start_singing(spell, MUSIC_SOUND);
+               }
+
+               {
+                       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 CRUS_SPEL_BANISH_EVIL:
+       case 14:
 #ifdef JP
-               if (name) return "¼Ù°­ÄÉÊü";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥Õ¥£¥ê¥¨¥ë¤Î²Î";
+               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
 #else
-               if (name) return "Banish Evil";
-               if (desc) return "Teleports all evil monsters in sight away unless resisted.";
+               if (name) return "Firiel's Song";
+               if (desc) return "Resurrects nearby corpse and skeletons. And makes these your pets.";
 #endif
     
                {
-                       int power = 100;
-
-                       if (info) return info_power(power);
+                       /* Stop singing before start another */
+                       if (cast || fail) stop_singing();
 
                        if (cast)
                        {
-                               if (banish_evil(power))
-                               {
 #ifdef JP
-                                       msg_print("¿ÀÀ»¤ÊÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª");
+                               msg_print("À¸Ì¿¤ÈÉü³è¤Î¥Æ¡¼¥Þ¤òÁդǻϤ᤿¡¥¡¥¡¥");
 #else
-                                       msg_print("The holy power banishes evil!");
+                               msg_print("The themes of life and revival are woven into your song...");
 #endif
 
-                               }
+                               animate_dead(0, py, px);
                        }
                }
                break;
 
-       case CRUS_SPEL_ARMAGEDDON:
+       case 15:
 #ifdef JP
-               if (name) return "¥Ï¥ë¥Þ¥²¥É¥ó";
-               if (desc) return "¼þÊդΥ¢¥¤¥Æ¥à¡¢¥â¥ó¥¹¥¿¡¼¡¢ÃÏ·Á¤òÇ˲õ¤¹¤ë¡£";
+               if (name) return "ι¤ÎÃç´Ö";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Armageddon";
-               if (desc) return "Destroy everything in nearby area.";
+               if (name) return "Fellowship Chant";
+               if (desc) return "Attempts to charm all monsters in sight.";
 #endif
-    
-               {
-                       int base = 12;
-                       int sides = 4;
 
-                       if (cast)
-                       {
-                               destroy_area(py, px, base + randint1(sides), FALSE);
-                       }
-               }
-               break;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case CRUS_SPEL_AN_EYE_FOR_AN_EYE:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "ÌܤˤÏÌܤò";
-               if (desc) return "°ìÄê»þ´Ö¡¢¼«Ê¬¤¬¥À¥á¡¼¥¸¤ò¼õ¤±¤¿¤È¤­¤Ë¹¶·â¤ò¹Ô¤Ã¤¿¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆƱÅù¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+                       msg_print("°Â¤é¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
 #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.";
+                       msg_print("You weave a slow, soothing melody of imploration...");
 #endif
-    
+                       start_singing(spell, MUSIC_CHARM);
+               }
+
                {
-                       int base = 10;
+                       int dice = 10 + plev / 15;
+                       int sides = 6;
 
-                       if (info) return info_duration(base, base);
+                       if (info) return info_power_dice(dice, sides);
 
-                       if (cast)
+                       if (cont)
                        {
-                               set_tim_eyeeye(randint1(base) + base, FALSE);
+                               charm_monsters(damroll(dice, sides));
                        }
                }
+
                break;
 
-       case CRUS_SPEL_WRATH_OF_THE_GOD:
+       case 16:
 #ifdef JP
-               if (name) return "¿À¤ÎÅܤê";
-               if (desc) return "¥¿¡¼¥²¥Ã¥È¤Î¼þ°Ï¤Ëʬ²ò¤Îµå¤ò¿¿ôÍî¤È¤¹¡£";
+               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.";
+               if (name) return "Sound of disintegration";
+               if (desc) return "Makes you be able to burrow into walls. Objects under your feet evaporate.";
 #endif
-    
-               {
-                       int dam = plev * 3 + 25;
-                       int rad = 2;
 
-                       if (info) return info_multi_damage(dam);
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                       if (cast)
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Ê´ºÕ¤¹¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
+#else
+                       msg_print("You weave a violent pattern of sounds to break wall.");
+#endif
+                       start_singing(spell, MUSIC_WALL);
+               }
+
+               {
+                       /*
+                        * ²Î¤Î³«»Ï»þ¤Ë¤â¸ú²Ìȯư¡§
+                        * MPÉÔ­¤Ç¸ú²Ì¤¬È¯Æ°¤µ¤ì¤ëÁ°¤Ë²Î¤¬ÃæÃǤ·¤Æ¤·¤Þ¤¦¤Î¤òËɻߡ£
+                        */
+                       if (cont || cast)
                        {
-                               if (!cast_wrath_of_the_god(dam, rad)) return NULL;
+                               project(0, 0, py, px,
+                                       0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
                        }
                }
                break;
 
-       case CRUS_SPEL_DIVINE_INTERVENTION:
+       case 17:
 #ifdef JP
-               if (name) return "¿À°Ò";
-               if (desc) return "ÎÙÀܤ¹¤ë¥â¥ó¥¹¥¿¡¼¤ËÀ»¤Ê¤ë¥À¥á¡¼¥¸¤òÍ¿¤¨¡¢»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¡¢¸ºÂ®¡¢Û¯Û°¡¢º®Í𡢶²ÉÝ¡¢Ì²¤ê¤òÍ¿¤¨¤ë¡£¤µ¤é¤ËÂÎÎϤò²óÉü¤¹¤ë¡£";
+               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.";
+               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 b_dam = plev * 11;
-                       int d_dam = plev * 4;
-                       int heal = 100;
-                       int power = plev * 4;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
+               if (cast)
+               {
 #ifdef JP
-                       if (info) return format("²ó%d/»%d+%d", heal, d_dam, b_dam/2);
+                       msg_print("¸µÁǤÎÎϤËÂФ¹¤ëǦÂѤβΤò²Î¤Ã¤¿¡£");
 #else
-                       if (info) return format("h%d/dm%d+%d", heal, d_dam, b_dam/2);
+                       msg_print("You sing a song of perseverance against powers...");
 #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);
-                       }
+                       start_singing(spell, MUSIC_RESIST);
                }
-               break;
 
-       case CRUS_SPEL_CRUSADE:
+               if (stop)
+               {
+                       if (!p_ptr->oppose_acid)
+                       {
 #ifdef JP
-               if (name) return "À»Àï";
-               if (desc) return "»ë³¦Æâ¤ÎÁ±Îɤʥâ¥ó¥¹¥¿¡¼¤ò¥Ú¥Ã¥È¤Ë¤·¤è¤¦¤È¤·¡¢¤Ê¤é¤Ê¤«¤Ã¤¿¾ì¹çµÚ¤ÓÁ±ÎɤǤʤ¤¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£¤µ¤é¤Ë¿¿ô¤Î²Ã®¤µ¤ì¤¿µ³»Î¤ò¾¤´­¤·¡¢¥Ò¡¼¥í¡¼¡¢½ËÊ¡¡¢²Ã®¡¢Âмٰ­·ë³¦¤òÆÀ¤ë¡£";
+                               msg_print("»À¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
 #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.";
+                               msg_print("You feel less resistant to acid.");
 #endif
-    
-               {
-                       if (cast)
+                       }
+
+                       if (!p_ptr->oppose_elec)
                        {
-                               int base = 25;
-                               int sp_sides = 20 + plev;
-                               int sp_base = plev;
+#ifdef JP
+                               msg_print("ÅÅ·â¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to elec.");
+#endif
+                       }
 
-                               int i;
-                               crusade();
-                               for (i = 0; i < 12; i++)
-                               {
-                                       int attempt = 10;
-                                       int my, mx;
+                       if (!p_ptr->oppose_fire)
+                       {
+#ifdef JP
+                               msg_print("²Ð¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to fire.");
+#endif
+                       }
 
-                                       while (attempt--)
-                                       {
-                                               scatter(&my, &mx, py, px, 4, 0);
+                       if (!p_ptr->oppose_cold)
+                       {
+#ifdef JP
+                               msg_print("Î䵤¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to cold.");
+#endif
+                       }
 
-                                               /* 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);
+                       if (!p_ptr->oppose_pois)
+                       {
+#ifdef JP
+                               msg_print("ÆǤؤÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£");
+#else
+                               msg_print("You feel less resistant to pois.");
+#endif
                        }
                }
+
                break;
 
-       case MUSI_SPEL_SONG_OF_HOLDING:
+       case 18:
 #ifdef JP
-               if (name) return "ÃÙÆߤβÎ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¥Û¥Ó¥Ã¥È¤Î¥á¥í¥Ç¥£";
+               if (desc) return "²Ã®¤¹¤ë¡£";
 #else
-               if (name) return "Song of Holding";
-               if (desc) return "Attempts to slow all monsters in sight.";
+               if (name) return "Hobbit Melodies";
+               if (desc) return "Hastes you.";
 #endif
-    
-               {
-                       int song = MUSIC_SLOW;
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
-
-                       if (cast) start_singing(spell, song);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("·Ú²÷¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start singing joyful pop song...");
+#endif
+                       start_singing(spell, MUSIC_SPEED);
                }
-               break;
 
-       case MUSI_SPEL_SONG_OF_BLESSING:
+               if (stop)
+               {
+                       if (!p_ptr->fast)
+                       {
 #ifdef JP
-               if (name) return "½ËÊ¡¤Î²Î";
-               if (desc) return "Ì¿ÃæΨ¤ÈAC¤Î¥Ü¡¼¥Ê¥¹¤òÆÀ¤ë¡£";
+                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
 #else
-               if (name) return "Song of Blessing";
-               if (desc) return "Gives bonus to hit and AC for a few turns.";
+                               msg_print("You feel yourself slow down.");
 #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:
+       case 19:
 #ifdef JP
-               if (name) return "Êø²õ¤Î²»¿§";
-               if (desc) return "¹ì²»¤Î¥Ü¥ë¥È¤òÊü¤Ä¡£";
+               if (name) return "ÏĤó¤ÀÀ¤³¦";
+               if (desc) return "¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Wrecking Note";
-               if (desc) return "Fires a bolt of sound.";
+               if (name) return "World Contortion";
+               if (desc) return "Teleports all nearby monsters away unless resisted.";
 #endif
     
                {
-                       int dice = 4 + (plev - 1) / 5;
-                       int sides = 4;
+                       int rad = plev / 15 + 1;
+                       int power = plev * 3 + 1;
 
-                       if (info) return info_damage(dice, sides, 0);
+                       if (info) return info_radius(rad);
 
                        /* Stop singing before start another */
                        if (cast || fail) stop_singing();
 
                        if (cast)
                        {
-                               if (!get_aim_dir(&dir)) return NULL;
+#ifdef JP
+                               msg_print("²Î¤¬¶õ´Ö¤òÏĤ᤿¡¥¡¥¡¥");
+#else
+                               msg_print("Reality whirls wildly as you sing a dizzying melody...");
+#endif
 
-                               fire_bolt(GF_SOUND, dir, damroll(dice, sides));
+                               project(0, rad, py, px, power, GF_AWAY_ALL, PROJECT_KILL, -1);
                        }
                }
                break;
 
-       case MUSI_SPEL_STUN_PATTERN:
+       case 20:
 #ifdef JP
-               if (name) return "Û¯Û°¤ÎÀûΧ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òÛ¯Û°¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "Â໶¤Î²Î";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Stun Pattern";
-               if (desc) return "Attempts to stun all monsters in sight.";
+               if (name) return "Dispelling chant";
+               if (desc) return "Damages all monsters in sight. Hurts evil monsters greatly.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int song = MUSIC_STUN;
+#ifdef JP
+                       msg_print("ÂѤ¨¤é¤ì¤Ê¤¤ÉÔ¶¨Ï²»¤¬Å¨¤òÀÕ¤áΩ¤Æ¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You cry out in an ear-wracking voice...");
+#endif
+                       start_singing(spell, MUSIC_DISPEL);
+               }
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               {
+                       int m_sides = plev * 3;
+                       int e_sides = plev * 3;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               dispel_monsters(randint1(m_sides));
+                               dispel_evil(randint1(e_sides));
+                       }
                }
                break;
 
-       case MUSI_SPEL_FLOW_OF_LIFE:
+       case 21:
 #ifdef JP
-               if (name) return "À¸Ì¿¤Îή¤ì";
-               if (desc) return "ÂÎÎϤò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+               if (name) return "¥µ¥ë¥Þ¥ó¤Î´Å¸À";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¡¢Ì²¤é¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Flow of Life";
-               if (desc) return "Heals HP a little.";
+               if (name) return "The Voice of Saruman";
+               if (desc) return "Attempts to slow and sleep all monsters in sight.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int song = MUSIC_L_LIFE;
+#ifdef JP
+                       msg_print("Í¥¤·¤¯¡¢Ì¥ÎÏŪ¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("You start humming a gentle and attractive song...");
+#endif
+                       start_singing(spell, MUSIC_SARUMAN);
+               }
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               {
+                       int power = plev;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return info_power(power);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               slow_monsters(plev);
+                               sleep_monsters(plev);
+                       }
                }
+
                break;
 
-       case MUSI_SPEL_SONG_OF_THE_SUN:
+       case 22:
 #ifdef JP
-               if (name) return "ÂÀÍۤβÎ";
-               if (desc) return "¸÷¸»¤¬¾È¤é¤·¤Æ¤¤¤ëÈϰϤ«Éô²°Á´ÂΤò±Êµ×¤ËÌÀ¤ë¤¯¤¹¤ë¡£";
+               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.";
+               if (name) return "Song of the Tempest";
+               if (desc) return "Fires a beam of sound.";
 #endif
     
                {
-                       int dice = 2;
-                       int sides = plev / 2;
-                       int rad = plev / 10 + 1;
+                       int dice = 15 + (plev - 1) / 2;
+                       int sides = 10;
 
                        if (info) return info_damage(dice, sides, 0);
 
@@ -10416,192 +9828,122 @@ cptr do_spell(int spell, int mode)
 
                        if (cast)
                        {
-#ifdef JP
-                               msg_print("¸÷¤êµ±¤¯²Î¤¬ÊÕ¤ê¤ò¾È¤é¤·¤¿¡£");
-#else
-                               msg_print("Your uplifting song brings brightness to dark places...");
-#endif
+                               if (!get_aim_dir(&dir)) return NULL;
 
-                               lite_area(damroll(dice, sides), rad);
+                               fire_beam(GF_SOUND, dir, damroll(dice, sides));
                        }
                }
                break;
 
-       case MUSI_SPEL_SONG_OF_FEAR:
+       case 23:
 #ifdef JP
-               if (name) return "¶²ÉݤβÎ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¶²Éݤµ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "¤â¤¦°ì¤Ä¤ÎÀ¤³¦";
+               if (desc) return "¸½ºß¤Î³¬¤òºÆ¹½À®¤¹¤ë¡£";
 #else
-               if (name) return "Song of Fear";
-               if (desc) return "Attempts to scare all monsters in sight.";
+               if (name) return "Ambarkanta";
+               if (desc) return "Recreates current dungeon level.";
 #endif
     
                {
-                       int song = MUSIC_FEAR;
+                       int base = 15;
+                       int sides = 20;
 
-                       if (info) return do_singing(song, SPELL_INFO);
+                       if (info) return info_delay(base, sides);
 
                        /* Stop singing before start another */
                        if (cast || fail) stop_singing();
 
-                       if (cast) start_singing(spell, song);
-               }
-               break;
-
-       case MUSI_SPEL_HEROIC_BALLAD:
+                       if (cast)
+                       {
 #ifdef JP
-               if (name) return "À襤¤Î²Î";
-               if (desc) return "¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ë¡£";
+                               msg_print("¼þ°Ï¤¬ÊѲ½¤·»Ï¤á¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Heroic Ballad";
-               if (desc) return "Removes fear, and gives bonus to hit and 10 more HP for a while.";
+                               msg_print("You sing of the primeval shaping of Middle-earth...");
 #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);
+                               alter_reality();
+                       }
                }
                break;
 
-       case MUSI_SPEL_CLAIRAUDIENCE:
+       case 24:
 #ifdef JP
-               if (name) return "ÎîŪÃγÐ";
-               if (desc) return "¶á¤¯¤Îæ«/Èâ/³¬Ãʤò´¶ÃΤ¹¤ë¡£¥ì¥Ù¥ë15¤ÇÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¡¢20¤ÇºâÊõ¤È¥¢¥¤¥Æ¥à¤ò´¶ÃΤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¡£¥ì¥Ù¥ë25¤Ç¼þÊÕ¤ÎÃÏ·Á¤ò´¶ÃΤ·¡¢40¤Ç¤½¤Î³¬Á´ÂΤò±Êµ×¤Ë¾È¤é¤·¡¢¥À¥ó¥¸¥ç¥óÆâ¤Î¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò´¶ÃΤ¹¤ë¡£¤³¤Î¸ú²Ì¤Ï²Î¤¤Â³¤±¤ë¤³¤È¤Ç½ç¤Ëµ¯¤³¤ë¡£";
+               if (name) return "Ç˲õ¤ÎÀûΧ";
+               if (desc) return "¼þ°Ï¤Î¥À¥ó¥¸¥ç¥ó¤òÍɤ餷¡¢ÊɤȾ²¤ò¥é¥ó¥À¥à¤ËÆþ¤ìÊѤ¨¤ë¡£";
 #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.";
+               if (name) return "Wrecking Pattern";
+               if (desc) return "Shakes dungeon structure, and results in random swapping of floors and walls.";
 #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;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case MUSI_SPEL_SOUL_SHRIEK:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "º²¤Î²Î";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤ÆÀº¿À¹¶·â¤ò¹Ô¤¦¡£";
+                       msg_print("Ç˲õŪ¤Ê²Î¤¬¶Á¤­¤ï¤¿¤Ã¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Soul Shriek";
-               if (desc) return "Damages all monsters in sight with PSI damages.";
+                       msg_print("You weave a pattern of sounds to contort and shatter...");
 #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);
+                       start_singing(spell, MUSIC_QUAKE);
                }
-               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);
+                       int rad = 10;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return info_radius(rad);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               earthquake(py, px, 10);
+                       }
                }
+
                break;
 
-       case MUSI_SPEL_HIDING_TUNE:
+
+       case 25:
 #ifdef JP
-               if (name) return "±£ÆۤβÎ";
-               if (desc) return "±£Ì©¹ÔưǽÎϤò¾å¾º¤µ¤»¤ë¡£";
+               if (name) return "ÄäÂڤβÎ";
+               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òËãá㤵¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
 #else
-               if (name) return "Hiding Tune";
-               if (desc) return "Gives improved stealth.";
+               if (name) return "Stationary Shriek";
+               if (desc) return "Attempts to freeze all monsters in sight.";
 #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;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-       case MUSI_SPEL_ILLUSION_PATTERN:
+               if (cast)
+               {
 #ifdef JP
-               if (name) return "¸¸±Æ¤ÎÀûΧ";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òº®Í𤵤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+                       msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥");
 #else
-               if (name) return "Illusion Pattern";
-               if (desc) return "Attempts to confuse all monsters in sight.";
+                       msg_print("You weave a very slow pattern which is almost likely to stop...");
 #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);
+                       start_singing(spell, MUSIC_STASIS);
                }
-               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);
+                       int power = plev * 4;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return info_power(power);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               stasis_monsters(power);
+                       }
                }
+
                break;
 
-       case MUSI_SPEL_FIRIELS_SONG:
+       case 26:
 #ifdef JP
-               if (name) return "¥Õ¥£¥ê¥¨¥ë¤Î²Î";
-               if (desc) return "¼þ°Ï¤Î»àÂΤä¹ü¤òÀ¸¤­ÊÖ¤¹¡£";
+               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.";
+               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
     
                {
@@ -10611,422 +9953,248 @@ cptr do_spell(int spell, int mode)
                        if (cast)
                        {
 #ifdef JP
-                               msg_print("À¸Ì¿¤ÈÉü³è¤Î¥Æ¡¼¥Þ¤òÁդǻϤ᤿¡¥¡¥¡¥");
+                               msg_print("²Î¤¬¿ÀÀ»¤Ê¾ì¤òºî¤ê½Ð¤·¤¿¡¥¡¥¡¥");
 #else
-                               msg_print("The themes of life and revival are woven into your song...");
+                               msg_print("The holy power of the Music is creating sacred field...");
 #endif
 
-                               animate_dead(0, py, px);
+                               warding_glyph();
                        }
                }
                break;
 
-       case MUSI_SPEL_FELLOWSHIP_CHANT:
+       case 27:
 #ifdef JP
-               if (name) return "ι¤ÎÃç´Ö";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò̥λ¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "±Ñͺ¤Î»í";
+               if (desc) return "²Ã®¤·¡¢¥Ò¡¼¥í¡¼µ¤Ê¬¤Ë¤Ê¤ê¡¢»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
 #else
-               if (name) return "Fellowship Chant";
-               if (desc) return "Attempts to charm all monsters in sight.";
+               if (name) return "The Hero's Poem";
+               if (desc) return "Hastes you. Gives heroism. Damages all monsters in sight.";
 #endif
     
-               {
-                       int song = MUSIC_CHARM;
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               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);
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       /* Recalculate hitpoints */
+                       p_ptr->update |= (PU_HP);
 
-                       if (cast) start_singing(spell, song);
+                       start_singing(spell, MUSIC_SHERO);
                }
-               break;
 
-       case MUSI_SPEL_SOUND_OF_DISINTEGRATION:
+               if (stop)
+               {
+                       if (!p_ptr->hero)
+                       {
 #ifdef JP
-               if (name) return "ʬ²ò²»ÇÈ";
-               if (desc) return "Êɤò·¡¤ê¿Ê¤à¡£¼«Ê¬¤Î­¸µ¤Î¥¢¥¤¥Æ¥à¤Ï¾øȯ¤¹¤ë¡£";
+                               msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
 #else
-               if (name) return "Sound of disintegration";
-               if (desc) return "Turns all rocks in the adjacent squares to mud.";
+                               msg_print("The heroism wears off.");
 #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;
+                               /* Recalculate hitpoints */
+                               p_ptr->update |= (PU_HP);
+                       }
 
-       case MUSI_SPEL_FINRODS_RESISTANCE:
+                       if (!p_ptr->fast)
+                       {
 #ifdef JP
-               if (name) return "¸µÁÇÂÑÀ­";
-               if (desc) return "»À¡¢ÅÅ·â¡¢±ê¡¢Î䵤¡¢ÆǤËÂФ¹¤ëÂÑÀ­¤òÆÀ¤ë¡£ÁõÈ÷¤Ë¤è¤ëÂÑÀ­¤ËÎßÀѤ¹¤ë¡£";
+                               msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£");
 #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.";
+                               msg_print("You feel yourself slow down.");
 #endif
-    
-               {
-                       int song = MUSIC_RESIST;
+                       }
+               }
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               {
+                       int dice = 1;
+                       int sides = plev * 3;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return info_damage(dice, sides, 0);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               dispel_monsters(damroll(dice, sides));
+                       }
                }
                break;
 
-       case MUSI_SPEL_HOBBIT_MELODIES:
+       case 28:
 #ifdef JP
-               if (name) return "¥Û¥Ó¥Ã¥È¤Î¥á¥í¥Ç¥£";
-               if (desc) return "²Ã®¤¹¤ë¡£";
+               if (name) return "¥ä¥ô¥¡¥ó¥Ê¤Î½õ¤±";
+               if (desc) return "¶¯ÎϤʲóÉü¤Î²Î¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
 #else
-               if (name) return "Hobbit Melodies";
-               if (desc) return "Hastes you.";
+               if (name) return "Relief of Yavanna";
+               if (desc) return "Powerful healing song. Also heals cut and stun completely.";
 #endif
     
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
+
+               if (cast)
                {
-                       int song = MUSIC_SPEED;
+#ifdef JP
+                       msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥");
+#else
+                       msg_print("Life flows through you as you sing the song...");
+#endif
+                       start_singing(spell, MUSIC_H_LIFE);
+               }
 
-                       if (info) return do_singing(song, SPELL_INFO);
+               {
+                       int dice = 15;
+                       int sides = 10;
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                       if (info) return info_heal(dice, sides, 0);
 
-                       if (cast) start_singing(spell, song);
+                       if (cont)
+                       {
+                               hp_player(damroll(dice, sides));
+                               set_stun(0);
+                               set_cut(0);
+                       }
                }
+
                break;
 
-       case MUSI_SPEL_WORLD_CONTORTION:
+       case 29:
 #ifdef JP
-               if (name) return "ÏĤó¤ÀÀ¤³¦";
-               if (desc) return "¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               if (name) return "ºÆÀ¸¤Î²Î";
+               if (desc) return "¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¿¥¹¤È·Ð¸³Ãͤò²óÉü¤¹¤ë¡£";
 #else
-               if (name) return "World Contortion";
-               if (desc) return "Teleports all nearby monsters away unless resisted.";
+               if (name) return "Goddess' rebirth";
+               if (desc) return "Restores all stats and experience.";
 #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("²Î¤¬¶õ´Ö¤òÏĤ᤿¡¥¡¥¡¥");
+                               msg_print("°Å¹õ¤ÎÃæ¤Ë¸÷¤ÈÈþ¤ò¤Õ¤ê¤Þ¤¤¤¿¡£ÂΤ¬¸µ¤Î³èÎϤò¼è¤êÌᤷ¤¿¡£");
 #else
-                               msg_print("Reality whirls wildly as you sing a dizzying melody...");
+                               msg_print("You strewed light and beauty in the dark as you sing. You feel refreshed.");
 #endif
-
-                               project(0, rad, py, px, power, GF_AWAY_ALL, PROJECT_KILL, -1);
+                               (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_DISPELLING_CHANT:
+       case 30:
 #ifdef JP
-               if (name) return "Â໶¤Î²Î";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÆäËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+               if (name) return "¥µ¥¦¥í¥ó¤ÎËâ½Ñ";
+               if (desc) return "Èó¾ï¤Ë¶¯ÎϤǤ´¤¯¾®¤µ¤¤¹ì²»¤Îµå¤òÊü¤Ä¡£";
 #else
-               if (name) return "Dispelling chant";
-               if (desc) return "Damages all monsters in sight. Hurts evil monsters greatly.";
+               if (name) return "Wizardry of Sauron";
+               if (desc) return "Fires an extremely powerful tiny ball of sound.";
 #endif
     
                {
-                       int song = MUSIC_DISPEL;
+                       int dice = 50 + plev;
+                       int sides = 10;
+                       int rad = 0;
 
-                       if (info) return do_singing(song, SPELL_INFO);
+                       if (info) return info_damage(dice, sides, 0);
 
                        /* Stop singing before start another */
                        if (cast || fail) stop_singing();
 
-                       if (cast) start_singing(spell, song);
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
+                       }
                }
                break;
 
-       case MUSI_SPEL_THE_VOICE_OF_SARUMAN:
+       case 31:
 #ifdef JP
-               if (name) return "¥µ¥ë¥Þ¥ó¤Î´Å¸À";
-               if (desc) return "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¸ºÂ®¤µ¤»¡¢Ì²¤é¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+               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.";
+               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_SARUMAN;
-
-                       if (info) return do_singing(song, SPELL_INFO);
+               /* Stop singing before start another */
+               if (cast || fail) stop_singing();
 
-                       /* 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
-    
+               if (cast)
                {
-                       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 "»ë³¦Æâ¤ÎÁ´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤òËãá㤵¤»¤è¤¦¤È¤¹¤ë¡£Äñ¹³¤µ¤ì¤ë¤È̵¸ú¡£";
+                               msg_print("¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤Î̽²¦¤Ø¤ÎÄ©Àï¤ò²Î¤Ã¤¿¡¥¡¥¡¥");
 #else
-               if (name) return "Stationary Shriek";
-               if (desc) return "Attempts to freeze all monsters in sight.";
+                               msg_print("You recall the valor of Fingolfin's challenge to the Dark Lord...");
 #endif
-    
-               {
-                       int song = MUSIC_STASIS;
-
-                       if (info) return do_singing(song, SPELL_INFO);
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+                               /* Redraw map */
+                               p_ptr->redraw |= (PR_MAP);
+               
+                               /* Update monsters */
+                               p_ptr->update |= (PU_MONSTERS);
+               
+                               /* Window stuff */
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
 
-                       if (cast) start_singing(spell, song);
+                               start_singing(spell, MUSIC_INVULN);
                }
-               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
-    
+               if (stop)
                {
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
-
-                       if (cast)
+                       if (!p_ptr->invuln)
                        {
 #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 "¶¯ÎϤʲóÉü¤Î²Î¤Ç¡¢Éé½ý¤ÈÛ¯Û°¾õÂÖ¤âÁ´²÷¤¹¤ë¡£";
+                               msg_print("̵Ũ¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
 #else
-               if (name) return "Relief of Yavanna";
-               if (desc) return "Powerful healing song. Also heals cut and stun completely.";
+                               msg_print("The invulnerability wears off.");
 #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;
+                               /* Redraw map */
+                               p_ptr->redraw |= (PR_MAP);
 
-       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();
+                               /* Update monsters */
+                               p_ptr->update |= (PU_MONSTERS);
 
-                       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();
+                               /* Window stuff */
+                               p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
                        }
                }
-               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;
+       return "";
+}
 
-                       if (info) return do_singing(song, SPELL_INFO);
 
-                       /* Stop singing before start another */
-                       if (cast || fail) stop_singing();
+static cptr do_hissatsu_spell(int spell, int mode)
+{
+       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
 
-                       if (cast) start_singing(spell, song);
-               }
-               break;
+       int dir;
+       int plev = p_ptr->lev;
 
-       case TECH_SPEL_TOBI_IZUNA:
+       switch (spell)
+       {
+       case 0:
 #ifdef JP
                if (name) return "ÈôÈÓ¹Ë";
                if (desc) return "2¥Þ¥¹Î¥¤ì¤¿¤È¤³¤í¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¡£";
@@ -11044,7 +10212,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_3_WAY_ATTACK:
+       case 1:
 #ifdef JP
                if (name) return "¸Þ·î±«»Â¤ê";
                if (desc) return "3Êý¸þ¤ËÂФ·¤Æ¹¶·â¤¹¤ë¡£";
@@ -11101,7 +10269,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_BOOMERANG:
+       case 2:
 #ifdef JP
                if (name) return "¥Ö¡¼¥á¥é¥ó";
                if (desc) return "Éð´ï¤ò¼ê¸µ¤ËÌá¤Ã¤Æ¤¯¤ë¤è¤¦¤ËÅꤲ¤ë¡£Ìá¤Ã¤Æ¤³¤Ê¤¤¤³¤È¤â¤¢¤ë¡£";
@@ -11112,11 +10280,11 @@ cptr do_spell(int spell, int mode)
     
                if (cast)
                {
-                       if (!do_cmd_throw_aux(1, TRUE, 0)) return NULL;
+                       if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
                }
                break;
 
-       case TECH_SPEL_BURNING_STRIKE:
+       case 3:
 #ifdef JP
                if (name) return "±ëÎî";
                if (desc) return "²Ð±êÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
@@ -11149,7 +10317,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_DETECT_FEROCITY:
+       case 4:
 #ifdef JP
                if (name) return "»¦µ¤´¶ÃÎ";
                if (desc) return "¶á¤¯¤Î»×¹Í¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
@@ -11164,7 +10332,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_STRIKE_TO_STUN:
+       case 5:
 #ifdef JP
                if (name) return "¤ß¤ÍÂǤÁ";
                if (desc) return "Áê¼ê¤Ë¥À¥á¡¼¥¸¤òÍ¿¤¨¤Ê¤¤¤¬¡¢Û¯Û°¤È¤µ¤»¤ë¡£";
@@ -11197,7 +10365,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_COUNTER:
+       case 6:
 #ifdef JP
                if (name) return "¥«¥¦¥ó¥¿¡¼";
                if (desc) return "Áê¼ê¤Ë¹¶·â¤µ¤ì¤¿¤È¤­¤ËÈ¿·â¤¹¤ë¡£È¿·â¤¹¤ë¤¿¤Ó¤ËMP¤ò¾ÃÈñ¡£";
@@ -11226,7 +10394,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_HARAINUKE:
+       case 7:
 #ifdef JP
                if (name) return "ʧ¤¤È´¤±";
                if (desc) return "¹¶·â¤·¤¿¸å¡¢È¿ÂЦ¤ËÈ´¤±¤ë¡£";
@@ -11283,7 +10451,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_SERPENTS_TONGUE:
+       case 8:
 #ifdef JP
                if (name) return "¥µ¡¼¥Ú¥ó¥Ä¥¿¥ó";
                if (desc) return "ÆÇÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
@@ -11316,7 +10484,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_ZAMMAKEN:
+       case 9:
 #ifdef JP
                if (name) return "»ÂËâ·õÆõ¤ÎÂÀÅá";
                if (desc) return "À¸Ì¿¤Î¤Ê¤¤¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¤¬¡¢Â¾¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤ÏÁ´¤¯¸ú²Ì¤¬¤Ê¤¤¡£";
@@ -11349,7 +10517,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_WIND_BLAST:
+       case 10:
 #ifdef JP
                if (name) return "ÎöÉ÷·õ";
                if (desc) return "¹¶·â¤·¤¿Áê¼ê¤ò¸åÊý¤Ø¿á¤­Èô¤Ð¤¹¡£";
@@ -11428,7 +10596,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_JUDGE:
+       case 11:
 #ifdef JP
                if (name) return "Åá¾¢¤ÎÌÜÍø¤­";
                if (desc) return "Éð´ï¡¦Ëɶñ¤ò1¤Ä¼±Ê̤¹¤ë¡£¥ì¥Ù¥ë45°Ê¾å¤ÇÉð´ï¡¦Ëɶñ¤ÎǽÎϤò´°Á´¤ËÃΤ뤳¤È¤¬¤Ç¤­¤ë¡£";
@@ -11439,7 +10607,7 @@ cptr do_spell(int spell, int mode)
     
                if (cast)
                {
-                       if (p_ptr->lev > 44)
+                       if (plev > 44)
                        {
                                if (!identify_fully(TRUE)) return NULL;
                        }
@@ -11450,7 +10618,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_ROCK_SMASH:
+       case 12:
 #ifdef JP
                if (name) return "ÇË´ä»Â";
                if (desc) return "´ä¤ò²õ¤·¡¢´äÀзϤΥâ¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
@@ -11482,7 +10650,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_MIDARE_SETSUGEKKA:
+       case 13:
 #ifdef JP
                if (name) return "Íð¤ìÀã·î²Ö";
                if (desc) return "¹¶·â²ó¿ô¤¬Áý¤¨¡¢Î䵤ÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÂç¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
@@ -11515,7 +10683,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_SPOT_AIMING:
+       case 14:
 #ifdef JP
                if (name) return "µÞ½êÆͤ­";
                if (desc) return "¥â¥ó¥¹¥¿¡¼¤ò°ì·â¤ÇÅݤ¹¹¶·â¤ò·«¤ê½Ð¤¹¡£¼ºÇÔ¤¹¤ë¤È1ÅÀ¤·¤«¥À¥á¡¼¥¸¤òÍ¿¤¨¤é¤ì¤Ê¤¤¡£";
@@ -11548,7 +10716,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_MAJINGIRI:
+       case 15:
 #ifdef JP
                if (name) return "Ëâ¿À»Â¤ê";
                if (desc) return "²ñ¿´¤Î°ì·â¤Ç¹¶·â¤¹¤ë¡£¹¶·â¤¬¤«¤ï¤µ¤ì¤ä¤¹¤¤¡£";
@@ -11581,7 +10749,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_DESPERATE_ATTACK:
+       case 16:
 #ifdef JP
                if (name) return "¼Î¤Æ¿È";
                if (desc) return "¶¯ÎϤʹ¶·â¤ò·«¤ê½Ð¤¹¡£¼¡¤Î¥¿¡¼¥ó¤Þ¤Ç¤Î´Ö¡¢¿©¤é¤¦¥À¥á¡¼¥¸¤¬Áý¤¨¤ë¡£";
@@ -11615,7 +10783,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_LIGHTNING_EAGLE:
+       case 17:
 #ifdef JP
                if (name) return "Íë·âÏÉÄÞ»Â";
                if (desc) return "ÅÅ·âÂÑÀ­¤Î¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤ËÈó¾ï¤ËÂ礭¤¤¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
@@ -11648,7 +10816,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_RUSH_ATTACK:
+       case 18:
 #ifdef JP
                if (name) return "Æþ¿È";
                if (desc) return "ÁÇÁ᤯Áê¼ê¤Ë¶á´ó¤ê¹¶·â¤¹¤ë¡£";
@@ -11663,7 +10831,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_BLOODY_MAELSTROM:
+       case 19:
 #ifdef JP
                if (name) return "ÀÖή±²";
                if (desc) return "¼«Ê¬¼«¿È¤â½ý¤òºî¤ê¤Ä¤Ä¡¢¤½¤Î½ý¤¬¿¼¤¤¤Û¤ÉÂ礭¤¤°ÒÎϤÇÁ´Êý¸þ¤ÎŨ¤ò¹¶·â¤Ç¤­¤ë¡£À¸¤­¤Æ¤¤¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤Ë¤Ï¸ú²Ì¤¬¤Ê¤¤¡£";
@@ -11713,7 +10881,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_EARTHQUAKE_BLOW:
+       case 20:
 #ifdef JP
                if (name) return "·ã¿Ì·â";
                if (desc) return "ÃϿ̤òµ¯¤³¤¹¡£";
@@ -11739,7 +10907,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_CRACK:
+       case 21:
 #ifdef JP
                if (name) return "ÃÏÁö¤ê";
                if (desc) return "¾×·âÇȤΥӡ¼¥à¤òÊü¤Ä¡£";
@@ -11789,7 +10957,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_WAR_CRY:
+       case 22:
 #ifdef JP
                if (name) return "µ¤Ç÷¤Îͺ¶«¤Ó";
                if (desc) return "»ë³¦Æâ¤ÎÁ´¥â¥ó¥¹¥¿¡¼¤ËÂФ·¤Æ¹ì²»¤Î¹¶·â¤ò¹Ô¤¦¡£¤µ¤é¤Ë¡¢¶á¤¯¤Ë¤¤¤ë¥â¥ó¥¹¥¿¡¼¤òÅܤ餻¤ë¡£";
@@ -11805,12 +10973,12 @@ cptr do_spell(int spell, int mode)
 #else
                        msg_print("You roar out!");
 #endif
-                       project_hack(GF_SOUND, randint1(p_ptr->lev * 3));
+                       project_hack(GF_SOUND, randint1(plev * 3));
                        aggravate_monsters(0);
                }
                break;
 
-       case TECH_SPEL_MUSOU_SANDAN:
+       case 23:
 #ifdef JP
                if (name) return "̵Áл°ÃÊ";
                if (desc) return "¶¯ÎϤÊ3Ãʹ¶·â¤ò·«¤ê½Ð¤¹¡£";
@@ -11890,14 +11058,18 @@ cptr do_spell(int spell, int mode)
                                        /* Move the player */
                                        if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
                                }
-       
-                               /* -more- */
+                               else
+                               {
+                                       break;
+                               }
+
+                               /* -more- */
                                if (i < 2) msg_print(NULL);
                        }
                }
                break;
 
-       case TECH_SPEL_VAMPIRES_FANG:
+       case 24:
 #ifdef JP
                if (name) return "µÛ·ìµ´¤Î²ç";
                if (desc) return "¹¶·â¤·¤¿Áê¼ê¤ÎÂÎÎϤòµÛ¤¤¤È¤ê¡¢¼«Ê¬¤ÎÂÎÎϤò²óÉü¤µ¤»¤ë¡£À¸Ì¿¤ò»ý¤¿¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤Ë¤ÏÄ̤¸¤Ê¤¤¡£";
@@ -11930,7 +11102,7 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_MOON_DAZZLING:
+       case 25:
 #ifdef JP
                if (name) return "¸¸ÏÇ";
                if (desc) return "»ë³¦Æâ¤Îµ¯¤­¤Æ¤¤¤ëÁ´¥â¥ó¥¹¥¿¡¼¤ËÛ¯Û°¡¢º®Íð¡¢Ì²¤ê¤òÍ¿¤¨¤è¤¦¤È¤¹¤ë¡£";
@@ -11946,13 +11118,13 @@ cptr do_spell(int spell, int mode)
 #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);
+                       project_hack(GF_ENGETSU, plev * 4);
+                       project_hack(GF_ENGETSU, plev * 4);
+                       project_hack(GF_ENGETSU, plev * 4);
                }
                break;
 
-       case TECH_SPEL_HUNDRED_SLAUGHTER:
+       case 26:
 #ifdef JP
                if (name) return "É´¿Í»Â¤ê";
                if (desc) return "Ϣ³¤·¤ÆÆþ¿È¤Ç¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¡£¹¶·â¤¹¤ë¤¿¤Ó¤ËMP¤ò¾ÃÈñ¡£MP¤¬¤Ê¤¯¤Ê¤ë¤«¡¢¥â¥ó¥¹¥¿¡¼¤òÅݤ»¤Ê¤«¤Ã¤¿¤éÉ´¿Í»Â¤ê¤Ï½ªÎ»¤¹¤ë¡£";
@@ -11994,235 +11166,1467 @@ cptr do_spell(int spell, int mode)
                }
                break;
 
-       case TECH_SPEL_DRAGONIC_FLASH:
+       case 27:
+#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, 0L) ||
+                           (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, 0L);
+               }
+               break;
+
+       case 28:
+#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 29:
+#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 30:
+#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 31:
+#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("Éð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£");
+#else
+                               msg_print("Meaning of Bushi-do is found in the death.");
+#endif
+                               take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
+                       }
+               }
+               break;
+       }
+
+       return "";
+}
+
+
+/* Hex */
+static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+               case TV_SWORD:
+               case TV_HAFTED:
+               case TV_POLEARM:
+               case TV_DIGGING:
+               {
+                       return (TRUE);
+               }
+       }
+
+       return (FALSE);
+}
+
+static bool item_tester_hook_cursed(object_type *o_ptr)
+{
+       return (bool)(object_is_cursed(o_ptr));
+}
+
+static cptr do_hex_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 cont = (mode == SPELL_CONT) ? TRUE : FALSE;
+       bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
+
+       bool add = TRUE;
+
+       int plev = p_ptr->lev;
+       int power;
+
+       switch (spell)
+       {
+       /*** 1st book (0-7) ***/
+       case 0:
+#ifdef JP
+               if (name) return "¼Ù¤Ê¤ë½ËÊ¡";
+               if (desc) return "½ËÊ¡¤Ë¤è¤ê¹¶·âÀºÅÙ¤ÈËɸæÎϤ¬¾å¤¬¤ë¡£";
+#else
+               if (name) return "Evily blessing";
+               if (desc) return "Attempts to increase +to_hit of a weapon and AC";
+#endif
+               if (cast)
+               {
+                       if (!p_ptr->blessed)
+                       {
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤Ë¤Ê¤Ã¤¿¡ª");
+#else
+                               msg_print("You feel righteous!");
+#endif
+                       }
+               }
+               if (stop)
+               {
+                       if (!p_ptr->blessed)
+                       {
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The prayer has expired.");
+#endif
+                       }
+               }
+               break;
+
+       case 1:
+#ifdef JP
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "HP¤ä½ý¤ò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure light wounds";
+               if (desc) return "Heals cut and HP a little.";
+#endif
+               if (info) return info_heal(1, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(1, 10));
+                       set_cut(p_ptr->cut - 10);
+               }
+               break;
+
+       case 2:
+#ifdef JP
+               if (name) return "°­Ëâ¤Î¥ª¡¼¥é";
+               if (desc) return "±ê¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢²óÉü®ÅÙ¤¬Â®¤¯¤Ê¤ë¡£";
+#else
+               if (name) return "Demonic aura";
+               if (desc) return "Gives fire aura and regeneration.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬±ê¤Î¥ª¡¼¥é¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by fiery aura!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("±ê¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Fiery aura disappeared.");
+#endif
+               }
+               break;
+
+       case 3:
+#ifdef JP
+               if (name) return "°­½­Ì¸";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÈù¼åÎ̤ÎÆǤΥÀ¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Stinking mist";
+               if (desc) return "Deals few damages of poison to all monsters in your sight.";
+#endif
+               power = plev / 2 + 5;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_POIS, randint1(power));
+               }
+               break;
+
+       case 4:
+#ifdef JP
+               if (name) return "ÏÓÎ϶¯²½";
+               if (desc) return "½Ñ¼Ô¤ÎÏÓÎϤò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Extra might";
+               if (desc) return "Attempts to increase your strength.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("²¿¤À¤«ÎϤ¬Í¯¤¤¤ÆÍè¤ë¡£");
+#else
+                       msg_print("You feel you get stronger.");
+#endif
+               }
+               break;
+
+       case 5:
+#ifdef JP
+               if (name) return "Éð´ï¼öÇû";
+               if (desc) return "ÁõÈ÷¤·¤Æ¤¤¤ëÉð´ï¤ò¼ö¤¦¡£";
+#else
+               if (name) return "Curse weapon";
+               if (desc) return "Curses your weapon.";
+#endif
+               if (cast)
+               {
+                       int item;
+                       char *q, *s;
+                       char o_name[MAX_NLEN];
+                       object_type *o_ptr;
+                       u32b f[TR_FLAG_SIZE];
+
+                       item_tester_hook = item_tester_hook_weapon_except_bow;
+#ifdef JP
+                       q = "¤É¤ì¤ò¼ö¤¤¤Þ¤¹¤«¡©";
+                       s = "Éð´ï¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which weapon do you curse?";
+                       s = "You wield no weapons.";
+#endif
+
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_desc(o_name, o_ptr, OD_NAME_ONLY);
+                       object_flags(o_ptr, f);
+
+#ifdef JP
+                       if (!get_check(format("ËÜÅö¤Ë %s ¤ò¼ö¤¤¤Þ¤¹¤«¡©", o_name))) return FALSE;
+#else
+                       if (!get_check(format("Do you curse %s, really¡©", o_name))) return FALSE;
+#endif
+
+                       if (!one_in_(3) &&
+                               (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
+                       {
+#ifdef JP
+                               msg_format("%s ¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡£", o_name);
+#else
+                               msg_format("%s resists the effect.", o_name);
+#endif
+                               if (one_in_(3))
+                               {
+                                       if (o_ptr->to_d > 0)
+                                       {
+                                               o_ptr->to_d -= randint1(3) % 2;
+                                               if (o_ptr->to_d < 0) o_ptr->to_d = 0;
+                                       }
+                                       if (o_ptr->to_h > 0)
+                                       {
+                                               o_ptr->to_h -= randint1(3) % 2;
+                                               if (o_ptr->to_h < 0) o_ptr->to_h = 0;
+                                       }
+                                       if (o_ptr->to_a > 0)
+                                       {
+                                               o_ptr->to_a -= randint1(3) % 2;
+                                               if (o_ptr->to_a < 0) o_ptr->to_a = 0;
+                                       }
+#ifdef JP
+                                       msg_format("%s ¤ÏÎô²½¤·¤Æ¤·¤Þ¤Ã¤¿¡£", o_name);
+#else
+                                       msg_format("Your %s was disenchanted!", o_name);
+#endif
+                               }
+                       }
+                       else
+                       {
+                               int power = 0;
+#ifdef JP
+                               msg_format("¶²ÉݤΰŹõ¥ª¡¼¥é¤¬¤¢¤Ê¤¿¤Î%s¤òÊñ¤ß¹þ¤ó¤À¡ª", o_name);
+#else
+                               msg_format("A terrible black aura blasts your %s!", o_name);
+#endif
+                               o_ptr->curse_flags |= (TRC_CURSED);
+
+                               if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
+                               {
+
+                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       if (one_in_(666))
+                                       {
+                                               o_ptr->curse_flags |= (TRC_TY_CURSE);
+                                               if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+
+                                               add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                               add_flag(o_ptr->art_flags, TR_VORPAL);
+                                               add_flag(o_ptr->art_flags, TR_VAMPIRIC);
+#ifdef JP
+                                               msg_print("·ì¤À¡ª·ì¤À¡ª·ì¤À¡ª");
+#else
+                                               msg_print("Blood, Blood, Blood!");
+#endif
+                                               power = 2;
+                                       }
+                               }
+
+                               o_ptr->curse_flags |= get_curse(power, o_ptr);
+                       }
+
+                       p_ptr->update |= (PU_BONUS);
+                       add = FALSE;
+               }
+               break;
+
+       case 6:
+#ifdef JP
+               if (name) return "¼Ù°­´¶ÃÎ";
+               if (desc) return "¼þ°Ï¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Evil detection";
+               if (desc) return "Detects evil monsters.";
+#endif
+               if (info) return info_range(MAX_SIGHT);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¼Ù°­¤ÊÀ¸Êª¤Î¸ºß¤ò´¶¤¸¼è¤í¤¦¤È¤·¤¿¡£");
+#else
+                       msg_print("You attend to the presence of evil creatures.");
+#endif
+               }
+               break;
+
+       case 7:
+#ifdef JP
+               if (name) return "²æËý";
+               if (desc) return "¿ô¥¿¡¼¥ó¹¶·â¤òÂѤ¨¤¿¸å¡¢¼õ¤±¤¿¥À¥á¡¼¥¸¤òÃϹö¤Î¶È²Ð¤È¤·¤Æ¼þ°Ï¤ËÊü½Ð¤¹¤ë¡£";
+#else
+               if (name) return "Patience";
+               if (desc) return "Bursts hell fire strongly after patients any damage while few turns.";
+#endif
+               power = MIN(200, (p_ptr->magic_num1[2] * 2));
+               if (info) return info_damage(0, 0, power);
+               if (cast)
+               {
+                       int a = 3 - (p_ptr->pspeed - 100) / 10;
+                       int r = 3 + randint1(3) + MAX(0, MIN(3, a));
+
+                       if (p_ptr->magic_num2[2] > 0)
+                       {
+#ifdef JP
+                               msg_print("¤¹¤Ç¤Ë²æËý¤ò¤·¤Æ¤¤¤ë¡£");
+#else
+                               msg_print("You are already patienting.");
+#endif
+                               return NULL;
+                       }
+
+                       p_ptr->magic_num2[1] = 1;
+                       p_ptr->magic_num2[2] = r;
+                       p_ptr->magic_num1[2] = 0;
+#ifdef JP
+                       msg_print("¤¸¤Ã¤ÈÂѤ¨¤ë¤³¤È¤Ë¤·¤¿¡£");
+#else
+                       msg_print("You decide to patient all damages.");
+#endif
+                       add = FALSE;
+               }
+               if (cont)
+               {
+                       int rad = 2 + (power / 50);
+
+                       p_ptr->magic_num2[2]--;
+
+                       if ((p_ptr->magic_num2[2] <= 0) || (power >= 200))
+                       {
+#ifdef JP
+                               msg_print("²æËý¤¬²ò¤«¤ì¤¿¡ª");
+#else
+                               msg_print("Time for end of patioence!");
+#endif
+                               if (power)
+                               {
+                                       project(0, rad, py, px, power, GF_HELL_FIRE,
+                                               (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
+                               }
+                               if (p_ptr->wizard)
+                               {
+#ifdef JP
+                                       msg_format("%dÅÀ¤Î¥À¥á¡¼¥¸¤òÊÖ¤·¤¿¡£", power);
+#else
+                                       msg_format("You return %d damages.", power);
+#endif
+                               }
+
+                               /* Reset */
+                               p_ptr->magic_num2[1] = 0;
+                               p_ptr->magic_num2[2] = 0;
+                               p_ptr->magic_num1[2] = 0;
+                       }
+               }
+               break;
+
+       /*** 2nd book (8-15) ***/
+       case 8:
+#ifdef JP
+               if (name) return "ɹ¤Î³»";
+               if (desc) return "ɹ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢ËɸæÎϤ¬¾å¾º¤¹¤ë¡£";
+#else
+               if (name) return "Ice armor";
+               if (desc) return "Gives fire aura and bonus to AC.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬É¹¤Î³»¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by ice armor!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("ɹ¤Î³»¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Ice armor disappeared.");
+#endif
+               }
+               break;
+
+       case 9:
+#ifdef JP
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤä½ý¤ò¿¾¯²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure serious wounds";
+               if (desc) return "Heals cut and HP more.";
+#endif
+               if (info) return info_heal(2, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(2, 10));
+                       set_cut((p_ptr->cut / 2) - 10);
+               }
+               break;
+
+       case 10:
+#ifdef JP
+               if (name) return "ÌôÉʵÛÆþ";
+               if (desc) return "¼öʸ±Ó¾§¤òÃæ»ß¤¹¤ë¤³¤È¤Ê¤¯¡¢Ìô¤Î¸ú²Ì¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
+#else
+               if (name) return "Inhail potion";
+               if (desc) return "Quaffs a potion without canceling of casting a spell.";
+#endif
+               if (cast)
+               {
+                       p_ptr->magic_num1[0] |= (1L << HEX_INHAIL);
+                       do_cmd_quaff_potion();
+                       p_ptr->magic_num1[0] &= ~(1L << HEX_INHAIL);
+                       add = FALSE;
+               }
+               break;
+
+       case 11:
+#ifdef JP
+               if (name) return "µÛ·ì̸";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÈù¼åÎ̤ÎÀ¸Ì¿Îϵۼý¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Í¿¤¨¤¿¥À¥á¡¼¥¸¤Îʬ¡¢ÂÎÎϤ¬²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Vampiric mist";
+               if (desc) return "Deals few dameges of drain life to all monsters in your sight.";
+#endif
+               power = (plev / 2) + 5;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_OLD_DRAIN, randint1(power));
+               }
+               break;
+
+       case 12:
+#ifdef JP
+               if (name) return "Ëâ·õ²½";
+               if (desc) return "Éð´ï¤Î¹¶·âÎϤò¾å¤²¤ë¡£ÀÚ¤ìÌ£¤òÆÀ¡¢¼ö¤¤¤Ë±þ¤¸¤ÆÍ¿¤¨¤ë¥À¥á¡¼¥¸¤¬¾å¾º¤·¡¢Á±Îɤʥâ¥ó¥¹¥¿¡¼¤ËÂФ¹¤ë¥À¥á¡¼¥¸¤¬2Çܤˤʤ롣";
+#else
+               if (name) return "Swords to runeswords";
+               if (desc) return "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤ÎÉð´ï¤¬¹õ¤¯µ±¤¤¤¿¡£");
+#else
+                       if (!empty_hands(FALSE))
+                               msg_print("Your weapons glow bright black.");
+                       else
+                               msg_print("Your weapon glows bright black.");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("Éð´ï¤Îµ±¤­¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
+#endif
+               }
+               break;
+
+       case 13:
+#ifdef JP
+               if (name) return "º®Íð¤Î¼ê";
+               if (desc) return "¹¶·â¤·¤¿ºÝ¥â¥ó¥¹¥¿¡¼¤òº®Í𤵤»¤ë¡£";
+#else
+               if (name) return "Touch of confusion";
+               if (desc) return "Confuses a monster when you attack.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤Î¼ê¤¬ÀÖ¤¯µ±¤­»Ï¤á¤¿¡£");
+#else
+                       msg_print("Your hands glow bright red.");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("¼ê¤Îµ±¤­¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£");
+#else
+                       msg_print("Brightness on your hands disappeard.");
+#endif
+               }
+               break;
+
+       case 14:
+#ifdef JP
+               if (name) return "ÆùÂζ¯²½";
+               if (desc) return "½Ñ¼Ô¤ÎÏÓÎÏ¡¢´ïÍѤµ¡¢Âѵ×ÎϤò¾å¾º¤µ¤»¤ë¡£¹¶·â²ó¿ô¤Î¾å¸Â¤ò 1 Áý²Ã¤µ¤»¤ë¡£";
+#else
+               if (name) return "Building up";
+               if (desc) return "Attempts to increases your strength, dexterity and constitusion.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¿ÈÂΤ¬¶¯¤¯¤Ê¤Ã¤¿µ¤¤¬¤·¤¿¡£");
+#else
+                       msg_print("You feel your body is developed more now.");
+#endif
+               }
+               break;
+
+       case 15:
+#ifdef JP
+               if (name) return "È¿¥Æ¥ì¥Ý¡¼¥È·ë³¦";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤Î¥Æ¥ì¥Ý¡¼¥È¤òÁ˳²¤¹¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Anti teleport barrier";
+               if (desc) return "Obstructs all teleportations by monsters in your sight.";
+#endif
+               power = plev * 3 / 2;
+               if (info) return info_power(power);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¥Æ¥ì¥Ý¡¼¥È¤òËɤ°¼ö¤¤¤ò¤«¤±¤¿¡£");
+#else
+                       msg_print("You feel anyone can not teleport except you.");
+#endif
+               }
+               break;
+
+       /*** 3rd book (16-23) ***/
+       case 16:
+#ifdef JP
+               if (name) return "¾×·â¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "Åŵ¤¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢Æ°¤­¤¬Â®¤¯¤Ê¤ë¡£";
+#else
+               if (name) return "Cloak of shock";
+               if (desc) return "Gives lightning aura and a bonus to speed.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬°ðºÊ¤Î¥ª¡¼¥é¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by electrical aura!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("°ðºÊ¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Electrical aura disappeared.");
+#endif
+               }
+               break;
+
+       case 17:
+#ifdef JP
+               if (name) return "Ã×Ì¿½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤä½ý¤ò²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure critical wounds";
+               if (desc) return "Heals cut and HP greatry.";
+#endif
+               if (info) return info_heal(4, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(4, 10));
+                       set_stun(0);
+                       set_cut(0);
+                       set_poisoned(0);
+               }
+               break;
+
+       case 18:
+#ifdef JP
+               if (name) return "¼öÎÏÉõÆþ";
+               if (desc) return "ËâË¡¤ÎÆ»¶ñ¤ËËâÎϤòºÆ½¼Å¶¤¹¤ë¡£";
+#else
+               if (name) return "Recharging";
+               if (desc) return "Recharges a magic device.";
+#endif
+               power = plev * 2;
+               if (info) return info_power(power);
+               if (cast)
+               {
+                       if (!recharge(power)) return NULL;
+                       add = FALSE;
+               }
+               break;
+
+       case 19:
+#ifdef JP
+               if (name) return "»à¼ÔÉü³è";
+               if (desc) return "»àÂΤòÁɤ餻¤Æ¥Ú¥Ã¥È¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Animate Dead";
+               if (desc) return "Raises corpses and skeletons from dead.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("»à¼Ô¤Ø¤Î¸Æ¤Ó¤«¤±¤ò»Ï¤á¤¿¡£");
+#else
+                       msg_print("You start to call deads.!");
+#endif
+               }
+               if (cast || cont)
+               {
+                       animate_dead(0, py, px);
+               }
+               break;
+
+       case 20:
+#ifdef JP
+               if (name) return "Ëɶñ¼öÇû";
+               if (desc) return "ÁõÈ÷¤·¤Æ¤¤¤ëËɶñ¤Ë¼ö¤¤¤ò¤«¤±¤ë¡£";
+#else
+               if (name) return "Curse armor";
+               if (desc) return "Curse a piece of armour that you wielding.";
+#endif
+               if (cast)
+               {
+                       int item;
+                       char *q, *s;
+                       char o_name[MAX_NLEN];
+                       object_type *o_ptr;
+                       u32b f[TR_FLAG_SIZE];
+
+                       item_tester_hook = object_is_armour;
+#ifdef JP
+                       q = "¤É¤ì¤ò¼ö¤¤¤Þ¤¹¤«¡©";
+                       s = "Ëɶñ¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which piece of armour do you curse?";
+                       s = "You wield no piece of armours.";
+#endif
+
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_desc(o_name, o_ptr, OD_NAME_ONLY);
+                       object_flags(o_ptr, f);
+
+#ifdef JP
+                       if (!get_check(format("ËÜÅö¤Ë %s ¤ò¼ö¤¤¤Þ¤¹¤«¡©", o_name))) return FALSE;
+#else
+                       if (!get_check(format("Do you curse %s, really¡©", o_name))) return FALSE;
+#endif
+
+                       if (!one_in_(3) &&
+                               (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
+                       {
+#ifdef JP
+                               msg_format("%s ¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡£", o_name);
+#else
+                               msg_format("%s resists the effect.", o_name);
+#endif
+                               if (one_in_(3))
+                               {
+                                       if (o_ptr->to_d > 0)
+                                       {
+                                               o_ptr->to_d -= randint1(3) % 2;
+                                               if (o_ptr->to_d < 0) o_ptr->to_d = 0;
+                                       }
+                                       if (o_ptr->to_h > 0)
+                                       {
+                                               o_ptr->to_h -= randint1(3) % 2;
+                                               if (o_ptr->to_h < 0) o_ptr->to_h = 0;
+                                       }
+                                       if (o_ptr->to_a > 0)
+                                       {
+                                               o_ptr->to_a -= randint1(3) % 2;
+                                               if (o_ptr->to_a < 0) o_ptr->to_a = 0;
+                                       }
+#ifdef JP
+                                       msg_format("%s ¤ÏÎô²½¤·¤Æ¤·¤Þ¤Ã¤¿¡£", o_name);
+#else
+                                       msg_format("Your %s was disenchanted!", o_name);
+#endif
+                               }
+                       }
+                       else
+                       {
+                               int power = 0;
+#ifdef JP
+                               msg_format("¶²ÉݤΰŹõ¥ª¡¼¥é¤¬¤¢¤Ê¤¿¤Î%s¤òÊñ¤ß¹þ¤ó¤À¡ª", o_name);
+#else
+                               msg_format("A terrible black aura blasts your %s!", o_name);
+#endif
+                               o_ptr->curse_flags |= (TRC_CURSED);
+
+                               if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
+                               {
+
+                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       if (one_in_(666))
+                                       {
+                                               o_ptr->curse_flags |= (TRC_TY_CURSE);
+                                               if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+
+                                               add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                               add_flag(o_ptr->art_flags, TR_RES_POIS);
+                                               add_flag(o_ptr->art_flags, TR_RES_DARK);
+                                               add_flag(o_ptr->art_flags, TR_RES_NETHER);
+#ifdef JP
+                                               msg_print("·ì¤À¡ª·ì¤À¡ª·ì¤À¡ª");
+#else
+                                               msg_print("Blood, Blood, Blood!");
+#endif
+                                               power = 2;
+                                       }
+                               }
+
+                               o_ptr->curse_flags |= get_curse(power, o_ptr);
+                       }
+
+                       p_ptr->update |= (PU_BONUS);
+                       add = FALSE;
+               }
+               break;
+
+       case 21:
+#ifdef JP
+               if (name) return "±Æ¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "±Æ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢Å¨¤Ë±Æ¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Cloak of shadow";
+               if (desc) return "Gives aura of shadow.";
+#endif
+               if (cast)
+               {
+                       object_type *o_ptr = &inventory[INVEN_OUTER];
+
+                       if (!o_ptr->k_idx)
+                       {
+#ifdef JP
+                               msg_print("¥¯¥í¡¼¥¯¤ò¿È¤Ë¤Ä¤±¤Æ¤¤¤Ê¤¤¡ª");
+#else
+                               msg_print("You don't ware any cloak.");
+#endif
+                               return NULL;
+                       }
+                       else if (!object_is_cursed(o_ptr))
+                       {
+#ifdef JP
+                               msg_print("¥¯¥í¡¼¥¯¤Ï¼ö¤ï¤ì¤Æ¤¤¤Ê¤¤¡ª");
+#else
+                               msg_print("Your cloak is not cursed.");
+#endif
+                               return NULL;
+                       }
+                       else
+                       {
+#ifdef JP
+                               msg_print("±Æ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤Ã¤¿¡£");
+#else
+                               msg_print("You have enveloped by shadow aura!");
+#endif
+                       }
+               }
+               if (cont)
+               {
+                       object_type *o_ptr = &inventory[INVEN_OUTER];
+
+                       if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
+                       {
+                               do_spell(REALM_HEX, spell, SPELL_STOP);
+                               p_ptr->magic_num1[0] &= ~(1L << spell);
+                               p_ptr->magic_num2[0]--;
+                               if (!p_ptr->magic_num2[0]) set_action(ACTION_NONE);
+                       }
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("±Æ¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Shadow aura disappeared.");
+#endif
+               }
+               break;
+
+       case 22:
+#ifdef JP
+               if (name) return "¶ìÄˤòËâÎϤË";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÀº¿À¥À¥á¡¼¥¸Í¿¤¨¡¢ËâÎϤòµÛ¤¤¼è¤ë¡£";
+#else
+               if (name) return "Pains to mana";
+               if (desc) return "Deals psychic damages to all monsters in sight, and drains some mana.";
+#endif
+               power = plev * 3 / 2;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_PSI_DRAIN, randint1(power));
+               }
+               break;
+
+       case 23:
+#ifdef JP
+               if (name) return "ÌܤˤÏÌܤò";
+               if (desc) return "ÂÇ·â¤äËâË¡¤Ç¼õ¤±¤¿¥À¥á¡¼¥¸¤ò¡¢¹¶·â¸µ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤âÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Eye for an eye";
+               if (desc) return "Returns same damage which you got to the monster which damaged you.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Éü½²¤·¤¿¤¤Íß˾¤Ë¤«¤é¤ì¤¿¡£");
+#else
+                       msg_print("You wish strongly you want to revenge anything.");
+#endif
+               }
+               break;
+
+       /*** 4th book (24-31) ***/
+       case 24:
+#ifdef JP
+               if (name) return "È¿Áý¿£·ë³¦";
+               if (desc) return "¤½¤Î³¬¤ÎÁý¿£¤¹¤ë¥â¥ó¥¹¥¿¡¼¤ÎÁý¿£¤òÁ˻ߤ¹¤ë¡£";
+#else
+               if (name) return "Anti multiply barrier";
+               if (desc) return "Obstructs all multiplying by monsters in entire floor.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Áý¿£¤òÁ˻ߤ¹¤ë¼ö¤¤¤ò¤«¤±¤¿¡£");
+#else
+                       msg_print("You feel anyone can not already multiply.");
+#endif
+               }
+               break;
+
+       case 25:
 #ifdef JP
-               if (name) return "Å·æÆζÁ®";
-               if (desc) return "»ë³¦Æâ¤Î¾ì½ê¤ò»ØÄꤷ¤Æ¡¢¤½¤Î¾ì½ê¤È¼«Ê¬¤Î´Ö¤Ë¤¤¤ëÁ´¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤·¡¢¤½¤Î¾ì½ê¤Ë°ÜÆ°¤¹¤ë¡£";
+               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.";
+               if (name) return "Restore life";
+               if (desc) return "Restores life energy and status.";
 #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("¼ºÇÔ¡ª");
+                       msg_print("À¸Ì¿ÎϤ¬Ìá¤ê»Ï¤á¤¿¡£");
 #else
-                               msg_print("You cannot move to that place!");
+                       msg_print("You feel your life energy starting to return.");
 #endif
-                               break;
+               }
+               if (cast || cont)
+               {
+                       bool flag = FALSE;
+                       int d = (p_ptr->max_exp - p_ptr->exp);
+                       int r = (p_ptr->exp / 20);
+                       int i;
+
+                       if (d > 0)
+                       {
+                               if (d < r)
+                                       p_ptr->exp = p_ptr->max_exp;
+                               else
+                                       p_ptr->exp += r;
+
+                               /* Check the experience */
+                               check_experience();
+
+                               flag = TRUE;
                        }
-                       if (p_ptr->anti_tele)
+                       for (i = A_STR; i < 6; i ++)
+                       {
+                               if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
+                               {
+                                       if (p_ptr->stat_cur[i] < 18)
+                                               p_ptr->stat_cur[i]++;
+                                       else
+                                               p_ptr->stat_cur[i] += 10;
+
+                                       if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
+                                               p_ptr->stat_cur[i] = p_ptr->stat_max[i];
+
+                                       /* Recalculate bonuses */
+                                       p_ptr->update |= (PU_BONUS);
+
+                                       flag = TRUE;
+                               }
+                       }
+
+                       if (!flag)
                        {
 #ifdef JP
-                               msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
+                               msg_format("%s¤Î¼öʸ¤Î±Ó¾§¤ò¤ä¤á¤¿¡£", do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
 #else
-                               msg_print("A mysterious force prevents you from teleporting!");
+                               msg_format("Finish casting '%^s'.", do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
 #endif
-       
-                               break;
+                               p_ptr->magic_num1[0] &= ~(1L << HEX_RESTORE);
+                               if (cont) p_ptr->magic_num2[0]--;
+                               if (p_ptr->magic_num2) p_ptr->action = ACTION_NONE;
+
+                               /* Redraw status */
+                               p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
+                               p_ptr->redraw |= (PR_EXTRA);
+
+                               return "";
                        }
-                       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:
+       case 26:
 #ifdef JP
-               if (name) return "Æó½Å¤Î·õ·â";
-               if (desc) return "1¥¿¡¼¥ó¤Ç2ÅÙ¹¶·â¤ò¹Ô¤¦¡£";
+               if (name) return "¼öÎϵۼý";
+               if (desc) return "¼ö¤ï¤ì¤¿Éð´ï¤Î¼ö¤¤¤òµÛ¼ý¤·¤ÆËâÎϤò²óÉü¤¹¤ë¡£";
 #else
-               if (name) return "Twin Slash";
-               if (desc) return "double attacks at a time.";
+               if (name) return "Drain curse power";
+               if (desc) return "Drains curse on your weapon and heals SP a little.";
 #endif
-    
                if (cast)
                {
-                       int x, y;
-       
-                       if (!get_rep_dir(&dir, FALSE)) return NULL;
+                       int item;
+                       char *s, *q;
+                       u32b f[TR_FLAG_SIZE];
+                       object_type *o_ptr;
 
-                       y = py + ddy[dir];
-                       x = px + ddx[dir];
+                       item_tester_hook = item_tester_hook_cursed;
+#ifdef JP
+                       q = "¤É¤ÎÁõÈ÷Éʤ«¤éµÛ¼ý¤·¤Þ¤¹¤«¡©";
+                       s = "¼ö¤ï¤ì¤¿¥¢¥¤¥Æ¥à¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which cursed equipment do you drain mana from?";
+                       s = "You have no cursed equipment.";
+#endif
 
-                       if (cave[y][x].m_idx)
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_flags(o_ptr, f);
+
+                       p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
+                       if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
+                       if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
+
+                       if (o_ptr->curse_flags & TRC_PERMA_CURSE)
                        {
-                               py_attack(y, x, 0);
-                               if (cave[y][x].m_idx)
+                               /* Nothing */
+                       }
+                       else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                       {
+                               if (one_in_(7))
                                {
-                                       handle_stuff();
-                                       py_attack(y, x, 0);
+#ifdef JP
+                                       msg_print("¼ö¤¤¤òÁ´¤ÆµÛ¤¤¼è¤Ã¤¿¡£");
+#else
+                                       msg_print("Heavy curse vanished away.");
+#endif
+                                       o_ptr->curse_flags = 0L;
                                }
                        }
-                       else
+                       else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
                        {
 #ifdef JP
-       msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+                               msg_print("¼ö¤¤¤òÁ´¤ÆµÛ¤¤¼è¤Ã¤¿¡£");
 #else
-                               msg_print("You don't see any monster in this direction");
+                               msg_print("Curse vanished away.");
 #endif
-                               return NULL;
+                               o_ptr->curse_flags = 0L;
                        }
+
+                       add = FALSE;
                }
                break;
 
-       case TECH_SPEL_KOFUKU_ZETTOUSEI:
+       case 27:
 #ifdef JP
-               if (name) return "¸×ÉúÀäÅáÀª";
-               if (desc) return "¶¯ÎϤʹ¶·â¤ò¹Ô¤¤¡¢¶á¤¯¤Î¾ì½ê¤Ë¤â¸ú²Ì¤¬µÚ¤Ö¡£";
+               if (name) return "µÛ·ì¤Î¿Ï";
+               if (desc) return "µÛ·ì°À­¤Ç¹¶·â¤¹¤ë¡£";
 #else
-               if (name) return "Kofuku-Zettousei";
-               if (desc) return "Performs a powerful attack which even effect nearby monsters.";
+               if (name) return "Swords to vampires";
+               if (desc) return "Gives vampiric ability to your weapon.";
 #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("¤Ê¤¼¤«¹¶·â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¡£");
+                       msg_print("¤¢¤Ê¤¿¤ÎÉð´ï¤¬·ì¤òÍߤ·¤Æ¤¤¤ë¡£");
 #else
-                               msg_print("Something prevent you from attacking.");
+                       if (!empty_hands(FALSE))
+                               msg_print("Your weapons want more blood now.");
+                       else
+                               msg_print("Your weapon wants more blood now.");
 #endif
-                               return "";
-                       }
+               }
+               if (stop)
+               {
 #ifdef JP
-                       msg_print("Éð´ï¤òÂ礭¤¯¿¶¤ê²¼¤í¤·¤¿¡£");
+                       msg_print("Éð´ï¤Î³é˾¤¬¾Ã¤¨µî¤Ã¤¿¡£");
 #else
-                       msg_print("You swing your weapon downward.");
+                       msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
 #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:
+       case 28:
 #ifdef JP
-               if (name) return "·Ä±Àµ´Ç¦·õ";
-               if (desc) return "¼«Ê¬¤â¥À¥á¡¼¥¸¤ò¤¯¤é¤¦¤¬¡¢Áê¼ê¤ËÈó¾ï¤ËÂ礭¤Ê¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£¥¢¥ó¥Ç¥Ã¥É¤Ë¤ÏÆä˸ú²Ì¤¬¤¢¤ë¡£";
+               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.";
+               if (name) return "Word of stun";
+               if (desc) return "Stuns all monsters in your sight.";
+#endif
+               power = plev * 4;
+               if (info) return info_power(power);
+               if (cast || cont)
+               {
+                       stun_monsters(power);
+               }
+               break;
+
+       case 29:
+#ifdef JP
+               if (name) return "±Æ°ÜÆ°";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ÎÎ٤Υޥ¹¤Ë½Ö´Ö°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Moving into shadow";
+               if (desc) return "Teleports you close to a monster.";
 #endif
-    
                if (cast)
                {
-                       int y, x;
+                       int i, y, x, dir;
+                       bool flag;
 
-                       if (!get_rep_dir2(&dir)) return NULL;
-                       if (dir == 5) return NULL;
+                       for (i = 0; i < 3; i++)
+                       {
+                               if (!tgt_pt(&x, &y)) return FALSE;
 
-                       y = py + ddy[dir];
-                       x = px + ddx[dir];
+                               flag = FALSE;
 
-                       if (cave[y][x].m_idx)
-                               py_attack(y, x, HISSATSU_UNDEAD);
-                       else
-                       {
+                               for (dir = 0; dir < 8; dir++)
+                               {
+                                       int dy = y + ddy_ddd[dir];
+                                       int dx = x + ddx_ddd[dir];
+                                       if (dir == 5) continue;
+                                       if(cave[dy][dx].m_idx) flag = TRUE;
+                               }
+
+                               if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
+                                       (distance(y, x, py, px) > plev + 2))
+                               {
 #ifdef JP
-                               msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
+                                       msg_print("¤½¤³¤Ë¤Ï°ÜÆ°¤Ç¤­¤Ê¤¤¡£");
 #else
-                               msg_print("There is no monster.");
+                                       msg_print("Can not teleport to there.");
 #endif
-                               return NULL;
+                                       continue;
+                               }
+                               break;
+                       }
+
+                       if (flag && randint0(plev * plev / 2))
+                       {
+                               teleport_player_to(y, x, 0L);
                        }
+                       else
+                       {
 #ifdef JP
-                       take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), "·Ä±Àµ´Ç¦·õ¤ò»È¤Ã¤¿¾×·â", -1);
+                               msg_print("¤ª¤Ã¤È¡ª");
 #else
-                       take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), "exhaustion on using Keiun-Kininken", -1);
+                               msg_print("Oops!");
 #endif
+                               teleport_player(30, 0L);
+                       }
+
+                       add = FALSE;
                }
                break;
 
-       case TECH_SPEL_HARAKIRI:
+       case 30:
 #ifdef JP
-               if (name) return "ÀÚÊ¢";
-               if (desc) return "¡ÖÉð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£¡×";
+               if (name) return "È¿ËâË¡·ë³¦";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ÎËâË¡¤òÁ˳²¤¹¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
 #else
-               if (name) return "Harakiri";
-               if (desc) return "'Busido is found in death'";
+               if (name) return "Anti magic barrier";
+               if (desc) return "Obstructs all magic spell of monsters in your sight.";
 #endif
-
+               power = plev * 3 / 2;
+               if (info) return info_power(power);
                if (cast)
                {
-                       int i;
 #ifdef JP
-       if (!get_check("ËÜÅö¤Ë¼«»¦¤·¤Þ¤¹¤«¡©")) return NULL;
+                       msg_print("ËâË¡¤òËɤ°¼ö¤¤¤ò¤«¤±¤¿¡£");
 #else
-                       if (!get_check("Do you really want to commit suicide? ")) return NULL;
+                       msg_print("You feel anyone can not cast spells except you.");
 #endif
-                               /* Special Verification for suicide */
+               }
+               break;
+
+       case 31:
 #ifdef JP
-       prt("³Îǧ¤Î¤¿¤á '@' ¤ò²¡¤·¤Æ²¼¤µ¤¤¡£", 0, 0);
+               if (name) return "Éü½²¤ÎÀë¹ð";
+               if (desc) return "¿ô¥¿¡¼¥ó¸å¤Ë¤½¤ì¤Þ¤Ç¼õ¤±¤¿¥À¥á¡¼¥¸¤Ë±þ¤¸¤¿°ÒÎϤÎÃϹö¤Î¹å²Ð¤ÎÃƤòÊü¤Ä¡£";
 #else
-                       prt("Please verify SUICIDE by typing the '@' sign: ", 0, 0);
+               if (name) return "Revenge sentence";
+               if (desc) return "Fires  a ball of hell fire to try revenging after few turns.";
 #endif
-       
-                       flush();
-                       i = inkey();
-                       prt("", 0, 0);
-                       if (i != '@') return NULL;
-                       if (p_ptr->total_winner)
+               power = p_ptr->magic_num1[2];
+               if (info) return info_damage(0, 0, power);
+               if (cast)
+               {
+                       int r;
+                       int a = 3 - (p_ptr->pspeed - 100) / 10;
+                       r = 1 + randint1(2) + MAX(0, MIN(3, a));
+
+                       if (p_ptr->magic_num2[2] > 0)
                        {
-                               take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
-                               p_ptr->total_winner = TRUE;
+#ifdef JP
+                               msg_print("¤¹¤Ç¤ËÉü½²¤ÏÀë¹ðºÑ¤ß¤À¡£");
+#else
+                               msg_print("You already pronounced your revenge.");
+#endif
+                               return NULL;
                        }
-                       else
+
+                       p_ptr->magic_num2[1] = 2;
+                       p_ptr->magic_num2[2] = r;
+#ifdef JP
+                       msg_format("¤¢¤Ê¤¿¤ÏÉü½²¤òÀë¹ð¤·¤¿¡£¤¢¤È %d ¥¿¡¼¥ó¡£", r);
+#else
+                       msg_format("You pronounce your revenge. %d turns left.", r);
+#endif
+                       add = FALSE;
+               }
+               if (cont)
+               {
+                       p_ptr->magic_num2[2]--;
+
+                       if (p_ptr->magic_num2[2] <= 0)
                        {
+                               int dir;
+
+                               if (power)
+                               {
+                                       command_dir = 0;
+
+                                       do
+                                       {
 #ifdef JP
-                               msg_print("Éð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£");
-                               take_hit(DAMAGE_FORCE, 9999, "ÀÚÊ¢", -1);
+                                               msg_print("Éü½²¤Î»þ¤À¡ª");
 #else
-                               msg_print("Meaning of Bushi-do is found in the death.");
-                               take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
+                                               msg_print("Time to revenge!");
 #endif
+                                       }
+                                       while (!get_aim_dir(&dir));
+
+                                       fire_ball(GF_HELL_FIRE, dir, power, 1);
+
+                                       if (p_ptr->wizard)
+                                       {
+#ifdef JP
+                                               msg_format("%dÅÀ¤Î¥À¥á¡¼¥¸¤òÊÖ¤·¤¿¡£", power);
+#else
+                                               msg_format("You return %d damages.", power);
+#endif
+                                       }
+                               }
+                               else
+                               {
+#ifdef JP
+                                       msg_print("Éü½²¤¹¤ëµ¤¤¬¼º¤»¤¿¡£");
+#else
+                                       msg_print("You are not a mood to revenge.");
+#endif
+                               }
+                               p_ptr->magic_num1[2] = 0;
                        }
                }
                break;
        }
 
+       /* start casting */
+       if ((cast) && (add))
+       {
+               /* add spell */
+               p_ptr->magic_num1[0] |= 1L << (spell);
+               p_ptr->magic_num2[0]++;
+
+               if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
+       }
+
+       /* Redraw status */
+       if (!info)
+       {
+               p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
+               p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
+       }
+
        return "";
 }
+
+
+/*
+ * Do everything for each spell
+ */
+cptr do_spell(int realm, int spell, int mode)
+{
+       switch (realm)
+       {
+       case REALM_LIFE:     return do_life_spell(spell, mode);
+       case REALM_SORCERY:  return do_sorcery_spell(spell, mode);
+       case REALM_NATURE:   return do_nature_spell(spell, mode);
+       case REALM_CHAOS:    return do_chaos_spell(spell, mode);
+       case REALM_DEATH:    return do_death_spell(spell, mode);
+       case REALM_TRUMP:    return do_trump_spell(spell, mode);
+       case REALM_ARCANE:   return do_arcane_spell(spell, mode);
+       case REALM_CRAFT:    return do_craft_spell(spell, mode);
+       case REALM_DAEMON:   return do_daemon_spell(spell, mode);
+       case REALM_CRUSADE:  return do_crusade_spell(spell, mode);
+       case REALM_MUSIC:    return do_music_spell(spell, mode);
+       case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
+       case REALM_HEX:      return do_hex_spell(spell, mode);
+       }
+
+       return NULL;
+}