From ac18f0c50f6b50ebd92ca3cd7a752bdd8a26ba63 Mon Sep 17 00:00:00 2001
From: Sage <SageBasilMint@gmail.com>
Date: Wed, 18 Dec 2013 20:32:19 +0000
Subject: [PATCH 1/5] Vine stalkers added.

Weirdness and Mutations:
- Fangs II (Becomes III at xl8)
- Antimagic bite (Much stronger than standard bite, bites every turn,
  applies antimagic brand, and restores your mana)
- Potions and wands cannot restore your HP
- Regen III
- Unbreathing
- Spirit shield
- HP -3
- MP +1
---
 crawl-ref/docs/crawl_manual.reST                   |   26 +++++++++++
 crawl-ref/source/acquire.cc                        |    4 +-
 crawl-ref/source/aptitudes.h                       |   39 ++++++++++++++++
 crawl-ref/source/dat/descript/species.txt          |    6 +++
 crawl-ref/source/describe.cc                       |    1 +
 crawl-ref/source/enum.h                            |    5 +-
 crawl-ref/source/itemname.cc                       |   14 ++++--
 crawl-ref/source/melee_attack.cc                   |   49 ++++++++++++++++++--
 crawl-ref/source/melee_attack.h                    |    2 +-
 crawl-ref/source/mutation-data.h                   |   20 ++++++++
 crawl-ref/source/mutation.cc                       |    1 +
 crawl-ref/source/ng-restr.cc                       |    4 ++
 crawl-ref/source/ng-setup.cc                       |    8 ++++
 crawl-ref/source/player.cc                         |   17 ++++++-
 crawl-ref/source/potion.cc                         |   28 ++++++++++-
 crawl-ref/source/rltiles/dc-player.txt             |    2 +
 .../source/rltiles/player/base/vine_stalker_f.png  |  Bin 0 -> 800 bytes
 .../source/rltiles/player/base/vine_stalker_m.png  |  Bin 0 -> 778 bytes
 crawl-ref/source/species.cc                        |   29 +++++++-----
 crawl-ref/source/spl-goditem.cc                    |    2 +
 crawl-ref/source/tilepick-p.cc                     |    2 +
 21 files changed, 234 insertions(+), 25 deletions(-)
 create mode 100644 crawl-ref/source/rltiles/player/base/vine_stalker_f.png
 create mode 100644 crawl-ref/source/rltiles/player/base/vine_stalker_m.png

diff --git a/crawl-ref/docs/crawl_manual.reST b/crawl-ref/docs/crawl_manual.reST
index eadfa25..0c7cf05 100644
--- a/crawl-ref/docs/crawl_manual.reST
+++ b/crawl-ref/docs/crawl_manual.reST
@@ -1791,6 +1791,32 @@ Gargoyles
   skilled with blunt weapons and in unarmed combat. They can also be exceptional
   earth-based conjurers.
 
+Vine Stalkers
+  Limber in shape, Vine Stalkers are anthropomorphic masses of thick vines.
+  They possess a once-humanoid core, parasitized moments before death by the
+  magical vines. Lacking any other discernible features, their faces are
+  dominated by their disproportionate, vicious maw with which they disrupt and
+  devour the magical energies of their foes.
+ 
+  Magic courses freely through their bodies, and they can not only share any
+  damage taken with their magical reserves, but in fact physically regenerate
+  at an alarming rate. However these traits come at a price: the dual nature of
+  their bodies makes them frail to the extreme and they cannot benefit from
+  potions or wands to heal their wounds.
+ 
+  Living examples of adaptation, Vine Stalkers level up quickly and lend well
+  to an all-out offensive style; trusting their stealth to choose their prey
+  and then their regenerating capabilities to power through the wounds they may
+  sustain in battle. Many members of the species however, are seen wielding
+  magic quite competently and then switching to a hybrid style when their
+  reserves start to run low, thus replenishing their shroud of magic and their
+  spells' fuel with each voracious bite.
+
+  Their great offensive capabilities and intrinsic regeneration lead some Vine
+  Stalkers to eschew more traditional defenses such as armour and dodging,
+  although this proves fatally unwise often times when their judgement of their
+  prey fails and they bite more than they can possibly chew.
+
 Orcs
 ========================================
 
