From 48dc5f593d102f9fa5cdc287fbf73c5d65a5a6ec Mon Sep 17 00:00:00 2001
From: aKromatopzia <94389683+aKromatopzia@users.noreply.github.com>
Date: Fri, 21 Nov 2025 01:46:06 +0800
Subject: [PATCH] The full-custom blood colour quirk, again (#4332)
## About The Pull Request
Technically, this is also a bugfix for the removed portion of the evil
quirk.
This is a blood colour quirk which aims to create an entirely new
blood_type datum per color-modified base type, and acts as a launching
pad into developing more blood stuff.
As an additional note: In our testing injected blood wouldn't override
the recipient's blood colour. However if this does happen at all in
live, do state such!
## Why It's Good For The Game
Blood colour good? Near-fully custom blood color better?
## Proof Of Testing
oh hey it works now. The three lizards in the video use red blood,
cyan/vox blood, and white/nanite blood respectively.
https://github.com/user-attachments/assets/cec6465f-68de-4c6f-97f4-58061f4f7241
Not rigorously tested, but my process was to only dev the lizard type
then copy to everything else... so it should be fine? Just to show it
should work on blood types with existing compatible_type fields though -
as in, it actually copies the list:
## What We Learnt
Trust our gut. We shouldve replaced it ages ago but thought original
refactorer knew better
## Changelog
:cl:
add: blood colour quirk. it's mechanically near-identical to the normal
type.
code: more blood colour presets. yum.
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
---
code/__DEFINES/~~bubber_defines/colors.dm | 7 +
.../customization/_globalvars/lists.dm | 13 +
.../client/preferences/unique_blood_color.dm | 41 +++
.../clothing/under/accessories/badges.dm | 10 +
.../code/modules/mob/living/blood_types.dm | 280 ++++++++++++++++++
.../neutral_quirks/unique_blood_color.dm | 75 +++++
tgstation.dme | 3 +
.../bubbers/unique_blood_color.tsx | 15 +
8 files changed, 444 insertions(+)
create mode 100644 modular_zubbers/code/modules/client/preferences/unique_blood_color.dm
create mode 100644 modular_zubbers/code/modules/clothing/under/accessories/badges.dm
create mode 100644 modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm
create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx
diff --git a/code/__DEFINES/~~bubber_defines/colors.dm b/code/__DEFINES/~~bubber_defines/colors.dm
index 95cf66938e1..6a1b181357f 100644
--- a/code/__DEFINES/~~bubber_defines/colors.dm
+++ b/code/__DEFINES/~~bubber_defines/colors.dm
@@ -9,8 +9,15 @@ GLOBAL_LIST_INIT(chat_colors_by_mob_name, list(
"Unknown" = list("#ffffff", "#d8d8d8"),
))
+/// Blood colors
#define BLOOD_COLOR_COPPER "#6E3B08"
#define BLOOD_COLOR_NANITE_SLURRY "#CCCCCC"
+//alternate lizard blood
+#define BLOOD_COLOR_GREEN "#339933"
+//old-canon avalis had violet blood, so...
+#define BLOOD_COLOR_VIOLET "#9966FF"
+//cyan vox blood
+#define BLOOD_COLOR_CYAN "#33FFFF"
/// Modsuit hardlight colors
diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm
index 69e4eb1af32..df9f3640200 100644
--- a/modular_skyrat/modules/customization/_globalvars/lists.dm
+++ b/modular_skyrat/modules/customization/_globalvars/lists.dm
@@ -110,3 +110,16 @@ GLOBAL_LIST_INIT(color_list_ghoul, list( \
"Plutonium Blue" = "a5cfcc", \
"Marked Red" = "f05b68" \
))
+
+//blood colours
+GLOBAL_LIST_INIT(custom_blood_colors, list(
+ "Red/Human" = BLOOD_COLOR_RED,
+ "D.Green/Lizard" = BLOOD_COLOR_LIZARD,
+ "Green" = BLOOD_COLOR_GREEN,
+ "Lime/Xeno" = BLOOD_COLOR_XENO,
+ "Violet/Avali" = BLOOD_COLOR_VIOLET,
+ "Cyan/Vox" = BLOOD_COLOR_CYAN,
+ "Brown/Skrell" = BLOOD_COLOR_COPPER,
+ "White/Nanites" = BLOOD_COLOR_NANITE_SLURRY,
+ "Black" = BLOOD_COLOR_BLACK,
+))
diff --git a/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm b/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm
new file mode 100644
index 00000000000..ca5f43853e5
--- /dev/null
+++ b/modular_zubbers/code/modules/client/preferences/unique_blood_color.dm
@@ -0,0 +1,41 @@
+///see modular_zubbers\code\modules\quirks\neutral_quirks\unique_blood_color.dm
+
+///manual colour input
+/datum/preference/color/input_blood_color
+ category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
+ savefile_key = "input_blood_color"
+ savefile_identifier = PREFERENCE_CHARACTER
+
+/datum/preference/color/input_blood_color/create_default_value()
+ return BLOOD_COLOR_BLACK
+
+/datum/preference/color/input_blood_color/is_accessible(datum/preferences/preferences)
+ if (!..(preferences))
+ return FALSE
+
+ return /datum/quirk/item_quirk/unique_blood_color::name in preferences.all_quirks
+
+/datum/preference/color/input_blood_color/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+///colour preset selection
+/datum/preference/choiced/select_blood_color
+ category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
+ savefile_key = "select_blood_color"
+ savefile_identifier = PREFERENCE_CHARACTER
+ can_randomize = FALSE
+
+/datum/preference/choiced/select_blood_color/create_default_value()
+ return "Custom"
+
+/datum/preference/choiced/select_blood_color/is_accessible(datum/preferences/preferences)
+ if (!..(preferences))
+ return FALSE
+
+ return /datum/quirk/item_quirk/unique_blood_color::name in preferences.all_quirks
+
+/datum/preference/choiced/select_blood_color/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/choiced/select_blood_color/init_possible_values()
+ return list("Custom") + assoc_to_keys(GLOB.custom_blood_colors)
diff --git a/modular_zubbers/code/modules/clothing/under/accessories/badges.dm b/modular_zubbers/code/modules/clothing/under/accessories/badges.dm
new file mode 100644
index 00000000000..bc802004a9d
--- /dev/null
+++ b/modular_zubbers/code/modules/clothing/under/accessories/badges.dm
@@ -0,0 +1,10 @@
+/obj/item/clothing/accessory/dogtag/unique_blood
+ name = "Blood dogtag"
+ desc = "A dogtag with a listing of blood properties."
+
+/obj/item/clothing/accessory/dogtag/unique_blood/Initialize(mapload, blood_type, color_string)
+ . = ..()
+ if(color_string && blood_type)
+ display = span_notice("\"Hi! My blood is [blood_type] despite being [color_string]!\"")
+ else
+ display = span_notice("The dogtag is all scratched up.")
diff --git a/modular_zubbers/code/modules/mob/living/blood_types.dm b/modular_zubbers/code/modules/mob/living/blood_types.dm
index 090be02def8..012ca54c9c8 100644
--- a/modular_zubbers/code/modules/mob/living/blood_types.dm
+++ b/modular_zubbers/code/modules/mob/living/blood_types.dm
@@ -1,3 +1,15 @@
+/datum/blood_type
+ ///blood type to be edited for change_blood_color
+ var/recolor_blood_type //datum typepath for the alt_color version of the blood type
+
+/datum/blood_type/proc/make_alt_color(override, datum/blood_type/orig)
+ var/datum/blood_type/original = orig
+ name = "[name] ([override])"
+ color = override
+ id = name
+ testing("created alternate [id]")
+ compatible_types = LAZYLISTDUPLICATE(original?.compatible_types)
+
// For Skrell
/datum/blood_type/copper
name = BLOOD_TYPE_COPPER
@@ -5,6 +17,16 @@
reagent_type = /datum/reagent/copper
color = BLOOD_COLOR_COPPER
restoration_chem = null
+ recolor_blood_type = /datum/blood_type/copper/alt_color
+
+/datum/blood_type/copper/alt_color
+ abstract_type = /datum/blood_type/copper
+
+/datum/blood_type/copper/alt_color/type_key()
+ return /datum/blood_type/copper
+
+/datum/blood_type/copper/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
// For Proteans
/datum/blood_type/nanite_slurry
@@ -13,3 +35,261 @@
reagent_type = /datum/reagent/medicine/nanite_slurry
color = BLOOD_COLOR_NANITE_SLURRY
restoration_chem = null
+ recolor_blood_type = /datum/blood_type/nanite_slurry/alt_color
+
+/datum/blood_type/nanite_slurry/alt_color
+ abstract_type = /datum/blood_type/nanite_slurry
+
+/datum/blood_type/nanite_slurry/alt_color/type_key()
+ return /datum/blood_type/nanite_slurry
+
+/datum/blood_type/nanite_slurry/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/* blood type template for alt_colors
+/datum/blood_type/namehere
+ recolor_blood_type = /datum/blood_type/namehere/alt_color
+
+/datum/blood_type/namehere/alt_color
+ abstract_type = /datum/blood_type/namehere/alt_color
+
+/datum/blood_type/namehere/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/alt_color/type_key()
+ return /datum/blood_type/PARENT_TYPE_HERE
+*/
+
+///A-
+/datum/blood_type/human/a_minus
+ recolor_blood_type = /datum/blood_type/human/a_minus/alt_color
+
+/datum/blood_type/human/a_minus/alt_color
+ /* abstract_type = /datum/blood_type/human/a_minus/alt_color */
+
+/datum/blood_type/human/a_minus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/a_minus/alt_color/type_key()
+ return /datum/blood_type/human/a_minus
+
+///A+
+/datum/blood_type/human/a_plus
+ recolor_blood_type = /datum/blood_type/human/a_plus/alt_color
+
+/datum/blood_type/human/a_plus/alt_color
+ /* abstract_type = /datum/blood_type/human/a_plus/alt_color */
+
+/datum/blood_type/human/a_plus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/a_plus/alt_color/type_key()
+ return /datum/blood_type/human/a_plus
+
+///B+
+/datum/blood_type/human/b_plus
+ recolor_blood_type = /datum/blood_type/human/b_plus/alt_color
+
+/datum/blood_type/human/b_plus/alt_color
+ /* abstract_type = /datum/blood_type/human/b_plus/alt_color */
+
+/datum/blood_type/human/b_plus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/b_plus/alt_color/type_key()
+ return /datum/blood_type/human/b_plus
+
+///B-
+/datum/blood_type/human/b_minus
+ recolor_blood_type = /datum/blood_type/human/b_minus/alt_color
+
+/datum/blood_type/human/b_minus/alt_color
+ /* abstract_type = /datum/blood_type/human/b_minus/alt_color */
+
+/datum/blood_type/human/b_minus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/b_minus/alt_color/type_key()
+ return /datum/blood_type/human/b_minus
+
+///AB-
+/datum/blood_type/human/ab_minus
+ recolor_blood_type = /datum/blood_type/human/ab_minus/alt_color
+
+/datum/blood_type/human/ab_minus/alt_color
+ /* abstract_type = /datum/blood_type/human/ab_minus/alt_color */
+
+/datum/blood_type/human/ab_minus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/ab_minus/alt_color/type_key()
+ return /datum/blood_type/human/ab_minus
+
+///AB+
+/datum/blood_type/human/ab_plus
+ recolor_blood_type = /datum/blood_type/human/ab_plus/alt_color
+
+/datum/blood_type/human/ab_plus/alt_color
+ /* abstract_type = /datum/blood_type/human/ab_plus/alt_color */
+
+/datum/blood_type/human/ab_plus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/ab_plus/alt_color/type_key()
+ return /datum/blood_type/human/ab_plus
+
+///O-
+/datum/blood_type/human/o_minus
+ recolor_blood_type = /datum/blood_type/human/o_minus/alt_color
+
+/datum/blood_type/human/o_minus/alt_color
+ /* abstract_type = /datum/blood_type/human/o_minus/alt_color */
+
+/datum/blood_type/human/o_minus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/o_minus/alt_color/type_key()
+ return /datum/blood_type/human/o_minus
+
+///O+
+/datum/blood_type/human/o_plus
+ recolor_blood_type = /datum/blood_type/human/o_plus/alt_color
+
+/datum/blood_type/human/o_plus/alt_color
+ /* abstract_type = /datum/blood_type/human/o_plus/alt_color */
+
+/datum/blood_type/human/o_plus/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/human/o_plus/alt_color/type_key()
+ return /datum/blood_type/human/o_plus
+
+///Y-
+/datum/blood_type/animal
+ recolor_blood_type = /datum/blood_type/animal/alt_color
+
+/datum/blood_type/animal/alt_color
+ abstract_type = /datum/blood_type/animal/alt_color
+
+/datum/blood_type/animal/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/animal/alt_color/type_key()
+ return /datum/blood_type/animal
+
+///L
+/datum/blood_type/lizard
+ recolor_blood_type = /datum/blood_type/lizard/alt_color
+
+/datum/blood_type/lizard/alt_color
+ abstract_type = /datum/blood_type/lizard/alt_color
+
+/datum/blood_type/lizard/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/lizard/alt_color/type_key()
+ return /datum/blood_type/lizard
+
+///LE
+/datum/blood_type/ethereal
+ recolor_blood_type = /datum/blood_type/ethereal/alt_color
+
+/datum/blood_type/ethereal/alt_color
+ abstract_type = /datum/blood_type/ethereal/alt_color
+
+/datum/blood_type/ethereal/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/ethereal/alt_color/type_key()
+ return /datum/blood_type/ethereal
+
+///Oil
+/datum/blood_type/oil
+ recolor_blood_type = /datum/blood_type/oil/alt_color
+
+/datum/blood_type/oil/alt_color
+ abstract_type = /datum/blood_type/oil/alt_color
+
+/datum/blood_type/oil/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/oil/alt_color/type_key()
+ return /datum/blood_type/oil
+
+///V
+/datum/blood_type/vampire
+ recolor_blood_type = /datum/blood_type/vampire/alt_color
+
+/datum/blood_type/vampire/alt_color
+ abstract_type = /datum/blood_type/vampire/alt_color
+
+/datum/blood_type/vampire/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/vampire/alt_color/type_key()
+ return /datum/blood_type/vampire
+
+///U
+/datum/blood_type/universal
+ recolor_blood_type = /datum/blood_type/universal/alt_color
+
+/datum/blood_type/universal/alt_color
+ abstract_type = /datum/blood_type/universal/alt_color
+
+/datum/blood_type/universal/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/universal/alt_color/type_key()
+ return /datum/blood_type/universal
+
+///MT-
+/datum/blood_type/meat
+ recolor_blood_type = /datum/blood_type/meat/alt_color
+
+/datum/blood_type/meat/alt_color
+ abstract_type = /datum/blood_type/meat/alt_color
+
+/datum/blood_type/meat/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/meat/alt_color/type_key()
+ return /datum/blood_type/meat
+
+///TOX
+/datum/blood_type/slime
+ recolor_blood_type = /datum/blood_type/slime/alt_color
+
+/datum/blood_type/slime/alt_color
+ abstract_type = /datum/blood_type/slime/alt_color
+
+/datum/blood_type/slime/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/slime/alt_color/type_key()
+ return /datum/blood_type/slime
+
+///H2O
+/datum/blood_type/water
+ recolor_blood_type = /datum/blood_type/water/alt_color
+
+/datum/blood_type/water/alt_color
+ abstract_type = /datum/blood_type/water/alt_color
+
+/datum/blood_type/water/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/water/alt_color/type_key()
+ return /datum/blood_type/water
+
+///S
+/datum/blood_type/snail
+ recolor_blood_type = /datum/blood_type/snail/alt_color
+
+/datum/blood_type/snail/alt_color
+ abstract_type = /datum/blood_type/snail/alt_color
+
+/datum/blood_type/snail/alt_color/New(override, datum/blood_type/orig)
+ make_alt_color(override, orig)
+
+/datum/blood_type/snail/alt_color/type_key()
+ return /datum/blood_type/snail
diff --git a/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm b/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm
new file mode 100644
index 00000000000..e2d66c5daa2
--- /dev/null
+++ b/modular_zubbers/code/modules/quirks/neutral_quirks/unique_blood_color.dm
@@ -0,0 +1,75 @@
+//i dont enjoy this implementation, but we're also not going to figure out how to write a proper do-all replace_blood_type() without |some| help....
+
+/datum/quirk/item_quirk/unique_blood_color
+ name = "Blood Pigmentation"
+ desc = "Your blood has a different colour than what your species usually has."
+ gain_text = span_purple("Your flesh shifts in hue.")
+ lose_text = span_purple("Your flesh returns to a natural look.")
+ medical_record_text = "Patient has unusual blood pigmentation."
+ value = 0
+ icon = FA_ICON_DROPLET
+ //this should only ever be a hex
+ var/color_code = NONE
+ var/datum/blood_type/new_blood = NONE
+ //for removal, and having an un-appended type name
+ var/datum/blood_type/old_blood = NONE
+
+/datum/quirk_constant_data/uniquebloodcolor
+ associated_typepath = /datum/quirk/item_quirk/unique_blood_color
+ customization_options = list(
+ /datum/preference/color/input_blood_color,
+ /datum/preference/choiced/select_blood_color,
+ )
+
+
+/datum/quirk/item_quirk/unique_blood_color/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ //If you want to change the blood of a non-human mob, just varedit. It'll reset when changing species tho
+ if(!istype(human_holder))
+ return
+ old_blood = human_holder.dna.blood_type
+ var/selected_color = client_source?.prefs.read_preference(/datum/preference/choiced/select_blood_color) || "Custom"
+ testing("selected_color is [selected_color]")
+ if(selected_color != "Custom")
+ color_code = GLOB.custom_blood_colors[selected_color]
+ testing("selected_color is not Custom")
+ else if(selected_color == "Custom")
+ color_code = client_source?.prefs.read_preference(/datum/preference/color/input_blood_color)
+ testing("selected_color is Custom")
+ testing("color_code set to [color_code]")
+ change_blood_color(quirked = human_holder, override = color_code)
+
+/datum/quirk/item_quirk/unique_blood_color/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ if (!istype(human_holder) || isnull(old_blood))
+ return
+ var/datum/blood_type/new_blood = new old_blood.type
+ human_holder.set_blood_type(new_blood)
+ human_holder.dna.species.exotic_bloodtype = initial(human_holder.dna.species.exotic_bloodtype)
+
+//someone could turn this into a universal replace_blood() or something... but not me
+
+/datum/quirk/item_quirk/unique_blood_color/proc/change_blood_color(datum/source, mob/living/carbon/human/quirked, override, update_cached_blood_dna_info)
+ SIGNAL_HANDLER
+///Check if new blood type is same as old. Jank, but it should prevent cases of special blood types made from relative normal blood
+ if(quirked.dna.blood_type.get_color() == color_code)
+ to_chat(quirked, span_notice("...but nothing had actually changed."))
+ remove_from_current_holder()
+ WARNING("quirk 'unique_blood_color' automatically removed from [quirked.name]")
+ return
+///Making the new blood type
+ new_blood = get_blood_type("[quirked.dna.blood_type] ([override])") //for example, A-_#69af19
+///check if blood type already exists before making it new
+ if(isnull(new_blood))
+ var/recolor_type = quirked.dna.blood_type.recolor_blood_type
+ new_blood = new recolor_type(override = override, orig = quirked.dna.blood_type)
+ GLOB.blood_types[new_blood.id] = new_blood
+ NOTICE("finalized new blood type [new_blood.id] for [quirked.name]")
+ quirked.dna.species.exotic_bloodtype = new_blood
+ quirked.set_blood_type(new_blood)
+
+
+/datum/quirk/item_quirk/unique_blood_color/add_unique(client/client_source)
+ var/get_bloodtype_id = old_blood.name
+ var/obj/item/clothing/accessory/dogtag/unique_blood/dogtag = new(quirk_holder, get_bloodtype_id, color_code)
+ give_item_to_holder(dogtag, list(LOCATION_BACKPACK, LOCATION_HANDS), flavour_text = "Medical should probably see this...", notify_player = TRUE)
diff --git a/tgstation.dme b/tgstation.dme
index 665f7fb42dd..6b967e68537 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -9218,6 +9218,7 @@
#include "modular_zubbers\code\modules\client\preferences\permanent_limp.dm"
#include "modular_zubbers\code\modules\client\preferences\player_panel.dm"
#include "modular_zubbers\code\modules\client\preferences\sounds.dm"
+#include "modular_zubbers\code\modules\client\preferences\unique_blood_color.dm"
#include "modular_zubbers\code\modules\client\verbs\character_directory.dm"
#include "modular_zubbers\code\modules\clothing\_job.dm"
#include "modular_zubbers\code\modules\clothing\donator_clothing.dm"
@@ -9261,6 +9262,7 @@
#include "modular_zubbers\code\modules\clothing\under\security.dm"
#include "modular_zubbers\code\modules\clothing\under\skirts_dresses.dm"
#include "modular_zubbers\code\modules\clothing\under\syndicate.dm"
+#include "modular_zubbers\code\modules\clothing\under\accessories\badges.dm"
#include "modular_zubbers\code\modules\clothing\under\jobs\command.dm"
#include "modular_zubbers\code\modules\colony_fabricator\code\design_datums\fabricator_flag_additions\tools.dm"
#include "modular_zubbers\code\modules\contractor\code\items\boxes.dm"
@@ -9609,6 +9611,7 @@
#include "modular_zubbers\code\modules\protected_roles\code\antag_restricted_jobs.dm"
#include "modular_zubbers\code\modules\public_logging\public_logging.dm"
#include "modular_zubbers\code\modules\quirks\neutral_quirks\body_temp.dm"
+#include "modular_zubbers\code\modules\quirks\neutral_quirks\unique_blood_color.dm"
#include "modular_zubbers\code\modules\quirks\positive_quirks\telepathy.dm"
#include "modular_zubbers\code\modules\quote_of_the_round\config.dm"
#include "modular_zubbers\code\modules\quote_of_the_round\debug_verbs.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx
new file mode 100644
index 00000000000..34f59c7f829
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/unique_blood_color.tsx
@@ -0,0 +1,15 @@
+import { Feature, FeatureChoiced, FeatureColorInput } from '../../base';
+import { FeatureDropdownInput } from '../../dropdowns';
+
+export const input_blood_color: Feature = {
+ name: 'Custom color',
+ description:
+ 'NOTE: This matches the colour to the BRIGHTEST px. So, make this slightly (about 10?) more luminescent (HSL) than you want the blood to be.',
+ component: FeatureColorInput,
+};
+
+export const select_blood_color: FeatureChoiced = {
+ name: 'Preset color',
+ description: 'NOTE: Use the Custom option for custom color.',
+ component: FeatureDropdownInput,
+};