Files
2026-03-09 08:58:37 -04:00

193 lines
7.1 KiB
Plaintext

/obj/item/storage/box/lipsticks
name = "lipstick box"
/obj/item/storage/box/lipsticks/PopulateContents()
..()
new /obj/item/lipstick(src)
new /obj/item/lipstick/purple(src)
new /obj/item/lipstick/jade(src)
new /obj/item/lipstick/black(src)
/obj/item/lipstick/quantum
name = "quantum lipstick"
/obj/item/lipstick/quantum/attack(mob/attacked_mob, mob/user)
if(!open || !ismob(attacked_mob))
return
if(!ishuman(attacked_mob))
to_chat(user, span_warning("Where are the lips on that?"))
return
INVOKE_ASYNC(src, PROC_REF(async_set_color), attacked_mob, user)
/obj/item/lipstick/quantum/proc/async_set_color(mob/attacked_mob, mob/user)
// BUBBERSTATION EDIT START: TGUI COLOR PICKER
var/new_color = tgui_color_picker(
user,
"Select lipstick color",
null,
COLOR_WHITE,
)
// BUBBERSTATION EDIT END: TGUI COLOR PICKER
var/mob/living/carbon/human/target = attacked_mob
if(target.is_mouth_covered())
to_chat(user, span_warning("Remove [ target == user ? "your" : "[target.p_their()]" ] mask!"))
return
if(target.lip_style) //if they already have lipstick on
to_chat(user, span_warning("You need to wipe off the old lipstick first!"))
return
if(target == user)
user.visible_message(span_notice("[user] does [user.p_their()] lips with \the [src]."), \
span_notice("You take a moment to apply \the [src]. Perfect!"))
target.update_lips("lipstick", new_color, lipstick_trait)
return
user.visible_message(span_warning("[user] begins to do [target]'s lips with \the [src]."), \
span_notice("You begin to apply \the [src] on [target]'s lips..."))
if(!do_after(user, 2 SECONDS, target = target))
return
user.visible_message(span_notice("[user] does [target]'s lips with \the [src]."), \
span_notice("You apply \the [src] on [target]'s lips."))
target.update_lips("lipstick", new_color, lipstick_trait)
/obj/item/hairbrush/comb
name = "comb"
desc = "A rather simple tool, used to straighten out hair and knots in it."
icon = 'modular_skyrat/modules/salon/icons/items.dmi'
icon_state = "blackcomb"
/obj/item/hairstyle_preview_magazine
name = "hip hairstyles magazine"
desc = "A magazine featuring a magnitude of hairsytles!"
/obj/item/hairstyle_preview_magazine/ui_interact(mob/user, datum/tgui/ui)
. = ..()
// A simple GUI with a list of hairstyles and a view, so people can choose a hairstyle!
/obj/effect/decal/cleanable/hair
name = "hair cuttings"
icon = 'modular_skyrat/modules/salon/icons/items.dmi'
icon_state = "cut_hair"
/obj/item/razor
name = "electric razor"
desc = "The latest and greatest power razor born from the science of shaving."
icon = 'modular_skyrat/modules/salon/icons/items.dmi'
icon_state = "razor"
obj_flags = CONDUCTS_ELECTRICITY
w_class = WEIGHT_CLASS_TINY
// How long do we take to shave someone's (facial) hair?
var/shaving_time = 5 SECONDS
/obj/item/razor/suicide_act(mob/living/carbon/user)
user.visible_message(span_suicide("[user] begins shaving [user.p_them()]self without the razor guard! It looks like [user.p_theyre()] trying to commit suicide!"))
shave(user, BODY_ZONE_PRECISE_MOUTH)
shave(user, BODY_ZONE_HEAD)//doesnt need to be BODY_ZONE_HEAD specifically, but whatever
return BRUTELOSS
/obj/item/razor/proc/shave(mob/living/carbon/human/target_human, location = BODY_ZONE_PRECISE_MOUTH)
if(location == BODY_ZONE_PRECISE_MOUTH)
target_human.set_facial_hairstyle("Shaved", update = TRUE)
else
target_human.set_hairstyle("Bald", update = TRUE)
playsound(loc, 'sound/items/unsheath.ogg', 20, TRUE)
/obj/item/razor/attack(mob/attacked_mob, mob/living/user)
if(!ishuman(attacked_mob))
return ..()
var/mob/living/carbon/human/target_human = attacked_mob
var/location = user.zone_selected
var/obj/item/bodypart/head/noggin = target_human.get_bodypart(BODY_ZONE_HEAD)
var/static/list/head_zones = list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)
if(!noggin && (location in head_zones))
to_chat(user, span_warning("[target_human] doesn't have a head!"))
return
if(!(location in head_zones) && !user.combat_mode)
to_chat(user, span_warning("You stop, look down at what you're currently holding and ponder to yourself, \"This is probably to be used on their hair or their facial hair.\""))
return
if(location == BODY_ZONE_PRECISE_MOUTH)
if(!(noggin.head_flags & HEAD_FACIAL_HAIR))
to_chat(user, span_warning("There is no facial hair to shave!"))
return
var/covering = target_human.is_mouth_covered()
if(covering)
to_chat(user, span_warning("[covering] is in the way!"))
return
if(HAS_TRAIT(target_human, TRAIT_SHAVED))
to_chat(user, span_warning("[target_human] is just way too shaved. Like, really really shaved."))
return
if(target_human.facial_hairstyle == "Shaved")
to_chat(user, span_warning("Already clean-shaven!"))
return
var/self_shaving = target_human == user // Shaving yourself?
user.visible_message(span_notice("[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src]."), \
span_notice("You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]..."))
if(do_after(user, shaving_time, target = target_human))
user.visible_message(span_notice("[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src]."), \
span_notice("You finish shaving [self_shaving ? "your" : " [target_human]'s"] hair with [src]. Fast and clean!"))
shave(target_human, location)
else if(location == BODY_ZONE_HEAD)
if(!(noggin.head_flags & HEAD_HAIR))
to_chat(user, span_warning("There is no hair to shave!"))
return
if(!target_human.is_location_accessible(location))
to_chat(user, span_warning("The headgear is in the way!"))
return
if(target_human.hairstyle == "Bald" || target_human.hairstyle == "Balding Hair" || target_human.hairstyle == "Skinhead")
to_chat(user, span_warning("There is not enough hair left to shave!"))
return
if(HAS_TRAIT(target_human, TRAIT_SHAVED))
to_chat(user, span_warning("[target_human] is just way too shaved. Like, really really shaved."))
return
var/self_shaving = target_human == user // Shaving yourself?
user.visible_message(span_notice("[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src]."), \
span_notice("You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]..."))
if(do_after(user, shaving_time, target = target_human))
user.visible_message(span_notice("[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src]."), \
span_notice("You finish shaving [self_shaving ? "your" : " [target_human]'s"] hair with [src]. Fast and clean!"))
shave(target_human, location)
return
return ..()
/obj/structure/sign/barber
name = "barbershop sign"
desc = "A glowing red-blue-white stripe you won't mistake for any other!"
icon = 'modular_skyrat/modules/salon/icons/items.dmi'
icon_state = "barber"
buildable_sign = FALSE // Don't want them removed, they look too jank.
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/barber, 13)
/obj/structure/sign/barber/Initialize(mapload)
. = ..()
if(mapload)
find_and_mount_on_atom()
/obj/structure/sign/barber/get_turfs_to_mount_on()
return list(get_step(src, dir))