Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PORT] Removes vampire race, replaces them with vampire antagonist (bloodsuckers) #12092

Open
wants to merge 39 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6c88297
initial
mrmanlikesbt Dec 20, 2024
6951f0f
stuff, log in desc
mrmanlikesbt Dec 22, 2024
5718167
Merge branch 'BeeStation:master' into bloodsucker
mrmanlikesbt Dec 22, 2024
6659b41
i need this file space ok?
mrmanlikesbt Dec 27, 2024
306234c
Merge branch 'bloodsucker' of https://github.com/mrmanlikesbt/BeeStat…
mrmanlikesbt Dec 27, 2024
a6f4e70
Merge branch 'master' into bloodsucker
mrmanlikesbt Dec 27, 2024
bb1bc66
Merge branch 'bloodsucker' of https://github.com/mrmanlikesbt/BeeStat…
mrmanlikesbt Dec 28, 2024
d09c897
fixes compilation errors + grammar
mrmanlikesbt Dec 28, 2024
07ec2c7
stuff
mrmanlikesbt Dec 28, 2024
efe0d1c
mostly code cleanup
mrmanlikesbt Dec 29, 2024
8bf2e41
🍎
mrmanlikesbt Jan 3, 2025
69273ed
lets fix this before i forget
mrmanlikesbt Jan 3, 2025
fc8928d
Merge branch 'BeeStation:master' into bloodsucker
mrmanlikesbt Jan 3, 2025
056878f
im tired
mrmanlikesbt Jan 4, 2025
15af799
whoops
mrmanlikesbt Jan 4, 2025
7bf4a0c
am i stupid?
mrmanlikesbt Jan 4, 2025
10a35f7
i am a vampire
mrmanlikesbt Jan 8, 2025
c497464
soulstone
mrmanlikesbt Jan 8, 2025
77d6f5f
Update malkavian.dm
mrmanlikesbt Jan 8, 2025
9bf58f6
lets fix this before it becomes a problem
mrmanlikesbt Jan 8, 2025
4e74ce7
will this fix linters?
mrmanlikesbt Jan 8, 2025
1fb65bd
going to bed now. hope this fixes it
mrmanlikesbt Jan 8, 2025
50631e8
cleanup + bugfixes
mrmanlikesbt Jan 10, 2025
c6b3b6a
oops
mrmanlikesbt Jan 10, 2025
6d08842
removes vampire race, fix linters (probably)
mrmanlikesbt Jan 10, 2025
3e5db7e
fixes
mrmanlikesbt Jan 11, 2025
1ac4a52
tgui, rewrote power explanations, fixed problem with final_death
mrmanlikesbt Jan 11, 2025
173d1bc
fix runtime + bloodshield fix
mrmanlikesbt Jan 11, 2025
0d817b4
rename bloodsuckers to vampires
mrmanlikesbt Jan 11, 2025
25d9a46
fix checks probably
mrmanlikesbt Jan 11, 2025
db42371
linter
mrmanlikesbt Jan 11, 2025
61561e0
what the FUCK IS A KILOMETER
mrmanlikesbt Jan 11, 2025
f1ada62
im freaking it
mrmanlikesbt Jan 11, 2025
8bf8f1e
plz
mrmanlikesbt Jan 11, 2025
8b4dac7
need this file space
mrmanlikesbt Jan 12, 2025
c215cf2
fix checks probably
mrmanlikesbt Jan 13, 2025
840b225
humanity is kind of stupid. goodbye
mrmanlikesbt Jan 14, 2025
2dfec30
last commit kind of looks like a suicide note :trollface:
mrmanlikesbt Jan 14, 2025
a64a8e5
tgui looks a lot cooler with the narsie theme
mrmanlikesbt Jan 14, 2025
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
51 changes: 50 additions & 1 deletion beestation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#include "code\__DEFINES\basic_mobs.dm"
#include "code\__DEFINES\bitfields.dm"
#include "code\__DEFINES\blood.dm"
#include "code\__DEFINES\bloodsuckers.dm"
#include "code\__DEFINES\bodyparts.dm"
#include "code\__DEFINES\bot_defines.dm"
#include "code\__DEFINES\callbacks.dm"
Expand Down Expand Up @@ -308,6 +309,7 @@
#include "code\__HELPERS\test_helpers.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
#include "code\__HELPERS\traits.dm"
#include "code\__HELPERS\turfs.dm"
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\type_processing.dm"
Expand Down Expand Up @@ -373,6 +375,7 @@
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\blob_overmind.dm"
#include "code\_onclick\hud\blobbernauthud.dm"
#include "code\_onclick\hud\bloodsucker.dm"
#include "code\_onclick\hud\constructs.dm"
#include "code\_onclick\hud\credits.dm"
#include "code\_onclick\hud\drones.dm"
Expand Down Expand Up @@ -490,6 +493,7 @@
#include "code\controllers\subsystem\stat.dm"
#include "code\controllers\subsystem\stickyban.dm"
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\sunlight.dm"
#include "code\controllers\subsystem\supply.dm"
#include "code\controllers\subsystem\tgui.dm"
#include "code\controllers\subsystem\throwing.dm"
Expand Down Expand Up @@ -1623,6 +1627,7 @@
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\bloodsucker_crypt.dm"
#include "code\game\objects\structures\bot_elevator.dm"
#include "code\game\objects\structures\catwalk.dm"
#include "code\game\objects\structures\crateshelf.dm"
Expand Down Expand Up @@ -1714,6 +1719,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
#include "code\game\objects\structures\crates_lockers\crates\bins.dm"
#include "code\game\objects\structures\crates_lockers\crates\coffins.dm"
#include "code\game\objects\structures\crates_lockers\crates\critter.dm"
#include "code\game\objects\structures\crates_lockers\crates\large.dm"
#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
Expand Down Expand Up @@ -1956,6 +1962,49 @@
#include "code\modules\antagonists\blob\structures\resource.dm"
#include "code\modules\antagonists\blob\structures\shield.dm"
#include "code\modules\antagonists\blood_contract\blood_contract.dm"
#include "code\modules\antagonists\bloodsucker\conversion_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\daylight_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\frenzy_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\life_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\misc_procs_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\moodlets_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\names_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\objectives_bloodsucker.dm"
#include "code\modules\antagonists\bloodsucker\clans\_clan.dm"
#include "code\modules\antagonists\bloodsucker\clans\assignclan.dm"
#include "code\modules\antagonists\bloodsucker\clans\clan_flavortext.dm"
#include "code\modules\antagonists\bloodsucker\clans\malkavian.dm"
#include "code\modules\antagonists\bloodsucker\clans\nosferatu.dm"
#include "code\modules\antagonists\bloodsucker\clans\tremere.dm"
#include "code\modules\antagonists\bloodsucker\clans\venture.dm"
#include "code\modules\antagonists\bloodsucker\powers\_power.dm"
#include "code\modules\antagonists\bloodsucker\powers\cloak.dm"
#include "code\modules\antagonists\bloodsucker\powers\feed.dm"
#include "code\modules\antagonists\bloodsucker\powers\fortitude.dm"
#include "code\modules\antagonists\bloodsucker\powers\gohome.dm"
#include "code\modules\antagonists\bloodsucker\powers\masquerade.dm"
#include "code\modules\antagonists\bloodsucker\powers\veil.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\_targeted.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\brawn.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\haste.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\lunge.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\mesmerize.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\trespass.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\_tremere.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\auspex.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\dominate.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\thaumaturgey.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\distress.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\recuperate.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\revenge_bloodbag.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\revenge_checkstatus.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\revenge_fold.dm"
#include "code\modules\antagonists\bloodsucker\vassals\datum_vassal.dm"
#include "code\modules\antagonists\bloodsucker\vassals\ex_vassal.dm"
#include "code\modules\antagonists\bloodsucker\vassals\favorite_vassal.dm"
#include "code\modules\antagonists\bloodsucker\vassals\misc_procs_vassal.dm"
#include "code\modules\antagonists\bloodsucker\vassals\revenge_vassal.dm"
#include "code\modules\antagonists\brainwashing\brainwashing.dm"
#include "code\modules\antagonists\brother\brother.dm"
#include "code\modules\antagonists\changeling\cellular_emporium.dm"
Expand Down Expand Up @@ -2910,6 +2959,7 @@
#include "code\modules\language\sylvan.dm"
#include "code\modules\language\terrum.dm"
#include "code\modules\language\uncommon.dm"
#include "code\modules\language\vampiric.dm"
#include "code\modules\language\voltaic.dm"
#include "code\modules\language\xenocommon.dm"
#include "code\modules\library\lib_codex_gigas.dm"
Expand Down Expand Up @@ -3139,7 +3189,6 @@
#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm"
#include "code\modules\mob\living\carbon\human\species_types\snail.dm"
#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
#include "code\modules\mob\living\carbon\human\verbs\give.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/antagonists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
#define FACTION_BLOB "Blob"
#define FACTION_ALIEN "Xenomorph"
#define FACTION_WIZARD "Wizard"
#define FACTION_BLOODSUCKER "Bloodsucker"