diff --git a/crawl-ref/source/acquire.cc b/crawl-ref/source/acquire.cc
index 86b59f8..9ebd7fe 100644
--- a/crawl-ref/source/acquire.cc
+++ b/crawl-ref/source/acquire.cc
@@ -712,8 +712,10 @@ static int _acquirement_wand_subtype()
         // First, weight according to usefulness.
         switch (type)
         {
-        case WAND_HASTING:          // each 17.9%, group unknown each 26.3%
         case WAND_HEAL_WOUNDS:
+            if (you.mutation[MUT_NO_DEVICE_HEAL])
+                w = 0; break;
+        case WAND_HASTING:          // each 17.9%, group unknown each 26.3%
             w = 25; break;
         case WAND_TELEPORTATION:    // each 10.7%, group unknown each 17.6%
             w = 15; break;
diff --git a/crawl-ref/source/aptitudes.h b/crawl-ref/source/aptitudes.h
index 2211078..031eb6c 100644
--- a/crawl-ref/source/aptitudes.h
+++ b/crawl-ref/source/aptitudes.h
@@ -1451,6 +1451,45 @@ static const species_skill_aptitude species_skill_aptitudes[] =
     APT(SP_FORMICID,        SK_POISON_MAGIC,    3),
     APT(SP_FORMICID,        SK_INVOCATIONS,     2),
     APT(SP_FORMICID,        SK_EVOCATIONS,      2),
+
+    // SP_VINE_STALKER
+    APT(SP_VINE_STALKER,    SK_FIGHTING,        0),
+    APT(SP_VINE_STALKER,    SK_SHORT_BLADES,    -1),
+    APT(SP_VINE_STALKER,    SK_LONG_BLADES,     -1),
+    APT(SP_VINE_STALKER,    SK_AXES,            -1),
+    APT(SP_VINE_STALKER,    SK_MACES_FLAILS,    -1),
+    APT(SP_VINE_STALKER,    SK_POLEARMS,        -1),
+    APT(SP_VINE_STALKER,    SK_STAVES,          -1),
+    APT(SP_VINE_STALKER,    SK_SLINGS,          -1),
+    APT(SP_VINE_STALKER,    SK_BOWS,            -1),
+    APT(SP_VINE_STALKER,    SK_CROSSBOWS,       -1),
+    APT(SP_VINE_STALKER,    SK_THROWING,        -1),
+    APT(SP_VINE_STALKER,    SK_ARMOUR,          -2),
+    APT(SP_VINE_STALKER,    SK_DODGING,         -2),
+    APT(SP_VINE_STALKER,    SK_STEALTH,         3),
+#if TAG_MAJOR_VERSION == 34
+    APT(SP_VINE_STALKER,    SK_STABBING,      -99),
+#endif
+    APT(SP_VINE_STALKER,    SK_SHIELDS,        -1),
+#if TAG_MAJOR_VERSION == 34
+    APT(SP_VINE_STALKER,    SK_TRAPS,         -99),
+#endif
+    APT(SP_VINE_STALKER,    SK_UNARMED_COMBAT,  0),
+    APT(SP_VINE_STALKER,    SK_SPELLCASTING,    0),
+    APT(SP_VINE_STALKER,    SK_CONJURATIONS,    0),
+    APT(SP_VINE_STALKER,    SK_HEXES,           0),
+    APT(SP_VINE_STALKER,    SK_CHARMS,          0),
+    APT(SP_VINE_STALKER,    SK_SUMMONINGS,      0),
+    APT(SP_VINE_STALKER,    SK_NECROMANCY,      0),
+    APT(SP_VINE_STALKER,    SK_TRANSLOCATIONS,  0),
+    APT(SP_VINE_STALKER,    SK_TRANSMUTATIONS,  0),
+    APT(SP_VINE_STALKER,    SK_FIRE_MAGIC,      0),
+    APT(SP_VINE_STALKER,    SK_ICE_MAGIC,       0),
+    APT(SP_VINE_STALKER,    SK_AIR_MAGIC,       0),
+    APT(SP_VINE_STALKER,    SK_EARTH_MAGIC,     0),
+    APT(SP_VINE_STALKER,    SK_POISON_MAGIC,    0),
+    APT(SP_VINE_STALKER,    SK_INVOCATIONS,     0),
+    APT(SP_VINE_STALKER,    SK_EVOCATIONS,      0),
 };
 
 #endif
diff --git a/crawl-ref/source/dat/descript/species.txt b/crawl-ref/source/dat/descript/species.txt
index 3b571bd..d404aae 100644
--- a/crawl-ref/source/dat/descript/species.txt
+++ b/crawl-ref/source/dat/descript/species.txt
@@ -134,3 +134,9 @@ Vampire
 Shifting between the states of life and undeath, they're accomplished stabbers
 and casters.
 %%%%
+Vine Stalker
+
+Frail symbionts, vine stalkers regenerate quickly but cannot regain hp from
+devices or potions. They are protected by their magical reserves, and pack a
+mean bite that replenishes them.
+%%%%
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc
index 33c8048..51e7474 100644
--- a/crawl-ref/source/describe.cc
+++ b/crawl-ref/source/describe.cc
@@ -3807,6 +3807,7 @@ string get_ghost_description(const monster_info &mi, bool concise)
     case SP_MUMMY:
     case SP_GHOUL:
     case SP_FORMICID:
