From ae614db7c44fe4f8ecdb5e7535ca011d91365581 Mon Sep 17 00:00:00 2001 From: General626 Date: Wed, 6 May 2026 12:19:56 +0200 Subject: [PATCH 01/24] Quietus changes --- .../covens/coven_powers/quietus.dm | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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..28bc1573c2f 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" @@ -218,7 +223,7 @@ //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 attacked to boil in their own blood." level = 5 check_flags = COVEN_CHECK_CAPABLE | COVEN_CHECK_CONSCIOUS | COVEN_CHECK_IMMOBILE | COVEN_CHECK_LYING @@ -229,7 +234,7 @@ var/mob/living/lastattacker = owner.lastattacker_weakref?.resolve() if(isliving(lastattacker)) lastattacker.adjust_stamina(-80) - lastattacker.adjust_fire_stacks(6) + lastattacker.fire_act(6, 6) lastattacker.adjustFireLoss(10) to_chat(owner, "You send your curse on [lastattacker], the last creature you attacked.") else From e1c81a097924cd210572dca8d7c2bed9b7fb5f36 Mon Sep 17 00:00:00 2001 From: General626 Date: Wed, 6 May 2026 14:48:11 +0200 Subject: [PATCH 02/24] Adds button to the clan menu for increasing coven level --- .../villain/neu_vampires/clan/clan_menu.dm | 56 ++++++++++++++++++- .../neu_vampires/covens/_base_coven.dm | 16 ++++++ 2 files changed, 71 insertions(+), 1 deletion(-) 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..910822ac279 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/clan_menu.dm @@ -101,7 +101,8 @@
-
RP: [coven.research_points]
+ + "} @@ -805,6 +806,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 +944,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 +1198,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/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 From 16b17fee1beeaea2e95bd22ade05abc78e856243 Mon Sep 17 00:00:00 2001 From: General626 Date: Wed, 6 May 2026 15:04:19 +0200 Subject: [PATCH 03/24] updates to interface --- .../antagonists/villain/neu_vampires/clan/clan_menu.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 910822ac279..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.
"} if(!user.clan_position?.can_assign_positions) reproduce_string = {"
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,7 @@
- + "} From f475849cdbf9d0fd6f427c54242ee93685f9840a Mon Sep 17 00:00:00 2001 From: General626 Date: Fri, 8 May 2026 11:46:55 +0200 Subject: [PATCH 04/24] Dagon's call no longer costs vitae without a proper target --- .../covens/coven_powers/quietus.dm | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) 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 28bc1573c2f..7075a4a9dc1 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 @@ -230,13 +230,24 @@ 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.fire_act(6, 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.") From 66dc825425228d5b1f7c813ab0d867d88304a21b Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 09:41:06 +0200 Subject: [PATCH 05/24] Diablerism changes --- .../antagonists/villain/neu_vampires/bloodsuck.dm | 9 +++++++++ .../villain/neu_vampires/covens/coven_powers/quietus.dm | 6 ++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index c3abb49a20a..97e607a5c2a 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 = "soul of [victim.real_name]" + 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].")) 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 7075a4a9dc1..babe75ad54d 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 @@ -223,7 +223,7 @@ //DAGON'S CALL /datum/coven_power/quietus/dagons_call name = "Dagon's Call" - desc = "Curse the last person you attacked to boil 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 @@ -237,15 +237,13 @@ 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) From 42302599d2a9b79a24626a36bb551ce65d71f018 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 10:00:57 +0200 Subject: [PATCH 06/24] Forces bloodheal for custom clan, eoran coven is now restricted --- .../villain/neu_vampires/covens/coven_powers/eoran.dm | 1 + code/modules/antagonists/villain/vampire/_vampire.dm | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) 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/vampire/_vampire.dm b/code/modules/antagonists/villain/vampire/_vampire.dm index 10c2bfe5cf8..1095bf92259 100644 --- a/code/modules/antagonists/villain/vampire/_vampire.dm +++ b/code/modules/antagonists/villain/vampire/_vampire.dm @@ -146,11 +146,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)) From b2babfd736edc359295cc2964722b903b4f2dfc6 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 10:13:42 +0200 Subject: [PATCH 07/24] Allows vampire spawn to change slot + fixes undead eyes removing on slot change --- code/modules/antagonists/villain/vampire/lord.dm | 3 ++- code/modules/antagonists/villain/vampire/spawn.dm | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/villain/vampire/lord.dm b/code/modules/antagonists/villain/vampire/lord.dm index 2c5c080a77c..5f4bcaf075c 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) 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 From 374bf753633773938207e891bb2cece5e57ee758 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 12:25:30 +0200 Subject: [PATCH 08/24] buffs cooldown recharge time for enslaving mortals, replaces transfix with it, fixes slaves not being able to be sired --- code/__DEFINES/traits/definitions.dm | 1 + .../antagonists/villain/neu_vampires/bloodsuck.dm | 6 +++--- .../villain/neu_vampires/clan/_base_clan.dm | 9 ++++++--- .../villain/neu_vampires/clan/clan_leader.dm | 1 - .../villain/neu_vampires/clan/real_clans/caitiff.dm | 1 + .../neu_vampires/clan/real_clans/crimson_fangs.dm | 1 + .../villain/neu_vampires/clan/real_clans/daewalker.dm | 3 ++- .../villain/neu_vampires/clan/real_clans/eoran.dm | 4 ++-- .../villain/neu_vampires/clan/real_clans/nosferatu.dm | 2 +- .../antagonists/villain/neu_vampires/enslave_mortal.dm | 4 ++-- code/modules/antagonists/villain/vampire/actions.dm | 10 ++++++---- 11 files changed, 25 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/traits/definitions.dm b/code/__DEFINES/traits/definitions.dm index f88d9425b2b..7a78b176359 100644 --- a/code/__DEFINES/traits/definitions.dm +++ b/code/__DEFINES/traits/definitions.dm @@ -468,6 +468,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/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index 97e607a5c2a..3e0c2134c07 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -51,7 +51,7 @@ //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 = "soul of [victim.real_name]" + 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() @@ -83,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 @@ -97,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 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..988a324aa4a 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 @@ -303,7 +304,7 @@ 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, ) for(var/spell_type in spells_to_remove) var/datum/action/spell_instance = locate(spell_type) in vampire.actions @@ -382,8 +383,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/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..778e97131a3 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,10 @@ /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/transfix, /datum/action/cooldown/spell/undirected/conjure_item/vamp_sword, ) lord_traits = list(TRAIT_HEAVYARMOR, TRAIT_NOSTAMINA) @@ -34,6 +33,7 @@ TRAIT_NOAMBUSH, TRAIT_DARKVISION, TRAIT_LIMBATTACHMENT, + TRAIT_VAMP_OFFERED ) clan_covens = list( 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..7f7f708cb0f 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() 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/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 From 4d85d6db31a171fb46da036f49c8e99529e4ca67 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 12:31:38 +0200 Subject: [PATCH 09/24] fixes lack of undead eyes for new spawn --- code/modules/antagonists/villain/neu_vampires/bloodsuck.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index 3e0c2134c07..f56f3f71e16 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -118,5 +118,6 @@ revive((HEAL_DAMAGE|HEAL_AFFLICTIONS|HEAL_LIMBS|HEAL_WOUNDS|HEAL_ORGANS), 500, TRUE) mind.add_antag_datum(new /datum/antagonist/vampire(C, TRUE)) 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!")) From 79721beac7946934cd95e476509db3548c369914 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 12:58:49 +0200 Subject: [PATCH 10/24] All eorans properly get transfix --- .../villain/neu_vampires/clan/_base_clan.dm | 2 ++ .../villain/neu_vampires/clan/real_clans/eoran.dm | 12 ++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) 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 988a324aa4a..df1135fd281 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm @@ -305,6 +305,8 @@ And it also helps for the character set panel var/list/spells_to_remove = list( /datum/action/clan_menu, /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 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 778e97131a3..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,10 +1,8 @@ - /datum/clan_leader/eoran lord_spells = list( /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/transfix, /datum/action/cooldown/spell/undirected/conjure_item/vamp_sword, ) lord_traits = list(TRAIT_HEAVYARMOR, TRAIT_NOSTAMINA) @@ -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) From e616c080ede219e2ecf7a369d169dee6ba5c86b4 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 14:25:08 +0200 Subject: [PATCH 11/24] Comments out second level of auspex as it was bugged --- .../neu_vampires/clan/real_clans/nosferatu.dm | 12 ++++++------ .../neu_vampires/covens/coven_powers/auspex.dm | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) 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 7f7f708cb0f..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 @@ -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/coven_powers/auspex.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/auspex.dm index c1cdf501404..8100b76d43b 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" @@ -37,7 +37,7 @@ owner.update_sight() -//PSYCHIC PROJECTION +// PSYCHIC PROJECTION /datum/coven_power/auspex/psychic_projection name = "Psychic Projection" desc = "Leave your body behind and fly across the land." @@ -55,7 +55,7 @@ /mob var/obj/effect/blood_rune/ajourn -//////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////// GLOBAL_LIST_INIT(astral_projections, list()) /datum/action/cooldown/spell/undirected/astral_return From 8e4a53feabcba94a299a03ebd81c92295c3a2633 Mon Sep 17 00:00:00 2001 From: General626 Date: Sat, 9 May 2026 23:40:21 +0200 Subject: [PATCH 12/24] actually comments out level 2 of auspex --- .../covens/coven_powers/auspex.dm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) 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 8100b76d43b..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 @@ -37,25 +37,25 @@ owner.update_sight() -// PSYCHIC PROJECTION -/datum/coven_power/auspex/psychic_projection - name = "Psychic Projection" - desc = "Leave your body behind and fly across the land." +//PSYCHIC PROJECTION +// /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 From 57c5c5f8b7f63720774cff5ed68f9ada51362bdd Mon Sep 17 00:00:00 2001 From: General626 Date: Sun, 10 May 2026 16:20:18 +0200 Subject: [PATCH 13/24] Removes vitae check from using the teleporter and confusing choice options --- .../villain/vampire/objects/bloodpool.dm | 2 +- .../villain/vampire/objects/portal.dm | 75 ++++++------------- 2 files changed, 25 insertions(+), 52 deletions(-) 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..a9992d59c7e 100644 --- a/code/modules/antagonists/villain/vampire/objects/portal.dm +++ b/code/modules/antagonists/villain/vampire/objects/portal.dm @@ -8,58 +8,31 @@ . = TRUE - - if(!user.has_bloodpool_cost(1000)) - to_chat(user, span_warning("This costs 1000 vitae, I lack that.")) - 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) + 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 + 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" From 0dc84ae849a4c3fe1353bb43e499f22efa1aba1f Mon Sep 17 00:00:00 2001 From: General626 Date: Sun, 10 May 2026 16:32:16 +0200 Subject: [PATCH 14/24] Unsued variable --- code/modules/antagonists/villain/vampire/objects/portal.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/antagonists/villain/vampire/objects/portal.dm b/code/modules/antagonists/villain/vampire/objects/portal.dm index a9992d59c7e..f31db775a82 100644 --- a/code/modules/antagonists/villain/vampire/objects/portal.dm +++ b/code/modules/antagonists/villain/vampire/objects/portal.dm @@ -8,7 +8,6 @@ . = TRUE - var/list/choices = list("RETURN", "SENDING", CHOICE_CANCEL) if(sending) to_chat(user, "A portal is already active!") return From 4f3f72d5d9c9173dca380c4571a1d34c5b7daaab Mon Sep 17 00:00:00 2001 From: General626 Date: Mon, 11 May 2026 19:21:50 +0200 Subject: [PATCH 15/24] world anchors can now be used to summon a portal --- code/modules/antagonists/villain/vampire/objects/portal.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/villain/vampire/objects/portal.dm b/code/modules/antagonists/villain/vampire/objects/portal.dm index f31db775a82..9ecc631f6d9 100644 --- a/code/modules/antagonists/villain/vampire/objects/portal.dm +++ b/code/modules/antagonists/villain/vampire/objects/portal.dm @@ -97,8 +97,8 @@ name = "Gate Amulet" 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 @@ -119,6 +119,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) From 565f65fed6d69ca2f0503b8d0d88cdbcb5f6ed2f Mon Sep 17 00:00:00 2001 From: General626 Date: Mon, 11 May 2026 19:43:00 +0200 Subject: [PATCH 16/24] Buffs vitae upkeep time for potence and celerity + adds tutorial description to the portal amulet --- .../villain/neu_vampires/covens/coven_powers/celerity.dm | 4 ++-- .../villain/neu_vampires/covens/coven_powers/potence.dm | 4 ++-- code/modules/antagonists/villain/vampire/objects/portal.dm | 7 +++++++ 3 files changed, 11 insertions(+), 4 deletions(-) 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/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/vampire/objects/portal.dm b/code/modules/antagonists/villain/vampire/objects/portal.dm index 9ecc631f6d9..6aed210fe56 100644 --- a/code/modules/antagonists/villain/vampire/objects/portal.dm +++ b/code/modules/antagonists/villain/vampire/objects/portal.dm @@ -95,6 +95,7 @@ /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 = 6 @@ -108,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) From 432aa2a44df3f7bb0b7e0580229516a719b7747f Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 12 May 2026 09:42:05 +0200 Subject: [PATCH 17/24] Adds autoassigment to positiions --- code/modules/antagonists/villain/neu_vampires/bloodsuck.dm | 2 ++ .../modules/antagonists/villain/neu_vampires/clan/_base_clan.dm | 2 +- .../antagonists/villain/neu_vampires/living_modifications.dm | 2 ++ code/modules/antagonists/villain/vampire/lord.dm | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index f56f3f71e16..2b4e157d342 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -117,6 +117,8 @@ grab_ghost(TRUE, TRUE) revive((HEAL_DAMAGE|HEAL_AFFLICTIONS|HEAL_LIMBS|HEAL_WOUNDS|HEAL_ORGANS), 500, TRUE) mind.add_antag_datum(new /datum/antagonist/vampire(C, TRUE)) + var/datum/clan_hierarchy_node/new_clan_position = C.create_position("Neonate", "", 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]...")) 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 df1135fd281..9fb42d9b3e4 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm @@ -56,7 +56,7 @@ And it also helps for the character set panel /// 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() diff --git a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm index 1f9561d18f1..6556870ba95 100644 --- a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm +++ b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm @@ -395,4 +395,6 @@ if(!master.clan) return master.clan.add_non_vampire_member(src) + var/datum/clan_hierarchy_node/new_clan_position = master.clan.create_position("Thrall", "", master.clan_position, 1) + new_clan_position.assign_member(src) add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal) diff --git a/code/modules/antagonists/villain/vampire/lord.dm b/code/modules/antagonists/villain/vampire/lord.dm index 5f4bcaf075c..3ee09626dbc 100644 --- a/code/modules/antagonists/villain/vampire/lord.dm +++ b/code/modules/antagonists/villain/vampire/lord.dm @@ -52,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) From 06935b48d934fee2a7eea455225fc8ee703ba861 Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 12 May 2026 11:16:40 +0200 Subject: [PATCH 18/24] Adds organ fixing to higher levels of bloodheal --- .../modules/antagonists/villain/neu_vampires/bloodsuck.dm | 2 +- .../antagonists/villain/neu_vampires/clan/_base_clan.dm | 1 + .../villain/neu_vampires/covens/coven_powers/bloodheal.dm | 8 +++++++- .../villain/neu_vampires/living_modifications.dm | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index 2b4e157d342..788b4e48618 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -117,7 +117,7 @@ grab_ghost(TRUE, TRUE) revive((HEAL_DAMAGE|HEAL_AFFLICTIONS|HEAL_LIMBS|HEAL_WOUNDS|HEAL_ORGANS), 500, TRUE) mind.add_antag_datum(new /datum/antagonist/vampire(C, TRUE)) - var/datum/clan_hierarchy_node/new_clan_position = C.create_position("Neonate", "", sire.clan_position, 1) + 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() 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 9fb42d9b3e4..775112cbb32 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm @@ -53,6 +53,7 @@ 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 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/living_modifications.dm b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm index 6556870ba95..c9b78b87031 100644 --- a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm +++ b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm @@ -395,6 +395,6 @@ if(!master.clan) return master.clan.add_non_vampire_member(src) - var/datum/clan_hierarchy_node/new_clan_position = master.clan.create_position("Thrall", "", master.clan_position, 1) + 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) add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal) From a2e705180d5c8f0545977e240eb5e48a985f5687 Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 12 May 2026 12:11:10 +0200 Subject: [PATCH 19/24] Small visual and sound change for encode thought --- .../spell_types/undirected/list_target/encode_thoughts.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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" From 01a5e9b6f4b2af863e70c28c53fc8ced4326e217 Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 19 May 2026 17:15:40 +0200 Subject: [PATCH 20/24] Presence no longer works on dead people --- .../villain/neu_vampires/covens/coven_powers/presence.dm | 6 ++++++ 1 file changed, 6 insertions(+) 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)) From 7b5f0e9f9f9f353ed397ad41a1255183e1a38aaf Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 19 May 2026 17:57:23 +0200 Subject: [PATCH 21/24] Fixes Baal's carress poison, deletes outdated element --- code/datums/elements/one_time_poison.dm | 33 ------------------- .../covens/coven_powers/quietus.dm | 5 ++- 2 files changed, 4 insertions(+), 34 deletions(-) delete mode 100644 code/datums/elements/one_time_poison.dm 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/covens/coven_powers/quietus.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/quietus.dm index babe75ad54d..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 @@ -206,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" From afdd8fdc471992eeb40167fd78f17545149206d2 Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 19 May 2026 20:57:35 +0200 Subject: [PATCH 22/24] Fix --- vanderlin.dme | 1 - 1 file changed, 1 deletion(-) 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" From 62bd02902d008d1cd9fd7b8b96fc762566857ba3 Mon Sep 17 00:00:00 2001 From: General626 Date: Tue, 19 May 2026 22:55:38 +0200 Subject: [PATCH 23/24] Turns thralls into proper ghouls --- .../villain/neu_vampires/bloodsuck.dm | 3 ++ .../villain/neu_vampires/clan/_base_clan.dm | 11 +++++++ .../neu_vampires/living_modifications.dm | 30 +++++++++++++++++++ code/modules/mob/living/grabbing.dm | 2 +- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index 788b4e48618..4c85eff3c1f 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -102,6 +102,9 @@ to_chat(sire, span_warning("[src] could not be sired.")) return + if(length(covens) == 1) //removing old covens for thralls + remove_coven(covens[1]) + var/datum/clan/C = sire.clan var/choice = tgui_alert(client_victim, "You have been offered the immortal blessing. Take it, or perish.", "THE CURSE OF KAIN", list("I ACCEPT", "TO NECRA"), timeout = 15 SECONDS) if(QDELETED(src)) 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 775112cbb32..8361a4a5769 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm @@ -95,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(length(drinker.covens) == 1) //thrall drinking + if(!(blood_types & BLOOD_PREFERENCE_KIN) && !wanted_blood) //shares drinking habits with their master + 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 diff --git a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm index c9b78b87031..8ffd5163962 100644 --- a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm +++ b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm @@ -398,3 +398,33 @@ 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) add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal) + 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 + + src.hud_used?.shutdown_bloodpool() + src.hud_used?.initialize_bloodpool() + src.hud_used?.bloodpool.set_fill_color("#510000") + maxbloodpool = 1500 + set_bloodpool(500) + ADD_TRAIT(src, TRAIT_BLOODDRINKER, "clan") + give_coven(chosen_coven) + + + diff --git a/code/modules/mob/living/grabbing.dm b/code/modules/mob/living/grabbing.dm index d494cd6b36b..75e3946a1e4 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) || length(user.covens) == 1)) ? 80 : 10 user.drinksomeblood(grabbed, sublimb_grabbed, drink_amt) From 2f754f2dcef4a9902f138f07ee31ac1e0e881f59 Mon Sep 17 00:00:00 2001 From: General626 Date: Wed, 20 May 2026 15:17:16 +0200 Subject: [PATCH 24/24] Adds antag datum for ghouls --- .../antagonists/villain/neu_vampires/bloodsuck.dm | 10 +++++++--- .../villain/neu_vampires/clan/_base_clan.dm | 4 ++-- .../villain/neu_vampires/living_modifications.dm | 8 +------- code/modules/mob/living/grabbing.dm | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm index 4c85eff3c1f..158421716e0 100644 --- a/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm +++ b/code/modules/antagonists/villain/neu_vampires/bloodsuck.dm @@ -102,9 +102,6 @@ to_chat(sire, span_warning("[src] could not be sired.")) return - if(length(covens) == 1) //removing old covens for thralls - remove_coven(covens[1]) - var/datum/clan/C = sire.clan var/choice = tgui_alert(client_victim, "You have been offered the immortal blessing. Take it, or perish.", "THE CURSE OF KAIN", list("I ACCEPT", "TO NECRA"), timeout = 15 SECONDS) if(QDELETED(src)) @@ -119,6 +116,13 @@ 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) 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 8361a4a5769..3dea14ec3c9 100644 --- a/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm +++ b/code/modules/antagonists/villain/neu_vampires/clan/_base_clan.dm @@ -96,8 +96,8 @@ And it also helps for the character set panel var/unwanted_blood = (blood_types & blood_disgust) - if(length(drinker.covens) == 1) //thrall drinking - if(!(blood_types & BLOOD_PREFERENCE_KIN) && !wanted_blood) //shares drinking habits with their master + 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 diff --git a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm index 8ffd5163962..199856e4578 100644 --- a/code/modules/antagonists/villain/neu_vampires/living_modifications.dm +++ b/code/modules/antagonists/villain/neu_vampires/living_modifications.dm @@ -397,7 +397,6 @@ master.clan.add_non_vampire_member(src) 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) - add_bodypart_feature(new /datum/bodypart_feature/vamprire_seal) var/list/coven_options = list() // Get all available covens @@ -418,13 +417,8 @@ if(chosen_coven.max_level > 3) chosen_coven.max_level = 3 //caps the level for thralls at 3 - src.hud_used?.shutdown_bloodpool() - src.hud_used?.initialize_bloodpool() - src.hud_used?.bloodpool.set_fill_color("#510000") - maxbloodpool = 1500 - set_bloodpool(500) - ADD_TRAIT(src, TRAIT_BLOODDRINKER, "clan") give_coven(chosen_coven) + src.mind.add_antag_datum(/datum/antagonist/ghoul) diff --git a/code/modules/mob/living/grabbing.dm b/code/modules/mob/living/grabbing.dm index 75e3946a1e4..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) || length(user.covens) == 1)) ? 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)