summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-29 05:16:39 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-29 05:16:39 +0000
commit6e8c4b9c5c42d35f71c444b524a9bb366f70e9cd (patch)
treeb888e9f208d93a196908516417fa99a21a1f0573 /crawl-ref/source
parent020b21eee05af9a8e23d9f1f4053a3f1c06519aa (diff)
downloadcrawl-ref-6e8c4b9c5c42d35f71c444b524a9bb366f70e9cd.tar.gz
crawl-ref-6e8c4b9c5c42d35f71c444b524a9bb366f70e9cd.zip
Bug 2005002: Allow friendly and neutral-good monsters to cast spells while in
sanctuary, and allow hostile and neutral monsters to cast spells once outside of sanctuary as long as it won't harm anything inside of sanctuary. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6205 c06c8d41-db1a-0410-9941-cceddc491573
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 );