+    case SP_VINE_STALKER:
         str += 10;
         break;
 
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 7879dde..4b37929 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -3031,6 +3031,8 @@ enum mutation_type
     MUT_FUMES,
     MUT_JUMP,
     MUT_EXOSKELETON,
+    MUT_ANTIMAGIC_BITE,
+    MUT_NO_DEVICE_HEAL,
     NUM_MUTATIONS,
 
     RANDOM_MUTATION,
@@ -3384,7 +3386,8 @@ enum species_type
     SP_LAVA_ORC,
     SP_GARGOYLE,
     SP_FORMICID,
-    LAST_VALID_SPECIES = SP_FORMICID,
+    SP_VINE_STALKER,
+    LAST_VALID_SPECIES = SP_VINE_STALKER,
 // The high scores viewer still needs enums for removed species.
     SP_ELF,                            // (placeholder)
     SP_HILL_DWARF,                     // (placeholder)
diff --git a/crawl-ref/source/itemname.cc b/crawl-ref/source/itemname.cc
index 52a7062..f6e7124 100644
--- a/crawl-ref/source/itemname.cc
+++ b/crawl-ref/source/itemname.cc
@@ -2889,7 +2889,8 @@ bool is_emergency_item(const item_def &item)
             if (you.species == SP_FORMICID)
                 return false;
         case WAND_HEAL_WOUNDS:
-            return true;
+            if (!you.mutation[MUT_NO_DEVICE_HEAL])
+                return true;
         default:
             return false;
         }
@@ -2915,8 +2916,10 @@ bool is_emergency_item(const item_def &item)
         case POT_SPEED:
             if (you_worship(GOD_CHEIBRIADOS) || you.species == SP_FORMICID)
                 return false;
-        case POT_CURING:
         case POT_HEAL_WOUNDS:
+            if (you.mutation[MUT_NO_DEVICE_HEAL])
+                return false;
+        case POT_CURING:
         case POT_RESISTANCE:
         case POT_MAGIC:
             return true;
@@ -3210,6 +3213,10 @@ bool is_useless_item(const item_def &item, bool temp)
         if (you.species == SP_FELID)
             return true;
 
+        if (you.mutation[MUT_NO_DEVICE_HEAL]
+            && item.sub_type == WAND_HEAL_WOUNDS)
+            return true;
+
         if (item.sub_type == WAND_INVISIBILITY
             && item_type_known(item)
                 && _invisibility_is_useless(temp))
@@ -3286,7 +3293,8 @@ bool is_useless_item(const item_def &item, bool temp)
         case POT_SLOWING:
         case POT_PARALYSIS:
             return you.species == SP_FORMICID;
-
+        case POT_HEAL_WOUNDS:
+            return you.mutation[MUT_NO_DEVICE_HEAL];
         case POT_INVISIBILITY:
             return _invisibility_is_useless(temp);
         }
diff --git a/crawl-ref/source/melee_attack.cc b/crawl-ref/source/melee_attack.cc
index f723d46..a964894 100644
--- a/crawl-ref/source/melee_attack.cc
+++ b/crawl-ref/source/melee_attack.cc
@@ -1238,6 +1238,7 @@ void melee_attack::player_aux_setup(unarmed_attack_type atk)
     aux_verb.clear();
     damage_brand = SPWPN_NORMAL;
     aux_damage = 0;
+    int str_bite_damage = 0;
 
     switch (atk)
     {
@@ -1326,7 +1327,8 @@ void melee_attack::player_aux_setup(unarmed_attack_type atk)
     case UNAT_BITE:
         aux_attack = aux_verb = "bite";
         aux_damage += you.has_usable_fangs() * 2;
-        aux_damage += div_rand_round(max(you.strength()-10, 0), 5);
+        str_bite_damage += div_rand_round(max(you.strength()-10, 0), 5);
+        aux_damage += str_bite_damage;
         noise_factor = 75;
 
         // prob of vampiric bite:
@@ -1340,6 +1342,14 @@ void melee_attack::player_aux_setup(unarmed_attack_type atk)
             damage_brand = SPWPN_VAMPIRICISM;
         }
 
