mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
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:
@@ -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
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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> \
|
||||||
|
|||||||
@@ -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."))
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user