summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/abl-show.cc46
-rw-r--r--crawl-ref/source/acr.cc2
-rw-r--r--crawl-ref/source/delay.cc204
-rw-r--r--crawl-ref/source/delay.h1
-rw-r--r--crawl-ref/source/enum.h8
-rw-r--r--crawl-ref/source/initfile.cc1
-rw-r--r--crawl-ref/source/mon-util.cc4
-rw-r--r--crawl-ref/source/religion.cc4
-rw-r--r--crawl-ref/source/spells4.cc99
-rw-r--r--crawl-ref/source/spells4.h1
-rw-r--r--crawl-ref/source/spl-book.cc1
-rw-r--r--crawl-ref/source/spl-cast.cc4
-rw-r--r--crawl-ref/source/spl-data.h9
13 files changed, 229 insertions, 155 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc
index f37ccb2854..3d3e7f7adc 100644
--- a/crawl-ref/source/abl-show.cc
+++ b/crawl-ref/source/abl-show.cc
@@ -39,6 +39,7 @@
#include "abyss.h"
#include "beam.h"
#include "decks.h"
+#include "delay.h"
#include "effects.h"
#include "food.h"
#include "it_use2.h"
@@ -78,7 +79,7 @@ enum ability_flag_type
{
ABFLAG_NONE = 0x00000000,
ABFLAG_BREATH = 0x00000001, // ability uses DUR_BREATH_WEAPON
- ABFLAG_DELAY = 0x00000002, // ability has its own delay (ie glamour)
+ ABFLAG_DELAY = 0x00000002, // ability has its own delay (ie recite)
ABFLAG_PAIN = 0x00000004, // ability must hurt player (ie torment)
ABFLAG_EXHAUSTION = 0x00000008, // fails if you.exhausted
ABFLAG_INSTANT = 0x00000010, // doesn't take time to use
@@ -110,7 +111,7 @@ ability_type god_abilities[MAX_NUM_GODS][MAX_GOD_ABILITIES] =
{ ABIL_NON_ABILITY, ABIL_NON_ABILITY, ABIL_NON_ABILITY,
ABIL_NON_ABILITY, ABIL_NON_ABILITY },
// Zin
- { ABIL_NON_ABILITY, ABIL_ZIN_SMITING, ABIL_ZIN_REVITALISATION,
+ { ABIL_ZIN_RECITE, ABIL_ZIN_SMITING, ABIL_ZIN_REVITALISATION,
ABIL_NON_ABILITY, ABIL_ZIN_SANCTUARY },
// TSO
{ ABIL_TSO_REPEL_UNDEAD, ABIL_TSO_DIVINE_SHIELD, ABIL_TSO_ANNIHILATE_UNDEAD,
@@ -173,7 +174,6 @@ static const ability_def Ability_List[] =
// NON_ABILITY should always come first
{ ABIL_NON_ABILITY, "No ability", 0, 0, 0, 0, ABFLAG_NONE },
{ ABIL_SPIT_POISON, "Spit Poison", 0, 0, 40, 0, ABFLAG_BREATH },
- { ABIL_GLAMOUR, "Glamour", 5, 0, 40, 0, ABFLAG_DELAY },
{ ABIL_MAPPING, "Sense Surroundings", 0, 0, 30, 0, ABFLAG_NONE },
{ ABIL_TELEPORTATION, "Teleportation", 3, 0, 200, 0, ABFLAG_NONE },
@@ -232,6 +232,7 @@ static const ability_def Ability_List[] =
// INVOCATIONS:
// Zin
+ { ABIL_ZIN_RECITE, "Recite", 3, 0, 150, 0, ABFLAG_DELAY },
{ ABIL_ZIN_SMITING, "Smiting",
3, 0, 50, generic_cost::fixed(2), ABFLAG_NONE },
{ ABIL_ZIN_REVITALISATION, "Revitalisation", 0, 0, 100, 3, ABFLAG_NONE },
@@ -483,10 +484,6 @@ static talent get_talent(ability_type ability, bool check_confused)
break;
// begin species abilities - some are mutagenic, too {dlb}
- case ABIL_GLAMOUR:
- failure = 50 - (you.experience_level * 2);
- break;
-
case ABIL_SPIT_POISON:
failure = ((you.species == SP_NAGA) ? 20 : 40)
- 10 * you.mutation[MUT_SPIT_POISON]
@@ -635,6 +632,7 @@ static talent get_talent(ability_type ability, bool check_confused)
failure = 20 - (you.piety / 20) - (5 * you.skills[SK_INVOCATIONS]);
break;
+ case ABIL_ZIN_RECITE:
case ABIL_TSO_REPEL_UNDEAD:
case ABIL_KIKU_RECALL_UNDEAD_SLAVES:
case ABIL_BEOGH_RECALL_ORCISH_FOLLOWERS:
@@ -994,21 +992,6 @@ static bool do_ability(const ability_def& abil)
you.attribute[ ATTR_DELAYED_FIREBALL ] = 0;
break;
- case ABIL_GLAMOUR:
- if (you.duration[DUR_GLAMOUR])
- {
- canned_msg(MSG_CANNOT_DO_YET);
- return (false);
- }
-
- mpr("You use your Elvish wiles.");
-
- cast_glamour( 10 + random2(you.experience_level)
- + random2(you.experience_level) );
-
- you.duration[DUR_GLAMOUR] = 20 + random2avg(13, 3);
- break;
-
case ABIL_SPIT_POISON: // Naga + spit poison mutation
if (you.duration[DUR_BREATH_WEAPON])
{
@@ -1318,6 +1301,18 @@ static bool do_ability(const ability_def& abil)
break;
// INVOCATIONS:
+
+ case ABIL_ZIN_RECITE:
+ {
+ if (!check_recital_audience())
+ {
+ mpr("There's no-one here to preach to!");
+ return (false);
+ }
+ const int pow = (you.skills[SK_INVOCATIONS] + 12) * (50 + you.piety) / 600;
+ start_delay(DELAY_RECITE, 3, pow, you.hp);
+ break;
+ }
case ABIL_ZIN_SMITING:
if (your_spells( SPELL_SMITING, (2 + skill_bump(SK_INVOCATIONS)) * 6,
false ) == SPRET_ABORT)
@@ -1946,13 +1941,6 @@ std::vector<talent> your_talents( bool check_confused )
if (you.species == SP_MUMMY && you.experience_level >= 13)
add_talent(talents, ABIL_MUMMY_RESTORATION, check_confused);
- if ( ((you.species == SP_GREY_ELF && you.experience_level >= 5) ||
- (you.species == SP_HIGH_ELF && you.experience_level >= 15)) &&
- you.attribute[ATTR_TRANSFORMATION] == TRAN_NONE )
- {
- add_talent(talents, ABIL_GLAMOUR, check_confused);
- }
-
if (you.species == SP_NAGA)
{
add_talent(talents, you.mutation[MUT_BREATHE_POISON] ?
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index bad82f21bd..47712a1c81 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -2558,8 +2558,6 @@ static void decrement_durations()
if ( decrement_a_duration(DUR_STONESKIN, "Your skin feels tender.") )
you.redraw_armour_class = true;
- decrement_a_duration(DUR_GLAMOUR);
-
if ( decrement_a_duration(DUR_TELEPORT) )
{
// only to a new area of the abyss sometimes (for abyss teleports)
diff --git a/crawl-ref/source/delay.cc b/crawl-ref/source/delay.cc
index 9c2b744b7d..8aae771c2f 100644
--- a/crawl-ref/source/delay.cc
+++ b/crawl-ref/source/delay.cc
@@ -52,6 +52,140 @@ static void handle_run_delays(const delay_queue_item &delay);
static void handle_macro_delay();
static void finish_delay(const delay_queue_item &delay);
+// monster cannot be affected in these states
+static bool recite_mons_useless(const monsters *mon)
+{
+ return (mons_is_fleeing(mon)
+ || mons_is_sleeping(mon)
+ || mons_friendly(mon)
+ || mons_neutral(mon)
+ || mon->has_ench(ENCH_BERSERK));
+}
+
+static int recite_to_monsters(int x, int y, int pow, int turn)
+{
+ const int mon = mgrd[x][y];
+ if (mon == NON_MONSTER)
+ return (0);
+
+ monsters *mons = &menv[mon];
+
+ // monster must be intelligent
+ if (mons_intel(mons->type) < I_NORMAL)
+ return (0);
+
+ if (recite_mons_useless(mons))
+ return (0);
+
+ int attempt = 3 - turn;
+ bool bad_effect =
+ (mons_class_holiness(mon) == MH_DEMONIC? !one_chance_in(8)
+ : pow < random2(attempt*5));
+
+ // 50% chance nothing happens
+ if (bad_effect && coinflip())
+ return (0);
+
+ bool resist = check_mons_resist_magic(mons, pow);
+
+ if (bad_effect) // can still have positive effects
+ {
+ if (!resist)
+ {
+ if (one_chance_in(3) && mons->add_ench(mon_enchant(ENCH_CONFUSION,
+ 0, KC_YOU, (16 + random2avg(13, 2)) * 10)))
+ {
+ simple_monster_message(mons, " looks confused.");
+ return (1);
+ }
+ if (one_chance_in(4) && mons->add_ench(ENCH_FEAR))
+ {
+ simple_monster_message(mons, " turns to flee.");
+ return (1);
+ }
+ if (one_chance_in(4))
+ {
+ mons->put_to_sleep();
+ simple_monster_message(mons, " falls asleep!");
+ return (1);
+ }
+ }
+ if (one_chance_in(3) && mons->add_ench(mon_enchant(ENCH_HASTE, 0,
+ KC_YOU, (16 + random2avg(13, 2)) * 10)))
+ {
+ simple_monster_message(mons, " is annoyed!");
+ return (1);
+ }
+ if (mons->can_go_berserk()) // seriously annoyed now
+ {
+ mons->go_berserk(true);
+ return (1);
+ }
+ return (0); // no effect
+ }
+
+ if (resist)
+ {
+ simple_monster_message(mons, " resists!");
+ return (0);
+ }
+
+ switch (random2(pow))
+ {
+ default: // nothing happens
+ return (0);
+ case 6:
+ case 7:
+ if (mons->add_ench(ENCH_FEAR))
+ {
+ simple_monster_message(mons, " turns to flee.");
+ return (1);
+ }
+ break;
+ case 8:
+ case 9:
+ mons->put_to_sleep();
+ simple_monster_message(mons, " falls asleep!");
+ return (1);
+ case 10:
+ case 11:
+ case 12:
+ if (mons->add_ench(mon_enchant(ENCH_CONFUSION, 0, KC_YOU,
+ (16 + random2avg(13, 2)) * 10)))
+ {
+ simple_monster_message(mons, " looks confused.");
+ return (1);
+ }
+ break;
+ case 13:
+ case 14:
+ if (mons->add_ench(mon_enchant(ENCH_PARALYSIS, 0, KC_YOU,
+ (16 + random2avg(13, 2)) * 10)))
+ {
+ simple_monster_message(mons, " is paralyzed!");
+ return (1);
+ }
+ break;
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ if (mons->add_ench(ENCH_NEUTRAL))
+ {
+ simple_monster_message(mons, " seems impressed!");
+ return (1);
+ }
+ break;
+ case 19:
+ case 20:
+ mons->attitude = ATT_NEUTRAL; // but same message as above
+ simple_monster_message(mons, " seems impressed!");
+ return (1);
+ }
+
+ return (0);
+} // end recite_to_monsters()
+
// Returns true if this delay can act as a parent to other delays, i.e. if
// other delays can be spawned while this delay is running. If is_parent_delay
// returns true, new delays will be pushed immediately to the front of the
@@ -196,6 +330,11 @@ void stop_delay( void )
mpr( "You stop dropping stuff." );
pop_delay();
break;
+
+ case DELAY_RECITE:
+ mpr( "You stop reciting.");
+ pop_delay();
+ break;
case DELAY_RUN:
case DELAY_REST:
@@ -295,6 +434,39 @@ bool is_being_butchered(const item_def &item)
return (false);
}
+// check whether there are monsters who might be influenced by Recite
+bool check_recital_audience()
+{
+ int mid;
+ monsters *mons;
+
+ for (int x = you.x_pos - 8; x <= you.x_pos + 8; x++)
+ for (int y = you.y_pos - 8; y <= you.y_pos + 8; y++)
+ {
+ if (!in_bounds(x,y) || !see_grid(x, y))
+ continue;
+
+ mid = mgrd[x][y];
+ if (mid == NON_MONSTER)
+ continue;
+
+ mons = &menv[mid];
+
+ // can not be affected in these states
+ if (recite_mons_useless(mons))
+ continue;;
+
+ return (true);
+ }
+
+#ifdef DEBUG_DIAGNOSTICS
+ mpr(MSGCH_DIAGNOSTICS, "No audience found!");
+#endif
+
+ // Sorry, no audience found!
+ return (false);
+}
+
// Xom is amused by a potential food source going to waste, and is
// more amused the hungrier you are.
static void xom_check_corpse_waste()
@@ -333,6 +505,12 @@ void handle_delay( void )
case DELAY_PASSWALL:
mpr("You begin to meditate on the wall.", MSGCH_MULTITURN_ACTION);
break;
+ case DELAY_RECITE:
+ mprf(MSGCH_MULTITURN_ACTION,
+ "You begin to recite %s's Axioms of Law.",
+ god_name(GOD_ZIN).c_str());
+ apply_area_visible(recite_to_monsters, delay.parm1, delay.duration);
+ break;
default:
break;
}
@@ -429,6 +607,19 @@ void handle_delay( void )
}
}
+ if ( delay.type == DELAY_RECITE)
+ {
+
+ if (!check_recital_audience() // maybe no unaffected monsters in LOS?
+ || Options.hp_warning && you.hp*Options.hp_warning <= you.hp_max
+ && delay.parm2*Options.hp_warning > you.hp_max
+ || you.hp*2 < delay.parm2) // or significant health drop
+ {
+ stop_delay();
+ return;
+ }
+ }
+
// Handle delay:
if (delay.duration > 0)
{
@@ -464,6 +655,11 @@ void handle_delay( void )
mpr("You continue meditating on the rock.",
MSGCH_MULTITURN_ACTION);
break;
+ case DELAY_RECITE:
+ mpr("You continue reciting the Axioms of Law.",
+ MSGCH_MULTITURN_ACTION);
+ apply_area_visible(recite_to_monsters, delay.parm1, delay.duration);
+ break;
case DELAY_MULTIDROP:
drop_item( items_for_multidrop[0].slot,
items_for_multidrop[0].quantity,
@@ -563,6 +759,10 @@ static void finish_delay(const delay_queue_item &delay)
mpr( "You finish memorising." );
add_spell_to_memory( static_cast<spell_type>( delay.parm1 ) );
break;
+
+ case DELAY_RECITE:
+ mpr( "You finish reciting the Axioms of Law." );
+ break;
case DELAY_PASSWALL:
{
@@ -1289,8 +1489,8 @@ static const char *delay_names[] =
{
"not_delayed", "eat", "armour_on", "armour_off", "jewellery_on",
"memorise", "butcher", "weapon_swap", "passwall",
- "drop_item", "multidrop", "ascending_stairs", "descending_stairs", "run",
- "rest", "travel", "macro", "interruptible", "uninterruptible",
+ "drop_item", "multidrop", "ascending_stairs", "descending_stairs", "recite",
+ "run", "rest", "travel", "macro", "interruptible", "uninterruptible",
};
// Gets a delay given its name.
diff --git a/crawl-ref/source/delay.h b/crawl-ref/source/delay.h
index 81e14807f0..5168d12574 100644
--- a/crawl-ref/source/delay.h
+++ b/crawl-ref/source/delay.h
@@ -74,6 +74,7 @@ void start_delay( delay_type type, int turns, int parm1 = 0, int parm2 = 0 );
void stop_delay( void );
bool you_are_delayed( void );
delay_type current_delay_action( void );
+bool check_recital_audience( void );
void handle_delay( void );
bool is_run_delay(int delay);
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index c70edd1b95..fd5f87287d 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -36,7 +36,6 @@ enum ability_type
{
ABIL_NON_ABILITY = -1,
ABIL_SPIT_POISON = 1, // 1
- ABIL_GLAMOUR,
ABIL_MAPPING,
ABIL_TELEPORTATION,
ABIL_BREATHE_FIRE, // 5
@@ -75,7 +74,8 @@ enum ability_type
ABIL_END_TRANSFORMATION, // 55
// Divine abilities
- ABIL_ZIN_SMITING = 110, // 110
+ ABIL_ZIN_RECITE = 110, // 110
+ ABIL_ZIN_SMITING,
ABIL_ZIN_REVITALISATION,
ABIL_ZIN_SANCTUARY,
ABIL_TSO_REPEL_UNDEAD = 120, // 120
@@ -704,6 +704,7 @@ enum delay_type
DELAY_MULTIDROP,
DELAY_ASCENDING_STAIRS,
DELAY_DESCENDING_STAIRS,
+ DELAY_RECITE, // Zin's Recite invocation
// [dshaligram] Shift-running, resting, travel and macros are now
// also handled as delays.
@@ -1075,7 +1076,6 @@ enum duration_type
DUR_SEE_INVISIBLE,
DUR_WEAPON_BRAND, // general "branding" spell counter
DUR_SILENCE,
- DUR_GLAMOUR,
DUR_CONDENSATION_SHIELD,
DUR_STONESKIN,
DUR_REPEL_UNDEAD,
@@ -1122,6 +1122,7 @@ enum enchant_type
ENCH_FATIGUE, // Post-berserk fatigue.
ENCH_HELD, // caught in a net
ENCH_BATTLE_FRENZY, // Monster is in a battle frenzy
+ ENCH_NEUTRAL,
NUM_ENCHANTMENTS
};
@@ -2512,7 +2513,6 @@ enum spell_type
SPELL_BEND,
SPELL_BACKLIGHT,
SPELL_INTOXICATE, // confusion but only "smart" creatures
- SPELL_GLAMOUR, // charm/confuse/sleep but only "smart" creatures 190
SPELL_EVAPORATE, // turn a potion into a cloud
SPELL_ERINGYAS_SURPRISING_BOUQUET, // turn sticks into herbivore food
SPELL_FRAGMENTATION, // replacement for "orb of frag"
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index b9dd3f493e..c4530e341a 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -479,6 +479,7 @@ void game_options::set_default_activity_interrupts()
// the delay will just trash all queued delays, including travel.
"interrupt_ascending_stairs =",
"interrupt_descending_stairs =",
+ "interrupt_recite = teleport",
"interrupt_uninterruptible =",
"interrupt_weapon_swap =",
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index c573acfb6c..aeb0c84bba 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -1788,7 +1788,7 @@ bool mons_friendly(const monsters *m)
bool mons_neutral(const monsters *m)
{
- return (m->attitude == ATT_NEUTRAL);
+ return (m->attitude == ATT_NEUTRAL || m->has_ench(ENCH_NEUTRAL));
}
mon_attitude_type mons_attitude(const monsters *m)
@@ -4338,7 +4338,7 @@ void monsters::timeout_enchantments(int levels)
case ENCH_SLOW: case ENCH_HASTE: case ENCH_FEAR:
case ENCH_INVIS: case ENCH_CHARM: case ENCH_SLEEP_WARY:
case ENCH_SICK: case ENCH_SLEEPY: case ENCH_PARALYSIS:
- case ENCH_BATTLE_FRENZY:
+ case ENCH_BATTLE_FRENZY: case ENCH_NEUTRAL:
lose_ench_levels(i->second, levels);
break;
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 9146cea387..12ba52fc84 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -189,7 +189,7 @@ const char* god_gain_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
// no god
{ "", "", "", "", "" },
// Zin
- { "",
+ { "recite Zin's Axioms of Law",
"smite your foes",
"call upon Zin for revitalisation",
"",
@@ -274,7 +274,7 @@ const char* god_lose_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
// no god
{ "", "", "", "", "" },
// Zin
- { "",
+ { "recite Zin's Axioms of Law",
"smite your foes",
"call upon Zin for revitalisation",
"",
diff --git a/crawl-ref/source/spells4.cc b/crawl-ref/source/spells4.cc
index 02ffc88846..c2832fc7c5 100644
--- a/crawl-ref/source/spells4.cc
+++ b/crawl-ref/source/spells4.cc
@@ -1519,105 +1519,6 @@ void cast_intoxicate(int pow)
apply_area_visible(intoxicate_monsters, pow);
} // end cast_intoxicate()
-// intended as a high-level Elven (a)bility
-static int glamour_monsters(int x, int y, int pow, int garbage)
-{
- UNUSED( garbage );
-
- int mon = mgrd[x][y];
-
- // Power in this function is already limited by a function of
- // experience level (10 + level / 2) since it's only an ability,
- // never an actual spell. -- bwr
-
- if (mon == NON_MONSTER)
- return (0);
-
- if (one_chance_in(5))
- return (0);
-
- if (mons_intel(menv[mon].type) < I_NORMAL)
- return (0);
-
- if (mons_class_holiness(mon) != MH_NATURAL)
- return (0);
-
- if (!mons_is_humanoid( menv[mon].type ))
- return (0);
-
- const char show_char = mons_char( menv[mon].type );
-
- // gargoyles are immune.
- if (menv[mon].type == MONS_GARGOYLE
- || menv[mon].type == MONS_METAL_GARGOYLE
- || menv[mon].type == MONS_MOLTEN_GARGOYLE)
- {
- return (0);
- }
-
- // orcs resist thru hatred of elves
- // elves resist cause they're elves
- // boggarts are malevolent highly magical wee-folk
- if (show_char == 'o' || show_char == 'e' || menv[mon].type == MONS_BOGGART)
- pow = (pow / 2) + 1;
-
- if (check_mons_resist_magic(&menv[mon], pow))
- return (0);
-
- switch (random2(6))
- {
- case 0:
- menv[mon].add_ench(ENCH_FEAR);
- break;
- case 1:
- case 4:
- menv[mon].add_ench(mon_enchant(ENCH_CONFUSION, 0, KC_YOU));
- break;
- case 2:
- case 5:
- menv[mon].add_ench(ENCH_CHARM);
- break;
- case 3:
- menv[mon].behaviour = BEH_SLEEP;
- break;
- }
-
- // why no, there's no message as to which effect happened >:^)
- if (!one_chance_in(4))
- {
- std::string msg = menv[mon].name(DESC_CAP_THE);
-
- switch (random2(4))
- {
- case 0:
- msg += " looks dazed.";
- break;
- case 1:
- msg += " blinks several times.";
- break;
- case 2:
- msg += " rubs its eye";
- if (menv[mon].type != MONS_CYCLOPS &&
- menv[mon].type != MONS_POLYPHEMUS)
- msg += "s";
- msg += ".";
- break;
- case 3:
- msg += " tilts its head.";
- break;
- }
-
- mpr(msg.c_str());
- }
-
- return (1);
-} // end glamour_monsters()
-
-void cast_glamour(int pow)
-{
- apply_area_visible(glamour_monsters, pow);
-} // end cast_glamour()
-
bool backlight_monsters(int x, int y, int pow, int garbage)
{
UNUSED( pow );
diff --git a/crawl-ref/source/spells4.h b/crawl-ref/source/spells4.h
index f807104e3d..e0ee9d40b9 100644
--- a/crawl-ref/source/spells4.h
+++ b/crawl-ref/source/spells4.h
@@ -37,7 +37,6 @@ void cast_twist(int powc);
void cast_far_strike(int powc);
void cast_swap(int powc);
int cast_apportation(int powc);
-void cast_glamour(int pow);
void cast_ignite_poison(int pow);
void cast_intoxicate(int pow);
void cast_mass_sleep(int pow);
diff --git a/crawl-ref/source/spl-book.cc b/crawl-ref/source/spl-book.cc
index f5953b0fd6..be9bf4069d 100644
--- a/crawl-ref/source/spl-book.cc
+++ b/crawl-ref/source/spl-book.cc
@@ -1116,7 +1116,6 @@ bool undead_cannot_memorise(spell_type spell, char being)
case SPELL_CURE_POISON_II:
case SPELL_DEATHS_DOOR:
case SPELL_DRAGON_FORM:
- case SPELL_GLAMOUR:
case SPELL_ICE_FORM:
case SPELL_INTOXICATE:
case SPELL_NECROMUTATION:
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index d719feabde..dab3229a35 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1829,10 +1829,6 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
cast_intoxicate(powc);
break;
- case SPELL_GLAMOUR:
- cast_glamour(powc);
- break;
-
case SPELL_EVAPORATE:
if ( !cast_evaporate(powc, beam, potion) )
return SPRET_ABORT;
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index ed15d675f4..d61bd51498 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -1978,15 +1978,6 @@
},
{
- SPELL_GLAMOUR, "Glamour",
- SPTYP_ENCHANTMENT,
- SPFLAG_NONE,
- 5,
- 200,
- NULL
-},
-
-{
SPELL_EVAPORATE, "Evaporate",
SPTYP_FIRE | SPTYP_TRANSMIGRATION,
SPFLAG_DIR_OR_TARGET,