+        if (player_mutation_level(MUT_ANTIMAGIC_BITE))
+        {
+            //Change formula to fangs_level*3 + str/6
+            aux_damage -= str_bite_damage;
+            aux_damage += div_rand_round(2 * you.get_experience_level(), 3);
+            damage_brand = SPWPN_ANTIMAGIC;
+        }
+
         if (player_mutation_level(MUT_ACIDIC_BITE))
         {
             damage_brand = SPWPN_ACID;
@@ -1580,13 +1590,14 @@ bool melee_attack::player_aux_apply(unarmed_attack_type atk)
         {
             mprf("%s is splashed with acid.",
                  defender->name(DESC_THE).c_str());
-                 corrode_monster(defender->as_monster(), &you);
+            corrode_monster(defender->as_monster(), &you);
         }
 
         // TODO: remove this? Unarmed poison attacks?
         if (damage_brand == SPWPN_VENOM && coinflip())
             poison_monster(defender->as_monster(), &you);
 
+
         // Normal vampiric biting attack, not if already got stabbing special.
         if (damage_brand == SPWPN_VAMPIRICISM && you.species == SP_VAMPIRE
             && (!stab_attempt || stab_bonus <= 0))
@@ -1594,6 +1605,31 @@ bool melee_attack::player_aux_apply(unarmed_attack_type atk)
             _player_vampire_draws_blood(defender->as_monster(), damage_done);
         }
 
+        if (damage_brand == SPWPN_ANTIMAGIC && you.mutation[MUT_ANTIMAGIC_BITE]
+            && damage_done > 0)
+        {
+            bool spell_user = false;
+
+            if (defender->as_monster()->can_use_spells()
+                && !defender->as_monster()->is_priest()
+                && !mons_class_flag(defender->type, M_FAKE_SPELLS))
+            {
+                spell_user = true;
+            }
+
+            antimagic_affects_defender(true);
+            mprf("You drain %s magic.",
+                 defender->as_monster()->pronoun(PRONOUN_POSSESSIVE).c_str());
+            inc_mp(random2(damage_done) + 1);
+
+            if (spell_user) // The mana drain is more effective on spellcasters
+            {
+                inc_mp(random2(damage_done) + 1);
+            }
+
+            mprf("You feel%sinvigorated.", spell_user ? " very " : " ");
+        }
+
         if (atk == UNAT_TAILSLAP && you.species == SP_GREY_DRACONIAN
             && grd(you.pos()) == DNGN_DEEP_WATER
             && feat_is_water(grd(defender->as_monster()->pos())))
@@ -2461,7 +2497,7 @@ bool melee_attack::distortion_affects_defender()
     return false;
 }
 
