Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions code/__DEFINES/bloodsuckers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#define ARMMY_MONSTER "Armmy (100 Blood)"
#define CALCIUM_MONSTER "Calcium (150 Blood)"
#define HUSK_MONSTER "Husk"
#define TOREADOR_MAX_HUMANITY_LOSS 10

/**
* Power defines
*/
Expand Down Expand Up @@ -77,3 +79,7 @@
#define BP_AM_STATIC_COOLDOWN (1<<2)
/// This Power doesn't cost bloot to run while unconscious
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)

// Signals

#define COMSIG_BLOODSUCKER_RANKS_SPENT
22 changes: 21 additions & 1 deletion code/modules/antagonists/bloodsuckers/bloodsucker_flaws.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@
var/static/list/clans = list(
CLAN_GANGREL,
CLAN_LASOMBRA,
CLAN_TOREADOR,
)
var/list/options = list()
options = clans
// Brief descriptions in case they don't read the Wiki.
to_chat(owner, span_announce("List of all Clans:\n\
Gangrel - Prone to Frenzy, strange outcomes from being on frenzy, special power.\n\
Lasombra - Life in the shadows, very weak to fire but no brute damage, upgradable abilities through tasks."))
Lasombra - Life in the shadows, very weak to fire but no brute damage, upgradable abilities through tasks.\n\
Toreador - More human then other bloodsucker, easily disguise among crew, but bound with moral."))

var/answer = input("You have Ranked up far enough to remember your clan. Which clan are you part of?", "Our mind feels luxurious...") in options
if(!answer)
Expand Down Expand Up @@ -76,4 +78,22 @@
to_chat(owner, span_notice("You have also learned how to channel the abyss's power into an iron knight's armor that can be build in the structure ta and activated as a trap for your lair."))
owner.teach_crafting_recipe(/datum/crafting_recipe/possessedarmor)
owner.teach_crafting_recipe(/datum/crafting_recipe/restingplace)
if(CLAN_TOREADOR)
my_clan = CLAN_TOREADOR
to_chat(owner, span_announce("You have Ranked up enough to learn: You are part of the Toreador Clan!\n\
* As part of the Toreador, you can't ignore your own emotions and disrespect inhuman actions.\n\
* Being in Masquarade doesn't spend your blood, as well as having any negative effects on your immortal powers.\n\
* You passively rise morale of your living vassals around you.\n\
* Also you get really sad when comitting inhumane actions, but your humanity loss can't go above a certain treashold.\n\
* Remember, that those bloodsuckers who dare to act inhuman or break the Masquarade shouldn't be forgiven, and deserve only <span class='red'>death</span>.\n\
* Finally, your Favorite Vassal will gain the Mesmerise ability to help you in non-lethaly dealing with enemies or vassalising people."))
if(owner.current && ishuman(owner.current) && !owner.current.GetComponent(/datum/component/mood))
owner.current.AddComponent(/datum/component/mood) //You are not a emotionless beast!

for(var/datum/action/bloodsucker/masquerade/masquarade_spell in powers)
if(!istype(masquarade_spell))
continue
masquarade_spell.bloodcost = 0
masquarade_spell.constant_bloodcost = 0 //Wow very cool code, good job

owner.announce_objectives()
13 changes: 7 additions & 6 deletions code/modules/antagonists/bloodsuckers/bloodsuckers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -740,13 +740,14 @@
continue
if(!isliving(clan_minds.current))
continue
to_chat(clan_minds, span_userdanger("[owner.current] has broken the Masquerade! Ensure they are eliminated at all costs!"))
var/datum/antagonist/bloodsucker/bloodsuckerdatum = clan_minds.has_antag_datum(/datum/antagonist/bloodsucker)
var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate
masquerade_objective.target = owner.current
masquerade_objective.explanation_text = "Ensure [owner.current], who has broken the Masquerade, is Final Death'ed."
bloodsuckerdatum.objectives += masquerade_objective
clan_minds.announce_objectives()
to_chat(clan_minds, span_userdanger("[owner.current] has broken the Masquerade![bloodsuckerdatum.my_clan == CLAN_TOREADOR ? "Ensure they are eliminated at all costs!" : ""]"))
if(bloodsuckerdatum.my_clan == CLAN_TOREADOR)
var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate
masquerade_objective.target = owner.current
masquerade_objective.explanation_text = "Ensure [owner.current], who has broken the Masquerade, is Final Death'ed."
bloodsuckerdatum.objectives += masquerade_objective
clan_minds.announce_objectives()

///This is admin-only of reverting a broken masquerade, sadly it doesn't remove the Malkavian objectives yet.
/datum/antagonist/bloodsucker/proc/fix_masquerade()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@
They can be best defined as 'The most humane kind of vampire', due to their kindred with an obsession with perfectionism and beauty<br> \
<b>Favorite Vassal</b>: Their favorite Vassal gains the Mesmerize ability \
<b>Strength</b>: Highly charismatic and influential.<br> \
<b>Weakness</b>: Physically and Morally weak."
<b>Weakness</b>: Morally weak."
if(CLAN_NOSFERATU)
dat += "This Clan has been the most obvious to find information about.<br> \
They are <i>disfigured, ghoul-like</i> vampires upon embrace by their Sire, scouts that travel through desolate paths to avoid violating the Masquerade.<br> \
Expand Down
5 changes: 5 additions & 0 deletions code/modules/antagonists/bloodsuckers/powers/feed.dm
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,11 @@

