diff options
author | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-06-29 05:16:39 +0000 |
---|---|---|
committer | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-06-29 05:16:39 +0000 |
commit | 6e8c4b9c5c42d35f71c444b524a9bb366f70e9cd (patch) | |
tree | b888e9f208d93a196908516417fa99a21a1f0573 | |
parent | 020b21eee05af9a8e23d9f1f4053a3f1c06519aa (diff) | |
download | crawl-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
-rw-r--r-- | crawl-ref/source/mon-util.cc | 36 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 27 | ||||
-rw-r--r-- | crawl-ref/source/spl-cast.h | 5 | ||||
-rw-r--r-- | crawl-ref/source/spl-data.h | 419 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.cc | 31 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.h | 3 |
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 ); |