mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 08:08:49 +01:00
193 lines
7.1 KiB
Plaintext
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))
|