-void melee_attack::antimagic_affects_defender()
+void melee_attack::antimagic_affects_defender(bool amplify_effect = false)
 {
     if (defender->is_player())
     {
@@ -2478,6 +2514,8 @@ void melee_attack::antimagic_affects_defender()
     {
         int dur = div_rand_round(damage_done * 8, defender->as_monster()->hit_dice);
         dur = random2(dur + 1) * BASELINE_DELAY;
+        if (amplify_effect)
+            dur *= 2;
         defender->as_monster()->add_ench(mon_enchant(ENCH_ANTIMAGIC, 0,
                                 attacker, // doesn't matter
                                 dur));
@@ -5413,10 +5451,11 @@ bool melee_attack::_extra_aux_attack(unarmed_attack_type atk, bool is_uc)
                && !one_chance_in(3);
 
     case UNAT_BITE:
-        return (is_uc
+        return ((is_uc
                 || you.has_usable_fangs()
                 || player_mutation_level(MUT_ACIDIC_BITE))
-               && x_chance_in_y(2, 5);
+                && x_chance_in_y(2, 5))
+                || you.mutation[MUT_ANTIMAGIC_BITE];
 
     case UNAT_PUNCH:
         return is_uc && !one_chance_in(3);
diff --git a/crawl-ref/source/melee_attack.h b/crawl-ref/source/melee_attack.h
index c387471..d2ca0f3 100644
--- a/crawl-ref/source/melee_attack.h
+++ b/crawl-ref/source/melee_attack.h
@@ -125,7 +125,7 @@ private:
     /* Brand / Attack Effects */
     // Returns true if the defender is banished.
     bool distortion_affects_defender();
-    void antimagic_affects_defender();
+    void antimagic_affects_defender(bool amplify_effect);
     void pain_affects_defender();
     void chaos_affects_defender();
     void chaos_affects_attacker();
diff --git a/crawl-ref/source/mutation-data.h b/crawl-ref/source/mutation-data.h
index 1310d13..202dc16 100644
--- a/crawl-ref/source/mutation-data.h
+++ b/crawl-ref/source/mutation-data.h
@@ -1247,6 +1247,26 @@
   "acidic bite"
 },
 
+{ MUT_ANTIMAGIC_BITE,                 0,  1, false,  true,  true,
+  "antimagic bite",
+
+  {"Your bite disrupts and absorbs the magic of your enemies.", "", ""},
+  {"You feel a sudden thirst for magic.", "", ""},
+  {"Your magical appetite wanes.", "", ""},
+
+  "antimagic bite bite"
+},
+
+{ MUT_NO_DEVICE_HEAL,                 0,  1, true,  false,  false,
+  "no device heal",
+
+  {"Potions and wands cannot restore your HP.", "", ""},
+  {"Your system rejects artificial healing.", "", ""},
+  {"Your system accepts artificial healing.", "", ""},
+
+  "no device heal"
+},
+
 // Scale mutations
 { MUT_DISTORTION_FIELD,               2,  3, false, false, false,
   "repulsion field",
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index bd60249..a663aa9 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -1190,6 +1190,7 @@ static int _handle_conflicting_mutations(mutation_type mutation,
         { MUT_ACUTE_VISION,        MUT_BLURRY_VISION,    1},
         { MUT_FAST,                MUT_SLOW,             1},
         { MUT_MUTATION_RESISTANCE, MUT_EVOLUTION,       -1},
+        { MUT_ANTIMAGIC_BITE,      MUT_ACIDIC_BITE,     -1},
         };
 
     // If we have one of the pair, delete all levels of the other,
diff --git a/crawl-ref/source/ng-restr.cc b/crawl-ref/source/ng-restr.cc
index e980188..a8aeaad 100644
--- a/crawl-ref/source/ng-restr.cc
+++ b/crawl-ref/source/ng-restr.cc
@@ -657,6 +657,7 @@ char_choice_restriction weapon_restriction(weapon_type wpn,
         case SP_OCTOPODE:
         case SP_BASE_DRACONIAN:
         case SP_FORMICID:
+        case SP_VINE_STALKER:
             return CC_UNRESTRICTED;
 
         default:
@@ -682,6 +683,7 @@ char_choice_restriction weapon_restriction(weapon_type wpn,
         case SP_BASE_DRACONIAN:
         case SP_DJINNI:
         case SP_FORMICID:
+        case SP_VINE_STALKER:
             return CC_UNRESTRICTED;
 
         case SP_SPRIGGAN:
@@ -718,6 +720,7 @@ char_choice_restriction weapon_restriction(weapon_type wpn,
         case SP_BASE_DRACONIAN:
         case SP_DJINNI:
         case SP_FORMICID:
+        case SP_VINE_STALKER:
             return CC_UNRESTRICTED;
 
         default:
@@ -767,6 +770,7 @@ char_choice_restriction weapon_restriction(weapon_type wpn,
         case SP_DJINNI:
         case SP_FORMICID:
         case SP_GARGOYLE:
+        case SP_VINE_STALKER:
             return CC_UNRESTRICTED;
 
         default:
diff --git a/crawl-ref/source/ng-setup.cc b/crawl-ref/source/ng-setup.cc
index dc7372a..8249e9b 100644
--- a/crawl-ref/source/ng-setup.cc
+++ b/crawl-ref/source/ng-setup.cc
@@ -78,6 +78,7 @@ static void _species_stat_init(species_type which_species)
     case SP_MERFOLK:            s =  8; i =  7; d =  9;      break;  // 24
     case SP_TENGU:              s =  8; i =  8; d =  9;      break;  // 25
     case SP_FORMICID:           s = 12; i =  7; d =  6;      break;  // 25
+    case SP_VINE_STALKER:       s = 10; i =  8; d =  9;      break;  // 27
 
     case SP_KOBOLD:             s =  7; i =  6; d = 10;      break;  // 23
     case SP_HALFLING:           s =  5; i =  8; d = 11;      break;  // 24
@@ -326,6 +327,13 @@ void give_basic_mutations(species_type speci)
     case SP_DJINNI:
         you.mutation[MUT_NEGATIVE_ENERGY_RESISTANCE] = 3;
         break;
+    case SP_VINE_STALKER:
+        you.mutation[MUT_FANGS]          = 2;
+        you.mutation[MUT_ANTIMAGIC_BITE] = 1;
+        you.mutation[MUT_REGENERATION]   = 3;
+        you.mutation[MUT_MANA_SHIELD]    = 1;
+        you.mutation[MUT_NO_DEVICE_HEAL] = 1;
+        break;
     default:
         break;
     }
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index f7b4c9e..295adf2 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -3560,6 +3560,20 @@ void level_change(int source, const char* aux, bool skip_attribute_increase)
                 }
                 break;
 
+            case SP_VINE_STALKER:
+                if (!(you.experience_level % 4))
+                {
+                    modify_stat((coinflip() ? STAT_STR
+                                            : STAT_DEX), 1, false,
+                                "level gain");
+                }
+
+                if (you.experience_level == 8)
+                {
+                    perma_mutate(MUT_FANGS, 1, "vine stalker growth");
+                }
+                break;
+
             default:
                 break;
             }
@@ -6785,7 +6799,7 @@ int player::res_rotting(bool temp) const
     if (temp && (petrified() || form == TRAN_STATUE || form == TRAN_WISP))
         return 3;
 
-    if (species == SP_GARGOYLE)
+    if (species == SP_GARGOYLE || species == SP_VINE_STALKER)
         return 3;
 
     if (mutation[MUT_FOUL_STENCH])
@@ -6892,6 +6906,7 @@ int player_res_magic(bool calc_unid, bool temp)
         break;
     case SP_NAGA:
     case SP_MUMMY:
+    case SP_VINE_STALKER:
         rm = you.experience_level * 5;
         break;
     case SP_PURPLE_DRACONIAN:
diff --git a/crawl-ref/source/potion.cc b/crawl-ref/source/potion.cc
index 265e497..1ace7ea 100644
--- a/crawl-ref/source/potion.cc
+++ b/crawl-ref/source/potion.cc
@@ -81,7 +81,22 @@ bool potion_effect(potion_type pot_eff, int pow, item_def *potion, bool was_know
             break;
         }
 
-        inc_hp((5 + random2(7)) / factor);
+        if (you.mutation[MUT_NO_DEVICE_HEAL]
+            && potion && was_known
+            && you.duration[DUR_CONF] == 0 
+            && you.duration[DUR_POISONING] == 0
+            && you.rotting == 0
+            && you.disease == 0)
+        {
+            mpr("You have no ailments to cure.");
+            return false;
+        }
+
+        if (!you.mutation[MUT_NO_DEVICE_HEAL]) 
+        {
+            inc_hp((5 + random2(7)) / factor);
+        }
+
         mpr("You feel better.");
 
         // Only fix rot when healed to full.
@@ -109,6 +124,17 @@ bool potion_effect(potion_type pot_eff, int pow, item_def *potion, bool was_know
             break;
         }
 
+        if (you.mutation[MUT_NO_DEVICE_HEAL])
+        {
+            if (potion && was_known)
+            {
+                mpr("That would not heal you.");
+                return false;
+            }
+            mpr("That seemed strangely inert.");
+            break;
+        }
+
         inc_hp((10 + random2avg(28, 3)) / factor);
         mpr("You feel much better.");
 
diff --git a/crawl-ref/source/rltiles/dc-player.txt b/crawl-ref/source/rltiles/dc-player.txt
index a92fdb2..3b488be 100644
--- a/crawl-ref/source/rltiles/dc-player.txt
+++ b/crawl-ref/source/rltiles/dc-player.txt
@@ -75,6 +75,8 @@ djinni_f DJINNI
 djinni_m
 %rim 1
 formicid FORMICID
+vine_stalker_f VINE_STALKER
+vine_stalker_m
 
 # draconians
 draconian_f DRACONIAN DRACONIAN_FIRST
diff --git a/crawl-ref/source/rltiles/player/base/vine_stalker_f.png b/crawl-ref/source/rltiles/player/base/vine_stalker_f.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4aa47d487bfe7a0c389c6231a13d11c351f93e8
GIT binary patch
diff --git a/crawl-ref/source/rltiles/player/base/vine_stalker_m.png b/crawl-ref/source/rltiles/player/base/vine_stalker_m.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf616c10aa100944c14bb736e9e7986762866883
GIT binary patch
diff --git a/crawl-ref/source/species.cc b/crawl-ref/source/species.cc
index e0e03ed..dc92323 100644
--- a/crawl-ref/source/species.cc
+++ b/crawl-ref/source/species.cc
@@ -25,6 +25,7 @@ static species_type species_order[] =
     SP_DEEP_ELF,       SP_DEEP_DWARF,
     SP_HILL_ORC,       SP_LAVA_ORC,
     SP_MERFOLK,        SP_FORMICID,
+    SP_VINE_STALKER, 
     // small species
     SP_HALFLING,       SP_KOBOLD,
     SP_SPRIGGAN,
@@ -67,7 +68,7 @@ static const char * Species_Abbrev_List[NUM_SPECIES] =
       // the draconians
       "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr", "Dr",
       "Ce", "Dg", "Sp", "Mi", "Ds", "Gh", "Te", "Mf", "Vp", "DD",
-      "Fe", "Op", "Dj", "LO", "Gr", "Fo",
+      "Fe", "Op", "Dj", "LO", "Gr", "Fo", "VS",
       // placeholders
       "El", "HD", "OM", "GE", "Gn", "MD",
 #if TAG_MAJOR_VERSION > 34
@@ -192,17 +193,18 @@ string species_name(species_type speci, bool genus, bool adj)
     default:
         switch (speci)
         {
-        case SP_HUMAN:      res = "Human";                             break;
-        case SP_HALFLING:   res = "Halfling";                          break;
-        case SP_KOBOLD:     res = "Kobold";                            break;
-        case SP_MUMMY:      res = "Mummy";                             break;
-        case SP_NAGA:       res = "Naga";                              break;
-        case SP_CENTAUR:    res = "Centaur";                           break;
-        case SP_SPRIGGAN:   res = "Spriggan";                          break;
-        case SP_MINOTAUR:   res = "Minotaur";                          break;
-        case SP_TENGU:      res = "Tengu";                             break;
-        case SP_GARGOYLE:   res = "Gargoyle";                          break;
-        case SP_FORMICID:   res = "Formicid";                          break;
+        case SP_HUMAN:          res = "Human";                                 break;
+        case SP_HALFLING:       res = "Halfling";                              break;
+        case SP_KOBOLD:         res = "Kobold";                                break;
+        case SP_MUMMY:          res = "Mummy";                                 break;
+        case SP_NAGA:           res = "Naga";                                  break;
+        case SP_CENTAUR:        res = "Centaur";                               break;
+        case SP_SPRIGGAN:       res = "Spriggan";                              break;
+        case SP_MINOTAUR:       res = "Minotaur";                              break;
+        case SP_TENGU:          res = "Tengu";                                 break;
+        case SP_GARGOYLE:       res = "Gargoyle";                              break;
+        case SP_FORMICID:       res = "Formicid";                              break;
+        case SP_VINE_STALKER:   res = "Vine Stalker";                          break;
 
         case SP_DEEP_DWARF:
             res = (adj ? "Dwarven" : genus ? "Dwarf" : "Deep Dwarf");
@@ -437,6 +439,7 @@ int species_exp_modifier(species_type species)
     case SP_HUMAN:
     case SP_HALFLING:
     case SP_KOBOLD:
+    case SP_VINE_STALKER:
         return 1;
     case SP_HILL_ORC:
     case SP_OGRE:
@@ -486,6 +489,7 @@ int species_hp_modifier(species_type species)
     case SP_FELID:
         return -4;
     case SP_SPRIGGAN:
+    case SP_VINE_STALKER:
         return -3;
     case SP_DEEP_ELF:
     case SP_TENGU:
@@ -541,6 +545,7 @@ int species_mp_modifier(species_type species)
         return 0;
     case SP_SLUDGE_ELF:
     case SP_TENGU:
+    case SP_VINE_STALKER:
         return 1;
     case SP_FELID:
     case SP_HIGH_ELF:
diff --git a/crawl-ref/source/spl-goditem.cc b/crawl-ref/source/spl-goditem.cc
index 292e9d6..92fb91c 100644
--- a/crawl-ref/source/spl-goditem.cc
+++ b/crawl-ref/source/spl-goditem.cc
@@ -381,6 +381,8 @@ int cast_healing(int pow, int max_pow, bool divine_ability,
 {
     pow = min(50, pow);
     max_pow = min(50, max_pow);
+    if (!not_self && !divine_ability && you.mutation[MUT_NO_DEVICE_HEAL])
+        return 0;
     return _healing_spell(pow + roll_dice(2, pow) - 2, (3 * max_pow) - 2,
                           divine_ability, where, not_self, mode);
 }
diff --git a/crawl-ref/source/tilepick-p.cc b/crawl-ref/source/tilepick-p.cc
index e0e9749..ae9a5eb 100644
--- a/crawl-ref/source/tilepick-p.cc
+++ b/crawl-ref/source/tilepick-p.cc
@@ -630,6 +630,8 @@ tileidx_t tilep_species_to_base_tile(int sp, int level)
         return TILEP_BASE_DJINNI;
     case SP_FORMICID:
         return TILEP_BASE_FORMICID;
+    case SP_VINE_STALKER:
+        return TILEP_BASE_VINE_STALKER;
     default:
         return TILEP_BASE_HUMAN;
     }
-- 
1.7.9.5


From 63647940e80fa2ccc96862125212dacec91c5280 Mon Sep 17 00:00:00 2001
From: Sage <SageBasilMint@gmail.com>
Date: Mon, 30 Dec 2013 14:45:06 -0800
Subject: [PATCH 2/5] Minor formatting fix.

---
 crawl-ref/source/acquire.cc |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/crawl-ref/source/acquire.cc b/crawl-ref/source/acquire.cc
index 9ebd7fe..3e0a29b 100644
--- a/crawl-ref/source/acquire.cc
+++ b/crawl-ref/source/acquire.cc
@@ -714,7 +714,10 @@ static int _acquirement_wand_subtype()
         {
         case WAND_HEAL_WOUNDS:
             if (you.mutation[MUT_NO_DEVICE_HEAL])
-                w = 0; break;
+            {
+                w = 0;
+                break;
+            }
         case WAND_HASTING:          // each 17.9%, group unknown each 26.3%
             w = 25; break;
         case WAND_TELEPORTATION:    // each 10.7%, group unknown each 17.6%
-- 
1.7.9.5


From 5e91883bbd82f93249ac6a84a3c8f8432c46a544 Mon Sep 17 00:00:00 2001
From: Sage <SageBasilMint@gmail.com>
Date: Mon, 30 Dec 2013 15:02:24 -0800
Subject: [PATCH 3/5] Prevent unidentified /HW from being grayed out for VS.

---
 crawl-ref/source/itemname.cc |    1 +
 1 file changed, 1 insertion(+)

diff --git a/crawl-ref/source/itemname.cc b/crawl-ref/source/itemname.cc
index f6e7124..cf47af2 100644
--- a/crawl-ref/source/itemname.cc
+++ b/crawl-ref/source/itemname.cc
@@ -3214,6 +3214,7 @@ bool is_useless_item(const item_def &item, bool temp)
             return true;
 
         if (you.mutation[MUT_NO_DEVICE_HEAL]
+            && item_type_known(item)
             && item.sub_type == WAND_HEAL_WOUNDS)
             return true;
 
-- 
1.7.9.5


From de8bc04a4babf2cf9891ddcb849e75da771cbaf0 Mon Sep 17 00:00:00 2001
From: Sage <SageBasilMint@gmail.com>
Date: Mon, 30 Dec 2013 15:34:01 -0800
Subject: [PATCH 4/5] Prevent vine stalker bite from draining firewood or
 summons.

Summons still get antimagic applied, though.
---
 crawl-ref/source/melee_attack.cc |   11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/crawl-ref/source/melee_attack.cc b/crawl-ref/source/melee_attack.cc
index a964894..2c75830 100644
--- a/crawl-ref/source/melee_attack.cc
+++ b/crawl-ref/source/melee_attack.cc
@@ -1620,14 +1620,17 @@ bool melee_attack::player_aux_apply(unarmed_attack_type atk)
             antimagic_affects_defender(true);
             mprf("You drain %s magic.",
                  defender->as_monster()->pronoun(PRONOUN_POSSESSIVE).c_str());
-            inc_mp(random2(damage_done) + 1);
 
-            if (spell_user) // The mana drain is more effective on spellcasters
+            if (!defender->as_monster()->is_summoned()
+                && !mons_is_firewood(defender->as_monster()))
             {
                 inc_mp(random2(damage_done) + 1);
-            }
 
-            mprf("You feel%sinvigorated.", spell_user ? " very " : " ");
+                if (spell_user) // The mana drain is more effective on spellcasters
+                    inc_mp(random2(damage_done) + 1);
+
+                mprf("You feel%sinvigorated.", spell_user ? " very " : " ");
+            }
         }
 
         if (atk == UNAT_TAILSLAP && you.species == SP_GREY_DRACONIAN
-- 
1.7.9.5


From a199003436e43886ba6641fd0ea0c065b719cdfb Mon Sep 17 00:00:00 2001
From: Sage <SageBasilMint@gmail.com>
Date: Mon, 30 Dec 2013 15:37:27 -0800
Subject: [PATCH 5/5] Change 'magic' to 'power' for non-spellcaster manadrain
 message.

In case people are wondering what vine stalkers get when biting e.g. geckos.
---
 crawl-ref/source/melee_attack.cc |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/crawl-ref/source/melee_attack.cc b/crawl-ref/source/melee_attack.cc
index 2c75830..717acfc 100644
--- a/crawl-ref/source/melee_attack.cc
+++ b/crawl-ref/source/melee_attack.cc
@@ -1618,8 +1618,9 @@ bool melee_attack::player_aux_apply(unarmed_attack_type atk)
             }
 
             antimagic_affects_defender(true);
-            mprf("You drain %s magic.",
-                 defender->as_monster()->pronoun(PRONOUN_POSSESSIVE).c_str());
+            mprf("You drain %s%s.",
+                 defender->as_monster()->pronoun(PRONOUN_POSSESSIVE).c_str()
+                 spell_user ? " magic" : " power");
 
             if (!defender->as_monster()->is_summoned()
                 && !mons_is_firewood(defender->as_monster()))
-- 
1.7.9.5