// Heretic path defines.
#define HERETIC_PATH_START "Heretic Start Path"
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/atom_hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
#define ANTAG_HUD_VALENTINE 37
#define ANTAG_HUD_HEARTBREAKER 38
#define ANTAG_HUD_PRISONER 39
#define ANTAG_HUD_BLOODSUCKER 40

// Notification action types
#define NOTIFY_JUMP "jump"
Expand Down
175 changes: 175 additions & 0 deletions code/__DEFINES/bloodsuckers.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
///Uncomment this to enable testing of Bloodsucker features (such as vassalizing people with a mind instead of a client).
#define BLOODSUCKER_TESTING

/**
* Blood-level defines
*/
/// Determines Bloodsucker regeneration rate
#define BS_BLOOD_VOLUME_MAX_REGEN 700
/// Cost to torture someone halfway, in blood. Called twice for full cost
#define TORTURE_BLOOD_HALF_COST 8
/// Cost to convert someone after successful torture, in blood
#define TORTURE_CONVERSION_COST 50
/// Once blood is this low, will enter Frenzy
#define FRENZY_THRESHOLD_ENTER 25
/// Once blood is this high, will exit Frenzyshak
#define FRENZY_THRESHOLD_EXIT 250

/**
* Vassal defines
*/
///If someone passes all checks and can be vassalized
#define VASSALIZATION_ALLOWED 0
///If someone has to accept vassalization
#define VASSALIZATION_DISLOYAL 1
///If someone is not allowed under any circimstances to become a Vassal
#define VASSALIZATION_BANNED 2

