diff --git a/code/__DEFINES/traits/definitions.dm b/code/__DEFINES/traits/definitions.dm
index 5f955271eba..0e78725037d 100644
--- a/code/__DEFINES/traits/definitions.dm
+++ b/code/__DEFINES/traits/definitions.dm
@@ -472,6 +472,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_KNOWBANDITS "knowbandits"
#define TRAIT_VAMPMANSION "vampiremansion"
#define TRAIT_VAMP_DREAMS "vamp_dreams"
+#define TRAIT_VAMP_OFFERED "offered_vampirism"
#define TRAIT_INHUMENCAMP "inhumencamp"
#define TRAIT_INTRAINING "intraining" //allows certain roles to bypass the average skill limitation of training dummies
#define TRAIT_STEELHEARTED "steelhearted" //no bad mood from dismembering or seeing this
diff --git a/code/datums/elements/one_time_poison.dm b/code/datums/elements/one_time_poison.dm
deleted file mode 100644
index 1747b7be6f3..00000000000
--- a/code/datums/elements/one_time_poison.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/datum/element/one_time_poison
- element_flags = ELEMENT_DETACH_ON_HOST_DESTROY
-
-/datum/element/one_time_poison/Attach(atom/movable/target, list/reagent_list)
- . = ..()
- if(!istype(target, /obj/item/weapon))
- return ELEMENT_INCOMPATIBLE
- if(!LAZYLEN(reagent_list))
- return ELEMENT_INCOMPATIBLE
- if(!target.reagents)
- target.create_reagents(1)
- target.reagents.add_reagent_list(reagent_list)
- RegisterSignal(target, COMSIG_ITEM_ATTACK_EFFECT_SELF, PROC_REF(try_inject))
- RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
-
-/datum/element/one_time_poison/Detach(datum/source, force)
- . = ..()
- UnregisterSignal(source, list(COMSIG_ITEM_ATTACK_EFFECT_SELF, COMSIG_ATOM_EXAMINE))
-
-/datum/element/one_time_poison/proc/try_inject(obj/item/source, mob/user, obj/item/bodypart/affecting, intent, mob/living/victim, selzone)
- var/reagentlog2 = source.reagents
- if(!isliving(victim))
- return
-
- log_combat(user, victim, "poisoned", addition="with [reagentlog2]")
- source.reagents.trans_to(victim, source.reagents.get_reagent_amount(), transfered_by = user)
- Detach(src, TRUE)
- qdel(src, TRUE)
-
-/datum/element/one_time_poison/proc/on_examine(atom/movable/source, mob/user, list/examine_list)
- if(source.reagents.total_volume)
- var/reagent_color = mix_color_from_reagents(source.reagents.reagent_list)
- examine_list += span_red("Has been dipped in something!")
diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm
index c3abb49a20a..158421716e0 100644
--- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm
+++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm
@@ -46,7 +46,16 @@
message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(victim)]")
log_attack("[key_name(src)] successfully Diablerized [key_name(victim)].")
to_chat(src, span_danger("I have consumed my kindred!"))
+ to_chat(victim, span_userdanger("One of the kindred have consumed me! I share part of their mind now."))
victim.death()
+ //copied from the profane dagger
+ var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src)
+ soulstone_spirit.AddComponent(/datum/component/soulstoned, src)
+ soulstone_spirit.name = src.real_name //To imitate a vampire going insane through diablerism, the spirit of the consumed can still speak out loud
+ soulstone_spirit.real_name = victim.real_name
+ soulstone_spirit.PossessByPlayer(victim.key)
+ soulstone_spirit.cancel_camera()
+ src.maxbloodpool += 500 //increase bloodpool from diablerism
return 0
else
to_chat(src, span_userdanger("YOU TRY TO COMMIT DIABLERIE ON [victim]."))
@@ -74,7 +83,7 @@
return drink_amt
/mob/living/carbon/human/proc/vampire_conversion_prompt(mob/living/carbon/sire)
- if(HAS_TRAIT(src, "offered_vampirism"))
+ if(HAS_TRAIT(src, TRAIT_VAMP_OFFERED))
return // my testing allowed to double up the prompts, so just incase
if(!istype(sire?.mind?.has_antag_datum(/datum/antagonist/vampire), /datum/antagonist/vampire) || !sire.clan)
return
@@ -88,7 +97,7 @@
to_chat(sire, span_warning("[src]'s soul is beyond your grasp."))
return
- ADD_TRAIT(src, "offered_vampirism", INNATE_TRAIT)
+ ADD_TRAIT(src, TRAIT_VAMP_OFFERED, INNATE_TRAIT)
if(is_antag_banned(client_victim.ckey, ROLE_VAMPIRE))
to_chat(sire, span_warning("[src] could not be sired."))
return
@@ -107,7 +116,17 @@
return
grab_ghost(TRUE, TRUE)
revive((HEAL_DAMAGE|HEAL_AFFLICTIONS|HEAL_LIMBS|HEAL_WOUNDS|HEAL_ORGANS), 500, TRUE)
+ if(src.mind.has_antag_datum(/datum/antagonist/ghoul)) //removing old covens for thralls
+ var/obj/item/bodypart/chest = src.get_bodypart(BODY_ZONE_CHEST)
+ if(chest)
+ for (var/datum/bodypart_feature/F in chest.bodypart_features)
+ if (istype(F, /datum/bodypart_feature/vamprire_seal))
+ chest.remove_bodypart_feature(F)
+ src.mind.remove_antag_datum(/datum/antagonist/ghoul)
mind.add_antag_datum(new /datum/antagonist/vampire(C, TRUE))
+ var/datum/clan_hierarchy_node/new_clan_position = C.create_position(pick(C.new_members_titles), "A new member of clan [C.name]", sire.clan_position, 1)
+ new_clan_position.assign_member(src)
set_bloodpool(500)
+ grant_undead_eyes()
visible_message(span_danger("Some dark energy begins to flow into [src]..."))
visible_message(span_red("[src] rises as a new spawn!"))
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm
index 503de4e20e7..3dea14ec3c9 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm
@@ -40,6 +40,7 @@ And it also helps for the character set panel
TRAIT_NOAMBUSH,
TRAIT_DARKVISION,
TRAIT_LIMBATTACHMENT,
+ TRAIT_VAMP_OFFERED
)
var/silent_join = FALSE
@@ -52,10 +53,11 @@ And it also helps for the character set panel
var/list/clan_members = list()
var/list/non_vampire_members = list()
+ var/list/new_members_titles = list("Neonate", "Fledgling", "Youngblood", "Progeny")
/// Whether this clan allows non-vampire members
var/allows_non_vampires = TRUE
/// Title for non-vampire members
- var/non_vampire_title = "Slave"
+ var/non_vampire_title = "Thrall"
var/has_hierarchy = TRUE
var/datum/clan_hierarchy_node/hierarchy_root
var/list/datum/clan_hierarchy_node/all_positions = list()
@@ -93,6 +95,17 @@ And it also helps for the character set panel
var/wanted_blood = (blood_types & blood_preference)
var/unwanted_blood = (blood_types & blood_disgust)
+
+ if(drinker.mind.has_antag_datum(/datum/antagonist/ghoul)) //thrall drinking
+ if(!(blood_types & BLOOD_PREFERENCE_KIN) && !wanted_blood) //shares drinking habits with their master's clan
+ to_chat(drinker, span_userdanger("THIS BLOOD DOESN'T SATIATE ME! I NEED SOME OF MY MASTER'S BLOOD!"))
+ vitae *= 0.1
+ return vitae
+ else
+ vitae *= 2
+ return vitae
+
+
if(wanted_blood && !unwanted_blood)
drinker.apply_status_effect(/datum/status_effect/debuff/blood_preference)
vitae *= 1.5
@@ -303,7 +316,9 @@ And it also helps for the character set panel
var/list/spells_to_remove = list(
/datum/action/clan_menu,
- /datum/action/cooldown/spell/undirected/transfix,
+ /datum/action/cooldown/spell/undirected/list_target/encode_thoughts/vampire,
+ /datum/action/cooldown/spell/enslave_mortal,
+ /datum/action/cooldown/spell/undirected/transfix
)
for(var/spell_type in spells_to_remove)
var/datum/action/spell_instance = locate(spell_type) in vampire.actions
@@ -382,8 +397,10 @@ And it also helps for the character set panel
H.attributes?.add_sheet(/datum/attribute_holder/sheet/job/clan)
H.update_age_stats(H.age, TRUE)
- var/datum/action/cooldown/spell/undirected/transfix/transfix = new(H.mind)
- transfix.Grant(H)
+ var/datum/action/cooldown/spell/undirected/list_target/encode_thoughts/vampire/encode_thoughts = new(H.mind)
+ encode_thoughts.Grant(H)
+ var/datum/action/cooldown/spell/enslave_mortal/enslave_mortal = new(H.mind)
+ enslave_mortal.Grant(H)
/datum/clan/proc/apply_vampire_look(mob/living/carbon/human/H)
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/clan_leader.dm b/code/modules/antagonists/villain/neu_vampires/clan/clan_leader.dm
index 796327a0b8f..ec62e0c5fa1 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/clan_leader.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/clan_leader.dm
@@ -12,7 +12,6 @@
/datum/clan_leader/lord
lord_spells = list(
- /datum/action/cooldown/spell/enslave_mortal,
/datum/action/cooldown/spell/undirected/shapeshift/bat,
/datum/action/cooldown/spell/undirected/mansion_portal,
/datum/action/cooldown/spell/undirected/shapeshift/mist,
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm b/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm
index 7e3b89731b9..10ca9e575e4 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm
@@ -40,7 +40,7 @@
/datum/clan_menu_interface/proc/generate_welcome_screen_html()
var/clan_downside = "burn in sunlight"
var/blood_preference = "any blood"
- var/reproduce_string = {"
Creating Progeny: Drain someone's blood to critical levels to gain the option to embrace them as a new vampire.
"}
+ var/reproduce_string = {"
Creating Progeny: Bite someone's neck and then their blood to critical levels to gain the option to embrace them as a new vampire using the "sire mortal" verb.
Creating Progeny: You are unable to sire new vampires.
"}
@@ -54,7 +54,8 @@
Select a coven from the sidebar to view its research tree and manage your powers.
- Each coven represents a different aspect of your vampiric abilities.
+ Each coven represents a different aspect of your vampiric abilities.
+ You can input a number of vitae you wish to spend under a coven to increase the experience on it. Any vitae amount will be divived in half.
@@ -101,7 +102,8 @@
-
RP: [coven.research_points]
+
+
"}
@@ -805,6 +807,45 @@
color: #FFD700;
margin-bottom: 30px;
}
+
+ .exp-button {
+ background: #d86a00;
+ border: 2px solid #7a3c00;
+ color: #fff;
+ padding: 5px 10px;
+ border-radius: 0;
+ cursor: pointer;
+ font-weight: bold;
+ font-size: 12px;
+ letter-spacing: 0;
+ text-transform: none;
+ box-shadow: inset 0 0 2px #000;
+ transition: background 0.1s ease-in-out, transform 0.05s;
+ }
+
+ .exp-button:hover {
+ background: #ff8a2b;
+ box-shadow: inset 0 0 3px #000;
+ transform: translateY(-1px);
+ }
+
+ .exp-input {
+ width: 60px;
+ background: #1a1a1a;
+ border: 2px solid #7a3c00;
+ color: #fff;
+ padding: 4px 6px;
+ border-radius: 0;
+ font-size: 12px;
+ box-shadow: inset 0 0 2px #000;
+ outline: none;
+ transition: border-color 0.1s ease-in-out, background 0.1s;
+ }
+
+ .exp-input:focus {
+ border-color: #d86a00;
+ background: #222;
+ }
@@ -904,6 +945,11 @@
window.location.href = 'byond://?src=[REF(src)];action=load_coven_tree;coven_name=' + encodeURIComponent(covenName);
}
+ function addXP(covenName) {
+ var amount = parseInt(document.getElementById("xp_input_" + covenName).value) || 0;
+ window.location = 'byond://?src=[REF(src)];action=add_xp;coven_name=' + encodeURIComponent(covenName) + ';amount=' + amount;
+ }
+
// Research tree interaction variables
let isDragging = false;
let startX, startY;
@@ -1153,6 +1199,15 @@
var/coven_name = href_list["coven_name"]
load_coven_research_tree(coven_name)
+ if("add_xp")
+ var/coven_name = href_list["coven_name"]
+ var/amount = text2num(href_list["amount"])
+
+ var/datum/coven/C = user_covens[coven_name]
+ if(C)
+ C.addButtonExp(amount)
+ generate_interface()
+
if("show_hierarchy")
show_hierarchy()
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/caitiff.dm b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/caitiff.dm
index c4b40f1f3e1..15830cf2ad4 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/caitiff.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/caitiff.dm
@@ -17,6 +17,7 @@
TRAIT_DARKVISION,
TRAIT_NOBREATH,
TRAIT_NOAMBUSH,
+ TRAIT_VAMP_OFFERED,
)
has_hierarchy = FALSE
silent_join = TRUE
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/crimson_fangs.dm b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/crimson_fangs.dm
index 9b5231f7106..3ea87a9c347 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/crimson_fangs.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/crimson_fangs.dm
@@ -23,6 +23,7 @@
TRAIT_DARKVISION,
TRAIT_LIMBATTACHMENT,
TRAIT_NOENERGY,
+ TRAIT_VAMP_OFFERED
)
/datum/clan/crimson_fang/get_blood_preference_string()
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/daewalker.dm b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/daewalker.dm
index 86d2f63c87f..34dd43883c7 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/daewalker.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/daewalker.dm
@@ -29,7 +29,8 @@
TRAIT_NOENERGY,
TRAIT_ZJUMP,
TRAIT_IMMUNE_TO_FRENZY,
- TRAIT_COVEN_RESISTANT
+ TRAIT_COVEN_RESISTANT,
+ TRAIT_VAMP_OFFERED,
)
leader_title = "Daewalker"
leader = /datum/clan_leader/daewalker
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/eoran.dm b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/eoran.dm
index a02fd0475f5..2bd01638efd 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/eoran.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/eoran.dm
@@ -1,11 +1,8 @@
-
/datum/clan_leader/eoran
lord_spells = list(
- /datum/action/cooldown/spell/enslave_mortal,
/datum/action/cooldown/spell/undirected/mansion_portal,
/datum/action/cooldown/spell/undirected/shapeshift/frog,
/datum/action/cooldown/spell/charm/vampire,
- /datum/action/cooldown/spell/undirected/list_target/encode_thoughts/vampire,
/datum/action/cooldown/spell/undirected/conjure_item/vamp_sword,
)
lord_traits = list(TRAIT_HEAVYARMOR, TRAIT_NOSTAMINA)
@@ -34,6 +31,7 @@
TRAIT_NOAMBUSH,
TRAIT_DARKVISION,
TRAIT_LIMBATTACHMENT,
+ TRAIT_VAMP_OFFERED
)
clan_covens = list(
@@ -53,9 +51,7 @@
/datum/clan/eoran/apply_clan_components(mob/living/carbon/human/H)
H.AddComponent(/datum/component/vampire_disguise)
-
-
-
-
-
-
+/datum/clan/eoran/setup_vampire_abilities(mob/living/carbon/human/H)
+ ..()
+ var/datum/action/cooldown/spell/undirected/transfix/transfix = new(H.mind)
+ transfix.Grant(H)
diff --git a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/nosferatu.dm b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/nosferatu.dm
index e7c161e4b08..92b964d459e 100644
--- a/code/modules/antagonists/villain/neu_vampires/clan/real_clans/nosferatu.dm
+++ b/code/modules/antagonists/villain/neu_vampires/clan/real_clans/nosferatu.dm
@@ -6,7 +6,6 @@
/datum/clan_leader/nosferatu
lord_spells = list(
- /datum/action/cooldown/spell/enslave_mortal,
/datum/action/cooldown/spell/undirected/mansion_portal,
/datum/action/cooldown/spell/undirected/shapeshift/rat_vampire,
/datum/action/cooldown/spell/undirected/conjure_item/vamp_sword,
@@ -46,6 +45,7 @@
TRAIT_LIMBATTACHMENT,
TRAIT_NASTY_EATER,
TRAIT_POISON_RESILIENCE,
+ TRAIT_VAMP_OFFERED
)
/datum/clan/nosferatu/get_downside_string()
@@ -54,13 +54,13 @@
/datum/clan/nosferatu/get_blood_preference_string()
return "kindred blood, the blood of the dead, blood of vermin"
-/datum/clan/nosferatu/on_gain(mob/living/carbon/human/H, is_vampire = TRUE)
- . = ..()
+// /datum/clan/nosferatu/on_gain(mob/living/carbon/human/H, is_vampire = TRUE)
+// . = ..()
- if(is_vampire)
- var/obj/item/organ/eyes/night_vision/NV = new()
- NV.Insert(H, TRUE, FALSE)
- H.ventcrawler = VENTCRAWLER_ALWAYS //I don't think this does anything because we have no vents
+// if(is_vampire)
+// var/obj/item/organ/eyes/night_vision/NV = new()
+// NV.Insert(H, TRUE, FALSE)
+// H.ventcrawler = VENTCRAWLER_ALWAYS //I don't think this does anything because we have no vents
/datum/clan/nosferatu/apply_clan_components(mob/living/carbon/human/H)
H.AddComponent(/datum/component/sunlight_vulnerability, damage = 2, drain = 2)
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/_base_coven.dm b/code/modules/antagonists/villain/neu_vampires/covens/_base_coven.dm
index d32cae713e3..adc98fbcddf 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/_base_coven.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/_base_coven.dm
@@ -405,6 +405,8 @@
if("roleplay")
// Encourage roleplay with XP
final_amount = amount * 0.8
+ if("buttonadd")
+ final_amount = amount * 0.5
// Apply level-based diminishing returns for power use
if(source == "power_use" && power_used)
@@ -422,6 +424,20 @@
* XP gain triggers for various game events
*/
+//Used in the interface button
+/datum/coven/proc/addButtonExp(amount)
+ if(!amount || amount <= 0)
+ return
+
+ if(owner.bloodpool < amount)
+ to_chat(owner, span_warning("You don't have enough vitae to spend"))
+ return
+ owner.adjust_bloodpool(-amount)
+ gain_experience_from_source(amount, "buttonadd") // exp gain from this is halved so a vampire cannot just insta buy t5 on spawn
+
+ if(owner)
+ to_chat(owner, span_boldnotice("You have spent [amount] vitae in [src.name]."))
+
// Called when a power is successfully used
/datum/coven/proc/on_power_use_success(datum/coven_power/power, is_critical = FALSE, exp_multiplier = 1, vitae_spent = 0)
var/base_xp = 0
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/auspex.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/auspex.dm
index c1cdf501404..95702373ead 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/auspex.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/auspex.dm
@@ -3,7 +3,7 @@
desc = "Allows to see entities, auras and their health through walls."
icon_state = "auspex"
power_type = /datum/coven_power/auspex
- max_level = 2
+ max_level = 1
/datum/coven_power/auspex
name = "Auspex power name"
@@ -38,24 +38,24 @@
//PSYCHIC PROJECTION
-/datum/coven_power/auspex/psychic_projection
- name = "Psychic Projection"
- desc = "Leave your body behind and fly across the land."
+// /datum/coven_power/auspex/psychic_projection
+// name = "Psychic Projection"
+// desc = "Leave your body behind and fly across the land."
- level = 2
- check_flags = COVEN_CHECK_CONSCIOUS
- vitae_cost = 250
- violates_masquerade = TRUE
+// level = 2
+// check_flags = COVEN_CHECK_CONSCIOUS
+// vitae_cost = 250
+// violates_masquerade = TRUE
-/datum/coven_power/auspex/psychic_projection/activate()
- . = ..()
- var/obj/effect/blood_rune/rune = write_full_rune(get_turf(owner), /datum/rune_spell/astraljourney)
- rune.trigger(owner)
+// /datum/coven_power/auspex/psychic_projection/activate()
+// . = ..()
+// var/obj/effect/blood_rune/rune = write_full_rune(get_turf(owner), /datum/rune_spell/astraljourney)
+// rune.trigger(owner)
/mob
var/obj/effect/blood_rune/ajourn
-////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
GLOBAL_LIST_INIT(astral_projections, list())
/datum/action/cooldown/spell/undirected/astral_return
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/bloodheal.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/bloodheal.dm
index 1fdcdb7151d..878e8f80992 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/bloodheal.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/bloodheal.dm
@@ -94,7 +94,13 @@
owner.adjust_temp_blindness(-HEAL_AGGRAVATED * (level) SECONDS)
owner.adjust_eye_blur(-HEAL_AGGRAVATED * (level) SECONDS)
- if(level >= 7 && prob(5))
+ // No more broken organs
+ if(level >= 6)
+ var/list/organ_list = owner.internal_organs
+ for(var/obj/item/organ/organ as anything in organ_list)
+ organ.applyOrganDamage(-HEAL_BASHING_LETHAL * (level * 0.5))
+
+ if(level >= 7 && prob(10))
owner.regenerate_limb(silent = FALSE)
// Masquerade violation check
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/celerity.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/celerity.dm
index 37924ad51c1..e7a43447e8b 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/celerity.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/celerity.dm
@@ -20,8 +20,8 @@
desc = "Celerity power description"
violates_masquerade = TRUE
refresh_violations = TRUE
- duration_length = 3 SECONDS
- cooldown_length = 3 SECONDS
+ duration_length = 10 SECONDS
+ cooldown_length = 10 SECONDS
toggled = TRUE
check_flags = COVEN_CHECK_LYING | COVEN_CHECK_IMMOBILE
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/eoran.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/eoran.dm
index d2dbd066b25..310c69c72e4 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/eoran.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/eoran.dm
@@ -2,6 +2,7 @@
name = "Eoran Embrace"
desc = "Blessed by the Goddess of Love, Family, and Art, these vampires have developed powers that strengthen bonds, inspire beauty, and heal emotional wounds."
icon_state = "eora"
+ clan_restricted = TRUE
power_type = /datum/coven_power/eora
max_level = 4
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/potence.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/potence.dm
index 8840ef8deb9..33ec23f0843 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/potence.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/potence.dm
@@ -19,8 +19,8 @@
/datum/coven_power/potence/four,
/datum/coven_power/potence/five
)
- duration_length = 3 SECONDS
- cooldown_length = 3 SECONDS
+ duration_length = 10 SECONDS
+ cooldown_length = 10 SECONDS
violates_masquerade = TRUE
refresh_violations = TRUE
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/presence.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/presence.dm
index 48053a12929..846bb3cfe55 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/presence.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/presence.dm
@@ -24,6 +24,9 @@
cooldown_length = 15 SECONDS
/datum/coven_power/presence/awe/pre_activation_checks(mob/living/target)
+ if(target.stat == DEAD || target.stat == UNCONSCIOUS)
+ to_chat(owner, span_danger("Minds of the dead cannot be swayed."))
+ return FALSE
var/mypower = GET_MOB_ATTRIBUTE_VALUE(owner, STAT_INTELLIGENCE)
var/theirpower = GET_MOB_ATTRIBUTE_VALUE(owner, STAT_INTELLIGENCE) - 5
if((theirpower >= mypower))
@@ -70,6 +73,9 @@
cooldown_length = 15 SECONDS
/datum/coven_power/presence/dread_gaze/pre_activation_checks(mob/living/target)
+ if(target.stat == DEAD || target.stat == UNCONSCIOUS)
+ to_chat(owner, span_danger("Minds of the dead cannot be swayed."))
+ return FALSE
var/mypower = GET_MOB_ATTRIBUTE_VALUE(owner, STAT_INTELLIGENCE)
var/theirpower = GET_MOB_ATTRIBUTE_VALUE(owner, STAT_INTELLIGENCE) - 5
if((theirpower >= mypower))
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/quietus.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/quietus.dm
index 5b21b9cd8b8..e76e91ee5bc 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/quietus.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/quietus.dm
@@ -67,11 +67,7 @@
proximity_field.add_affected_mob(target)
/datum/coven_power/quietus/silence_of_death/proc/should_affect_target(mob/living/carbon/human/target)
- if(target == owner)
- return FALSE
- if(target.clan_position?.is_subordinate_to(owner.clan_position))
- return FALSE
- if(target.clan_position?.is_superior_to(owner.clan_position))
+ if(target == owner || target.clan_position?.is_subordinate_to(owner.clan_position) || target.clan_position?.is_superior_to(owner.clan_position))
return FALSE
return TRUE
@@ -150,6 +146,10 @@
violates_masquerade = TRUE
/datum/coven_power/quietus/scorpions_touch/activate()
+ if(owner.get_active_held_item())
+ to_chat(owner, span_danger("Your main hand is busy!"))
+ owner.adjust_bloodpool(vitae_cost)
+ return
. = ..()
owner.put_in_active_hand(new /obj/item/melee/touch_attack/quietus(owner))
@@ -169,8 +169,13 @@
L.adjustFireLoss(10)
L.AdjustKnockdown(3 SECONDS)
L.adjust_stamina(-50)
+ qdel(src)
return ..()
+/obj/item/melee/touch_attack/dropped(mob/user)
+ . = ..()
+ qdel(src)
+
//BAAL'S CARESS
/datum/coven_power/quietus/baals_caress
name = "Baal's Caress"
@@ -201,7 +206,10 @@
/datum/coven_power/quietus/baals_caress/activate(obj/item/weapon/target)
. = ..()
- target.AddElement(/datum/element/one_time_poison, list(/datum/reagent/strongpoison = 2))
+ if(!target.reagents)
+ target.AddElement(/datum/element/tipped_item)
+
+ target.reagents.add_reagent(/datum/reagent/strongpoison, 2)
/datum/coven_power/quietus/taste_of_death
name = "Taste of Death"
@@ -218,20 +226,29 @@
//DAGON'S CALL
/datum/coven_power/quietus/dagons_call
name = "Dagon's Call"
- desc = "Curse the last person you attacked to drown in their own blood."
+ desc = "Curse the last person you fought, causing their blood to boil."
level = 5
check_flags = COVEN_CHECK_CAPABLE | COVEN_CHECK_CONSCIOUS | COVEN_CHECK_IMMOBILE | COVEN_CHECK_LYING
cooldown_length = 30 SECONDS
/datum/coven_power/quietus/dagons_call/activate()
- . = ..()
+
var/mob/living/lastattacker = owner.lastattacker_weakref?.resolve()
- if(isliving(lastattacker))
- lastattacker.adjust_stamina(-80)
- lastattacker.adjust_fire_stacks(6)
- lastattacker.adjustFireLoss(10)
- to_chat(owner, "You send your curse on [lastattacker], the last creature you attacked.")
- else
+
+ if(!isliving(lastattacker))
to_chat(owner, "You don't seem to have last attacked soul earlier...")
+ owner.adjust_bloodpool(vitae_cost)
return
+ for(var/atom/I in lastattacker.get_equipped_items())
+ var/datum/enchantment/silver/ench = SSenchantment.get_enchantment(I, /datum/enchantment/silver)
+ if(ench)
+ to_chat(owner, span_danger("Silver dispells the curse! They are protected for now."))
+ return
+
+ . = ..()
+
+ lastattacker.adjust_stamina(-80)
+ lastattacker.fire_act(6, 6)
+ lastattacker.adjustFireLoss(10)
+ to_chat(owner, "You send your curse on [lastattacker], the last creature you attacked.")
diff --git a/code/modules/antagonists/villain/neu_vampires/enslave_mortal.dm b/code/modules/antagonists/villain/neu_vampires/enslave_mortal.dm
index 94adc09b43d..f736b42a40e 100644
--- a/code/modules/antagonists/villain/neu_vampires/enslave_mortal.dm
+++ b/code/modules/antagonists/villain/neu_vampires/enslave_mortal.dm
@@ -6,8 +6,8 @@
cast_range = 1
charge_time = 2 SECONDS
spell_cost = 0
- cooldown_time = 3 MINUTES
- var/enslavement_time = 30 SECONDS
+ cooldown_time = 1 MINUTES
+ var/enslavement_time = 20 SECONDS
var/blood_cost = 50
/datum/action/cooldown/spell/enslave_mortal/can_cast_spell(feedback)
diff --git a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm
index 1f9561d18f1..199856e4578 100644
--- a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm
+++ b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm
@@ -395,4 +395,30 @@
if(!master.clan)
return
master.clan.add_non_vampire_member(src)
- add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal)
+ var/datum/clan_hierarchy_node/new_clan_position = master.clan.create_position("Thrall", "A mortal servant to the clan.", master.clan_position, 1)
+ new_clan_position.assign_member(src)
+ var/list/coven_options = list()
+
+ // Get all available covens
+ for(var/coven_name in master.covens)
+ var/datum/coven/temp_coven = master.covens[coven_name]
+ if(temp_coven.name != "Bloodheal")
+ coven_options[temp_coven.name] = temp_coven
+ qdel(temp_coven)
+
+ if(!length(coven_options))
+ to_chat(master, span_warning("No covens available for granting."))
+ return
+
+ var/granted_boon = input(master, "Grant a coven to the thrall", "Coven Selection") as null|anything in coven_options
+ if(!granted_boon)
+ return
+ var/datum/coven/chosen_coven = coven_options[granted_boon]
+ if(chosen_coven.max_level > 3)
+ chosen_coven.max_level = 3 //caps the level for thralls at 3
+
+ give_coven(chosen_coven)
+ src.mind.add_antag_datum(/datum/antagonist/ghoul)
+
+
+
diff --git a/code/modules/antagonists/villain/vampire/_vampire.dm b/code/modules/antagonists/villain/vampire/_vampire.dm
index 10c2bfe5cf8..5d2b7eeb748 100644
--- a/code/modules/antagonists/villain/vampire/_vampire.dm
+++ b/code/modules/antagonists/villain/vampire/_vampire.dm
@@ -22,6 +22,22 @@ GLOBAL_LIST_EMPTY(vampire_objects)
var/datum/clan/forcing_clan
antag_flags = FLAG_ANTAG_CAP_TEAM
+/datum/antagonist/ghoul //Vampire thralls, their coven is picked through the make_vampire_slave() function in living_modifications.dm
+ name = "Ghoul"
+ increase_votepwr = FALSE
+ roundend_category = "Vampires"
+ antagpanel_category = "Vampire"
+
+/datum/antagonist/ghoul/on_gain()
+ var/mob/living/carbon/human/H = owner.current
+ H.hud_used?.shutdown_bloodpool()
+ H.hud_used?.initialize_bloodpool()
+ H.hud_used?.bloodpool.set_fill_color("#510000")
+ H.maxbloodpool = 1500
+ H.set_bloodpool(500)
+ H.add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal)
+ ADD_TRAIT(H, TRAIT_BLOODDRINKER, "clan")
+
/datum/antagonist/vampire/New(datum/clan/incoming_clan, forced_clan = FALSE)
. = ..()
if(forced_clan)
@@ -146,11 +162,9 @@ GLOBAL_LIST_EMPTY(vampire_objects)
finalize_custom_clan(vampdude)
return
- // Select first coven
- var/first_choice = input(vampdude, "Choose your first coven:", "Coven Selection") as null|anything in coven_options
- if(first_choice)
- selected_covens += coven_options[first_choice]
- coven_options -= first_choice
+ // Forces first coven to be bloodheal (seen too much newbies not pick it)
+ selected_covens += coven_options["Bloodheal"]
+ coven_options -= "Bloodheal"
// Select second coven
if(length(coven_options))
diff --git a/code/modules/antagonists/villain/vampire/actions.dm b/code/modules/antagonists/villain/vampire/actions.dm
index 40a5e561022..4b0371dc910 100644
--- a/code/modules/antagonists/villain/vampire/actions.dm
+++ b/code/modules/antagonists/villain/vampire/actions.dm
@@ -19,7 +19,7 @@
if(!(victim.ckey || ckey(victim.last_mind?.key)))
to_chat(src, span_warning("[victim.p_theyre(TRUE)] too simple to be sired."))
return
- if(HAS_TRAIT(victim, "offered_vampirism"))
+ if(HAS_TRAIT(victim, TRAIT_VAMP_OFFERED))
to_chat(src, span_warning("[victim.p_theyve(TRUE)] already been offered a blessing."))
return
var/obj/item/organ/brain/victim_brain = victim.getorgan(/obj/item/organ/brain)
@@ -35,9 +35,11 @@
var/datum/antagonist/zombie/Z = victim.mind.has_antag_datum(/datum/antagonist/zombie)
if(Z?.revived)
to_chat(src, span_warning("The dead already walk. This one is the Dark Lady's servant."))
- if(victim.clan || victim.mind.has_antag_datum(/datum/antagonist/vampire))
- to_chat(src, span_warning("[victim] has already been sired."))
- return
+ //Handled by TRAIT_VAMP_OFFERED, to allow ghouls for proper conversion
+ // if((victim.clan || victim.mind.has_antag_datum(/datum/antagonist/vampire)))
+ // if(victim.coven)
+ // to_chat(src, span_warning("[victim] has already been sired."))
+ // return
if(victim.mind.has_antag_datum(/datum/antagonist/werewolf))
to_chat(src, span_warning("[victim] tastes of beast. [victim.p_they()] will not sire."))
return
diff --git a/code/modules/antagonists/villain/vampire/lord.dm b/code/modules/antagonists/villain/vampire/lord.dm
index 2c5c080a77c..3ee09626dbc 100644
--- a/code/modules/antagonists/villain/vampire/lord.dm
+++ b/code/modules/antagonists/villain/vampire/lord.dm
@@ -39,8 +39,9 @@
vampire.reset_and_reroll_stats()
vampire.purge_combat_knowledge()
vampire.remove_all_traits()
- vampire.grant_undead_eyes()
. = ..()
+ vampire.grant_undead_eyes()
+
if(!forced)
if(clan_selected)
vampire.set_clan(default_clan)
@@ -51,6 +52,8 @@
if(!istype(thrall))
continue
thrall.set_clan_direct(vampire.clan)
+ var/datum/clan_hierarchy_node/new_clan_position = vampire.clan.create_position("Elder", "Original spawn of the [vampire.clan_position.name].", vampire.clan_position, 1)
+ new_clan_position.assign_member(thrall)
starting_thralls = null
if(chooses_name)
addtimer(CALLBACK(owner.current, TYPE_PROC_REF(/mob/living/carbon/human, choose_name_popup), "[name]"), 5 SECONDS)
diff --git a/code/modules/antagonists/villain/vampire/objects/bloodpool.dm b/code/modules/antagonists/villain/vampire/objects/bloodpool.dm
index b130935b6dd..3b426b6027a 100644
--- a/code/modules/antagonists/villain/vampire/objects/bloodpool.dm
+++ b/code/modules/antagonists/villain/vampire/objects/bloodpool.dm
@@ -196,7 +196,7 @@
return TRUE
/datum/vampire_project/proc/confirm_start(mob/living/user)
- return tgui_alert(user, "Begin [display_name]? [description] Total Cost: [total_cost] You can contribute vitae over time.", "PROJECT START", list("Yes", "No")) == "Yes"
+ return tgui_alert(user, "[description] Total Cost: [total_cost]. You can contribute vitae over time.", "PROJECT START", list("Yes", "No")) == "Yes"
/datum/vampire_project/proc/on_start(mob/living/user)
return
diff --git a/code/modules/antagonists/villain/vampire/objects/portal.dm b/code/modules/antagonists/villain/vampire/objects/portal.dm
index 06a5ca8b9ef..6aed210fe56 100644
--- a/code/modules/antagonists/villain/vampire/objects/portal.dm
+++ b/code/modules/antagonists/villain/vampire/objects/portal.dm
@@ -8,58 +8,30 @@
. = TRUE
-
- if(!user.has_bloodpool_cost(1000))
- to_chat(user, span_warning("This costs 1000 vitae, I lack that."))
+ if(sending)
+ to_chat(user, "A portal is already active!")
+ return
+ for(var/obj/item/clothing/neck/portalamulet/P in GLOB.vampire_objects)
+ possibleportals += P
+ var/atom/choice = browser_input_list(user, "Choose an area to open the portal to", "Choices", possibleportals)
+ if(!choice)
+ to_chat(user, span_warning("There are no anchors to open a portal to."))
return
- var/list/choices = list("RETURN", "SENDING", CHOICE_CANCEL)
- switch(browser_input_list(user, "Which type of portal?", "Portal Type", choices))
- if(CHOICE_CANCEL)
- return
-
- if("RETURN")
- for(var/obj/item/clothing/neck/portalamulet/P in GLOB.vampire_objects)
- possibleportals += P
- var/atom/choice = browser_input_list(user, "Choose an area to open the portal", "Choices", possibleportals)
- if(!choice)
- return
- user.visible_message("[user] begins to summon a portal.", "I begin to summon a portal.")
- if(!do_after(user, 3 SECONDS, src))
- return
-
- user.has_bloodpool_cost(-1000)
- if(istype(choice, /obj/item/clothing/neck/portalamulet))
- var/obj/item/clothing/neck/portalamulet/A = choice
- A.uses -= 1
- var/obj/effect/landmark/vteleportdestination/VR = new(A.loc)
- VR.amuletname = A.name
- create_portal_return(A.name, 3000)
- user.playsound_local(get_turf(src), 'sound/misc/portalactivate.ogg', 100, FALSE, pressure_affected = FALSE)
- if(A.uses <= 0)
- A.visible_message("[A] shatters!")
- qdel(A)
- if("SENDING")
- if(sending)
- to_chat(user, "A portal is already active!")
- return
- for(var/obj/item/clothing/neck/portalamulet/P in GLOB.vampire_objects)
- possibleportals += P
- var/atom/choice = browser_input_list(user, "Choose an area to open the portal to", "Choices", possibleportals)
- if(!choice)
- return
- user.visible_message("[user] begins to summon a portal.", "I begin to summon a portal.")
- if(do_after(user, 3 SECONDS, src))
- user.has_bloodpool_cost(-1000)
- if(istype(choice, /obj/item/clothing/neck/portalamulet))
- var/obj/item/clothing/neck/portalamulet/A = choice
- A.uses -= 1
- var/turf/G = get_turf(A)
- new /obj/effect/landmark/vteleportsenddest(G.loc)
- if(A.uses <= 0)
- A.visible_message("[A] shatters!")
- qdel(A)
- create_portal()
- user.playsound_local(get_turf(src), 'sound/misc/portalactivate.ogg', 100, FALSE, pressure_affected = FALSE)
+ user.visible_message("[user] begins to summon a portal.", "I begin to summon a portal.")
+ if(do_after(user, 3 SECONDS, src))
+ if(istype(choice, /obj/item/clothing/neck/portalamulet))
+ var/obj/item/clothing/neck/portalamulet/A = choice
+ A.uses -= 1
+ var/turf/G = get_turf(A)
+ new /obj/effect/landmark/vteleportsenddest(G.loc)
+ if(A.uses <= 0)
+ A.visible_message("[A] shatters!")
+ qdel(A)
+ else
+ to_chat(user, span_warning("[A.name] has only [A.uses] left before breaking."))
+ create_portal()
+ user.playsound_local(get_turf(src), 'sound/misc/portalactivate.ogg', 100, FALSE, pressure_affected = FALSE)
+
/obj/structure/vampire/portal
name = "Eerie Portal"
@@ -123,10 +95,11 @@
/obj/item/clothing/neck/portalamulet
name = "Gate Amulet"
+ desc = "Ominous looking necklace, origin of the tooth is impossible to tell. It seems to react to touch..?"
icon_state = "bloodtooth"
icon = 'icons/roguetown/clothing/neck.dmi'
- var/uses = 3
- var/can_local_portal = FALSE
+ var/uses = 6
+ var/can_local_portal = TRUE
/obj/item/clothing/neck/portalamulet/Initialize()
GLOB.vampire_objects |= src
@@ -136,6 +109,12 @@
GLOB.vampire_objects -= src
return ..()
+/obj/item/clothing/neck/portalamulet/examine(mob/user)
+ . = ..()
+ if(user.mind.has_antag_datum(/datum/antagonist/vampire))
+ desc = "World anchor, used by the portal in The Mansion. Using it will return you to where it was made, right in the evil's lair. Leave it behind to make a portal to later."
+ else
+ desc = "Ominous looking necklace, origin of the tooth is impossible to tell. It seems to react to touch..?"
/obj/item/clothing/neck/portalamulet/attack_self(mob/user, list/modifiers)
. = ..()
if(!can_local_portal)
@@ -147,6 +126,7 @@
for(var/obj/structure/vampire/portalmaker/P in GLOB.vampire_objects)
P.create_portal_return(name, 3000)
user.playsound_local(get_turf(src), 'sound/misc/portalactivate.ogg', 100, FALSE, pressure_affected = FALSE)
+ to_chat(user, span_danger("[name] has [uses] left."))
if(uses <= 0)
visible_message("[src] shatters!")
qdel(src)
diff --git a/code/modules/antagonists/villain/vampire/spawn.dm b/code/modules/antagonists/villain/vampire/spawn.dm
index 1991223fe55..833e2a156d8 100644
--- a/code/modules/antagonists/villain/vampire/spawn.dm
+++ b/code/modules/antagonists/villain/vampire/spawn.dm
@@ -6,6 +6,7 @@
"MY MASTER COMMANDS!",
"THE SUN IS THE ANATHEMA OF OUR MASTER!",
)
+ allow_preference_switching = TRUE
/datum/antagonist/vampire/lords_spawn/on_gain()
var/mob/living/carbon/human/vampire = owner.current
diff --git a/code/modules/mob/living/grabbing.dm b/code/modules/mob/living/grabbing.dm
index d494cd6b36b..d5d53b7e2b2 100644
--- a/code/modules/mob/living/grabbing.dm
+++ b/code/modules/mob/living/grabbing.dm
@@ -817,5 +817,5 @@
if(!limb_grabbed.get_bleed_rate())
to_chat(user, span_warning("Sigh. It's not bleeding."))
return
- var/drink_amt = ((user in user.clan?.clan_members) && !(user in user.clan.non_vampire_members)) ? 80 : 10
+ var/drink_amt = ((user in user.clan?.clan_members) && (!(user in user.clan.non_vampire_members) || user.mind.has_antag_datum(/datum/antagonist/ghoul))) ? 80 : 10
user.drinksomeblood(grabbed, sublimb_grabbed, drink_amt)
diff --git a/code/modules/spells/spell_types/undirected/list_target/encode_thoughts.dm b/code/modules/spells/spell_types/undirected/list_target/encode_thoughts.dm
index f2497259be7..6b58684037c 100644
--- a/code/modules/spells/spell_types/undirected/list_target/encode_thoughts.dm
+++ b/code/modules/spells/spell_types/undirected/list_target/encode_thoughts.dm
@@ -2,7 +2,7 @@
name = "Encode Thoughts"
desc = "Latch onto the mind of one who is nearby, weaving a particular thought into their mind."
button_icon_state = "encode_thought"
- sound = 'sound/magic/PSY.ogg'
+ sound = 'sound/ddrelief.ogg'
point_cost = 1
attunements = list(
@@ -35,7 +35,7 @@
to_chat(owner, "I pluck the strings of [cast_on]'s mind!")
cast_on.playsound_local(cast_on, sound, 100, TRUE)
- to_chat(cast_on, "Your mind thinks to itself: \"[message]...\"")
+ to_chat(cast_on, span_mind_control("Your mind thinks to itself: \"[message]...\""))
/datum/action/cooldown/spell/undirected/list_target/encode_thoughts/vampire
name = "Vampiric Manipulation"
diff --git a/vanderlin.dme b/vanderlin.dme
index fc7844fc371..4262209db92 100644
--- a/vanderlin.dme
+++ b/vanderlin.dme
@@ -1202,7 +1202,6 @@
#include "code\datums\elements\movetype_handler.dm"
#include "code\datums\elements\no_mouse_drop.dm"
#include "code\datums\elements\noisy_movement.dm"
-#include "code\datums\elements\one_time_poison.dm"
#include "code\datums\elements\relay_attackers.dm"
#include "code\datums\elements\retaliate.dm"
#include "code\datums\elements\ridable.dm"