summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/mon-util.cc36
-rw-r--r--crawl-ref/source/monstuff.cc27
-rw-r--r--crawl-ref/source/spl-cast.h5
-rw-r--r--crawl-ref/source/spl-data.h419
-rw-r--r--crawl-ref/source/spl-util.cc31
-rw-r--r--crawl-ref/source/spl-util.h3
6 files changed, 319 insertions, 202 deletions
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index a16cc59a97..6c794f77eb 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -2333,34 +2333,46 @@ bool ms_useful_fleeing_out_of_sight( const monsters *mon, spell_type monspell )
bool ms_low_hitpoint_cast( const monsters *mon, spell_type monspell )
{
- bool ret = false;
- bool targ_adj = false;
+ bool ret = false;
+ bool targ_adj = false;
+ bool targ_sanct = false;
if (mon->foe == MHITYOU || mon->foe == MHITNOT)
{
if (adjacent(you.x_pos, you.y_pos, mon->x, mon->y))
targ_adj = true;
+ if (is_sanctuary(you.x_pos, you.y_pos))
+ targ_sanct = true;
}
- else if (adjacent( menv[mon->foe].x, menv[mon->foe].y, mon->x, mon->y ))
+ else
{
- targ_adj = true;
+ if (adjacent( menv[mon->foe].x, menv[mon->foe].y, mon->x, mon->y ))
+ targ_adj = true;
+ if (is_sanctuary( menv[mon->foe].x, menv[mon->foe].y ))
+ targ_sanct = true;
}
switch (monspell)
{
+ case SPELL_TELEPORT_OTHER:
+ ret = !targ_sanct;
+ break;
+
case SPELL_TELEPORT_SELF:
// Don't cast again if already about to teleport.
if (mon->has_ench(ENCH_TP))
return (false);
// intentional fall-through
- case SPELL_TELEPORT_OTHER:
case SPELL_LESSER_HEALING:
case SPELL_GREATER_HEALING:
ret = true;
break;
- case SPELL_BLINK:
case SPELL_BLINK_OTHER:
+ if (targ_sanct)
+ return (false);
+ // intentional fall-through
+ case SPELL_BLINK:
if (targ_adj)
ret = true;
break;
@@ -2412,6 +2424,18 @@ bool ms_waste_of_time( const monsters *mon, spell_type monspell )
return (true);
}
+ if (!mons_friendly(mon) && !mons_good_neutral(mon))
+ {
+ if (spell_harms_area(monspell) && env.sanctuary_time > 0)
+ return (true);
+
+ if (spell_harms_target(monspell)
+ && is_sanctuary(mon->target_x, mon->target_y))
+ {
+ return (true);
+ }
+ }
+
// Eventually, we'll probably want to be able to have monsters
// learn which of their elemental bolts were resisted and have those
// handled here as well. -- bwr
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index b3f1aac6f5..554395e427 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -5045,6 +5045,15 @@ static bool _handle_spell(monsters *monster, bolt &beem)
bool finalAnswer = false; // as in: "Is that your...?" {dlb}
const spell_type draco_breath = _get_draconian_breath_spell(monster);
+ if (is_sanctuary(monster->x, monster->y))
+ {
+ if (!mons_friendly(monster)
+ && !mons_good_neutral(monster))
+ {
+ return (false);
+ }
+ }
+
// Yes, there is a logic to this ordering {dlb}:
if (mons_is_sleeping(monster)
|| monster->has_ench(ENCH_SUBMERGED)
@@ -5206,6 +5215,7 @@ static bool _handle_spell(monsters *monster, bolt &beem)
{
bool spellOK = false;
+
// Setup spell - monsters that are fleeing or leaving
// the level will always try to choose their emergency
// spell.
@@ -5214,10 +5224,6 @@ static bool _handle_spell(monsters *monster, bolt &beem)
spell_cast = (one_chance_in(5) ? SPELL_NO_SPELL
: hspell_pass[5]);
}
- else if (_is_player_or_mon_sanct(monster))
- {
- return (false);
- }
else
{
// Randomly picking one of the non-emergency spells:
@@ -5243,9 +5249,7 @@ static bool _handle_spell(monsters *monster, bolt &beem)
// All direct-effect/summoning/self-enchantments/etc.
spellOK = true;
- if (_is_player_or_mon_sanct(monster))
- spellOK = false;
- else if (ms_direct_nasty(spell_cast)
+ if (ms_direct_nasty(spell_cast)
&& mons_aligned(monster_index(monster),
monster->foe))
{
@@ -5288,13 +5292,8 @@ static bool _handle_spell(monsters *monster, bolt &beem)
// If not okay, then maybe we'll cast a defensive spell.
if (!spellOK)
{
- if (_is_player_or_mon_sanct(monster))
- spell_cast = SPELL_NO_SPELL;
- else
- {
- spell_cast = (coinflip() ? hspell_pass[2]
- : SPELL_NO_SPELL);
- }
+ spell_cast = (coinflip() ? hspell_pass[2]
+ : SPELL_NO_SPELL);
}
if (spell_cast != SPELL_NO_SPELL)
diff --git a/crawl-ref/source/spl-cast.h b/crawl-ref/source/spl-cast.h
index 036f99045f..5c891a0a38 100644
--- a/crawl-ref/source/spl-cast.h
+++ b/crawl-ref/source/spl-cast.h
@@ -28,7 +28,10 @@ enum spflag_type
SPFLAG_NEUTRAL = 0x0020, // TARG_ANY used
SPFLAG_NOT_SELF = 0x0040, // aborts on isMe
SPFLAG_UNHOLY = 0x0080, // counts at "unholy"
- SPFLAG_MAPPING = 0x0100 // a mapping spell of some kind
+ SPFLAG_MAPPING = 0x0100, // a mapping spell of some kind
+ SPFLAG_ESCAPE = 0x0200, // useful for running away
+ SPFLAG_RECOVERY = 0x0400, // healing or recovery spell
+ SPFLAG_AREA = 0x0800 // area affect
};
enum spret_type
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index 98dffe7970..ab1e212de9 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -143,18 +143,18 @@
{
SPELL_TELEPORT_SELF, "Teleport Self",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
5,
0,
NULL,
false,
- false
+ true
},
{
SPELL_CAUSE_FEAR, "Cause Fear",
SPTYP_ENCHANTMENT,
- SPFLAG_NONE,
+ SPFLAG_AREA,
5,
200,
NULL,
@@ -235,7 +235,8 @@
1,
25,
NULL,
- true
+ true,
+ false
},
{
@@ -245,7 +246,8 @@
3,
100,
NULL,
- true
+ true,
+ false
},
{
@@ -256,7 +258,7 @@
0,
NULL,
false,
- false
+ true
},
{
@@ -266,7 +268,8 @@
1,
25,
NULL,
- true
+ true,
+ false
},
{
@@ -298,7 +301,8 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -308,7 +312,8 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -318,7 +323,8 @@
5,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -328,7 +334,8 @@
5,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -338,7 +345,8 @@
5,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -348,7 +356,8 @@
3,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -371,7 +380,8 @@
4,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -381,7 +391,8 @@
4,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -391,7 +402,8 @@
3,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -412,7 +424,8 @@
2,
50,
NULL,
- true
+ true,
+ false
},
{
@@ -422,44 +435,47 @@
2,
50,
NULL,
- true
+ true,
+ false
},
{
SPELL_CONTROLLED_BLINK, "Controlled Blink",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
7,
0,
NULL,
false,
- false
+ true
},
{
SPELL_FREEZING_CLOUD, "Freezing Cloud",
SPTYP_CONJURATION | SPTYP_ICE | SPTYP_AIR,
- SPFLAG_GRID,
+ SPFLAG_GRID | SPFLAG_AREA,
7,
200,
"Where do you want to put it?",
- true
+ true,
+ false
},
{
SPELL_MEPHITIC_CLOUD, "Mephitic Cloud",
SPTYP_CONJURATION | SPTYP_POISON | SPTYP_AIR,
- SPFLAG_DIR_OR_TARGET,
+ SPFLAG_DIR_OR_TARGET | SPFLAG_AREA,
3,
200,
NULL,
- true
+ true,
+ false
},
{
SPELL_RING_OF_FLAMES, "Ring of Flames",
SPTYP_ENCHANTMENT | SPTYP_FIRE,
- SPFLAG_NONE,
+ SPFLAG_AREA,
8,
200,
NULL,
@@ -470,34 +486,34 @@
{
SPELL_RESTORE_STRENGTH, "Restore Strength",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
2,
0,
NULL,
false,
- false
+ true
},
{
SPELL_RESTORE_INTELLIGENCE, "Restore Intelligence",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
2,
0,
NULL,
false,
- false
+ true
},
{
SPELL_RESTORE_DEXTERITY, "Restore Dexterity",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
2,
0,
NULL,
false,
- false
+ true
},
{
@@ -507,33 +523,36 @@
5,
200,
NULL,
- true
+ true,
+ false
},
{
SPELL_OLGREBS_TOXIC_RADIANCE, "Olgreb's Toxic Radiance",
SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_AREA,
4,
0,
NULL,
- true
+ true,
+ false
},
{
SPELL_TELEPORT_OTHER, "Teleport Other",
SPTYP_TRANSLOCATION,
- SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF,
+ SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF | SPFLAG_ESCAPE,
4,
200,
NULL,
- true
+ true,
+ false
},
{
SPELL_LESSER_HEALING, "Lesser Healing",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
2,
0,
NULL,
@@ -544,34 +563,34 @@
{
SPELL_GREATER_HEALING, "Greater Healing",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
6,
0,
NULL,
false,
- false
+ true
},
{
SPELL_CURE_POISON_I, "Cure Poison",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
3,
200,
NULL,
false,
- false
+ true
},
{
SPELL_PURIFICATION, "Purification",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
5,
0,
NULL,
false,
- false
+ true
},
{
@@ -593,13 +612,13 @@
0,
NULL,
false,
- false
+ true
},
{
SPELL_MASS_CONFUSION, "Mass Confusion",
SPTYP_ENCHANTMENT,
- SPFLAG_NONE,
+ SPFLAG_AREA,
6,
200,
NULL,
@@ -621,7 +640,7 @@
{
SPELL_REPEL_UNDEAD, "Repel Undead",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_AREA,
3,
0,
NULL,
@@ -632,7 +651,7 @@
{
SPELL_HOLY_WORD, "Holy Word",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_AREA,
7,
0,
NULL,
@@ -648,7 +667,7 @@
0,
NULL,
false,
- false
+ true
},
{
@@ -665,7 +684,7 @@
{
SPELL_ABJURATION_I, "Abjuration",
SPTYP_SUMMONING,
- SPFLAG_NONE,
+ SPFLAG_AREA | SPFLAG_NEUTRAL,
3,
200,
NULL,
@@ -692,7 +711,7 @@
150,
NULL,
false,
- false
+ true
},
{
@@ -702,7 +721,8 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -712,7 +732,8 @@
8,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -722,27 +743,30 @@
3,
1000,
NULL,
- true
+ true,
+ false
},
{
SPELL_POISONOUS_CLOUD, "Poisonous Cloud",
SPTYP_CONJURATION | SPTYP_POISON | SPTYP_AIR,
- SPFLAG_GRID,
+ SPFLAG_GRID | SPFLAG_AREA,
6,
200,
"Where do you want to put it?",
- true
+ true,
+ false
},
{
SPELL_FIRE_STORM, "Fire Storm",
SPTYP_CONJURATION | SPTYP_FIRE,
- SPFLAG_GRID,
+ SPFLAG_GRID | SPFLAG_AREA,
9,
200,
"Where?",
- true
+ true,
+ false
},
{
@@ -753,13 +777,13 @@
50,
NULL,
false,
- false
+ true
},
{
SPELL_BLINK, "Blink",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
2,
0,
NULL,
@@ -776,7 +800,8 @@
4,
100,
NULL,
- true
+ true,
+ false
},
{
@@ -808,7 +833,8 @@
4,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -819,7 +845,7 @@
45,
NULL,
false,
- false
+ true
},
{
@@ -830,13 +856,13 @@
100,
NULL,
true,
- false
+ true
},
{
SPELL_ANIMATE_DEAD, "Animate Dead",
SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_AREA | SPFLAG_NEUTRAL,
4,
0,
NULL,
@@ -851,7 +877,8 @@
1,
25,
NULL,
- true
+ true,
+ false
},
{
@@ -862,7 +889,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -883,7 +910,7 @@
0,
NULL,
false,
- false
+ true
},
{
@@ -916,7 +943,7 @@
50,
NULL,
false,
- false
+ true
},
{
@@ -927,13 +954,13 @@
200,
NULL,
false,
- false
+ true
},
{
SPELL_BURN, "Burn", // used by wanderers
SPTYP_FIRE,
- SPFLAG_NONE,
+ SPFLAG_DIR,
1,
25,
NULL,
@@ -944,7 +971,7 @@
{
SPELL_FREEZE, "Freeze",
SPTYP_ICE,
- SPFLAG_NONE,
+ SPFLAG_DIR,
1,
25,
NULL,
@@ -966,11 +993,12 @@
{
SPELL_OZOCUBUS_REFRIGERATION, "Ozocubu's Refrigeration",
SPTYP_ICE,
- SPFLAG_NONE,
+ SPFLAG_AREA,
5,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -980,7 +1008,8 @@
4,
100,
NULL,
- true
+ true,
+ false
},
{
@@ -1045,7 +1074,8 @@
4,
100,
NULL,
- true
+ true,
+ false
},
{
@@ -1077,7 +1107,8 @@
6, // why is this the only holy spell with a secondary? {dlb}
200,
NULL,
- true
+ true,
+ false
}
,
@@ -1088,7 +1119,8 @@
8,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1116,7 +1148,7 @@
{
SPELL_ABJURATION_II, "Abjuration",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_AREA | SPFLAG_NEUTRAL,
4,
200,
NULL,
@@ -1132,7 +1164,7 @@
50,
NULL,
false,
- false
+ true
},
{
@@ -1142,7 +1174,8 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1153,7 +1186,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1164,7 +1197,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1174,7 +1207,8 @@
3,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1184,7 +1218,8 @@
4,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1205,7 +1240,8 @@
1,
25,
NULL,
- true
+ true,
+ false
},
{
@@ -1216,7 +1252,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1237,7 +1273,8 @@
9,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1276,7 +1313,7 @@
{
SPELL_CORPSE_ROT, "Corpse Rot",
SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_AREA | SPFLAG_NEUTRAL,
2,
0,
NULL,
@@ -1292,7 +1329,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1303,7 +1340,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1314,7 +1351,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1325,7 +1362,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1346,7 +1383,8 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1356,7 +1394,8 @@
3,
50,
NULL,
- true
+ true,
+ false
},
{
@@ -1379,7 +1418,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1389,7 +1428,8 @@
1,
25,
NULL,
- true
+ true,
+ false
},
{
@@ -1400,7 +1440,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1411,7 +1451,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1422,7 +1462,7 @@
200,
NULL,
false,
- false
+ true
},
{
@@ -1432,7 +1472,8 @@
7,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -1449,56 +1490,56 @@
{
SPELL_CURE_POISON_II, "Cure Poison",
SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_RECOVERY | SPFLAG_HELPFUL,
2,
200,
NULL,
false,
- false
+ true
},
{
SPELL_CONTROL_TELEPORT, "Control Teleport",
SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
200,
NULL,
false,
- false
+ true
},
{
SPELL_POISON_AMMUNITION, "Poison Ammunition",
SPTYP_ENCHANTMENT | SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
0,
NULL,
false,
- false
+ true
},
{
SPELL_POISON_WEAPON, "Poison Weapon",
SPTYP_ENCHANTMENT | SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
0,
NULL,
false,
- false
+ true
},
{
SPELL_RESIST_POISON, "Resist Poison",
SPTYP_ENCHANTMENT | SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
200,
NULL,
false,
- false
+ true
},
{
@@ -1542,18 +1583,18 @@
0,
NULL,
false,
- false
+ true
},
{
SPELL_PORTAL, "Portal",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
7,
0,
NULL,
false,
- false
+ true
},
{
@@ -1570,12 +1611,12 @@
{
SPELL_SPIDER_FORM, "Spider Form",
SPTYP_TRANSMIGRATION | SPTYP_POISON,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
3,
200,
NULL,
false,
- false
+ true
},
{
@@ -1596,79 +1637,80 @@
6,
200,
NULL,
- true
+ true,
+ false
},
{
SPELL_BLADE_HANDS, "Blade Hands",
SPTYP_TRANSMIGRATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
5, // only removes weapon, so I raised this from 4 -- bwr
200,
NULL,
false,
- false
+ true
},
{
SPELL_STATUE_FORM, "Statue Form",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
6,
200,
NULL,
false,
- false
+ true
},
{
SPELL_ICE_FORM, "Ice Form",
SPTYP_ICE | SPTYP_TRANSMIGRATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4, // doesn't allow for equipment, so I lowered this from 5 -- bwr
200,
NULL,
false,
- false
+ true
},
{
SPELL_DRAGON_FORM, "Dragon Form",
SPTYP_FIRE | SPTYP_TRANSMIGRATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
8,
200,
NULL,
false,
- false
+ true
},
{
SPELL_NECROMUTATION, "Necromutation",
SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
8,
200,
NULL,
false,
- false
+ true
},
{
SPELL_DEATH_CHANNEL, "Death Channel",
SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
9,
200,
NULL,
false,
- false
+ true
},
{
SPELL_SYMBOL_OF_TORMENT, "Symbol of Torment",
SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_AREA,
6,
0,
NULL,
@@ -1679,12 +1721,12 @@
{
SPELL_DEFLECT_MISSILES, "Deflect Missiles",
SPTYP_ENCHANTMENT | SPTYP_AIR,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
6,
200,
NULL,
false,
- false
+ true
},
{
@@ -1710,17 +1752,18 @@
{
SPELL_ICE_STORM, "Ice Storm",
SPTYP_CONJURATION | SPTYP_ICE,
- SPFLAG_DIR_OR_TARGET,
+ SPFLAG_DIR_OR_TARGET | SPFLAG_AREA,
9,
200,
NULL,
- true
+ true,
+ false
},
{
SPELL_ARC, "Arc",
SPTYP_AIR,
- SPFLAG_NONE,
+ SPFLAG_DIR,
1,
25,
NULL,
@@ -1746,6 +1789,7 @@
5,
0,
NULL,
+ false,
false
},
@@ -1763,12 +1807,12 @@
{
SPELL_SURE_BLADE, "Sure Blade",
SPTYP_ENCHANTMENT,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
2,
200,
NULL,
false,
- false
+ true
},
{
@@ -1785,18 +1829,18 @@
{
SPELL_PASSWALL, "Passwall",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
3,
200,
NULL,
false,
- false
+ true
},
{
SPELL_IGNITE_POISON, "Ignite Poison",
SPTYP_FIRE | SPTYP_TRANSMIGRATION,
- SPFLAG_NONE,
+ SPFLAG_AREA,
6,
200,
NULL,
@@ -1840,7 +1884,7 @@
{
SPELL_TAME_BEASTS, "Tame Beasts",
SPTYP_ENCHANTMENT,
- SPFLAG_NONE,
+ SPFLAG_AREA,
5,
200,
NULL,
@@ -1855,13 +1899,14 @@
2,
56,
NULL,
- true
+ true,
+ false
},
{
SPELL_MASS_SLEEP, "Metabolic Englaciation",
SPTYP_ENCHANTMENT | SPTYP_ICE,
- SPFLAG_NONE,
+ SPFLAG_AREA,
7,
200,
NULL,
@@ -1877,7 +1922,7 @@
0,
NULL,
false,
- false
+ true
},
{
@@ -1888,29 +1933,29 @@
200,
NULL,
false,
- false
+ true
},
{
SPELL_SEE_INVISIBLE, "See Invisible",
SPTYP_ENCHANTMENT | SPTYP_DIVINATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
200,
NULL,
false,
- false
+ true
},
{
SPELL_FORESCRY, "Forescry",
SPTYP_DIVINATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
5,
200,
NULL,
false,
- false
+ true
},
{
@@ -1927,18 +1972,18 @@
{
SPELL_WARP_BRAND, "Warp Weapon",
SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
7, // this is high for a reason - Warp brands are very powerful.
0,
NULL,
false,
- false
+ true
},
{
SPELL_SILENCE, "Silence",
SPTYP_ENCHANTMENT | SPTYP_AIR,
- SPFLAG_NONE,
+ SPFLAG_AREA,
5,
200,
NULL,
@@ -1949,7 +1994,7 @@
{
SPELL_SHATTER, "Shatter",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
- SPFLAG_NONE,
+ SPFLAG_AREA,
9,
200,
NULL,
@@ -1960,7 +2005,7 @@
{
SPELL_DISPERSAL, "Dispersal",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_AREA | SPFLAG_ESCAPE,
7,
200,
NULL,
@@ -1971,7 +2016,7 @@
{
SPELL_DISCHARGE, "Static Discharge",
SPTYP_CONJURATION | SPTYP_AIR,
- SPFLAG_NONE,
+ SPFLAG_AREA,
4,
200,
NULL,
@@ -1982,7 +2027,7 @@
{
SPELL_BEND, "Bend",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_DIR,
1,
100,
NULL,
@@ -1997,7 +2042,8 @@
1,
200,
NULL,
- true
+ true,
+ false
},
{
@@ -2018,7 +2064,8 @@
2, // XXX: level 2 or 3, what should it be now? -- bwr
200,
NULL,
- true
+ true,
+ false
},
{
@@ -2035,7 +2082,7 @@
{
SPELL_FRAGMENTATION, "Lee's Rapid Deconstruction",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
- SPFLAG_NONE,
+ SPFLAG_GRID,
5,
200,
NULL,
@@ -2046,12 +2093,12 @@
{
SPELL_AIR_WALK, "Air Walk",
SPTYP_TRANSMIGRATION | SPTYP_AIR,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
9,
200,
NULL,
false,
- false
+ true
},
{
@@ -2061,13 +2108,14 @@
1,
50,
NULL,
- true
+ true,
+ false
},
{
SPELL_ROTTING, "Rotting",
SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_AREA,
5,
200,
NULL,
@@ -2078,45 +2126,45 @@
{
SPELL_MAXWELLS_SILVER_HAMMER, "Maxwell's Silver Hammer",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
2,
200,
NULL,
false,
- false
+ true
},
{
SPELL_CONDENSATION_SHIELD, "Condensation Shield",
SPTYP_ICE | SPTYP_TRANSMIGRATION,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
4,
200,
NULL,
false,
- false
+ true
},
{
SPELL_SEMI_CONTROLLED_BLINK, "Semi-Controlled Blink",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE,
3,
100,
NULL,
false,
- false
+ true
},
{
SPELL_STONESKIN, "Stoneskin",
SPTYP_EARTH | SPTYP_TRANSMIGRATION, // was ench -- bwr
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
2,
200,
NULL,
false,
- false
+ true
},
{
@@ -2144,7 +2192,7 @@
{
SPELL_CHAIN_LIGHTNING, "Chain Lightning",
SPTYP_AIR | SPTYP_CONJURATION,
- SPFLAG_NONE,
+ SPFLAG_AREA,
8,
200,
NULL,
@@ -2155,7 +2203,7 @@
{
SPELL_EXCRUCIATING_WOUNDS, "Excruciating Wounds",
SPTYP_ENCHANTMENT | SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_HELPFUL,
5, // fairly high level - potentially one of the best brands
200,
NULL,
@@ -2210,7 +2258,7 @@
{
SPELL_BRAIN_FEED, "Brain Feed",
SPTYP_NECROMANCY,
- SPFLAG_UNHOLY,
+ SPFLAG_UNHOLY | SPFLAG_TARGET,
3,
0,
NULL,
@@ -2225,6 +2273,7 @@
3,
0,
NULL,
+ false,
false
},
@@ -2235,7 +2284,8 @@
4,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2256,6 +2306,7 @@
4,
0,
NULL,
+ false,
false
},
@@ -2266,7 +2317,8 @@
4,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2276,7 +2328,8 @@
2,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2308,7 +2361,8 @@
5,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2318,7 +2372,8 @@
5,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2328,7 +2383,8 @@
6,
0,
NULL,
- true
+ true,
+ false
},
{
@@ -2345,11 +2401,12 @@
{
SPELL_BLINK_OTHER, "Blink Other",
SPTYP_TRANSLOCATION,
- SPFLAG_NONE,
+ SPFLAG_ESCAPE | SPFLAG_DIR_OR_TARGET,
2,
0,
NULL,
- true
+ true,
+ false
},
{
diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc
index ac35b94fbe..4dcf356d95 100644
--- a/crawl-ref/source/spl-util.cc
+++ b/crawl-ref/source/spl-util.cc
@@ -240,6 +240,37 @@ bool spell_needs_foe(spell_type spell)
return (!_seekspell(spell)->ms_utility);
}
+bool spell_harms_target(spell_type spell)
+{
+ const unsigned int flags = _seekspell(spell)->flags;
+
+ if (flags & (SPFLAG_HELPFUL | SPFLAG_NEUTRAL))
+ return false;
+
+ if (flags & SPFLAG_TARGETING_MASK)
+ return true;
+
+ return false;
+}
+
+bool spell_harms_area(spell_type spell)
+{
+ const unsigned int flags = _seekspell(spell)->flags;
+
+ if (flags & (SPFLAG_HELPFUL | SPFLAG_NEUTRAL))
+ return false;
+
+ if (flags & SPFLAG_AREA)
+ return true;
+
+ return false;
+}
+
+bool spell_sanctuary_castable(spell_type spell)
+{
+ return false;
+}
+
// applied to spell misfires (more power = worse) and triggers
// for Xom acting (more power = more likely to grab his attention) {dlb}
int spell_mana(spell_type which_spell)
diff --git a/crawl-ref/source/spl-util.h b/crawl-ref/source/spl-util.h
index 5ab1f381a3..d1e3097312 100644
--- a/crawl-ref/source/spl-util.h
+++ b/crawl-ref/source/spl-util.h
@@ -90,6 +90,9 @@ const char *get_spell_target_prompt( spell_type which_spell );
bool spell_needs_tracer(spell_type spell);
bool spell_needs_foe(spell_type spell);
+bool spell_harms_target(spell_type spell);
+bool spell_harms_area(spell_type spell);
+bool spell_sanctuary_castable(spell_type spell);
int spell_levels_required(spell_type which_spell);
unsigned int get_spell_flags( spell_type which_spell );