/**
* Cooldown defines
* Used in Cooldowns Bloodsuckers use to prevent spamming
*/
///Spam prevention for healing messages.
#define BLOODSUCKER_SPAM_HEALING (15 SECONDS)
///Span prevention for Sol Masquerade messages.
#define BLOODSUCKER_SPAM_MASQUERADE (60 SECONDS)

///Span prevention for Sol messages.
#define BLOODSUCKER_SPAM_SOL (30 SECONDS)

/**
* Clan defines
*/
#define CLAN_NONE "Caitiff"
#define CLAN_BRUJAH "Brujah Clan"
#define CLAN_TOREADOR "Toreador Clan"
#define CLAN_NOSFERATU "Nosferatu Clan"
#define CLAN_TREMERE "Tremere Clan"
#define CLAN_GANGREL "Gangrel Clan"
#define CLAN_VENTRUE "Ventrue Clan"
#define CLAN_MALKAVIAN "Malkavian Clan"
#define CLAN_TZIMISCE "Tzimisce Clan"

#define TREMERE_VASSAL "tremere_vassal"
#define FAVORITE_VASSAL "favorite_vassal"
#define REVENGE_VASSAL "revenge_vassal"

/**
* Power defines
*/
/// This Power can't be used in Torpor
#define BP_CANT_USE_IN_TORPOR (1<<0)
/// This Power can't be used in Frenzy.
#define BP_CANT_USE_IN_FRENZY (1<<1)
/// This Power can't be used with a stake in you
#define BP_CANT_USE_WHILE_STAKED (1<<2)
/// This Power can't be used while incapacitated
#define BP_CANT_USE_WHILE_INCAPACITATED (1<<3)
/// This Power can't be used while unconscious
#define BP_CANT_USE_WHILE_UNCONSCIOUS (1<<4)

