diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c4e53366..a69c5a6d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -88,6 +88,16 @@ init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes) + + + // Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name + for(var/path in subtypesof(/datum/sprite_accessory/hair_gradient)) + var/datum/sprite_accessory/hair_gradient/H = new path() + GLOB.hair_gradients_list[H.name] = H + + init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes) + + //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 48ab3a88..7e272b88 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(hair_styles_female_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/facial_hair indexed by name GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names +GLOBAL_LIST_EMPTY(hair_gradients_list) //stores /datum/sprite_accessory/hair_gradient indexed by name //Underwear GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear/bottom indexed by name GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm new file mode 100644 index 00000000..3087f759 --- /dev/null +++ b/code/game/objects/items/dyekit.dm @@ -0,0 +1,60 @@ +/obj/item/dyespray + name = "hair dye spray" + desc = "A spray to dye your hair any gradients you'd like." + icon = 'icons/obj/dyespray.dmi' + icon_state = "dyespray" + + var/uses = 10 //SKYRAT EDIT ADDITION + +/obj/item/dyespray/attack_self(mob/user) + dye(user) + +/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params) + dye(target) + return ..() + +/** + * Applies a gradient and a gradient color to a mob. + * + * Arguments: + * * target - The mob who we will apply the gradient and gradient color to. + */ + +/obj/item/dyespray/proc/dye(mob/target) + if(!ishuman(target)) + return + + if(!uses) //SKYRAT EDIT ADDITION + return //SKYRAT EDIT ADDITION + + var/mob/living/carbon/human/human_target = target + + var/new_hair_color = input(usr, "Choose a base hair color:", "Character Preference","#"+human_target.hair_color) as color|null + if(!new_hair_color) + return + + var/new_grad_style = input(usr, "Choose a color pattern:", "Character Preference") as null|anything in GLOB.hair_gradients_list + if(!new_grad_style) + return + + var/new_grad_color = input(usr, "Choose a secondary hair color:", "Character Preference","#"+human_target.grad_color) as color|null + if(!new_grad_color) + return + + human_target.hair_color = sanitize_hexcolor(new_hair_color) + human_target.grad_style = new_grad_style + human_target.grad_color = sanitize_hexcolor(new_grad_color) + to_chat(human_target, "You start applying the hair dye...") + if(!do_after(usr, 30, target = human_target)) + return + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) + human_target.update_hair() + + //SKYRAT EDIT ADDITION + uses-- + +/obj/item/dyespray/examine(mob/user) + . = ..() + . += "It has [uses] uses left." + + //SKYRAT EDIT END diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2493ab15..34568594 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -96,6 +96,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_color = "000" //Eye color var/wing_color = "fff" //Wing color + var/grad_style //Hair gradient style + var/grad_color = "FFFFFF" //Hair gradient color + //HS13 var/body_size = 100 //Body Size in percent var/can_get_preg = 0 //if they can get preggers @@ -511,6 +514,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "< >
" dat += "    Change
" + + dat += "

Hair Gradient