// Checks: Step 2 - Is it a Mouse?
if(istype(feed_target, /mob/living/simple_animal/mouse))
if(bloodsuckerdatum_power.my_clan == CLAN_TOREADOR)
to_chat(user, span_danger("I am not going to drink blood of a lesser lifeform."))
bloodsuckerdatum_power.AddHumanityLost(1) //Even attempting to do this disguisting action is against your morale, so get humanity loss
DeactivatePower()
return
var/mob/living/simple_animal/mouse_target = feed_target
bloodsuckerdatum_power.AddBloodVolume(25)
to_chat(user, span_notice("You recoil at the taste of a lesser lifeform."))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,17 @@
INVOKE_ASYNC(src, .proc/HandleStarving)
INVOKE_ASYNC(src, .proc/HandleTorpor)

if(my_clan == CLAN_TOREADOR && owner.current.stat != DEAD)
for(var/datum/antagonist/vassal/vassal in vassals)
if(vassal.master != src)
continue
if(!vassal.owner.current || vassal.owner.current == DEAD)
continue
if(get_dist(get_turf(owner.current), get_turf(vassal.owner.current)) > 5)
continue
SEND_SIGNAL(vassal.owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_vassal)


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BLOOD
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand All @@ -35,6 +46,12 @@
if(humanity_lost >= 500)
to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human."))
return
if(my_clan == CLAN_TOREADOR)
if(humanity_lost >= TOREADOR_MAX_HUMANITY_LOSS)
to_chat(owner.current, span_warning("Your moral prevents you from becoming more ihuman."))
SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_inhuman2)
return
SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_inhuman)
humanity_lost += value
to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + humanity_lost * 10] Blood."))

Expand Down Expand Up @@ -90,7 +107,7 @@
/datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1)
var/actual_regen = bloodsucker_regen_rate + additional_regen
// Don't heal if I'm staked or on Masquerade (+ not in a Coffin). Masqueraded Bloodsuckers in a Coffin however, will heal.
if(owner.current.AmStaked() || (HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && !HAS_TRAIT(owner.current, TRAIT_NODEATH)))
if(owner.current.AmStaked() || (HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && !HAS_TRAIT(owner.current, TRAIT_NODEATH) && my_clan != CLAN_TOREADOR))
return FALSE
owner.current.adjustCloneLoss(-1 * (actual_regen * 4) * mult, 0)
owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) //adjustBrainLoss(-1 * (actual_regen * 4) * mult, 0)
Expand All @@ -103,7 +120,7 @@
/// Checks if you're in a coffin here, additionally checks for Torpor right below it.
var/amInCoffin = istype(user.loc, /obj/structure/closet/crate/coffin)
if(amInCoffin && HAS_TRAIT(user, TRAIT_NODEATH))
if(HAS_TRAIT(owner.current, TRAIT_MASQUERADE))
if(HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && my_clan != CLAN_TOREADOR)
to_chat(user, span_warning("You will not heal while your Masquerade ability is active."))
return
fireheal = min(user.getFireLoss_nonProsthetic(), actual_regen)
Expand Down Expand Up @@ -481,6 +498,21 @@
mood_change = -6
timeout = 6 MINUTES

/datum/mood_event/toreador_inhuman
description = "<span class='boldwarning'>I commited inhuman actions. I feel... bad.</span>\n"
mood_change = -4
timeout = 6 MINUTES

/datum/mood_event/toreador_inhuman2
description = "<span class='boldwarning'>I should stop acting like this. What am I turning into?</span>\n"
mood_change = -10
timeout = 10 MINUTES

/datum/mood_event/toreador_vassal
description = "<span class='nicegreen'>My master is near me. I love them.</span>\n"
mood_change = 4
timeout = 30 SECONDS

///Candelabrum's mood event to non Bloodsucker/Vassals
/datum/mood_event/vampcandle
description = "<span class='boldwarning'>Something is making your mind feel... loose.</span>\n"
Expand Down
10 changes: 10 additions & 0 deletions code/modules/antagonists/bloodsuckers/vassal.dm
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
//Remove Language & Hud
owner.current.remove_language(/datum/language/vampiric)
update_vassal_icons_removed(owner.current)
UnregisterSignal(master, COMSIG_BLOODSUCKER_RANKS_SPENT)
return ..()

/datum/antagonist/vassal/on_body_transfer(mob/living/old_body, mob/living/new_body)
Expand Down Expand Up @@ -132,6 +133,15 @@
return
playsound(vassal.loc, 'sound/effects/splat.ogg', 50, TRUE)
vassal.set_species(/datum/species/szlachta)
if(CLAN_TOREADOR)
BuyPower(/datum/action/bloodsucker/targeted/mesmerize)
RegisterSignal(master, COMSIG_BLOODSUCKER_RANKS_SPENT, .proc/toreador_levelup_mesmerize)

/datum/antagonist/vassal/proc/toreador_levelup_mesmerize() //Don't need stupid args
for(var/datum/action/bloodsucker/targeted/mesmerize/mesmerize_power in powers)
if(!istype(mesmerize_power))
continue
mesmerize_power.level_current = max(master.bloodsucker_level, 1)

/// If we weren't created by a bloodsucker, then we cannot be a vassal (assigned from antag panel)
/datum/antagonist/vassal/can_be_owned(datum/mind/new_owner)
Expand Down