MultiZ Layenia Base

This commit is contained in:
Dahlular
2022-09-04 10:32:31 -06:00
parent ec54fb9c05
commit f45b4bfb4c
187 changed files with 260225 additions and 124296 deletions
@@ -0,0 +1,9 @@
/**
* Additional client defines. I needed somewhere to put these so here it is!
*/
/client
//////////////////////////////////////
// Things that require the database //
//////////////////////////////////////
var/list/department_hours = list() // Track hours of leave accrued for each department
var/list/play_hours = list() // Tracks total playtime hours for each department
+1 -1
View File
@@ -10,4 +10,4 @@
strip_delay = 40
equip_delay_other = 20
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
@@ -0,0 +1,3 @@
/datum/job
var/timeoff_factor = 3
var/pto_type
@@ -0,0 +1,52 @@
/datum/job/barista
title = "Barista"
flag = BARISTA
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
outfit = /datum/outfit/job/barista
access = list(ACCESS_HYDROPONICS, ACCESS_BARISTA, ACCESS_KITCHEN, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_BARISTA, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/barista
name = "Barista"
jobtype = /datum/job/barista
belt = /obj/item/pda/bar
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/lawyer/blacksuit
suit = /obj/item/clothing/suit/toggle/lawyer/black
backpack_contents = list(/obj/item/book/granter/action/drink_fling=1, /obj/item/clothing/accessory/waistcoat)
shoes = /obj/item/clothing/shoes/laceup
/datum/job/barber
title = "Barber"
flag = BARBER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
outfit = /datum/outfit/job/barber
access = list(ACCESS_BARBER)
minimal_access = list(ACCESS_BARBER)
/datum/outfit/job/barber
name = "Barber"
jobtype = /datum/job/barber
glasses = /obj/item/clothing/glasses/sunglasses
ears = /obj/item/radio/headset/headset_srv
belt = /obj/item/pda
uniform = /obj/item/clothing/under/barber
shoes = /obj/item/clothing/shoes/laceup
@@ -0,0 +1,8 @@
/datum/job/lambent
alt_titles = list("Kinaris Protectorate", "Hardshield", "Asset Specialist", "Luminal")
/datum/job/barber
alt_titles = list("Cosmetologist", "Beautician", "Hairdresser", "Hair Stylist")
/datum/job/barista
alt_titles = list("Cafe Attendant", "Cafe Server")
@@ -0,0 +1,56 @@
/*
Lambent
*/
/datum/job/lambent
title = "Lambent"
flag = LAMBENT
department_head = list("CentCom")
department_flag = ENGSEC
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "Central Command and Kinaris officials"
selection_color = "#ffedcc"
req_admin_notify = 1
minimal_player_age = 30
exp_requirements = 9000
exp_type = EXP_TYPE_COMMAND
exp_type_department = EXP_TYPE_COMMAND
whitelist_type = "important"
custom_spawn_text = "You are a Kinaris Lambent; a person hired directly by Kinaris who has a high interest in asset security and the protection of the station. Unlike the station, your gear is official Kinaris items, not replicated Milky-Way Engrams. As such, you should keep them safe due to the power they hold. You answer directly to Central Command and Kinaris, and security matters should not involve you for the most part, unless staffing is low or there is a problem with securing assets. Thankfully, Layenia Station is one of Kinaris's most low-tech stations with hardly anything important to secure; not even the items in the vault are noteworthy due to the falsified, low-tech Engram they're under. Just ensure peace is kept and the station is functioning in a calm manner."
outfit = /datum/outfit/job/lambent
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_LAMBENT,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_BARISTA, ACCESS_BARBER,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_LAMBENT,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_BARISTA, ACCESS_BARBER,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
mind_traits = list(TRAIT_CAPTAIN_METABOLISM)
blacklisted_quirks = list(/datum/quirk/brainproblems, /datum/quirk/insanity, /datum/quirk/nonviolent)
/datum/outfit/job/lambent
name = "Lambent"
jobtype = /datum/job/lambent
id = /obj/item/card/id/silver
belt = /obj/item/pda/captain
glasses = /obj/item/clothing/glasses/hud/toggle/zao
ears = /obj/item/radio/headset/heads/captain/alt
gloves = /obj/item/clothing/gloves/lambent
uniform = /obj/item/clothing/under/rank/lambent
suit = /obj/item/clothing/suit/lambent
shoes = /obj/item/clothing/shoes/lambent
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
backpack = /obj/item/storage/backpack/lambent
satchel = /obj/item/storage/backpack/satchel/lambent
duffelbag = /obj/item/storage/backpack/duffelbag/lambent
box = /obj/item/storage/box/security
implants = list(/obj/item/implant/mindshield)
@@ -0,0 +1,31 @@
/obj/item/wallframe/light_fixture/fairy
name = "fairy lights frame"
icon_state = "fairy-construct-item"
result_path = /obj/structure/light_construct/fairy
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
/obj/structure/light_construct/fairy
name = "fairy lights frame"
icon_state = "fairy-construct-stage1"
fixture_type = "fairy"
sheets_refunded = 1
/obj/machinery/light/fairy
icon_state = "fairy"
base_state = "fairy"
fitting = "fairy"
brightness = 3
desc = "Small fairy lights."
//light_type = /obj/item/light/fairy
/obj/machinery/light/fairy/broken
status = LIGHT_BROKEN
icon_state = "fairy-broken"
/obj/machinery/light/fairy/built
icon_state = "bulb-empty"
/obj/machinery/light/fairy/built/Initialize()
. = ..()
status = LIGHT_EMPTY
update(0)
+541
View File
@@ -0,0 +1,541 @@
//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, "<span class='warning'>There isn't much point in brushing someone who can't appreciate it!</span>")
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, "<span class='warning'>[human_target] has no head!</span>")
return
if(human_target.is_mouth_covered(head_only = 1))
to_chat(usr, "<span class='warning'>You can't brush [human_target]'s hair while [human_target.p_their()] head is covered!</span>")
return
if(!do_after(user, brush_speed, human_target))
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("<span class='warning'>[usr] scrapes the bristles uncomfortably over [human_target]'s scalp.</span>","<span class='warning'>You scrape the bristles uncomfortably over [human_target]'s scalp.</span>")
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("<span class='notice'>[usr] brushes [usr.p_their()] hair!</span>","<span class='notice'>You brush your hair.</span>")
//SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "brushed", /datum/mood/brushed/self)
else
user.visible_message("<span class='notice'>[usr] brushes [human_target]'s hair!</span>","<span class='notice'>You brush [human_target]'s hair.</span>")
//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("<span class='notice'>[user] starts to masterfully paint [target_human]!</span>")
if(do_after(user, 20 SECONDS, target_human))
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("<span class='notice'>[user] finishes painting [target_human]!</span>")
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, "<span class='warning'>[target_human] has no markings!</span>")
return
//power stuff here
/var/selected_marking_area = user.zone_selected
if(!current_markings[selected_marking_area])
to_chat(user, "<span class='danger'>[target_human] has no bodymarkings on this limb!</span>")
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("<span class='notice'>[user] starts to masterfully paint [target_human]!</span>")
if(do_after(user, 20 SECONDS, target_human))
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("<span class='notice'>[user] finishes painting [target_human]!</span>")
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, "<span class='warning'>Someone is already drying here.</span>")
return
to_chat(user, "<span class='notice'>You start drying your hands.</span>")
playsound(src, 'hyperstation/sound/salon/drying.ogg', 50)
add_fingerprint(user)
busy = TRUE
if(do_after(user, 4 SECONDS, src))
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, "<span class='warning'>Where are the lips on that?</span>")
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, "<span class='warning'>Remove [ target == user ? "your" : "[target.p_their()]" ] mask!</span>")
return
if(target.lip_style) //if they already have lipstick on
to_chat(user, "<span class'warning'>You need to wipe off the old lipstick first!</span>")
return
if(target == user)
visible_message("<span class='notice'>[user] does [user.p_their()] lips with \the [src].</span>","<span class='notice'>You take a moment to apply \the [src]. Perfect!</span>")
target.lip_style = "lipstick"
target.lip_color = new_color
target.update_body()
return
visible_message("<span class='warning'>[user] begins to do [target]'s lips with \the [src].</span>","<span class='notice'>You begin to apply \the [src] on [target]'s lips...</span>")
if(!do_after(user, 2 SECONDS, target = target))
return
visible_message("<span class='notice'>[user] does [target]'s lips with \the [src].</span>","<span class='notice'>You apply \the [src] on [target]'s lips.</span>")
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, "<span class='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.\"</span>")
return
if((location in list(BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_HEAD)) && !target_human.get_bodypart(BODY_ZONE_HEAD))
to_chat(user, "<span class='warning'>[target_human] doesn't have a head!</span>")
return
if(location == BODY_ZONE_PRECISE_MOUTH)
if(!(FACEHAIR in target_human.dna.species.species_traits))
to_chat(user, "<span class='warning'>There is no facial hair to shave!</span>")
return
if(!get_location_accessible(target_human, location))
to_chat(user, "<span class'warning'>The mask is in the way!</span>")
return
if(target_human.facial_hair_style == "Shaved")
to_chat(user, "<span class='warning'>Already clean-shaven!</span>")
return
var/self_shaving = target_human == user // Shaving yourself?
visible_message("<span class='notice'>[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src].</span>","<span class='notice'>You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]...</span>")
if(do_after(user, shaving_time, target = target_human))
visible_message("<span class='notice'>[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src].</span>","<span class='notice'>You finish shaving [self_shaving ? "your" : " [target_human]'s"] hair with [src]. Fast and clean!</span>")
shave(target_human, location)
else if(location == BODY_ZONE_HEAD)
if(!(HAIR in target_human.dna.species.species_traits))
to_chat(user, "<span class='warning'>There is no hair to shave!</span>")
return
if(!get_location_accessible(target_human, location))
to_chat(user, "<span class='warning'>Their headgear is in the way!</span>")
return
if(target_human.hair_style == "Bald" || target_human.hair_style == "Balding Hair" || target_human.hair_style == "Skinhead")
to_chat(user, "<span class='warning'>There is not enough hair left to shave!</span>")
return
var/self_shaving = target_human == user // Shaving yourself?
visible_message("<span class='notice'>[user] starts to shave [self_shaving ? user.p_their() : "[target_human]'s"] hair with [src].</span>","<span class='notice'>You take a moment to shave [self_shaving ? "your" : "[target_human]'s" ] hair with [src]...</span>")
if(do_after(user, shaving_time, target = target_human))
visible_message("<span class='notice'>[user] shaves [self_shaving ? user.p_their() : "[target_human]'s"] hair clean with [src].</span>","<span class='notice'>You finish shaving [self_shaving ? "your" : " [target_human]'s"] hair with [src]. Fast and clean!</span>")
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/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, "<span class='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.\"</span>")
return
if(target_human.hair_style == "Bald" && target_human.facial_hair_style == "Shaved")
to_chat(user, "<span class='warning'>What hair? They have none!</span>")
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, "<span class='warning'>There is no hair to cut!</span>")
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, "<span class='warning'>[user] seems to be cutting all your hair off!</span>")
to_chat(user, "<span class='notice'>You begin to masterfully sculpt [target_human]'s hair!</span>")
playsound(target_human, 'hyperstation/sound/salon/haircut.ogg', 100)
if(do_after(user, haircut_duration, target_human))
target_human.hair_style = hair_id
target_human.update_hair()
visible_message("<span class='notice'>[user] successfully cuts [target_human]'s hair!</span>","<span class='notice'>You successfully cut [target_human]'s hair!</span>")
new /obj/effect/decal/cleanable/hair(get_turf(src))
else
if(!target_human.facial_hair_style == "Shaved" && target_human.wear_mask)
to_chat(user, "<span class='warning'>There is no hair to cut!</span>")
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, "<span class='warning'>[user] seems to be cutting all your facial hair off!</span>")
to_chat(user, "<span class='notice'>You begin to masterfully sculpt [target_human]'s facial hair!</span>")
playsound(target_human, 'hyperstation/sound/salon/haircut.ogg', 100)
if(do_after(user, facial_haircut_duration, target_human))
target_human.facial_hair_style = facial_hair_id
target_human.update_hair()
visible_message("<span class='notice'>[user] successfully cuts [target_human]'s facial hair!</span>","<span class='notice'>You successfully cut [target_human]'s facial hair!</span>")
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
@@ -0,0 +1,32 @@
/obj/machinery/vending/teavendomatic
name = "\improper Tea Vend-O-Matic"
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one, this one is branded for tea and non-alcoholic beverages... Mostly."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
products = list(
/obj/item/reagent_containers/food/drinks/mug/tea = 30,
/obj/item/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/reagent_containers/food/drinks/bottle/grappa = 5,
/obj/item/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 8,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 8,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 8,
/obj/item/reagent_containers/food/drinks/bottle/grenadine = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 8,
/obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 8,
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 15,
/obj/item/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/reagent_containers/food/drinks/ice = 10,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12,
/obj/item/reagent_containers/food/drinks/flask = 3)
contraband = list(/obj/item/reagent_containers/food/drinks/mug/tea = 12,)
premium = list(/obj/item/reagent_containers/glass/bottle/ethanol = 4,
/obj/item/reagent_containers/food/drinks/bottle/champagne = 5,
/obj/item/reagent_containers/food/drinks/bottle/trappist = 5)
product_slogans = "Keep a clear head and drink on.;It is a quite fine day to sit down and have a drink.;Remember to drink responsibly.;Products are assured to be GMO free."
product_ads = "Stay Radiant.;Remember to balance your intake.;Radiikist brands are not permitted in sectors 34-A through 59-B.;Keep a level head.;Refreshments are to be taken in modicum.;Let the day's stress melt away.;Please, enjoy.;In-service since the sixth Era."
req_access = list(ACCESS_BARISTA)
//refill_canister = /obj/item/vending_refill/teavendomatic
free = TRUE