" + + dat += "[grad_style]" + dat += "< >
" + dat += "    Change
" + + dat += "" //Mutant stuff var/mutant_category = 0 @@ -1868,6 +1879,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("previous_facehair_style") facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_list) + + if("grad_color") + var/new_grad_color = input(user, "Choose your character's gradient colour:", "Character Preference","#"+grad_color) as color|null + if(new_grad_color) + grad_color = sanitize_hexcolor(new_grad_color, 6) + + if("grad_style") + var/new_grad_style + new_grad_style = input(user, "Choose your character's hair gradient style:", "Character Preference") as null|anything in GLOB.hair_gradients_list + if(new_grad_style) + grad_style = new_grad_style + + if("next_grad_style") + grad_style = next_list_item(grad_style, GLOB.hair_gradients_list) + + if("previous_grad_style") + grad_style = previous_list_item(grad_style, GLOB.hair_gradients_list) + + + if("cycle_bg") bgstate = next_list_item(bgstate, bgstate_options) @@ -2891,6 +2922,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.skin_tone = skin_tone character.hair_style = hair_style character.facial_hair_style = facial_hair_style + + character.grad_style = grad_style + character.grad_color = grad_color character.underwear = underwear character.saved_underwear = underwear diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 43e5f64d..27020353 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -349,6 +349,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["skin_tone"] >> skin_tone S["hair_style_name"] >> hair_style S["facial_style_name"] >> facial_hair_style + S["grad_style"] >> grad_style + S["grad_color"] >> grad_color S["underwear"] >> underwear S["undie_color"] >> undie_color S["undershirt"] >> undershirt @@ -531,6 +533,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) hair_color = sanitize_hexcolor(hair_color, 3, 0) facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) + grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list) + grad_color = sanitize_hexcolor(grad_color, 6, FALSE) eye_color = sanitize_hexcolor(eye_color, 3, 0) skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) wing_color = sanitize_hexcolor(wing_color, 3, FALSE, "#FFFFFF") @@ -607,6 +611,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["skin_tone"] , skin_tone) WRITE_FILE(S["hair_style_name"] , hair_style) WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["grad_style"] , grad_style) + WRITE_FILE(S["grad_color"] , grad_color) WRITE_FILE(S["underwear"] , underwear) WRITE_FILE(S["body_size"] , body_size) WRITE_FILE(S["starting_weight"] , starting_weight) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 53be5eb9..62d5ea1e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -833,6 +833,64 @@ icon_state = "hair_tailhair2" ckeys_allowed = list("quotefox") +//Hair gradients + + +/datum/sprite_accessory/hair_gradient + icon = 'icons/mob/hair_gradients.dmi' + +/datum/sprite_accessory/hair_gradient/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/hair_gradient/fadeup + name = "Fade Up" + icon_state = "fadeup" + +/datum/sprite_accessory/hair_gradient/fadedown + name = "Fade Down" + icon_state = "fadedown" + +/datum/sprite_accessory/hair_gradient/vertical_split + name = "Vertical Split" + icon_state = "vsplit" + +/datum/sprite_accessory/hair_gradient/_split + name = "Horizontal Split" + icon_state = "bottomflat" + +/datum/sprite_accessory/hair_gradient/reflected + name = "Reflected" + icon_state = "reflected_high" + +/datum/sprite_accessory/hair_gradient/reflected_inverse + name = "Reflected Inverse" + icon_state = "reflected_inverse_high" + +/datum/sprite_accessory/hair_gradient/wavy + name = "Wavy" + icon_state = "wavy" + +/datum/sprite_accessory/hair_gradient/long_fade_up + name = "Long Fade Up" + icon_state = "long_fade_up" + +/datum/sprite_accessory/hair_gradient/long_fade_down + name = "Long Fade Down" + icon_state = "long_fade_down" + +/datum/sprite_accessory/hair_gradient/short_fade_up + name = "Short Fade Up" + icon_state = "short_fade_up" + +/datum/sprite_accessory/hair_gradient/short_fade_down + name = "Short Fade Down" + icon_state = "short_fade_down" + +/datum/sprite_accessory/hair_gradient/wavy_spike + name = "Spiked Wavy" + icon_state = "wavy_spiked" + //Pod-people hairs diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 161725d6..beaaa7dc 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -10,6 +10,14 @@ var/hair_color = "000" var/hair_style = "Bald" + + ///Colour used for the hair gradient. + var/grad_color = "000" + ///Style used for the hair gradient. + var/grad_style + + + //Facial hair colour and style var/facial_hair_color = "000" var/facial_hair_style = "Shaved" @@ -74,4 +82,4 @@ var/last_fire_update var/account_id can_be_held = "micro" - appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE \ No newline at end of file + appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d5b97ab1..bff24ea1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -16,6 +16,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. var/wing_color + ///The gradient style used for the mob's hair. + var/grad_style + ///The gradient color used to color the gradient. + var/grad_color + var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc) @@ -426,6 +431,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!hair_hidden || dynamic_hair_suffix) var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER) + var/mutable_appearance/gradient_overlay = mutable_appearance(layer = -HAIR_LAYER) if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain if(!(NOBLOOD in species_traits)) hair_overlay.icon = 'icons/mob/human_face.dmi' @@ -461,6 +467,20 @@ GLOBAL_LIST_EMPTY(roundstart_races) hair_overlay.color = "#" + hair_color else hair_overlay.color = "#" + H.hair_color + + + //Gradients + grad_style = H.grad_style + grad_color = H.grad_color + if(grad_style) + var/datum/sprite_accessory/gradient = GLOB.hair_gradients_list[grad_style] + var/icon/temp = icon(gradient.icon, gradient.icon_state) + var/icon/temp_hair = icon(hair_file, hair_state) + temp.Blend(temp_hair, ICON_ADD) + gradient_overlay.icon = temp + gradient_overlay.color = "#" + grad_color + + else hair_overlay.color = forced_colour hair_overlay.alpha = hair_alpha @@ -469,6 +489,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) hair_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2] if(hair_overlay.icon) standing += hair_overlay + standing += gradient_overlay + if(standing.len) H.overlays_standing[HAIR_LAYER] = standing diff --git a/icons/mob/hair_gradients.dmi b/icons/mob/hair_gradients.dmi new file mode 100644 index 00000000..ceb3b52e Binary files /dev/null and b/icons/mob/hair_gradients.dmi differ diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi new file mode 100644 index 00000000..eb056036 Binary files /dev/null and b/icons/obj/dyespray.dmi differ diff --git a/tgstation.dme b/tgstation.dme index b6c4a58a..18f76aa7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -914,6 +914,7 @@ #include "code\game\machinery\syndicatebomb.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transformer.dm" +#include "code\game\objects\items\dyekit.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\camera\camera.dm"