max_lum) continue
- // turfs += T
- //M.current.remove_vampire_blood(30) This isn't the right place for this either.
-
- if(!turfs.len)
- usr << "\red You cannot find darkness to step to."
- return
-
- var/turf/picked = pick(turfs)
-
- if(!picked || !isturf(picked))
- return
- M.current.ExtinguishMob()
- if(M.current.buckled)
- M.current.buckled.unbuckle_mob()
- var/atom/movable/overlay/animation = new /atom/movable/overlay( get_turf(usr) )
- animation.name = usr.name
- animation.density = 0
- animation.anchored = 1
- animation.icon = usr.icon
- animation.alpha = 127
- animation.layer = 5
- //animation.master = src
- usr.loc = picked
- M.current.remove_vampire_blood(30)
- spawn(10)
- qdel(animation)
-// M.current.remove_vampire_blood(30)
- M.current.verbs -= /client/vampire/proc/vampire_shadowstep
- spawn(20)
- M.current.verbs += /client/vampire/proc/vampire_shadowstep
-
-/mob/proc/remove_vampire_blood(amount = 0)
- var/bloodold
- if(!mind || !mind.vampire)
+ var/datum/vampire/vampire = vampire_power(20, 0)
+ if (!vampire)
return
- bloodold = mind.vampire.bloodusable
- mind.vampire.bloodusable = max(0, (mind.vampire.bloodusable - amount))
- if(bloodold != mind.vampire.bloodusable)
- src << "\blue You have [mind.vampire.bloodusable] left to use."
-//prepare for copypaste
-/client/vampire/proc/update_vampire_icons_added(datum/mind/vampire_mind)
- var/ref = "\ref[vampire_mind]"
- if(ref in vampire_mind.vampire.thralls)
- if(vampire_mind.current)
- if(vampire_mind.current.client)
- var/I = image('icons/mob/mob.dmi', loc = vampire_mind.current, icon_state = "vampire")
- vampire_mind.current.client.images += I
- for(var/headref in vampire_mind.vampire.thralls)
- for(var/datum/mind/t_mind in vampire_mind.vampire.thralls[headref])
- var/datum/mind/head = locate(headref)
- if(head)
- if(head.current)
- if(head.current.client)
- var/I = image('icons/mob/mob.dmi', loc = t_mind.current, icon_state = "vampthrall")
- head.current.client.images += I
- if(t_mind.current)
- if(t_mind.current.client)
- var/I = image('icons/mob/mob.dmi', loc = head.current, icon_state = "vampire")
- t_mind.current.client.images += I
- if(t_mind.current)
- if(t_mind.current.client)
- var/I = image('icons/mob/mob.dmi', loc = t_mind.current, icon_state = "vampthrall")
- t_mind.current.client.images += I
+ var/list/locs = list()
-/client/vampire/proc/update_vampire_icons_removed(datum/mind/vampire_mind)
- for(var/headref in vampire_mind.vampire.thralls)
- var/datum/mind/head = locate(headref)
- for(var/datum/mind/t_mind in vampire_mind.vampire.thralls[headref])
- if(t_mind.current)
- if(t_mind.current.client)
- for(var/image/I in t_mind.current.client.images)
- if((I.icon_state == "vampthrall" || I.icon_state == "vampire") && I.loc == vampire_mind.current)
- //world.log << "deleting [vampire_mind] overlay"
- qdel(I)
- if(head)
- //world.log << "found [head.name]"
- if(head.current)
- if(head.current.client)
- for(var/image/I in head.current.client.images)
- if((I.icon_state == "vampthrall" || I.icon_state == "vampire") && I.loc == vampire_mind.current)
- //world.log << "deleting [vampire_mind] overlay"
- qdel(I)
- if(vampire_mind.current)
- if(vampire_mind.current.client)
- for(var/image/I in vampire_mind.current.client.images)
- if(I.icon_state == "vampthrall" || I.icon_state == "vampire")
- qdel(I)
-
-/client/vampire/proc/remove_vampire_mind(datum/mind/vampire_mind, datum/mind/head)
- //var/list/removal
- if(!istype(head))
- head = vampire_mind //workaround for removing a thrall's control over the enthralled
- var/ref = "\ref[head]"
- if(vampire_mind.vampire.thralls)
- vampire_mind.vampire.thralls[ref] -= vampire_mind
- vampire_mind.vampire.enthralled -= vampire_mind
- //vampire.special_role = null
- update_vampire_icons_removed(vampire_mind)
- //world << "Removed [vampire_mind.current.name] from vampire shit"
- vampire_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now."
-
-/mob/living/carbon/human/proc/check_sun()
-
- var/ax = x
- var/ay = y
-
- for(var/i = 1 to 20)
- ax += sun.dx
- ay += sun.dy
-
- var/turf/T = locate( round(ax,0.5),round(ay,0.5),z)
-
- if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy)
+ for (var/direction in alldirs)
+ if (locs.len == 2)
break
- if(T.density)
- return
- if(prob(35))
- switch(health)
- if(80 to 100)
- src << "\red Your skin flakes away..."
- if(60 to 80)
- src << "Your skin sizzles!"
- // if((-INFINITY) to 60)
- // if(!on_fire)
- // src << "\red Your skin catches fire!"
- // else
- // src << "\red You continue to burn!"
- // fire_stacks += 5
- // IgniteMob()
- // emote("scream")
- //else
- // switch(health)
- // if((-INFINITY) to 60)
- // fire_stacks++
- // IgniteMob()
- adjustFireLoss(30) //Original value was 3. Barely did anything. Vamps should vaporize in starlight.
+ var/turf/T = get_step(src, direction)
+ if (AStar(src.loc, T, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 1))
+ locs += T
-/mob/living/carbon/human/proc/handle_vampire()
-/* if(hud_used)
- if(!hud_used.vampire_blood_display)
- hud_used.vampire_hud()
- hud_used.human_hud('icons/mob/screen1_Vampire.dmi')
- hud_used.vampire_blood_display.maptext_width = 64
- hud_used.vampire_blood_display.maptext_height = 26
- hud_used.vampire_blood_display.maptext = " U:[mind.vampire.bloodusable]
T:[mind.vampire.bloodtotal]
"
- */
- handle_vampire_cloak()
- if(istype(loc, /turf/space))
- check_sun()
- mind.vampire.nullified = max(0, mind.vampire.nullified - 1)
+ var/count = 0
+ if (locs.len)
+ for (var/turf/to_spawn in locs)
+ count++
+ // #TODO:10 Check bats to stop attacking owner.
+ new /mob/living/simple_animal/hostile/scarybat(to_spawn, src)
+ count++
+
+ if (count != 2)
+ new /mob/living/simple_animal/hostile/scarybat(src.loc, src)
+ else
+ new /mob/living/simple_animal/hostile/scarybat(src.loc, src)
+ new /mob/living/simple_animal/hostile/scarybat(src.loc, src)
+
+ vampire.blood_usable -= 60
+ verbs -= /mob/living/carbon/human/proc/vampire_bats
+ spawn (1200)
+ verbs += /mob/living/carbon/human/proc/vampire_bats
+
+// Chiropteran Screech
+/mob/living/carbon/human/proc/vampire_screech()
+ set category = "Vampire"
+ set name = "Chiropteran Screech (90)"
+ set desc = "Emit a powerful screech which shatters glass within a seven-tile radius, and stuns hearers in a four-tile radius."
+
+ var/datum/vampire/vampire = vampire_power(90, 0)
+ if (!vampire)
+ return
+
+ visible_message("[src.name] lets out an ear piercin shriek!", "You let out an ear-shattering shriek!", "You hear a painfully loud shriek!")
+
+ for (var/mob/living/carbon/human/T in hearers(4, src))
+ if (T == src)
+ continue
+
+ if (istype(T) && (T:l_ear || T:r_ear) && istype((T:l_ear || T:r_ear), /obj/item/clothing/ears/earmuffs))
+ continue
+
+ if (!vampire_can_affect_target(T))
+ continue
+
+ T << "You hear an ear piercing shriek and feel your senses go dull!"
+ T.Weaken(5)
+ T.ear_deaf = 20
+ T.stuttering = 20
+ T.Stun(5)
+
+ for (var/obj/structure/window/W in view(7))
+ W.shatter()
+
+ for (var/obj/machinery/light/L in view(7))
+ L.broken()
+
+ playsound(src.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
+ vampire.blood_usable -= 90
+
+ verbs -= /mob/living/carbon/human/proc/vampire_screech
+ spawn(3600)
+ verbs += /mob/living/carbon/human/proc/vampire_screech
+
+// Enables the vampire to be untouchable and walk through walls and other solid things.
+/mob/living/carbon/human/proc/vampire_veilwalk()
+ set category = "Vampire"
+ set name = "Toggle Veil Walking (80)"
+ set desc = "You enter the veil, leaving only an incorporeal manifestation of you visible to the others."
+
+ var/datum/vampire/vampire = vampire_power(80, 0)
+ if (!vampire)
+ return
+
+ var/obj/effect/dummy/veil_walk/holder = new /obj/effect/dummy/veil_walk(get_turf(loc))
+ holder.activate(src)
+
+ vampire.blood_usable -= 80
+
+// Veilwalk's dummy holder
+// TODO: Move this to its own file.
+/obj/effect/dummy/veil_walk
+ name = "a red ghost"
+ desc = "A red, shimmering presence."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "blank"
+ density = 0
+
+ var/last_valid_turf = null
+ var/can_move = 1
+ var/processing = 0
+ var/mob/owner_mob = null
+ var/datum/vampire/owner_vampire = null
+ var/warning_level = 0
+
+/obj/effect/dummy/veil_walk/Destroy()
+ eject_all()
+
+ if (processing)
+ processing_objects -= src
+ processing = 0
+
+ return ..()
+
+/obj/effect/dummy/veil_walk/proc/eject_all()
+ for (var/atom/movable/A in src)
+ A.forceMove(loc)
+ if (ismob(A))
+ var/mob/M = A
+ M.reset_view(null)
+
+/obj/effect/dummy/veil_walk/relaymove(var/mob/user, direction)
+ if (!can_move)
+ return
+
+ var/turf/new_loc = get_step(src, direction)
+ if (new_loc.flags & NOJAUNT || istype(new_loc.loc, /area/chapel))
+ usr << "Some strange aura is blocking the way!"
+ return
+
+ forceMove(new_loc)
+ var/turf/T = get_turf(loc)
+ if (!T.contains_dense_objects())
+ last_valid_turf = T
+
+ can_move = 0
+ spawn(2)
+ can_move = 1
+
+/obj/effect/dummy/veil_walk/process()
+ if (owner_vampire.blood_usable >= 5)
+ owner_vampire.blood_usable -= 5
+
+ switch (warning_level)
+ if (0)
+ if (owner_vampire.blood_usable <= 5 * 20)
+ owner_mob << "Your pool of blood is diminishing. You cannot stay in the veil for too long."
+ warning_level = 1
+ if (1)
+ if (owner_vampire.blood_usable <= 5 * 10)
+ owner_mob << "You will be ejected from the veil soon, as your pool of blood is running dry."
+ warning_level = 2
+ if (2)
+ if (owner_vampire.blood_usable <= 5 * 5)
+ owner_mob << "You cannot sustain this form for any longer!"
+ warning_level = 3
+ else
+ deactivate()
+
+/obj/effect/dummy/veil_walk/proc/activate(var/mob/owner)
+ if (!owner)
+ qdel(src)
+ return
+
+ owner_mob = owner
+ owner_vampire = owner.vampire_power()
+ if (!owner_vampire)
+ qdel(src)
+ return
+
+ owner_vampire.holder = src
+
+ owner.vampire_phase_out(get_turf(owner.loc))
+
+ icon_state = "veil_ghost"
+
+ last_valid_turf = get_turf(owner.loc)
+ owner.loc = src
+
+ desc += " Its features look faintly alike [owner.name]'s."
+
+ processing = 1
+ processing_objects += src
+
+/obj/effect/dummy/veil_walk/proc/deactivate()
+ if (processing)
+ processing_objects -= src
+ processing = 0
+
+ can_move = 0
+
+ icon_state = "blank"
+
+ owner_mob.vampire_phase_in(get_turf(loc))
+
+ eject_all()
+
+ owner_mob = null
+
+ owner_vampire.holder = null
+ owner_vampire = null
+
+ qdel(src)
+
+/obj/effect/dummy/veil_walk/ex_act(vars)
+ return
+
+/obj/effect/dummy/veil_walk/bullet_act(vars)
+ return
+
+// Heals the vampire at the cost of blood.
+/mob/living/carbon/human/proc/vampire_bloodheal()
+ set category = "Vampire"
+ set name = "Blood Heal"
+ set desc = "At the cost of blood and time, heal any injuries you have sustained."
+
+ var/datum/vampire/vampire = vampire_power(15, 0)
+ if (!vampire)
+ return
+
+ // Kick out of the already running loop.
+ if (vampire.is_healing)
+ vampire.is_healing = 0
+ return
+
+ vampire.is_healing = 1
+
+ while (do_after(src, 20, 5, 0))
+ if (vampire.is_healing == 0)
+ src << "Your concentration is broken! You are no longer regenerating!"
+ break
+
+ var/tox_loss = getToxLoss()
+ var/oxy_loss = getOxyLoss()
+ var/ext_loss = getBruteLoss() + getFireLoss()
+ var/clone_loss = getCloneLoss()
+
+ var/blood_used = 0
+ var/to_heal = 0
+
+ if (tox_loss)
+ to_heal = min(10, tox_loss)
+ adjustToxLoss(0 - to_heal)
+ blood_used += round(to_heal * 1.2)
+ if (oxy_loss)
+ to_heal = min(10, oxy_loss)
+ adjustOxyLoss(0 - to_heal)
+ blood_used += round(to_heal * 1.2)
+ if (ext_loss)
+ to_heal = min(20, ext_loss)
+ heal_overall_damage(min(10, getBruteLoss()), min(10, getFireLoss()))
+ blood_used += round(to_heal * 1.2)
+ if (clone_loss)
+ to_heal = min(10, clone_loss)
+ adjustCloneLoss(0 - to_heal)
+ blood_used += round(to_heal * 1.2)
+
+ var/list/organs = get_damaged_organs()
+ if (organs.len)
+ // Heal an absurd amount, basically regenerate one organ.
+ heal_organ_damage(50, 50)
+ blood_used += 12
+
+ var/list/emotes_lookers = list("[src.name]'s skin appears to liquefy for a moment, sealing up their wounds.",
+ "[src.name]'s veins turn black as their damaged flesh regenerates before your eyes!",
+ "[src.name]'s skin begins to split open. It turns to ash and falls away, revealing the wound to be fully healed.",
+ "Whispering arcane things, [src.name]'s damaged flesh appears to regenerate.",
+ "Thick globs of blood cover a wound on [src.name]'s body, eventually melding to be one with \his flesh.",
+ "[src.name]'s body crackles, skin and bone shifting back into place.")
+ var/list/emotes_self = list("Your skin appears to liquefy for a moment, sealing up your wounds.",
+ "Your veins turn black as their damaged flesh regenerates before your eyes!",
+ "Your skin begins to split open. It turns to ash and falls away, revealing the wound to be fully healed.",
+ "Whispering arcane things, your damaged flesh appears to regenerate.",
+ "Thick globs of blood cover a wound on your body, eventually melding to be one with your flesh.",
+ "Your body crackles, skin and bone shifting back into place.")
+
+ if (prob(20))
+ visible_message("[pick(emotes_lookers)]", "[pick(emotes_self)]")
+
+ if (vampire.blood_usable <= blood_used)
+ vampire.blood_usable = 0
+ vampire.is_healing = 0
+ src << "You ran out of blood, and are unable to continue!"
+ break
+
+ // We broke out of the loop naturally. Gotta catch that.
+ if (vampire.is_healing)
+ vampire.is_healing = 0
+ src << "Your concentration is broken! You are no longer regenerating!"
+
+ return
+
+// Dominate a victim, imbed a thought into their mind.
+/mob/living/carbon/human/proc/vampire_dominate()
+ set category = "Vampire"
+ set name = "Dominate (25)"
+ set desc = "Dominate the mind of a victim, make them obey your will."
+
+ var/datum/vampire/vampire = vampire_power(25, 0)
+ if (!vampire)
+ return
+
+ var/list/victims = list()
+ for (var/mob/living/carbon/human/H in view(7))
+ if (H == src)
+ continue
+ victims += H
+
+ if (!victims.len)
+ src << "No suitable targets."
+ return
+
+ var/mob/living/carbon/human/T = input(src, "Select Victim") as null|mob in victims
+
+ if (!vampire_can_affect_target(T))
+ return
+
+ // #TODO: Make higher level vampires automatically dominate, instead of taking a check.
+
+ if (!do_mob(src, T, 50))
+ src << "Your concentration is broken!"
+ return
+
+ var/command = input(src, "Command your victim.", "Your command.")
+
+ if (!command)
+ src << "\red Cancelled."
+ return
+
+ T << "You feel a strong presence enter your mind. For a moment, you hear nothing but what it says, and are compelled to follow its direction:
[command]"
+ src << "You command [T.name], and they will obey."
+ emote("me", 1, "whispers.")
+
+ vampire.blood_usable -= 25
+ verbs -= /mob/living/carbon/human/proc/vampire_dominate
+ spawn(1800)
+ verbs += /mob/living/carbon/human/proc/vampire_dominate
+
+// Enthralls a person, giving the vampire a mortal slave.
+/mob/living/carbon/human/proc/vampire_enthrall()
+ set category = "Vampire"
+ set name = "Enthrall (150)"
+ set desc = "Bind a mortal soul with a bloodbond to obey your every command."
+
+ var/datum/vampire/vampire = vampire_power(150, 0)
+ if (!vampire)
+ return
+
+ var/list/victims = list()
+ for (var/mob/living/carbon/human/H in view(1))
+ if (H == src)
+ continue
+ victims += H
+
+ if (!victims.len)
+ src << "No suitable targets."
+ return
+
+ var/mob/living/carbon/human/T = input(src, "Select Victim") as null|mob in victims
+
+ if (!vampire_can_affect_target(T))
+ return
+
+ visible_message("[src.name] tears the flesh on their wrist, and holds it up to [T.name]. In a gruesome display, [T.name] starts lapping up the blood that's oozing from the fresh wound.", "You inflict a wound upon yourself, and force them to drink your blood.")
+ T << "You feel an irresistable desire to drink the blood pooling out of [src.name]'s wound. Against your better judgement, you give in and start doing so."
+
+ if (!do_mob(src, T, 50))
+ visible_message("[src.name] yanks away their hand from [T.name]'s mouth as they're interrupted, the wound quickly sealing itself!", "You are interrupted!")
+ return
+
+ T << "Your mind blanks as you finish feeding from [src.name]'s wrist."
+ vampire_thrall.add_antagonist(T.mind, 1, 1, 0, 0, 1)
+
+ T.mind.vampire.master = src
+ T << "You have been forced into a blood bond by [T.mind.vampire.master], and are thus their thrall. While a thrall may feel a myriad of emotions towards their master, ranging from fear, to hate, to love; the supernatural bond between them still forces the thrall to obey their master, and to listen to the master's commands.
You must obey your master's orders, you must protect them, you cannot harm them."
+
+ mind.vampire.blood_usable -= 150
+ verbs -= /mob/living/carbon/human/proc/vampire_enthrall
+ spawn(2800)
+ verbs += /mob/living/carbon/human/proc/vampire_enthrall
+
+// Gives a lethal disease to the target.
+/mob/living/carbon/human/proc/vampire_diseasedtouch()
+ set category = "Vampire"
+ set name = "Diseased Touch (200)"
+ set desc = "Infects the victim with corruption from the Veil, causing their organs to fail."
+
+ var/datum/vampire/vampire = vampire_power(200, 0)
+ if (!vampire)
+ return
+
+ var/list/victims = list()
+ for (var/mob/living/carbon/human/H in view(1))
+ if (H == src)
+ continue
+ victims += H
+
+ if (!victims.len)
+ src << "No suitable targets."
+ return
+
+ var/mob/living/carbon/human/T = input(src, "Select Victim") as null|mob in victims
+
+ if (!vampire_can_affect_target(T))
+ return
+
+ help_shake_act(T)
+
+ var/datum/disease2/disease/lethal = new
+ lethal.makerandom(3)
+ lethal.infectionchance = 1
+ lethal.stage = lethal.max_stage
+ lethal.spreadtype = "None"
+
+ infect_mob(T, lethal)
+
+ vampire.blood_usable -= 200
+ verbs -= /mob/living/carbon/human/proc/vampire_diseasedtouch
+ spawn(1800)
+ verbs += /mob/living/carbon/human/proc/vampire_diseasedtouch
+
+// Makes the vampire appear 'friendlier' to others.
+/mob/living/carbon/human/proc/vampire_presence()
+ set category = "Vampire"
+ set name = "Presence (10)"
+ set desc = "Influences those weak of mind to look at you in a friendlier light."
+
+ var/datum/vampire/vampire = vampire_power(15, 0)
+ if (!vampire)
+ return
+
+ if (vampire.using_presence)
+ vampire.using_presence = 0
+ return
+
+ src << "You begin passively influencing the weak minded."
+ vampire.using_presence = 1
+
+ var/list/mob/living/carbon/human/affected = list()
+ // #TODO: Emotes list for Presence
+ var/list/emotes = list()
+
+ vampire.blood_usable -= 10
+
+ while (vampire.using_presence)
+ // Run every 20 seconds
+ sleep(200)
+
+ for (var/mob/living/carbon/human/T in view(5))
+ if (T == src)
+ continue
+
+ if (!vampire_can_affect_target(T))
+ continue
+
+ if (!T.client)
+ continue
+
+ var/probability = 50
+ if (!(T in affected))
+ affected += T
+ probability = 80
+
+ if (prob(probability))
+ T << "[pick(emotes)]"
+
+ vampire.blood_usable -= 5
+
+ if (vampire.blood_usable < 5)
+ vampire.using_presence = 0
+ break
+
+ src << "You are no longer influencing those weak of mind."
+
+// Convert a human into a vampire.
+/mob/living/carbon/human/proc/vampire_embrace()
+ set category = "Vampire"
+ set name = "The Embrace"
+ set desc = "Spread your corruption to an innocent soul, turning them into a spawn of the Veil, much akin to yourself."
+
+ var/datum/vampire/vampire = vampire_power(0, 0)
+ if (!vampire)
+ return
+
+ // Re-using blood drain code.
+ var/obj/item/weapon/grab/G = get_active_hand()
+ if (!istype(G))
+ src << "You must be grabbing a victim in your active hand to drain their blood."
+ return
+
+ if (G.state == GRAB_PASSIVE || G.state == GRAB_UPGRADING)
+ src << "You must have the victim pinned to the ground to drain their blood."
+ return
+
+ var/mob/living/carbon/human/T = G.affecting
+ if (!vampire_can_affect_target(T))
+ return
+
+ if (!T.client)
+ src << "[T.name] is a mindless husk. The Veil has no purpose for them."
+ return
+
+ if (T.stat == 2)
+ src << "[T.name]'s body is broken and damaged beyond salvation. You have no use for them."
+ return
+
+ if (vampire.is_draining)
+ src << "Your fangs are already sunk into a victim's neck!"
+ return
+
+ if (T.mind.vampire)
+ var/datum/vampire/draining_vamp = T.mind.vampire
+
+ if (draining_vamp.is_thrall)
+ var/choice_text = ""
+ var/denial_response = ""
+ if (draining_vamp.master == src)
+ choice_text = "[T.name] is your thrall. Do you wish to release them from the blood bond and give them the chance to become your equal?"
+ denial_response = "You opt against giving [T] a chance to ascend, and choose to keep them as a servant."
+ else
+ choice_text = "You can feel the taint of another master running in the veins of [T.name]. Do you wish to release them of their blood bond, and convert them into a vampire, in spite of their master?"
+ denial_response = "You choose not to continue with the Embrace, and permit [T.name] to keep serving their master."
+
+ if (alert(src, choice_text, "Choices", "Yes", "No") == "No")
+ src << "[denial_response]"
+ return
+ else
+ src << "You feel corruption running in [T.name]'s blood. Much like yourself, \he[T] is already a spawn of the Veil, and cannot be Embraced."
+ return
+
+ vampire.is_draining = 1
+
+ visible_message("\red [src.name] bites [T.name]'s neck!", "\red You bite [T.name]'s neck and begin to drain their blood, as the first step of introducing the corruption of the Veil to them.", "\blue You hear a soft puncture and a wet sucking noise")
+
+ T << "A dark force pushes you back into your body. You find yourself somehow still clinging to life."
+
+ T.Weaken(50)
+ vamp.add_antagonist(T.mind)
+
+ T << "You awaken. Moments ago, you were dead, your conciousness still forced stuck inside your body. Now you live. You feel different, a strange, dark force now present within you. You have an insatiable desire to drain the blood of mortals, and to grow in power."
+ src << "You have corrupted another mortal with the taint of the Veil. Beware: they will awaken hungry and maddened; not bound to any master."
+
+ T.mind.vampire.frenzy = 250
+ T.vampire_check_frenzy()
+
+ vampire.is_draining = 0
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index c84581f6b1f..38a988012c3 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -65,11 +65,6 @@
else
user.visible_message("\red [user]'s concentration is broken!", "\red Your concentration is broken! You and your target need to stay uninterrupted for longer!")
return
- else if(M.mind && M.mind.vampire)
- if(!(VAMP_FULL in M.mind.vampire.powers))
- user << "\red The rod burns cold in your hand, filling you with grim determination. You feel the creature's power weaken."
- M << "The nullrod's power interferes with your own! They are on to you!"
- M.mind.vampire.nullified = max(8, M.mind.vampire.nullified + 8)
else if(prob(10))
user << "The rod slips in your hand."
..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f5be082465c..e3b6f36bc93 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -80,7 +80,8 @@
if(mind)
if(mind.vampire)
- stat("Blood", mind.vampire.bloodusable)
+ stat("Usable Blood", mind.vampire.blood_usable)
+ stat("Total Blood", mind.vampire.blood_total)
if(mind.changeling)
stat("Chemical Storage", mind.changeling.chem_charges)
stat("Genetic Damage Time", mind.changeling.geneticdamage)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 5147dd641ed..419a8c3e55d 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -144,32 +144,6 @@
return 1
if(I_HURT)
- //Vampire code
- if(H.zone_sel && M.zone_sel.selecting == "head")
- if(H.mind && H.mind.vampire && !H.mind.vampire.draining)
- if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
- H << "\red Remove their mask!"
- return 0
- if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
- H << "\red Remove your mask!"
- return 0
- if(mind && mind.vampire)
- H << "\red Your fangs fail to pierce [src.name]'s cold flesh"
- return 0
- if(get_species() == "Machine")
- H << "\red They have no blood"
- return 0
- //we're good to suck the blood, blaah
- //and leave an attack log
- H.attack_log += text("\[[time_stamp()]\] Bit [src.name] ([src.ckey]) in the neck and draining their blood")
- src.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [H.name] ([H.ckey])")
- msg_admin_attack("[key_name_admin(H)] bit [key_name_admin(src)] in the neck - JMP")
- H.handle_bloodsucking(src)
- // var/datum/organ/external/affecting = get_organ(src.zone_sel.selecting)
- // affecting.take_damage(10,0,1,0,"dual puncture marks") //this does not work and causes runtimes.
- return
- //end vampire codes
-
if(!istype(H))
attack_generic(H,rand(1,3),"punched")
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 293be2d0dda..71da772f1c3 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1261,14 +1261,6 @@
see_in_dark = species.darksight
see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : SEE_INVISIBLE_LIVING
- if(mind && mind.vampire)
- if((VAMP_VISION in mind.vampire.powers) && !(VAMP_FULL in mind.vampire.powers))
- sight |= SEE_MOBS
- if((VAMP_FULL in mind.vampire.powers))
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
-
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index ae53810bdd7..87ad6518f0b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -208,18 +208,7 @@
/datum/reagent/water/holywater/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
- if(ishuman(M)) // Any location
- if(M.mind && cult.is_antagonist(M.mind) && prob(10))
- cult.remove_antagonist(M.mind)
- if(M.mind.vampire && (!(VAMP_FULL in M.mind.vampire.powers)))
- if(!M) M = holder.my_atom
- M.adjustFireLoss(6)
- M.adjust_fire_stacks(1)
- M.IgniteMob()
- //M.take_organ_damage(0, 1*REM)
- if(prob(20))
- for (var/mob/V in viewers(src))
- V.show_message(text("\red []'s skin sizzles and burns.", M), 1)
+ //#TODO: holy water adds frenzy
/datum/reagent/water/holywater/touch_turf(var/turf/T)
if(volume >= 5)
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 3afb1abc0df..9d7c49726cd 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -53,11 +53,11 @@
need_to_break = 1
reagents.remove_reagent("blood", blood_taken)
- user.mind.vampire.bloodtotal += blood_taken
+ user.mind.vampire.blood_total += blood_taken
user.check_vampire_upgrade(user.mind)
if (blood_taken)
- user << "\blue You have accumulated [user.mind.vampire.bloodtotal] [user.mind.vampire.bloodtotal > 1 ? "units" : "unit"] of blood and have [user.mind.vampire.bloodusable] left to use."
+ user << "\blue You have accumulated [user.mind.vampire.blood_total] [user.mind.vampire.blood_total > 1 ? "units" : "unit"] of blood and have [user.mind.vampire.blood_usable] left to use."
if (need_to_break)
break
diff --git a/code/setup.dm b/code/setup.dm
index 9b6e3d36143..9693c707789 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -870,6 +870,7 @@ var/list/be_special_flags = list(
#define MODE_LOYALIST "loyalist"
#define MODE_MALFUNCTION "malf"
#define MODE_TRAITOR "traitor"
+#define MODE_THRALL "thrall"
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index ef8ee9d29b2..e695ec72bd9 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