From 0ec4d9b509898416c55abedc754148b9c14f7946 Mon Sep 17 00:00:00 2001
From: Andrew Minton <a@cowmuffins.net>
Date: Mon, 6 Feb 2017 00:56:21 -0700
Subject: [PATCH] Replace Delayed Fireball with new spell: Ignition

This level 8 Fire spell drops a fireball-like explosion on every monster in LOS.
The explosions don't affect the player or allies. The spell is strong against
monsters adjacent to one another (as each monster gets hit multiple times) but
bad against single targets.

Currently the damage per fireball is the same as the regular Fireball spell.

Ignition replaces Delayed Fireball in the book of Fire, and Fireball in the book
of the Tempests.
---
 crawl-ref/source/ability.cc                        |   8 ++
 crawl-ref/source/beam.cc                           |   2 +-
 crawl-ref/source/book-data.h                       |   4 +-
 crawl-ref/source/dat/descript/spells.txt           |   7 ++
 crawl-ref/source/enum.h                            |   7 +-
 crawl-ref/source/ghost.cc                          |   2 +
 crawl-ref/source/god-abil.cc                       |   3 +-
 crawl-ref/source/nearby-danger.cc                  |   2 +
 crawl-ref/source/player.cc                         |   7 +-
 crawl-ref/source/religion.cc                       |   2 +
 crawl-ref/source/rltiles/dc-spells.txt             |   1 +
 .../source/rltiles/gui/spells/fire/ignition.png    | Bin 0 -> 470 bytes
 crawl-ref/source/spl-cast.cc                       |   7 ++
 crawl-ref/source/spl-damage.cc                     | 101 +++++++++++++++++++++
 crawl-ref/source/spl-damage.h                      |   4 +
 crawl-ref/source/spl-data.h                        |  17 +++-
 crawl-ref/source/spl-goditem.cc                    |  10 +-
 crawl-ref/source/spl-util.cc                       |  11 ++-
 crawl-ref/source/status.cc                         |   2 +
 crawl-ref/source/status.h                          |   2 +
 crawl-ref/source/tags.cc                           |   2 +
 crawl-ref/source/tilepick.cc                       |   2 +
 22 files changed, 189 insertions(+), 14 deletions(-)
 create mode 100644 crawl-ref/source/rltiles/gui/spells/fire/ignition.png

diff --git a/crawl-ref/source/ability.cc b/crawl-ref/source/ability.cc
index 6057a7a..d263ac7 100644
--- a/crawl-ref/source/ability.cc
+++ b/crawl-ref/source/ability.cc
@@ -307,8 +307,10 @@ static const ability_def Ability_List[] =
     { ABIL_DAMNATION, "Hurl Damnation",
         0, 150, 200, 0, {FAIL_XL, 50, 1}, abflag::NONE },
 
+#if TAG_MAJOR_VERSION == 34
     { ABIL_DELAYED_FIREBALL, "Release Delayed Fireball",
       0, 0, 0, 0, {}, abflag::INSTANT },
+#endif
     { ABIL_STOP_SINGING, "Stop Singing",
       0, 0, 0, 0, {}, abflag::NONE },
 
@@ -1618,7 +1620,9 @@ bool activate_talent(const talent& tal)
         case ABIL_STOP_FLYING:
         case ABIL_EVOKE_TURN_VISIBLE:
         case ABIL_END_TRANSFORMATION:
+#if TAG_MAJOR_VERSION == 34
         case ABIL_DELAYED_FIREBALL:
+#endif
         case ABIL_STOP_SINGING:
         case ABIL_STOP_RECALL:
         case ABIL_TRAN_BAT:
@@ -1806,6 +1810,7 @@ static spret_type _do_ability(const ability_def& abil, bool fail)
         }
         return frog_hop(fail);
 
+#if TAG_MAJOR_VERSION == 34
     case ABIL_DELAYED_FIREBALL:
     {
         fail_check();
@@ -1830,6 +1835,7 @@ static spret_type _do_ability(const ability_def& abil, bool fail)
         viewwindow();
         break;
     }