/// This Power can be purchased by Bloodsuckers
#define BLOODSUCKER_CAN_BUY (1<<0)
/// This is a Default Power that all Bloodsuckers get.
#define BLOODSUCKER_DEFAULT_POWER (1<<1)
/// This Power can be purchased by Tremere Bloodsuckers
#define TREMERE_CAN_BUY (1<<2)
/// This Power can be purchased by Vassals
#define VASSAL_CAN_BUY (1<<3)

/// This Power is a Toggled Power
#define BP_AM_TOGGLE (1<<0)
/// This Power is a Single-Use Power
#define BP_AM_SINGLEUSE (1<<1)
/// This Power has a Static cooldown
#define BP_AM_STATIC_COOLDOWN (1<<2)
/// This Power doesn't cost bloot to run while unconscious
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)

/**
* Bloodsucker Signals
*/
///Called when a Bloodsucker ranks up: (datum/bloodsucker_datum, mob/owner, mob/target)
#define BLOODSUCKER_RANK_UP "bloodsucker_rank_up"
///Called when a Bloodsucker interacts with a Vassal on their persuasion rack.
#define BLOODSUCKER_INTERACT_WITH_VASSAL "bloodsucker_interact_with_vassal"
///Called when a Bloodsucker makes a Vassal into their Favorite Vassal: (datum/vassal_datum, mob/master)
#define BLOODSUCKER_MAKE_FAVORITE "bloodsucker_make_favorite"
///Called when a new Vassal is successfully made: (datum/bloodsucker_datum)
#define BLOODSUCKER_MADE_VASSAL "bloodsucker_made_vassal"
///Called when a Bloodsucker exits Torpor.
#define BLOODSUCKER_EXIT_TORPOR "bloodsucker_exit_torpor"
///Called when a Bloodsucker reaches Final Death.
#define BLOODSUCKER_FINAL_DEATH "bloodsucker_final_death"
///Whether the Bloodsucker should not be dusted when arriving Final Death
#define DONT_DUST (1<<0)
///Called when a Bloodsucker breaks the Masquerade
#define COMSIG_BLOODSUCKER_BROKE_MASQUERADE "comsig_bloodsucker_broke_masquerade"
///Called when a Bloodsucker enters Frenzy
#define BLOODSUCKER_ENTERS_FRENZY "bloodsucker_enters_frenzy"
///Called when a Bloodsucker exits Frenzy
#define BLOODSUCKER_EXITS_FRENZY "bloodsucker_exits_frenzy"

/**
* Sol signals & Defines
*/
#define COMSIG_SOL_RANKUP_BLOODSUCKERS "comsig_sol_rankup_bloodsuckers"
#define COMSIG_SOL_RISE_TICK "comsig_sol_rise_tick"
#define COMSIG_SOL_NEAR_START "comsig_sol_near_start"
#define COMSIG_SOL_END "comsig_sol_end"
///Sent when a warning for Sol is meant to go out: (danger_level, vampire_warning_message, vassal_warning_message)
#define COMSIG_SOL_WARNING_GIVEN "comsig_sol_warning_given"
///Called on a Bloodsucker's Lifetick.
#define COMSIG_BLOODSUCKER_ON_LIFETICK "comsig_bloodsucker_on_lifetick"

#define DANGER_LEVEL_FIRST_WARNING 1
#define DANGER_LEVEL_SECOND_WARNING 2
#define DANGER_LEVEL_THIRD_WARNING 3
#define DANGER_LEVEL_SOL_ROSE 4
#define DANGER_LEVEL_SOL_ENDED 5

/**
* Clan defines
*
* This is stuff that is used solely by Clans for clan-related activity.
*/
///Drinks blood the normal Bloodsucker way.
#define BLOODSUCKER_DRINK_NORMAL "bloodsucker_drink_normal"
///Drinks blood but is snobby, refusing to drink from mindless
#define BLOODSUCKER_DRINK_SNOBBY "bloodsucker_drink_snobby"
///Drinks blood from disgusting creatures without Humanity consequences.
#define BLOODSUCKER_DRINK_INHUMANELY "bloodsucker_drink_imhumanely"

