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, +};