+#endif
 
     case ABIL_SPIT_POISON:      // Naga poison spit
     {
@@ -3398,9 +3404,11 @@ vector<talent> your_talents(bool check_confused, bool include_unusable)
         _add_talent(talents, ABIL_BREATHE_FIRE, check_confused);
     }
 
+#if TAG_MAJOR_VERSION == 34
     // Checking for unreleased Delayed Fireball.
     if (you.attribute[ ATTR_DELAYED_FIREBALL ])
         _add_talent(talents, ABIL_DELAYED_FIREBALL, check_confused);
+#endif
 
     if (you.duration[DUR_SONG_OF_SLAYING])
         _add_talent(talents, ABIL_STOP_SINGING, check_confused);
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index edcd26f..5295bb4 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -5782,7 +5782,7 @@ bool bolt::explode(bool show_more, bool hole_in_the_middle)
 {
     ASSERT(!special_explosion);
     ASSERT(!in_explosion_phase);
-    ASSERT(ex_size > 0);
+    ASSERT(ex_size >= 0);
 
     // explode() can be called manually without setting real_flavour.
     // FIXME: The entire flavour/real_flavour thing needs some
diff --git a/crawl-ref/source/book-data.h b/crawl-ref/source/book-data.h
index 3cfc1f5..9fa40bd 100644
--- a/crawl-ref/source/book-data.h
+++ b/crawl-ref/source/book-data.h
@@ -51,8 +51,8 @@ static const vector<spell_type> spellbook_templates[] =
     SPELL_IGNITE_POISON,
     SPELL_FIREBALL,
     SPELL_BOLT_OF_FIRE,
-    SPELL_DELAYED_FIREBALL,
     SPELL_RING_OF_FLAMES,
+    SPELL_IGNITION,
 },
 
 {   // Book of Ice
@@ -92,7 +92,7 @@ static const vector<spell_type> spellbook_templates[] =
 {   // Book of the Tempests
     SPELL_DISCHARGE,
     SPELL_LIGHTNING_BOLT,
-    SPELL_FIREBALL,
+    SPELL_IGNITION,
     SPELL_TORNADO,
     SPELL_SHATTER,
 },
diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt
index 8200dc8..645fc9b 100644
--- a/crawl-ref/source/dat/descript/spells.txt
+++ b/crawl-ref/source/dat/descript/spells.txt
@@ -731,6 +731,13 @@ Converts all nearby poison into liquid flame, burning poisoned creatures from
 within. It also turns clouds of poison and mephitic gases into flame. The
 caster is not affected directly.
 %%%%
+Ignition spell
+
+All foes in the caster's surroundings are engulfed in balls of fire. The caster
+and their allies are protected from the fire and will never be harmed by this
+spell.
+
+%%%%
 Infestation spell
 
 Calls forth a plague of scarabs, infesting affected creatures for a duration
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index c69f51a..3d95338 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -221,7 +221,9 @@ enum ability_type
     ABIL_BREATHE_ACID,
     ABIL_BLINK,
     // Others
+#if TAG_MAJOR_VERSION == 34
     ABIL_DELAYED_FIREBALL,
+#endif
     ABIL_END_TRANSFORMATION,
     ABIL_STOP_SINGING, // From song of slaying
 
@@ -482,7 +484,9 @@ enum attribute_type
     ATTR_DIVINE_DEATH_CHANNEL,
     ATTR_CARD_COUNTDOWN,
     ATTR_BANISHMENT_IMMUNITY,   // banishment immunity until
+#if TAG_MAJOR_VERSION == 34
     ATTR_DELAYED_FIREBALL,      // bwr: reserve fireballs
+#endif
     ATTR_HELD,                  // caught in a net or web
     ATTR_ABYSS_ENTOURAGE,       // maximum number of hostile monsters in
                                 // sight of the player while in the Abyss.
@@ -4283,8 +4287,8 @@ enum spell_type : int
     SPELL_MAGIC_DART,
     SPELL_FIREBALL,
     SPELL_APPORTATION,
-    SPELL_DELAYED_FIREBALL,
 #if TAG_MAJOR_VERSION == 34
+    SPELL_DELAYED_FIREBALL,
     SPELL_STRIKING,
 #endif
     SPELL_CONJURE_FLAME,
@@ -4729,6 +4733,7 @@ enum spell_type : int
     SPELL_RANDOM_EFFECTS,
     SPELL_POISONOUS_VAPOURS,
     SPELL_RING_OF_THUNDER,
+    SPELL_IGNITION,
     NUM_SPELLS
 };
 
diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc
index a57dd94..e55e14a 100644
--- a/crawl-ref/source/ghost.cc
+++ b/crawl-ref/source/ghost.cc
@@ -685,8 +685,10 @@ spell_type ghost_demon::translate_spell(spell_type spell) const
     {
     case SPELL_CONTROLLED_BLINK:
         return SPELL_BLINK;        // approximate
+#if TAG_MAJOR_VERSION == 34
     case SPELL_DELAYED_FIREBALL:
         return SPELL_FIREBALL;
+#endif
     case SPELL_DRAGON_CALL:
         return SPELL_SUMMON_DRAGON;
     case SPELL_SWIFTNESS:
diff --git a/crawl-ref/source/god-abil.cc b/crawl-ref/source/god-abil.cc
index 755bb56..7c5754b 100644
--- a/crawl-ref/source/god-abil.cc
+++ b/crawl-ref/source/god-abil.cc
@@ -1459,7 +1459,8 @@ bool vehumet_supports_spell(spell_type spell)
         || spell == SPELL_OZOCUBUS_REFRIGERATION
         || spell == SPELL_OLGREBS_TOXIC_RADIANCE
         || spell == SPELL_VIOLENT_UNRAVELLING
-        || spell == SPELL_INNER_FLAME)
+        || spell == SPELL_INNER_FLAME
+        || spell == SPELL_IGNITION)
     {
         return true;
     }
diff --git a/crawl-ref/source/nearby-danger.cc b/crawl-ref/source/nearby-danger.cc
index 7fb90e7..2f1e0d0 100644
--- a/crawl-ref/source/nearby-danger.cc
+++ b/crawl-ref/source/nearby-danger.cc
@@ -416,7 +416,9 @@ void revive()
     set_hunger(HUNGER_DEFAULT, true);
     restore_stat(STAT_ALL, 0, true);
 
+#if TAG_MAJOR_VERSION == 34
     you.attribute[ATTR_DELAYED_FIREBALL] = 0;
