Adds Toreador bloodsucker clan (#15428)

* new clan

* fix

* e

* e

* debuff

* Apply suggestions from code review

Co-authored-by: Jamie D <993128+JamieD1@users.noreply.github.com>
This commit is contained in:
SuperSlayer
2022-09-04 15:47:58 +03:00
committed by GitHub
parent 0d50260822
commit c5497e02e2
7 changed files with 84 additions and 10 deletions

View File

@@ -42,6 +42,8 @@
#define ARMMY_MONSTER "Armmy (100 Blood)" #define ARMMY_MONSTER "Armmy (100 Blood)"
#define CALCIUM_MONSTER "Calcium (150 Blood)" #define CALCIUM_MONSTER "Calcium (150 Blood)"
#define HUSK_MONSTER "Husk" #define HUSK_MONSTER "Husk"
#define TOREADOR_MAX_HUMANITY_LOSS 10
/** /**
* Power defines * Power defines
*/ */
@@ -77,3 +79,7 @@
#define BP_AM_STATIC_COOLDOWN (1<<2) #define BP_AM_STATIC_COOLDOWN (1<<2)
/// This Power doesn't cost bloot to run while unconscious /// This Power doesn't cost bloot to run while unconscious
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3) #define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)
// Signals
#define COMSIG_BLOODSUCKER_RANKS_SPENT

View File

@@ -22,13 +22,15 @@
var/static/list/clans = list( var/static/list/clans = list(
CLAN_GANGREL, CLAN_GANGREL,
CLAN_LASOMBRA, CLAN_LASOMBRA,
CLAN_TOREADOR,
) )
var/list/options = list() var/list/options = list()
options = clans options = clans
// Brief descriptions in case they don't read the Wiki. // Brief descriptions in case they don't read the Wiki.
to_chat(owner, span_announce("List of all Clans:\n\ to_chat(owner, span_announce("List of all Clans:\n\
Gangrel - Prone to Frenzy, strange outcomes from being on frenzy, special power.\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 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) if(!answer)
@@ -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.")) 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/possessedarmor)
owner.teach_crafting_recipe(/datum/crafting_recipe/restingplace) 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() owner.announce_objectives()

View File

@@ -740,13 +740,14 @@
continue continue
if(!isliving(clan_minds.current)) if(!isliving(clan_minds.current))
continue 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/antagonist/bloodsucker/bloodsuckerdatum = clan_minds.has_antag_datum(/datum/antagonist/bloodsucker)
var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate to_chat(clan_minds, span_userdanger("[owner.current] has broken the Masquerade![bloodsuckerdatum.my_clan == CLAN_TOREADOR ? "Ensure they are eliminated at all costs!" : ""]"))
masquerade_objective.target = owner.current if(bloodsuckerdatum.my_clan == CLAN_TOREADOR)
masquerade_objective.explanation_text = "Ensure [owner.current], who has broken the Masquerade, is Final Death'ed." var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate
bloodsuckerdatum.objectives += masquerade_objective masquerade_objective.target = owner.current
clan_minds.announce_objectives() 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. ///This is admin-only of reverting a broken masquerade, sadly it doesn't remove the Malkavian objectives yet.
/datum/antagonist/bloodsucker/proc/fix_masquerade() /datum/antagonist/bloodsucker/proc/fix_masquerade()

View File

@@ -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> \ 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>Favorite Vassal</b>: Their favorite Vassal gains the Mesmerize ability \
<b>Strength</b>: Highly charismatic and influential.<br> \ <b>Strength</b>: Highly charismatic and influential.<br> \
<b>Weakness</b>: Physically and Morally weak." <b>Weakness</b>: Morally weak."
if(CLAN_NOSFERATU) if(CLAN_NOSFERATU)
dat += "This Clan has been the most obvious to find information about.<br> \ 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> \ 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> \

View File

@@ -147,6 +147,11 @@
// Checks: Step 2 - Is it a Mouse? // Checks: Step 2 - Is it a Mouse?
if(istype(feed_target, /mob/living/simple_animal/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 var/mob/living/simple_animal/mouse_target = feed_target
bloodsuckerdatum_power.AddBloodVolume(25) bloodsuckerdatum_power.AddBloodVolume(25)
to_chat(user, span_notice("You recoil at the taste of a lesser lifeform.")) to_chat(user, span_notice("You recoil at the taste of a lesser lifeform."))

View File

@@ -23,6 +23,17 @@
INVOKE_ASYNC(src, .proc/HandleStarving) INVOKE_ASYNC(src, .proc/HandleStarving)
INVOKE_ASYNC(src, .proc/HandleTorpor) 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 // BLOOD
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -35,6 +46,12 @@
if(humanity_lost >= 500) if(humanity_lost >= 500)
to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human.")) to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human."))
return 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 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.")) 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."))
@@ -90,7 +107,7 @@
/datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1)
var/actual_regen = bloodsucker_regen_rate + additional_regen 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. // 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 return FALSE
owner.current.adjustCloneLoss(-1 * (actual_regen * 4) * mult, 0) 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) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) //adjustBrainLoss(-1 * (actual_regen * 4) * mult, 0)
@@ -103,7 +120,7 @@
/// Checks if you're in a coffin here, additionally checks for Torpor right below it. /// 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) var/amInCoffin = istype(user.loc, /obj/structure/closet/crate/coffin)
if(amInCoffin && HAS_TRAIT(user, TRAIT_NODEATH)) 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.")) to_chat(user, span_warning("You will not heal while your Masquerade ability is active."))
return return
fireheal = min(user.getFireLoss_nonProsthetic(), actual_regen) fireheal = min(user.getFireLoss_nonProsthetic(), actual_regen)
@@ -481,6 +498,21 @@
mood_change = -6 mood_change = -6
timeout = 6 MINUTES 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 ///Candelabrum's mood event to non Bloodsucker/Vassals
/datum/mood_event/vampcandle /datum/mood_event/vampcandle
description = "<span class='boldwarning'>Something is making your mind feel... loose.</span>\n" description = "<span class='boldwarning'>Something is making your mind feel... loose.</span>\n"

View File

@@ -67,6 +67,7 @@
//Remove Language & Hud //Remove Language & Hud
owner.current.remove_language(/datum/language/vampiric) owner.current.remove_language(/datum/language/vampiric)
update_vassal_icons_removed(owner.current) update_vassal_icons_removed(owner.current)
UnregisterSignal(master, COMSIG_BLOODSUCKER_RANKS_SPENT)
return ..() return ..()
/datum/antagonist/vassal/on_body_transfer(mob/living/old_body, mob/living/new_body) /datum/antagonist/vassal/on_body_transfer(mob/living/old_body, mob/living/new_body)
@@ -132,6 +133,15 @@
return return
playsound(vassal.loc, 'sound/effects/splat.ogg', 50, TRUE) playsound(vassal.loc, 'sound/effects/splat.ogg', 50, TRUE)
vassal.set_species(/datum/species/szlachta) 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) /// 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) /datum/antagonist/vassal/can_be_owned(datum/mind/new_owner)