/**
* Traits
*/
/// Falsifies Health analyzer blood levels
#define TRAIT_MASQUERADE "trait_masquerade"
/// Your body is literal room temperature. Does not make you immune to the temp
#define TRAIT_COLDBLOODED "trait_coldblooded"

/**
* Sources
*/
#define TRAIT_BLOODSUCKER "trait_bloodsucker"
/// Source trait while Feeding
#define TRAIT_FEED "trait_feed"
/// Source trait during a Frenzy
#define TRAIT_FRENZY "trait_frenzy"
/// Source trait for bloodsuckers in torpor.
#define TRAIT_TORPOR "trait_torpor"
/// Source trait for bloodsucker mesmerization.
#define TRAIT_MESMERIZED "trait_mesmerized"

/**
* Macros
*/
#define IS_BLOODSUCKER(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodsucker))
#define IS_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vassal))
#define IS_FAVORITE_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vassal/favorite))
#define IS_REVENGE_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vassal/revenge))
#define IS_EX_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/ex_vassal))
#define IS_CURATOR(mob) (mob?.mind?.assigned_role == JOB_NAME_CURATOR)

//Used in bloodsucker_life.dm
#define MARTIALART_FRENZYGRAB "frenzy grabbing"
1 change: 0 additions & 1 deletion code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define ishumanbasic(A) (is_species(A, /datum/species/human) && !is_species(A, /datum/species/human/krokodil_addict))
#define iscatperson(A) (is_species(A, /datum/species/human/felinid) )
#define isethereal(A) (is_species(A, /datum/species/ethereal))
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define isipc(A) (is_species(A, /datum/species/ipc))
#define isapid(A) (is_species(A, /datum/species/apid))
Expand Down
3 changes: 2 additions & 1 deletion code/__DEFINES/language.dm
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,6 @@ GLOBAL_LIST_INIT(multilingual_language_list, typecacheof(list(
/datum/language/sylvan,
/datum/language/terrum,
/datum/language/uncommon,
/datum/language/voltaic
/datum/language/voltaic,
/datum/language/vampiric
)))
2 changes: 2 additions & 0 deletions code/__DEFINES/role_preferences.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#define ROLE_PYRO_SLIME "Pyroclastic Anomaly Slime"
#define ROLE_MONKEY_HELMET "Sentient Monkey"
#define ROLE_PRISONER "Prisoner"
#define ROLE_BLOODSUCKER "Bloodsucker"

/// Roles that are antagonists, roundstart or not, and have passes to do.. antagonistry
GLOBAL_LIST_INIT(antagonist_bannable_roles, list(
Expand Down Expand Up @@ -91,6 +92,7 @@ GLOBAL_LIST_INIT(antagonist_bannable_roles, list(
ROLE_FUGITIVE_HUNTER,
ROLE_SLAUGHTER_DEMON,
ROLE_CONTRACTOR_SUPPORT_UNIT,
ROLE_BLOODSUCKER,
))

#define BAN_ROLE_FORCED_ANTAGONISTS "Forced Antagonists"
Expand Down
1 change: 0 additions & 1 deletion code/__DEFINES/species.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
#define SPECIES_SKELETON "skeleton"
#define SPECIES_SNAILPERSON "snail"
#define SPECIES_SUPERSOLDIER "supersoldier"
#define SPECIES_VAMPIRE "vampire"
#define SPECIES_PSYPHOZA "psyphoza"

//Defines for Golem Species IDs
Expand Down
9 changes: 9 additions & 0 deletions code/__HELPERS/traits.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/// Proc that handles adding multiple traits to a target via a list. Must have a common source and target.
/datum/proc/add_traits(list/list_of_traits, source)
for(var/trait in list_of_traits)
ADD_TRAIT(src, trait, source)

/// Proc that handles removing multiple traits from a target via a list. Must have a common source and target.
/datum/proc/remove_traits(list/list_of_traits, source)
for(var/trait in list_of_traits)
REMOVE_TRAIT(src, trait, source)
Loading
Loading