+#endif
     clear_trapping_net();
     you.attribute[ATTR_DIVINE_VIGOUR] = 0;
     you.attribute[ATTR_DIVINE_STAMINA] = 0;
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 292c227..28b3c4c 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -1288,23 +1288,28 @@ int player_spell_levels()
 {
     int sl = min(player_total_spell_levels(), 99);
 
+#if TAG_MAJOR_VERSION == 34
     bool fireball = false;
     bool delayed_fireball = false;
+#endif
 
     for (const spell_type spell : you.spells)
     {
+#if TAG_MAJOR_VERSION == 34
         if (spell == SPELL_FIREBALL)
             fireball = true;
         else if (spell == SPELL_DELAYED_FIREBALL)
             delayed_fireball = true;
-
+#endif
         if (spell != SPELL_NO_SPELL)
             sl -= spell_difficulty(spell);
     }
 
+#if TAG_MAJOR_VERSION == 34
     // Fireball is free for characters with delayed fireball
     if (fireball && delayed_fireball)
         sl += spell_difficulty(SPELL_FIREBALL);
+#endif
 
     // Note: This can happen because of draining. -- bwr
     if (sl < 0)
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index dc40f19..e11fcec 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -3881,8 +3881,10 @@ bool god_hates_ability(ability_type ability, god_type god)
     switch (ability)
     {
         case ABIL_BREATHE_FIRE:
+#if TAG_MAJOR_VERSION == 34
         case ABIL_DELAYED_FIREBALL:
             return god == GOD_DITHMENOS;
+#endif
         case ABIL_EVOKE_BERSERK:
             return god == GOD_CHEIBRIADOS;
         default:
diff --git a/crawl-ref/source/rltiles/dc-spells.txt b/crawl-ref/source/rltiles/dc-spells.txt
index 12a57e6..13db83e 100644
--- a/crawl-ref/source/rltiles/dc-spells.txt
+++ b/crawl-ref/source/rltiles/dc-spells.txt
@@ -66,6 +66,7 @@ ring_of_flames RING_OF_FLAMES
 sticky_flame STICKY_FLAME
 throw_flame THROW_FLAME
 inner_flame INNER_FLAME
+ignition IGNITION
 
 %sdir gui/spells/ice
 bolt_of_cold BOLT_OF_COLD
diff --git a/crawl-ref/source/rltiles/gui/spells/fire/ignition.png b/crawl-ref/source/rltiles/gui/spells/fire/ignition.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdf71940dd4a2de12dc4029d145c121cd1898340
GIT binary patch
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 3236ee3..0ce1e13 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1050,6 +1050,7 @@ static void _try_monster_cast(spell_type spell, int powc,
 
 static void _maybe_cancel_repeat(spell_type spell)
 {
+#if TAG_MAJOR_VERSION == 34
     switch (spell)
     {
     case SPELL_DELAYED_FIREBALL:        crawl_state.cant_cmd_repeat(make_stringf("You can't repeat %s.",
@@ -1059,6 +1060,7 @@ static void _maybe_cancel_repeat(spell_type spell)
     default:
         break;
     }
+#endif
 }
 
 static spret_type _do_cast(spell_type spell, int powc, const dist& spd,
@@ -1611,8 +1613,10 @@ static spret_type _do_cast(spell_type spell, int powc, const dist& spd,
     case SPELL_CALL_DOWN_DAMNATION:
         return cast_smitey_damnation(powc, beam) ? SPRET_SUCCESS : SPRET_ABORT;
 
+#if TAG_MAJOR_VERSION == 34
     case SPELL_DELAYED_FIREBALL:
         return cast_delayed_fireball(fail);
+#endif
 
     // LOS spells
 
@@ -1673,6 +1677,9 @@ static spret_type _do_cast(spell_type spell, int powc, const dist& spd,
     case SPELL_CLOUD_CONE:
         return cast_cloud_cone(&you, powc, target, fail);
 
+    case SPELL_IGNITION:
+        return cast_ignition(&you, powc, fail);
+
     // Summoning spells, and other spells that create new monsters.
     // If a god is making you cast one of these spells, any monsters
     // produced will count as god gifts.
diff --git a/crawl-ref/source/spl-damage.cc b/crawl-ref/source/spl-damage.cc
index 89c2f5d..3a50b74 100644
--- a/crawl-ref/source/spl-damage.cc
+++ b/crawl-ref/source/spl-damage.cc
@@ -45,6 +45,7 @@
 #include "viewchar.h"
 #include "view.h"
 
+#if TAG_MAJOR_VERSION == 34
 // This spell has two main advantages over Fireball:
 //
 // (1) The release is instantaneous, so monsters will not
@@ -79,6 +80,7 @@ spret_type cast_delayed_fireball(bool fail)
     you.attribute[ATTR_DELAYED_FIREBALL] = 1;
     return SPRET_SUCCESS;
 }
+#endif
 
 void setup_fire_storm(const actor *source, int pow, bolt &beam)
 {
@@ -1828,6 +1830,105 @@ spret_type cast_ignite_poison(actor* agent, int pow, bool fail, bool tracer)
     return SPRET_SUCCESS;
 }
 
+static void _ignition_square(const actor *agent, bolt beam, coord_def square, bool center)
+{
+    // HACK: bypass visual effect
+    beam.target = square;
+    beam.in_explosion_phase = true;
+    beam.explosion_affect_cell(square);
+    if (center)
+        noisy(spell_effect_noise(SPELL_IGNITION),square);
+}
+
+spret_type cast_ignition(const actor *agent, int pow, bool fail)
+{
+    ASSERT(agent->is_player());
+
+    fail_check();
+
+    targeter_los hitfunc(agent, LOS_NO_TRANS);
+
+    // Ignition affects squares that had hostile monsters on them at the time
+    // of casting. This way nothing bad happens when monsters die halfway
+    // through the spell.
+    vector<coord_def> blast_sources;
+
+    for (actor_near_iterator ai(agent->pos(), LOS_NO_TRANS);
+         ai; ++ai)
+    {
+        if (ai->is_monster() && !ai->as_monster()->wont_attack())
+        {
+            blast_sources.push_back(ai->position);
+        }
+    }
+
+    if (blast_sources.empty()) {
+        canned_msg(MSG_NOTHING_HAPPENS);
+    } else {
+        mpr("The air bursts into flame!"); 
+
+        vector<coord_def> blast_adjacents;
+
+        // Used to draw explosion cells
+        bolt beam_visual;
+        beam_visual.set_agent(agent);
+        beam_visual.flavour       = BEAM_VISUAL;
+        beam_visual.glyph         = dchar_glyph(DCHAR_FIRED_BURST);
+        beam_visual.colour        = RED;
+        beam_visual.ex_size       = 1;
+        beam_visual.is_explosion  = true;
+
+        // Used to deal damage; invisible
+        bolt beam_actual;
+        beam_actual.set_agent(agent);
+        beam_actual.flavour       = BEAM_FIRE;
+        beam_actual.real_flavour  = BEAM_FIRE;
+        beam_actual.glyph         = 0;
+        beam_actual.damage        = calc_dice(3, 10 + pow/2); // same as fireball for now
+        beam_actual.name          = "fireball";
+        beam_actual.colour        = RED;
+        beam_actual.ex_size       = 0;
+        beam_actual.is_explosion  = true;
+        beam_actual.loudness      = 0;
+
+#ifdef DEBUG_DIAGNOSTICS
+        dprf(DIAG_BEAM, "ignition dam=%dd%d",
+             beam_actual.damage.num, beam_actual.damage.size);
+#endif
+
+        // Fake "shaped" radius 1 explosions (skipping squares with friends).
+        for (coord_def pos : blast_sources) {
+            for (adjacent_iterator ai(pos); ai; ++ai) {
+                if (cell_is_solid(*ai))
+                    continue;
+
+                actor *act = actor_at(*ai);
+
+                // Friendly creature, don't blast this square.
+                if (act && (act == agent || (act->is_monster()
+                    && act->as_monster()->wont_attack())))
+                    continue;
+
+                blast_adjacents.push_back(*ai);
+                beam_visual.explosion_draw_cell(*ai);
+            }
+            beam_visual.explosion_draw_cell(pos);
+        }
+        update_screen();
+        scaled_delay(50);
+
+        // Real explosions on each individual square.
+        for (coord_def pos : blast_sources) {
+            _ignition_square(agent, beam_actual, pos, true);
+        }
+        for (coord_def pos : blast_adjacents) {
+            _ignition_square(agent, beam_actual, pos, false);
+        }
+    }
+
+    return SPRET_SUCCESS;
+}
+
 int discharge_monsters(coord_def where, int pow, actor *agent)
 {
     actor* victim = actor_at(where);
diff --git a/crawl-ref/source/spl-damage.h b/crawl-ref/source/spl-damage.h
index 5d11324..605abce 100644
--- a/crawl-ref/source/spl-damage.h
+++ b/crawl-ref/source/spl-damage.h
@@ -7,7 +7,9 @@
 struct bolt;
 class dist;
 
+#if TAG_MAJOR_VERSION == 34
 spret_type cast_delayed_fireball(bool fail);
+#endif
 void setup_fire_storm(const actor *source, int pow, bolt &beam);
 spret_type cast_fire_storm(int pow, bolt &beam, bool fail);
 bool cast_smitey_damnation(int pow, bolt &beam);
@@ -70,4 +72,6 @@ spret_type cast_random_bolt(int pow, bolt& beam, bool fail = false);
 size_t shotgun_beam_count(int pow);
 spret_type cast_scattershot(const actor *caster, int pow, const coord_def &pos,
                             bool fail = false);
+
+spret_type cast_ignition(const actor *caster, int pow, bool fail = false);
 #endif
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index 53902b2..0b95916 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -76,7 +76,7 @@ static const struct spell_desc spelldata[] =
     1, 0,
     TILEG_APPORTATION,
 },
-
+#if TAG_MAJOR_VERSION == 34
 {
     SPELL_DELAYED_FIREBALL, "Delayed Fireball",
     SPTYP_FIRE | SPTYP_CONJURATION,
@@ -85,9 +85,9 @@ static const struct spell_desc spelldata[] =
     0,
     -1, -1,
     7, 0,
-    TILEG_DELAYED_FIREBALL,
+    TILEG_ERROR,
 },
-
+#endif
 {
     SPELL_CONJURE_FLAME, "Conjure Flame",
     SPTYP_CONJURATION | SPTYP_FIRE,
@@ -3909,6 +3909,17 @@ static const struct spell_desc spelldata[] =
 },
 
 {
+    SPELL_IGNITION, "Ignition",
+    SPTYP_FIRE,
+    SPFLAG_AREA,
+    8,
+    200,
+    -1, -1,
+    8, 0,
+    TILEG_IGNITION,
+},
+
+{
     SPELL_NO_SPELL, "nonexistent spell",
     SPTYP_NONE,
     SPFLAG_TESTING,
diff --git a/crawl-ref/source/spl-goditem.cc b/crawl-ref/source/spl-goditem.cc
index ebbb45d..fe2d256 100644
--- a/crawl-ref/source/spl-goditem.cc
+++ b/crawl-ref/source/spl-goditem.cc
@@ -325,8 +325,12 @@ static void _dispellable_player_buffs(player_debuff_effects &buffs)
 {
     // attributes
     static const attribute_type dispellable_attributes[] = {
-        ATTR_DELAYED_FIREBALL, ATTR_SWIFTNESS,
-        ATTR_REPEL_MISSILES, ATTR_DEFLECT_MISSILES,
+#if TAG_MAJOR_VERSION == 34
+        ATTR_DELAYED_FIREBALL,
+#endif
+        ATTR_SWIFTNESS,
+        ATTR_REPEL_MISSILES,
+        ATTR_DEFLECT_MISSILES,
     };
 
     for (auto attribute : dispellable_attributes)
@@ -378,9 +382,11 @@ void debuff_player()
     for (auto attr : buffs.attributes)
     {
         you.attribute[attr] = 0;
+#if TAG_MAJOR_VERSION == 34
         if (attr == ATTR_DELAYED_FIREBALL)
             mprf(MSGCH_DURATION, "Your charged fireball dissipates.");
         else
+#endif
             need_msg = true;
     }
 
diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc
index 309573d..10c1847 100644
--- a/crawl-ref/source/spl-util.cc
+++ b/crawl-ref/source/spl-util.cc
@@ -355,6 +355,7 @@ static void _remove_spell_attributes(spell_type spell)
                                  : "your spell is no longer protecting you");
         }
         break;
+#if TAG_MAJOR_VERSION == 34
     case SPELL_DELAYED_FIREBALL:
         if (you.attribute[ATTR_DELAYED_FIREBALL])
         {
@@ -362,6 +363,7 @@ static void _remove_spell_attributes(spell_type spell)
             mprf(MSGCH_DURATION, "Your charged fireball dissipates.");
         }
         break;
+#endif
     default:
         break;
     }
@@ -480,7 +482,7 @@ int spell_difficulty(spell_type which_spell)
 int spell_levels_required(spell_type which_spell)
 {
     int levels = spell_difficulty(which_spell);
-
+#if TAG_MAJOR_VERSION == 34
     if (which_spell == SPELL_DELAYED_FIREBALL
         && you.has_spell(SPELL_FIREBALL))
     {
@@ -491,6 +493,7 @@ int spell_levels_required(spell_type which_spell)
     {
         levels = 0;
     }
+#endif
 
     return levels;
 }
@@ -1011,6 +1014,7 @@ int spell_effect_noise(spell_type spell)
     case SPELL_MEPHITIC_CLOUD:
     case SPELL_FIREBALL:
     case SPELL_VIOLENT_UNRAVELLING:
+    case SPELL_IGNITION:
         expl_size = 1;
         break;
 
@@ -1242,12 +1246,12 @@ string spell_uselessness_reason(spell_type spell, bool temp, bool prevent,
             return "you must stand on solid ground to cast this.";
         }
         break;
-
+#if TAG_MAJOR_VERSION == 34
     case SPELL_DELAYED_FIREBALL:
         if (temp && you.attribute[ATTR_DELAYED_FIREBALL])
             return "you are already charged.";
         break;
-
+#endif
     case SPELL_BORGNJORS_REVIVIFICATION:
         if (temp && you.hp == you.hp_max)
             return "you cannot be healed further.";
@@ -1416,6 +1420,7 @@ bool spell_no_hostile_in_range(spell_type spell)
     case SPELL_OZOCUBUS_REFRIGERATION:
     case SPELL_OLGREBS_TOXIC_RADIANCE:
     case SPELL_INTOXICATE:
+    case SPELL_IGNITION:
         return minRange > LOS_RADIUS;
 
     // Special handling for cloud spells.
diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc
index 4cea42d..183d75c 100644
--- a/crawl-ref/source/status.cc
+++ b/crawl-ref/source/status.cc
@@ -392,6 +392,7 @@ bool fill_status_info(int status, status_info* inf)
         _describe_stat_zero(inf, STAT_DEX);
         break;
 
+#if TAG_MAJOR_VERSION == 34
     case STATUS_FIREBALL:
         if (you.attribute[ATTR_DELAYED_FIREBALL])
         {
@@ -401,6 +402,7 @@ bool fill_status_info(int status, status_info* inf)
             inf->long_text    = "You have a stored fireball ready to release.";
         }
         break;
+#endif
 
     case STATUS_BONE_ARMOUR:
         if (you.attribute[ATTR_BONE_ARMOUR] > 0)
diff --git a/crawl-ref/source/status.h b/crawl-ref/source/status.h
index 5253daf..6d95140 100644
--- a/crawl-ref/source/status.h
+++ b/crawl-ref/source/status.h
@@ -21,7 +21,9 @@ enum status_type
     STATUS_STR_ZERO,
     STATUS_INT_ZERO,
     STATUS_DEX_ZERO,
+#if TAG_MAJOR_VERSION == 34
     STATUS_FIREBALL,
+#endif
     STATUS_BACKLIT,
     STATUS_UMBRA,
     STATUS_CONSTRICTED,
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 286397f..66b6334 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -5789,11 +5789,13 @@ void unmarshallMonster(reader &th, monster& m)
             slot.spell = _fixup_soh_breath(m.type);
             m.spells.push_back(slot);
         }
+#if TAG_MAJOR_VERSION == 34
         else if (slot.spell != SPELL_DELAYED_FIREBALL
                  && slot.spell != SPELL_MELEE)
         {
             m.spells.push_back(slot);
         }
+#endif
         else if (slot.spell == SPELL_CORRUPT_BODY)
         {
             slot.spell = SPELL_CORRUPTING_PULSE;
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index df07d5d..85822dd 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -3190,8 +3190,10 @@ tileidx_t tileidx_ability(const ability_type ability)
         return TILEG_ABILITY_HOP;
 
     // Others
+#if TAG_MAJOR_VERSION == 34
     case ABIL_DELAYED_FIREBALL:
         return TILEG_ABILITY_DELAYED_FIREBALL;
+#endif
     case ABIL_END_TRANSFORMATION:
         return TILEG_ABILITY_END_TRANSFORMATION;
     case ABIL_STOP_RECALL:
-- 
2.7.4

