//Proper modularity to come at a later date /obj/structure/chair/barber_chair name = "barbers chair" desc = "You sit in this, and your hair shall be cut." icon = 'icons/obj/chairs.dmi' icon_state = "barber_chair" /obj/structure/closet/secure_closet/barber name = "Barber's locker" icon_state = "barber" icon = 'icons/obj/closet.dmi' req_access = list(ACCESS_BARBER) /obj/structure/closet/secure_closet/barber/PopulateContents() new /obj/item/clothing/mask/surgical(src) // These three are here, so the barber can pick and choose what he's painting. new /obj/item/clothing/under/rank/medical/blue(src) new /obj/item/clothing/suit/apron/surgical(src) new /obj/item/clothing/accessory/waistcoat(src) //new /obj/item/clothing/under/rank/civilian/lawyer/purpsuit(src) new /obj/item/clothing/suit/toggle/lawyer/purple(src) new /obj/item/razor(src) //new /obj/item/straight_razor(src) new /obj/item/hairbrush/comb(src) new /obj/item/scissors(src) new /obj/item/fur_dyer(src) new /obj/item/dyespray(src) new /obj/item/storage/box/lipsticks(src) new /obj/item/reagent_containers/spray/quantum_hair_dye(src) new /obj/item/reagent_containers/spray/barbers_aid(src) new /obj/item/reagent_containers/spray/cleaner(src) new /obj/item/reagent_containers/rag(src) new /obj/item/storage/firstaid/regular(src) /obj/machinery/vending/barbervend name = "Fab-O-Vend" desc = "It would seem it vends dyes, and other stuff to make you pretty." icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "barbervend" product_slogans = "Spread the colour, like butter, onto toast... Onto their hair.; Sometimes, I dream about dyes...; Paint 'em up and call me Mr. Painter.; Look brother, I'm a vendomat, I solve practical problems." product_ads = "Cut 'em all!; To sheds!; Hair be gone!; Prettify!; Beautify!" vend_reply = "Come again!; Buy another!; Dont you love your new look?" req_access = list(ACCESS_BARBER) refill_canister = /obj/item/vending_refill/barbervend products = list( /obj/item/reagent_containers/spray/quantum_hair_dye = 3, // /obj/item/reagent_containers/spray/baldium = 3, /obj/item/reagent_containers/spray/barbers_aid = 3, /obj/item/dyespray = 5, /obj/item/hairbrush = 3, /obj/item/hairbrush/comb = 3, /obj/item/fur_dyer = 1, ) premium = list( /obj/item/scissors = 3, /obj/item/reagent_containers/spray/super_barbers_aid = 3, /obj/item/storage/box/lipsticks = 3, /obj/item/lipstick/quantum = 1, /obj/item/razor = 1, // /obj/item/storage/box/perfume = 1, ) refill_canister = /obj/item/vending_refill/barbervend /obj/item/vending_refill/barbervend machine_name = "barber vend resupply" icon_state = "refill_snack" //generic item refill because there isnt one sprited yet. /obj/effect/landmark/start/barber name = "Barber" icon_state = "Barber" //icon = 'modular_skyrat/master_files/icons/mob/landmarks.dmi' //Brush /obj/item/hairbrush name = "hairbrush" desc = "A small, circular brush with an ergonomic grip for efficient brush application." icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "brush" //Put lefthand and righthand files here w_class = WEIGHT_CLASS_TINY var/brush_speed = 3 SECONDS /obj/item/hairbrush/comb name = "comb" desc = "A rather simple tool, used to straighten out hair and knots in it." icon_state = "blackcomb" /obj/item/hairbrush/attack(mob/target, mob/user) if(target.stat == DEAD) to_chat(usr, "There isn't much point in brushing someone who can't appreciate it!") return brush(target, user) return COMPONENT_CANCEL_ATTACK_CHAIN //Brushes someone /obj/item/hairbrush/proc/brush(mob/living/target, mob/user) if(ishuman(target)) var/mob/living/carbon/human/human_target = target var/obj/item/bodypart/head = human_target.get_bodypart(BODY_ZONE_HEAD) //Don't brush if you can't reach their head or cancel the action if(!head) //No head? No bitches? to_chat(usr, "[human_target] has no head!") return if(human_target.is_mouth_covered(head_only = 1)) to_chat(usr, "You can't brush [human_target]'s hair while [human_target.p_their()] head is covered!") return if(!do_mob(user, human_target,brush_speed)) return // Do 1 brute to their head if they're bald. Should've been more careful. if(human_target.hair_style == "Bald" || human_target.hair_style == "Skinhead" && is_species(human_target, /datum/species/human)) //It can be assumed most anthros have hair on them! human_target.visible_message("[usr] scrapes the bristles uncomfortably over [human_target]'s scalp.","You scrape the bristles uncomfortably over [human_target]'s scalp.") playsound(target, 'hyperstation/sound/misc/bonk.ogg', 100, 1) //Until I fix it return //Brush their hair if(human_target == user) human_target.visible_message("[usr] brushes [usr.p_their()] hair!","You brush your hair.") //SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "brushed", /datum/mood/brushed/self) else user.visible_message("[usr] brushes [human_target]'s hair!","You brush [human_target]'s hair.") //SEND_SIGNAL(human_target, COMISG_ADD_MOOD_EVENT, "brushed", /datum/mood_event/brushed, user) //fur dyer #define COLOR_MODE_SPECIFIC "Specific Marking" #define COLOR_MODE_GENERAL "General Color" /obj/item/fur_dyer name = "electric fur dyer" desc = "Dye that is capable of recoloring fur in a mostly permanent way." icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "fur_sprayer" w_class = WEIGHT_CLASS_TINY var/mode = COLOR_MODE_GENERAL /* /obj/item/fur_dyer/Initialize(mapload) . = ..() AddComponent(/datum/component/cell) */ /obj/item/fur_dyer/attack_self(mob/user, modifiers) . = ..() if(mode == COLOR_MODE_SPECIFIC) mode = COLOR_MODE_GENERAL else mode = COLOR_MODE_SPECIFIC to_chat(user, "Set to [mode]!") /obj/item/fur_dyer/attack(mob/living/M, mob/living/user, params) if(!ishuman(M)) return ..() var/mob/living/carbon/human/target_human = M switch(mode) if(COLOR_MODE_SPECIFIC) to_chat(user, "The device resonates ominously, and stops. It seems to be interfered by an Engram.") //dye_marking(target_human, user) if(COLOR_MODE_GENERAL) dye_general(target_human, user) /obj/item/fur_dyer/proc/dye_general(mob/living/carbon/human/target_human, mob/living/user) var/selected_mutant_color = tgalert(user, "Please select which mutant color you'd like to change", "Select Color", "One", "Two", "Three") if(!selected_mutant_color) return var/selected_color = input( user, "Select marking color", null, "#FFFFFF" ) as color | null if(!selected_color) return selected_color = sanitize_hexcolor(selected_color) visible_message("[user] starts to masterfully paint [target_human]!") if(do_mob(user, target_human,20 SECONDS)) switch(selected_mutant_color) if("One") target_human.dna.features["mcolor"] = selected_color if("Two") target_human.dna.features["mcolor2"] = selected_color if("Three") target_human.dna.features["mcolor3"] = selected_color target_human.regenerate_icons() //use power visible_message("[user] finishes painting [target_human]!") playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE) /* We don't have markings that can be colored separately yet, so this is not needed /obj/item/fur_dyer/proc/dye_marking(mob/living/carbon/human/target_human, mob/living/user) var/list/list/current_markings = target_human.dna.body_markings.Copy() if(!current_markings.len) to_chat(user, "[target_human] has no markings!") return //power stuff here /var/selected_marking_area = user.zone_selected if(!current_markings[selected_marking_area]) to_chat(user, "[target_human] has no bodymarkings on this limb!") return var/selected_marking_id = input(user, "Please select which marking you'd like to color!", "Select marking", current_markings[selected_marking_area]) if(!selected_marking_id) return var/selected_color = input( user, "Select marking color", null, "#FFFFFF" ) as color | null if(!selected_color) return selected_color = sanitize_hexcolor(selected_color) visible_message("[user] starts to masterfully paint [target_human]!") if(do_mob(user, target_human,20 SECONDS)) current_markings[selected_marking_area][selected_marking_id] = selected_color target_human.dna.body_markings = current_markings.Copy() target_human.regenerate_icons() //item_use_power(power_use_amount, user) visible_message("[user] finishes painting [target_human]!") playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE) */ /obj/machinery/dryer name = "hand dryer" desc = "The Breath Of Lizards-3000, an experimental dryer." icon = 'hyperstation/icons/obj/dryer.dmi' icon_state = "dryer" density = FALSE anchored = TRUE var/busy = FALSE /obj/machinery/dryer/attack_hand(mob/user) if(iscyborg(user) || isAI(user)) return if(!can_interact(user)) return if(busy) to_chat(user, "Someone is already drying here.") return to_chat(user, "You start drying your hands.") playsound(src, 'hyperstation/sound/salon/drying.ogg', 50) add_fingerprint(user) busy = TRUE if(do_mob(user, src,4 SECONDS)) busy = FALSE user.visible_message("[user] dried their hands using \the [src].") else busy = FALSE /obj/item/reagent_containers/dropper/precision name = "pipette" desc = "A high precision pippette. Holds 1 unit." icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "pipette1" amount_per_transfer_from_this = 1 possible_transfer_amounts = list(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1) volume = 1 w_class = WEIGHT_CLASS_TINY /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, "Where are the lips on that?") return var/new_color = input( user, "Select lipstick color", null, "#FFFFFF" ) as color | null var/mob/living/carbon/human/target = attacked_mob if(target.is_mouth_covered()) to_chat(user, "Remove [ target == user ? "your" : "[target.p_their()]" ] mask!") return if(target.lip_style) //if they already have lipstick on to_chat(user, "You need to wipe off the old lipstick first!") return if(target == user) visible_message("[user] does [user.p_their()] lips with \the [src].","You take a moment to apply \the [src]. Perfect!") target.lip_style = "lipstick" target.lip_color = new_color target.update_body() return visible_message("[user] begins to do [target]'s lips with \the [src].","You begin to apply \the [src] on [target]'s lips...") if(!do_mob(user, target = target,2 SECONDS)) return visible_message("[user] does [target]'s lips with \the [src].","You apply \the [src] on [target]'s lips.") target.lip_style = "lipstick" target.lip_color = new_color target.update_body() /obj/effect/decal/cleanable/hair name = "hair cuttings" icon = 'hyperstation/icons/obj/barber.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 = 'hyperstation/icons/obj/barber.dmi' icon_state = "razor" flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_TINY // How long do we take to shave someone's (facial) hair? var/shaving_time = 10 SECONDS /obj/item/razor/proc/shave(mob/living/carbon/human/target_human, location = BODY_ZONE_PRECISE_MOUTH) if(location == BODY_ZONE_PRECISE_MOUTH) target_human.facial_hair_style = "Shaved" else target_human.hair_style = "Bald" target_human.update_hair() playsound(loc, 'sound/items/unsheath.ogg', 20, TRUE) /obj/item/razor/attack(mob/attacked_mob, mob/living/user) if(ishuman(attacked_mob)) var/mob/living/carbon/human/target_human = attacked_mob var/location = user.zone_selected if(!(location in list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD))) to_chat(user, "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 in list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)) && !target_human.get_bodypart(BODY_ZONE_HEAD)) to_chat(user, "[target_human] doesn't have a head!") return if(location == BODY_ZONE_PRECISE_MOUTH) if(!(FACEHAIR in target_human.dna.species.species_traits)) to_chat(user, "There is no facial hair to shave!") return if(!get_location_accessible(target_human, location)) to_chat(user, "The mask is in the way!") return if(target_human.facial_hair_style == "Shaved") to_chat(user, "Already clean-shaven!") return var/self_shaving = target_human == user // Shaving yourself? visible_message("[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src].","You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]...") if(do_mob(user, target = target_human,shaving_time)) visible_message("[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src].","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(!(HAIR in target_human.dna.species.species_traits)) to_chat(user, "There is no hair to shave!") return if(!get_location_accessible(target_human, location)) to_chat(user, "Their headgear is in the way!") return if(target_human.hair_style == "Bald" || target_human.hair_style == "Balding Hair" || target_human.hair_style == "Skinhead") to_chat(user, "There is not enough hair left to shave!") return var/self_shaving = target_human == user // Shaving yourself? visible_message("[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src].","You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]...") if(do_mob(user, target = target_human,shaving_time)) visible_message("[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src].","You finish shaving [self_shaving ? "your" : " [target_human]'s"] hair with [src]. Fast and clean!") shave(target_human, location) else ..() else ..() /obj/structure/sign/barber name = "barbershop sign" desc = "A glowing red-blue-white stripe you won't mistake for any other!" icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "barber" buildable_sign = FALSE // Don't want them removed, they look too jank. /obj/item/scissors name = "barber's scissors" desc = "Some say a barbers best tool is his electric razor, that is not the case. These are used to cut hair in a professional way!" icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "scissors" w_class = WEIGHT_CLASS_TINY sharpness = TRUE // How long does it take to change someone's hairstyle? var/haircut_duration = 1 MINUTES // How long does it take to change someone's facial hair style? var/facial_haircut_duration = 20 SECONDS /obj/item/scissors/attack(mob/living/carbon/attacked_mob, mob/living/user, params) if(!ishuman(attacked_mob)) return var/mob/living/carbon/human/target_human = attacked_mob var/location = user.zone_selected if(!(location in list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD))) to_chat(user, "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(target_human.hair_style == "Bald" && target_human.facial_hair_style == "Shaved") to_chat(user, "What hair? They have none!") return if(user.zone_selected != BODY_ZONE_HEAD) return ..() var/selected_part = tgalert(user, "Please select which part of [target_human] you would like to sculpt!", "It's sculpting time!", "Hair", "Facial Hair", "Cancel") if(!selected_part || selected_part == "Cancel") return if(selected_part == "Hair") if(!target_human.hair_style == "Bald" && target_human.head) to_chat(user, "There is no hair to cut!") return var/hair_id = input(user, "Please select what hairstyle you'd like to sculpt!", "Select masterpiece") as null|anything in GLOB.hair_styles_list //dear god help me please if(!hair_id) return if(hair_id == "Bald") to_chat(target_human, "[user] seems to be cutting all your hair off!") to_chat(user, "You begin to masterfully sculpt [target_human]'s hair!") playsound(target_human, 'hyperstation/sound/salon/haircut.ogg', 100) if(!do_mob(user, attacked_mob, haircut_duration)) return target_human.hair_style = hair_id target_human.update_hair() visible_message("[user] successfully cuts [target_human]'s hair!","You successfully cut [target_human]'s hair!") new /obj/effect/decal/cleanable/hair(get_turf(src)) else if(!target_human.facial_hair_style == "Shaved" && target_human.wear_mask) to_chat(user, "There is no hair to cut!") return var/facial_hair_id = input(user, "Please select what facial hairstyle you'd like to sculpt!", "Select masterpiece") as null|anything in GLOB.facial_hair_styles_list if(!facial_hair_id) return if(facial_hair_id == "Shaved") to_chat(target_human, "[user] seems to be cutting all your facial hair off!") to_chat(user, "You begin to masterfully sculpt [target_human]'s facial hair!") playsound(target_human, 'hyperstation/sound/salon/haircut.ogg', 100) if(!do_mob(user, attacked_mob, facial_haircut_duration)) return target_human.facial_hair_style = facial_hair_id target_human.update_hair() visible_message("[user] successfully cuts [target_human]'s facial hair!","You successfully cut [target_human]'s facial hair!") new /obj/effect/decal/cleanable/hair(get_turf(src)) //reagents /obj/item/reagent_containers/spray/quantum_hair_dye name = "quantum hair dye" desc = "Changes hair colour RANDOMLY! Don't forget to read the label!" icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "hairspraywhite" amount_per_transfer_from_this = 1 possible_transfer_amounts = list(5,10) list_reagents = list(/datum/reagent/hair_dye = 30) volume = 50 /* /obj/item/reagent_containers/spray/baldium name = "baldium spray" desc = "Causes baldness, exessive use may cause customer disatisfaction." icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "hairremoval" amount_per_transfer_from_this = 1 possible_transfer_amounts = list(5,10) list_reagents = list(/datum/reagent/baldium = 30) volume = 50 */ /obj/item/reagent_containers/spray/barbers_aid name = "barber's aid" desc = "Causes rapid hair and facial hair growth!" icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "hairaccelerator" amount_per_transfer_from_this = 1 possible_transfer_amounts = list(5,10) list_reagents = list(/datum/reagent/barbers_aid = 50) volume = 50 /obj/item/reagent_containers/spray/super_barbers_aid name = "super barber's aid" desc = "Causes SUPER rapid hair and facial hair growth!" icon = 'hyperstation/icons/obj/barber.dmi' icon_state = "hairaccelerator" amount_per_transfer_from_this = 1 possible_transfer_amounts = list(5,10) list_reagents = list(/datum/reagent/concentrated_barbers_aid = 30) volume = 50