// Make a vampire, add initial powers. /mob/proc/make_vampire() if (!mind) return if (!mind.vampire) mind.vampire = new /datum/vampire() // No powers to thralls. Ew. if (mind.vampire.status & VAMP_ISTHRALL) return mind.vampire.blood_usable += 30 verbs += new/datum/game_mode/vampire/verb/vampire_help for (var/datum/power/vampire/P in vampirepowers) if (!P.blood_cost) if (!(P in mind.vampire.purchased_powers)) mind.vampire.add_power(mind, P, 0) return 1 // Checks the vampire's bloodlevel and unlocks new powers based on that. /mob/proc/check_vampire_upgrade() if (!mind.vampire) return var/datum/vampire/vampire = mind.vampire for (var/datum/power/vampire/P in vampirepowers) if (P.blood_cost <= vampire.blood_total) if (!(P in vampire.purchased_powers)) vampire.add_power(mind, P, 1) if (!(vampire.status & VAMP_FULLPOWER) && vampire.blood_total >= 650) vampire.status |= VAMP_FULLPOWER src << "You've gained full power. Some abilities now have bonus functionality, or work faster." // Runs the checks for whether or not we can use a power. /mob/proc/vampire_power(var/required_blood = 0, var/max_stat = 0, var/ignore_holder = 0, var/disrupt_healing = 1, var/required_vampire_blood = 0) if (!mind) return if (!ishuman(src)) return var/datum/vampire/vampire = mind.vampire if (!vampire) log_debug("[src] has a vampire power but is not a vampire.") return if (vampire.holder && !ignore_holder) src << "You cannot use this power while walking through the Veil." return if (stat > max_stat) src << "You are incapacitated." return if (required_blood > vampire.blood_usable) src << "You do not have enough usable blood. [required_blood] needed." return if ((vampire.status & VAMP_HEALING) && disrupt_healing) vampire.status &= ~VAMP_HEALING return vampire // Checks whether or not the target can be affected by a vampire's abilities. /mob/proc/vampire_can_affect_target(var/mob/living/carbon/human/T, var/notify = 1, var/account_loyalty_implant = 0) if (!T || !istype(T)) return 0 // How did you even get here? if (!mind.vampire) return 0 if ((mind.vampire.status & VAMP_FULLPOWER) && !(T.mind.vampire && (T.mind.vampire.status & VAMP_FULLPOWER))) return 1 if (T.mind) if (T.mind.assigned_role == "Chaplain") if (notify) src << "Your connection with the Veil is not strong enough to effect a man as devout as them." return 0 else if (T.mind.vampire) if (notify) src << "You lack the power required to affect another creature of the Veil." return 0 if (isipc(T)) if (notify) src << "You lack the power interact with mechanical constructs." return 0 if (account_loyalty_implant) for (var/obj/item/weapon/implant/loyalty/I in T) if (I.implanted) if (notify) src << "You feel [T.name]'s mind unreachable due to forced loyalty." return 0 return 1 // Plays the vampire phase in animation. /mob/proc/vampire_phase_in(var/turf/T = null) if (!T) return anim(T, src, 'icons/mob/mob.dmi', , "bloodify_in", , dir) // Plays the vampire phase out animation. /mob/proc/vampire_phase_out(var/turf/T = null) if (!T) return anim(T, src, 'icons/mob/mob.dmi', , "bloodify_out", , dir) // Make a vampire thrall /mob/proc/vampire_make_thrall() if (!mind) return var/datum/vampire/thrall/thrall = new() mind.vampire = thrall /mob/proc/vampire_check_frenzy(var/force_frenzy = 0) if (!mind || !mind.vampire) return var/datum/vampire/vampire = mind.vampire // Thralls don't frenzy. if (vampire.status & VAMP_ISTHRALL) return /* * Misc info: * 100 points ~= 3.5 minutes. * Average duration should be around 4 minutes of frenzy. * Trigger at 120 points or higher. */ if (vampire.status & VAMP_FRENZIED) if (vampire.frenzy < 10) vampire_stop_frenzy() else var/next_alert = 0 var/message = "" switch (vampire.frenzy) if (0) return if (1 to 20) // Pass function would be amazing here. next_alert = 0 message = "" if (21 to 40) next_alert = 600 message = "You feel the power of the Veil bubbling in your veins." if (41 to 60) next_alert = 500 message = "The corruption within your blood is seeking to take over, you can feel it." if (61 to 80) next_alert = 400 message = "Your rage is growing ever greater. You are having to actively resist it." if (81 to 120) next_alert = 300 message = "The corruption of the Veil is about to take over. You have little time left." else vampire_start_frenzy(force_frenzy) if (next_alert && message) if (!vampire.last_frenzy_message || vampire.last_frenzy_message + next_alert < world.time) usr << message vampire.last_frenzy_message = world.time // Remove one point per every life() tick. if (vampire.frenzy > 0) vampire.frenzy-- /mob/proc/vampire_start_frenzy(var/force_frenzy = 0) var/datum/vampire/vampire = mind.vampire if (vampire.status & VAMP_FRENZIED) return var/probablity = force_frenzy ? 100 : vampire.frenzy * 0.5 if (prob(probablity)) vampire.status |= VAMP_FRENZIED visible_message("A dark aura manifests itself around [src.name], their eyes turning red and their composure changing to be more beast-like.", "You can resist no longer. The power of the Veil takes control over your mind: you are unable to speak or think. In people, you see nothing but prey to be feasted upon. You are reduced to an animal.") mutations.Add(HULK) update_mutations() sight |= SEE_MOBS verbs += /mob/living/carbon/human/proc/grapple /mob/proc/vampire_stop_frenzy(var/force_stop = 0) var/datum/vampire/vampire = mind.vampire if (!(vampire.status & VAMP_FRENZIED)) return if (prob(force_stop ? 100 : vampire.blood_usable)) vampire.status &= ~VAMP_FRENZIED mutations.Remove(HULK) update_mutations() sight &= ~SEE_MOBS visible_message("[src.name]'s eyes no longer glow with violent rage, their form reverting to resemble that of a normal human's.", "The beast within you retreats. You gain control over your body once more.") verbs -= /mob/living/carbon/human/proc/grapple // Removes all vampire powers. /mob/proc/remove_vampire_powers() if (!mind || !mind.vampire) return for (var/datum/power/vampire/P in mind.vampire.purchased_powers) if (P.isVerb) verbs -= P.verbpath if (mind.vampire.status & VAMP_FRENZIED) vampire_stop_frenzy(1) /mob/proc/handle_vampire() // Apply frenzy while in the chapel. if (istype(get_area(loc), /area/chapel)) mind.vampire.frenzy += 3 if (mind.vampire.blood_usable < 10) mind.vampire.frenzy += 2 vampire_check_frenzy() return