Files
VOREStation/code/modules/clothing/accessories/accessory_vr.dm
T
SatinIsle 391c96c4ef Allows stripping people by resizing (#19038)
* Allows stripping people by resizing

Added a new preference that allows you to drop all of your items and possibly underwear upon being suddenly resized by more than 30%.

This also adds a variable to resize() that determines whether a specific method can trigger the stripping.
It is currently enabled on size guns and bluespace crackers only, I want to add it on a case by case basis.

* More info in tooltip

* Fix mistake

* Fix the other one too

* modern style

* Update vore_prefs.dm

* Turns defines into numbers

* Makes the new preference a dropdown

The edit mode is forced to true as the preferences page does not use edit modes.
Tested and it works fine.

* dropdown

* sublist

* .

* string keys

* tooltip

* .

* Current progress (broken)

* Fixes things

Tested and they work as expected

* please never do this

* .

* Make belly temps save

* move by 1 second

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2026-01-22 22:54:14 +01:00

1048 lines
39 KiB
Plaintext

//
// Collars and such like that
//
/obj/item/clothing/accessory/choker //A colorable, tagless choker
name = "plain choker"
slot_flags = SLOT_TIE | SLOT_OCLOTHING
desc = "A simple, plain choker. Or maybe it's a collar?"
icon_state = "choker_cst"
item_state = "choker_cst"
overlay_state = "choker_cst"
var/customized = 0
var/icon_previous_override
//Forces different sprite sheet on equip
/obj/item/clothing/accessory/choker/Initialize(mapload)
. = ..()
icon_previous_override = icon_override
/obj/item/clothing/accessory/choker/equipped() //Solution for race-specific sprites for an accessory which is also a suit. Suit icons break if you don't use icon override which then also overrides race-specific sprites.
..()
setUniqueSpeciesSprite()
/obj/item/clothing/accessory/choker/proc/setUniqueSpeciesSprite()
var/mob/living/carbon/human/H = loc
if(!istype(H) && istype(has_suit) && ishuman(has_suit.loc))
H = has_suit.loc
if(sprite_sheets && istype(H) && H.species.get_bodytype(H) && (H.species.get_bodytype(H) in sprite_sheets))
icon_override = sprite_sheets[H.species.get_bodytype(H)]
update_clothing_icon()
/obj/item/clothing/accessory/choker/on_attached(var/obj/item/clothing/S, var/mob/user)
if(!istype(S))
return
has_suit = S
setUniqueSpeciesSprite()
..(S, user)
/obj/item/clothing/accessory/choker/dropped(mob/user)
..()
icon_override = icon_previous_override
/obj/item/clothing/accessory/collar
slot_flags = SLOT_TIE | SLOT_OCLOTHING
icon_state = "collar_blk"
var/writtenon = 0
var/icon_previous_override
special_handling = TRUE
///Var for attack_self chain
var/special_collar = FALSE
default_worn_icon = INV_ACCESSORIES_DEF_ICON
//Forces different sprite sheet on equip
/obj/item/clothing/accessory/collar/Initialize(mapload)
. = ..()
icon_previous_override = icon_override
/obj/item/clothing/accessory/collar/equipped() //Solution for race-specific sprites for an accessory which is also a suit. Suit icons break if you don't use icon override which then also overrides race-specific sprites.
..()
setUniqueSpeciesSprite()
/obj/item/clothing/accessory/collar/proc/setUniqueSpeciesSprite()
var/mob/living/carbon/human/H = loc
if(!istype(H) && istype(has_suit) && ishuman(has_suit.loc))
H = has_suit.loc
if(sprite_sheets && istype(H) && H.species.get_bodytype(H) && (H.species.get_bodytype(H) in sprite_sheets))
icon_override = sprite_sheets[H.species.get_bodytype(H)]
update_clothing_icon()
/obj/item/clothing/accessory/collar/on_attached(var/obj/item/clothing/S, var/mob/user)
if(!istype(S))
return
has_suit = S
setUniqueSpeciesSprite()
..(S, user)
/obj/item/clothing/accessory/collar/dropped(mob/user)
..()
icon_override = icon_previous_override
/obj/item/clothing/accessory/collar/silver
name = "Silver tag collar"
desc = "A collar for your little pets... or the big ones."
icon_state = "collar_blk"
item_state = "collar_blk"
overlay_state = "collar_blk"
/obj/item/clothing/accessory/collar/gold
name = "Golden tag collar"
desc = "A collar for your little pets... or the big ones."
icon_state = "collar_gld"
item_state = "collar_gld"
overlay_state = "collar_gld"
/obj/item/clothing/accessory/collar/bell
name = "Bell collar"
desc = "A collar with a tiny bell hanging from it, purrfect furr kitties."
icon_state = "collar_bell"
item_state = "collar_bell"
overlay_state = "collar_bell"
var/jingled = 0
/obj/item/clothing/accessory/collar/bell/verb/jinglebell()
set name = "Jingle Bell"
set category = "Object"
set src in usr
if(!isliving(usr)) return
if(usr.stat) return
if(!jingled)
usr.audible_message("[usr] jingles the [src]'s bell.", runemessage = "jingle")
playsound(src, 'sound/items/pickup/ring.ogg', 50, 1)
jingled = 1
addtimer(CALLBACK(src, PROC_REF(jingledreset)), 50)
return
/obj/item/clothing/accessory/collar/bell/proc/jingledreset()
jingled = 0
/obj/item/clothing/accessory/collar/shock
name = "Shock collar"
desc = "A collar used to ease hungry predators."
icon_state = "collar_shk0"
item_state = "collar_shk"
overlay_state = "collar_shk"
var/on = FALSE // 0 for off, 1 for on, starts off to encourage people to set non-default frequencies and codes.
var/frequency = AMAG_ELE_FREQ
var/code = 2
var/datum/radio_frequency/radio_connection
special_collar = TRUE
/obj/item/clothing/accessory/collar/shock/Initialize(mapload)
. = ..()
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT) // Makes it so you don't need to change the frequency off of default for it to work.
/obj/item/clothing/accessory/collar/shock/Destroy() //Clean up your toys when you're done.
SSradio.remove_object(src, frequency)
radio_connection = null //Don't delete this, this is a shared object.
return ..()
/obj/item/clothing/accessory/collar/shock/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT)
/obj/item/clothing/accessory/collar/shock/attack_self(mob/user, flag1)
. = ..(user)
if(.)
return TRUE
if(!ishuman(user))
return
tgui_interact(user)
/obj/item/clothing/accessory/collar/shock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, custom_state)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ShockCollar", name)
ui.open()
/obj/item/clothing/accessory/collar/shock/tgui_static_data(mob/user)
var/list/data = ..()
data["freq_min"] = PUBLIC_LOW_FREQ
data["freq_max"] = PUBLIC_HIGH_FREQ
data["code_min"] = 0
data["code_max"] = 100
return data
/obj/item/clothing/accessory/collar/shock/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["on"] = on
data["frequency"] = frequency
data["code"] = code
return data
/obj/item/clothing/accessory/collar/shock/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
if(.)
return
switch(action)
if("freq")
var/new_freq = sanitize_frequency(params["freq"])
set_frequency(new_freq)
. = TRUE
if("code")
code = CLAMP(text2num(params["code"]), 1, 100)
. = TRUE
if("power")
on = !on
if(!istype(src, /obj/item/clothing/accessory/collar/shock/bluespace))
icon_state = "collar_shk[on]"
. = TRUE
if("tag")
var/sanitized = tgui_input_text(ui.user, "Tag text?", "Set Tag", "", MAX_NAME_LEN, encode = TRUE)
if(isnull(sanitized))
return
if(!length(sanitized))
to_chat(ui.user, span_notice("[src]'s tag set to blank."))
name = initial(name)
desc = initial(desc)
else
to_chat(ui.user, span_notice("[src]'s tag set to '[sanitized]'."))
name = initial(name) + " ([sanitized])"
desc = initial(desc) + " The tag says \"[sanitized]\"."
. = TRUE
/obj/item/clothing/accessory/collar/shock/receive_signal(datum/signal/signal)
if(!signal || signal.encryption != code)
return
if(on)
var/mob/M = null
if(ismob(loc))
M = loc
if(ismob(loc.loc))
M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
to_chat(M,span_danger("You feel a sharp shock!"))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, M)
s.start()
M.Weaken(10)
/obj/item/clothing/accessory/collar/spike
name = "Spiked collar"
desc = "A collar with spikes that look as sharp as your teeth."
icon_state = "collar_spik"
item_state = "collar_spik"
overlay_state = "collar_spik"
/obj/item/clothing/accessory/collar/pink
name = "Pink collar"
desc = "This collar will make your pets look FA-BU-LOUS."
icon_state = "collar_pnk"
item_state = "collar_pnk"
overlay_state = "collar_pnk"
/obj/item/clothing/accessory/collar/cowbell
name = "cowbell collar"
desc = "A collar for your little pets... or the big ones."
icon_state = "collar_cowbell"
item_state = "collar_cowbell_overlay"
overlay_state = "collar_cowbell_overlay"
/obj/item/clothing/accessory/collar/collarplanet_earth
name = "planet collar"
desc = "A collar featuring a surprisingly detailed replica of a earth-like planet surrounded by a weak battery powered force shield. There is a button to turn it off."
icon_state = "collarplanet_earth"
item_state = "collarplanet_earth"
overlay_state = "collarplanet_earth"
/obj/item/clothing/accessory/collar/holo
name = "Holo-collar"
desc = "An expensive holo-collar for the modern day pet."
icon_state = "collar_holo"
item_state = "collar_holo"
overlay_state = "collar_holo"
matter = list(MAT_STEEL = 50)
/obj/item/clothing/accessory/collar/holo/indigestible
desc = "A special variety of the holo-collar that seems to be made of a very durable fabric that fits around the neck."
//Make indigestible
/obj/item/clothing/accessory/collar/holo/indigestible/digest_act(var/atom/movable/item_storage = null)
return FALSE
/obj/item/clothing/accessory/collar/attack_self(mob/user)
. = ..(user)
if(.)
return TRUE
if(special_collar)
return FALSE
if(istype(src,/obj/item/clothing/accessory/collar/holo))
to_chat(user,span_notice("[name]'s interface is projected onto your hand."))
else
if(writtenon)
to_chat(user,span_notice("You need a pen or a screwdriver to edit the tag on this collar."))
return
to_chat(user,span_notice("You adjust the [name]'s tag."))
var/str = copytext(reject_bad_text(tgui_input_text(user,"Tag text?","Set tag","",MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user,span_notice("[name]'s tag set to be blank."))
name = initial(name)
desc = initial(desc)
else
to_chat(user,span_notice("You set the [name]'s tag to '[str]'."))
initialize_tag(str)
/obj/item/clothing/accessory/collar/proc/initialize_tag(var/tag)
name = initial(name) + " ([tag])"
desc = initial(desc) + " \"[tag]\" has been engraved on the tag."
writtenon = 1
/obj/item/clothing/accessory/collar/holo/initialize_tag(var/tag)
..()
desc = initial(desc) + " The tag says \"[tag]\"."
/obj/item/clothing/accessory/collar/attackby(obj/item/I, mob/user)
if(istype(src,/obj/item/clothing/accessory/collar/holo))
return
if(istype(I,/obj/item/tool/screwdriver))
update_collartag(user, I, "scratched out", "scratch out", "engraved")
return
if(istype(I,/obj/item/pen))
update_collartag(user, I, "crossed out", "cross out", "written")
return
to_chat(user,span_notice("You need a pen or a screwdriver to edit the tag on this collar."))
/obj/item/clothing/accessory/collar/proc/update_collartag(mob/user, obj/item/I, var/erasemethod, var/erasing, var/writemethod)
if(!(istype(user.get_active_hand(),I)) || !(istype(user.get_inactive_hand(),src)) || (user.stat))
return
var/str = copytext(reject_bad_text(tgui_input_text(user,"Tag text?","Set tag","",MAX_NAME_LEN)),1,MAX_NAME_LEN)
if(!str || !length(str))
if(!writtenon)
to_chat(user,span_notice("You don't write anything."))
else
to_chat(user,span_notice("You [erasing] the words with the [I]."))
name = initial(name)
desc = initial(desc) + " The tag has had the words [erasemethod]."
else
if(!writtenon)
to_chat(user,span_notice("You write '[str]' on the tag with the [I]."))
name = initial(name) + " ([str])"
desc = initial(desc) + " \"[str]\" has been [writemethod] on the tag."
writtenon = 1
else
to_chat(user,span_notice("You [erasing] the words on the tag with the [I], and write '[str]'."))
name = initial(name) + " ([str])"
desc = initial(desc) + " Something has been [erasemethod] on the tag, and it now has \"[str]\" [writemethod] on it."
//Size collar remote
/obj/item/clothing/accessory/collar/shock/bluespace
name = "Bluespace collar"
desc = "A collar that can manipulate the size of the wearer, and can be modified when unequiped."
icon_state = "collar_size"
item_state = "collar_size"
overlay_state = "collar_size"
var/original_size
var/last_activated
var/target_size = 1
on = 1
/obj/item/clothing/accessory/collar/shock/bluespace/tgui_static_data(mob/user)
var/list/data = ..()
data["target_size_min"] = RESIZE_MINIMUM_DORMS
data["target_size_max"] = RESIZE_MAXIMUM_DORMS
return data
/obj/item/clothing/accessory/collar/shock/bluespace/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["target_size"] = target_size
return data
/obj/item/clothing/accessory/collar/shock/bluespace/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
if(.)
return
switch(action)
if("size")
target_size = clamp((params["size"]/100), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS)
to_chat(ui.user, span_notice("You set the size to [target_size * 100]%"))
if(target_size < RESIZE_MINIMUM || target_size > RESIZE_MAXIMUM)
to_chat(ui.user, span_notice("Note: Resizing limited to 25-200% automatically while outside dormatory areas.")) //hint that we clamp it in resize
. = TRUE
/obj/item/clothing/accessory/collar/shock/bluespace/receive_signal(datum/signal/signal)
if(!signal || signal.encryption != code)
return
if(on)
var/mob/M = null
if(ismob(loc))
M = loc
if(ismob(loc.loc))
M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
var/mob/living/carbon/human/H = M
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
if(!H)
return
if(!H.resizable)
H.visible_message(span_warning("The space around [H] compresses for a moment but then nothing happens."),span_notice("The space around you distorts but nothing happens to you."))
return
if(H.size_multiplier != target_size)
if(!(world.time - last_activated > 10 SECONDS))
to_chat(M, span_warning("\The [src] flickers. It seems to be recharging."))
return
last_activated = world.time
original_size = H.size_multiplier
H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
s.start()
else if(H.size_multiplier == target_size)
if(original_size == null)
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
to_chat(M, span_warning("\The [src] flickers. It is now recharging and will be ready again in ten seconds."))
s.set_up(3, 1, M)
s.start()
return
/obj/item/clothing/accessory/collar/shock/bluespace/relaymove(var/mob/living/user,var/direction)
return //For some reason equipping this item was triggering this proc, putting the wearer inside of the collars belly for some reason.
/obj/item/clothing/accessory/collar/shock/bluespace/attackby(var/obj/item/component, mob/user as mob)
if (component.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("You crack the bluespace crystal [src]."))
var/turf/T = get_turf(src)
new /obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning(T)
user.drop_from_inventory(src)
qdel(src)
return
if (!istype(component,/obj/item/assembly/signaler))
..()
return
to_chat(user, span_notice("You wire the signaler into the [src]."))
user.drop_item()
qdel(component)
var/turf/T = get_turf(src)
new /obj/item/clothing/accessory/collar/shock/bluespace/modified(T)
user.drop_from_inventory(src)
qdel(src)
return
// modified bluespace collar where the size is controlled by the signaller.
/obj/item/clothing/accessory/collar/shock/bluespace/modified
name = "Bluespace collar"
desc = "A collar that can manipulate the size of the wearer, and can be modified when unequiped. It has a little reciever attached."
icon_state = "collar_size_mod"
item_state = "collar_size"
overlay_state = "collar_size"
target_size = 1
on = 1
/obj/item/clothing/accessory/collar/shock/bluespace/modified/attackby(var/obj/item/component, mob/user as mob)
if (component.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("You crack the bluespace crystal [src], the attached signaler disconnects."))
var/turf/T = get_turf(src)
new /obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning(T)
user.drop_from_inventory(src)
qdel(src)
return
if (!istype(component,/obj/item/assembly/signaler))
..()
return
to_chat(user, span_notice("There is already a signaler wired to the [src]."))
return
/obj/item/clothing/accessory/collar/shock/bluespace/modified/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["target_size"] = "code"
return data
/obj/item/clothing/accessory/collar/shock/bluespace/modified/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(action == "size")
return // no modifying size
. = ..()
/obj/item/clothing/accessory/collar/shock/bluespace/modified/receive_signal(datum/signal/signal)
if(!signal)
return
target_size = (signal.encryption * 2)/100
if(on)
var/mob/M = null
if(ismob(loc))
M = loc
if(ismob(loc.loc))
M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
var/mob/living/carbon/human/H = M
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
if(!H)
return
if(!H.resizable)
H.visible_message(span_warning("The space around [H] compresses for a moment but then nothing happens."),span_notice("The space around you distorts but nothing happens to you."))
return
if (target_size < 0.26)
H.visible_message(span_warning("The collar on [H] flickers, but fizzles out."),span_notice("Your collar flickers, but is not powerful enough to shrink you that small."))
return
if(H.size_multiplier != target_size)
if(!(world.time - last_activated > 10 SECONDS))
to_chat(M, span_warning("\The [src] flickers. It seems to be recharging."))
return
last_activated = world.time
original_size = H.size_multiplier
H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
s.start()
else if(H.size_multiplier == target_size)
if(original_size == null)
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
to_chat(M, span_warning("\The [src] flickers. It is now recharging and will be ready again in ten seconds."))
s.set_up(3, 1, M)
s.start()
return
//bluespace collar malfunctioning (random size)
/obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning
name = "Bluespace collar"
desc = "A collar that can manipulate the size of the wearer, and can be modified when unequiped. It has a crack on the crystal."
icon_state = "collar_size_malf"
item_state = "collar_size"
overlay_state = "collar_size"
target_size = 1
on = 1
var/currently_shrinking = 0
/obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning/attackby(var/obj/item/component, mob/user as mob)
if (!istype(component,/obj/item/assembly/signaler))
..()
return
to_chat(user, span_notice("The signaler doesn't respond to the connection attempt [src]."))
return
/obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["target_size"] = "locked"
return data
/obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(action == "size")
return // no modifying size
. = ..()
/obj/item/clothing/accessory/collar/shock/bluespace/malfunctioning/receive_signal(datum/signal/signal)
if(!signal)
return
target_size = (rand(25,200)) /100
if(on)
var/mob/M = null
if(ismob(loc))
M = loc
if(ismob(loc.loc))
M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
var/mob/living/carbon/human/H = M
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
if(!H)
return
if(!H.resizable)
H.visible_message(span_warning("The space around [H] compresses for a moment but then nothing happens."),span_notice("The space around you distorts but nothing happens to you."))
return
if (target_size < 0.25)
H.visible_message(span_warning("The collar on [H] flickers, but fizzles out."),span_notice("Your collar flickers, but is not powerful enough to shrink you that small."))
return
if(currently_shrinking == 0)
if(!(world.time - last_activated > 10 SECONDS))
to_chat(M, span_warning("\The [src] flickers. It seems to be recharging."))
return
last_activated = world.time
original_size = H.size_multiplier
currently_shrinking = 1
H.resize(target_size, ignore_prefs = FALSE, allow_stripping = TRUE) //In case someone else tries to put it on you.
H.visible_message(span_warning("The space around [H] distorts as they change size!"),span_notice("The space around you distorts as you change size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
s.set_up(3, 1, M)
s.start()
else if(currently_shrinking == 1)
if(original_size == null)
H.visible_message(span_warning("The space around [H] twists and turns for a moment but then nothing happens."),span_notice("The space around you distorts but stay the same size."))
return
last_activated = world.time
H.resize(original_size, ignore_prefs = FALSE, allow_stripping = TRUE)
original_size = null
currently_shrinking = 0
H.visible_message(span_warning("The space around [H] distorts as they return to their original size!"),span_notice("The space around you distorts as you return to your original size!"))
log_admin("Admin [key_name(M)]'s size was altered by a bluespace collar.")
to_chat(M, span_warning("\The [src] flickers. It is now recharging and will be ready again in ten seconds."))
s.set_up(3, 1, M)
s.start()
return
//Machete Holsters
/obj/item/clothing/accessory/holster/machete
name = "machete sheath"
desc = "A handsome synthetic leather sheath with matching belt."
icon_state = "holster_machete"
slot = ACCESSORY_SLOT_WEAPON
concealed_holster = 0
can_hold = list(/obj/item/material/knife/machete, /obj/item/kinetic_crusher/machete)
//sound_in = 'sound/effects/holster/sheathin.ogg'
//sound_out = 'sound/effects/holster/sheathout.ogg'
//Medals
/obj/item/clothing/accessory/medal/silver/unity
name = "medal of unity"
desc = "A silver medal awarded to a group which has demonstrated exceptional teamwork to achieve a notable feat."
/obj/item/clothing/accessory/medal/silver/unity/tabiranth
icon_state = "silverthree"
item_state = "silverthree"
overlay_state = "silverthree"
desc = "A silver medal awarded to a group which has demonstrated exceptional teamwork to achieve a notable feat. This one has three bronze service stars, denoting that it has been awarded four times."
/obj/item/clothing/accessory/talon
name = "Talon pin"
desc = "A collectable enamel pin that resembles ITV Talon's ship logo."
icon_state = "talon_pin"
item_state = "talonpin"
overlay_state = "talonpin"
//Casino Sentient Prize Collar
/obj/item/clothing/accessory/collar/casinosentientprize
name = "disabled Sentient Prize Collar"
desc = "A collar worn by sentient prizes registered to a SPASM. Although the red text on it shows its disconnected and nonfunctional."
icon_state = "casinoslave"
item_state = "casinoslave"
overlay_state = "casinoslave"
var/sentientprizename = null //Name for system to put on collar description
var/ownername = null //Name for system to put on collar description
var/sentientprizeckey = null //Ckey for system to check who is the person and ensure no abuse of system or errors
var/sentientprizeflavor = null //Description to show on the SPASM
var/sentientprizeooc = null //OOC text to show on the SPASM
var/sentientprizeitemtf = FALSE //Whether the person opted in to allowing themselves to be item TF'd as a prize
special_handling = TRUE
special_collar = TRUE
/obj/item/clothing/accessory/collar/casinosentientprize/attack_self(mob/user)
. = ..(user)
if(.)
return TRUE
return TRUE
//keeping it blank so people don't tag and reset collar status
/obj/item/clothing/accessory/collar/casinosentientprize_fake
name = "Sentient Prize Collar"
desc = "A collar worn by sentient prizes registered to a SPASM. This one has been disconnected from the system and is now an accessory!"
icon_state = "casinoslave_owned"
item_state = "casinoslave_owned"
overlay_state = "casinoslave_owned"
//The gold trim from one of the qipaos, separated to an accessory to preserve the color
/obj/item/clothing/accessory/qipaogold
name = "gold trim"
desc = "Gold trim belonging to a qipao. Why would you remove this?"
icon_state = "qipaogold"
item_state = "qipaogold"
overlay_state = "qipaogold"
//Antediluvian accessory set
/obj/item/clothing/accessory/antediluvian
name = "antediluvian bracers"
desc = "A pair of metal bracers with gold inlay. They're thin and light."
icon_state = "antediluvian"
item_state = "antediluvian"
overlay_state = "antediluvian"
body_parts_covered = ARMS
/obj/item/clothing/accessory/antediluvian/loincloth
name = "antediluvian loincloth"
desc = "A lengthy loincloth that drapes over the loins, obviously. It's quite long."
icon_state = "antediluvian_loin"
item_state = "antediluvian_loin"
overlay_state = "antediluvian_loin"
body_parts_covered = LOWER_TORSO
//The cloaks below belong to this _vr file but their sprites are contained in non-_vr icon files due to
//the way the poncho/cloak equipped() proc works. Sorry for the inconvenience
/obj/item/clothing/accessory/poncho/roles/cloak/antediluvian
name = "antediluvian cloak"
desc = "A regal looking cloak of white with specks of gold woven into the fabric."
icon_state = "antediluvian_cloak"
item_state = "antediluvian_cloak"
//Other clothes that I'm too lazy to port to Polaris
/obj/item/clothing/accessory/poncho/roles/cloak/chapel
name = "bishop's cloak"
desc = "An elaborate white and gold cloak."
icon_state = "bishopcloak"
item_state = "bishopcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/chapel/alt
name = "antibishop's cloak"
desc = "An elaborate black and gold cloak. It looks just a little bit evil."
icon_state = "blackbishopcloak"
item_state = "blackbishopcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/half
name = "rough half cloak"
desc = "The latest fashion innovations by the Nanotrasen Uniform & Fashion Department have provided the brilliant invention of slicing a regular cloak in half! All the ponce, half the cost!"
icon_state = "roughcloak"
item_state = "roughcloak"
actions_types = list(/datum/action/item_action/adjust_cloak)
special_handling = TRUE
/obj/item/clothing/accessory/poncho/roles/cloak/half/update_clothing_icon()
. = ..()
if(ismob(src.loc))
var/mob/M = src.loc
M.update_inv_wear_suit()
/obj/item/clothing/accessory/poncho/roles/cloak/half/attack_self(mob/user)
. = ..(user)
if(.)
return TRUE
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]_open"
src.item_state = "[item_state]_open"
flags_inv = HIDETIE|HIDEHOLSTER
to_chat(user, "You flip the cloak over your shoulder.")
else
src.icon_state = initial(icon_state)
src.item_state = initial(item_state)
flags_inv = HIDEHOLSTER
to_chat(user, "You pull the cloak over your shoulder.")
update_clothing_icon()
/obj/item/clothing/accessory/poncho/roles/cloak/shoulder
name = "shoulder cloak"
desc = "A small cape that primarily covers the left shoulder. Might help you stand out more, not necessarily for the right reasons."
icon_state = "cape_left"
item_state = "cape_left"
/obj/item/clothing/accessory/poncho/roles/cloak/shoulder/right
desc = "A small cape that primarily covers the right shoulder. It might look a tad cooler if it was longer."
icon_state = "cape_right"
item_state = "cape_right"
//Mantles
/obj/item/clothing/accessory/poncho/roles/cloak/mantle
name = "shoulder mantle"
desc = "Not a cloak and not really a cape either, but a silky fabric that rests on the neck and shoulders alone."
icon_state = "mantle"
item_state = "mantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/cargo
name = "cargo mantle"
desc = "A shoulder mantle bearing the colors of the Supply department, with a gold lapel emblazoned upon the front."
icon_state = "qmmantle"
item_state = "qmmantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/security
name = "security mantle"
desc = "A shoulder mantle bearing the colors of the Security department, featuring rugged molding around the collar."
icon_state = "hosmantle"
item_state = "hosmantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/engineering
name = "engineering mantle"
desc = "A shoulder mantle bearing the colors of the Engineering department, accenting the pristine white fabric."
icon_state = "cemantle"
item_state = "cemantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/research
name = "research mantle"
desc = "A shoulder mantle bearing the colors of the Research department, the material slick and hydrophobic."
icon_state = "rdmantle"
item_state = "rdmantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/medical
name = "medical mantle"
desc = "A shoulder mantle bearing the general colors of the Medical department, dyed a sterile nitrile cyan."
icon_state = "cmomantle"
item_state = "cmomantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/hop
name = "head of personnel mantle"
desc = "A shoulder mantle bearing the colors of the " + JOB_HEAD_OF_PERSONNEL + "'s uniform, featuring the typical royal blue contrasted by authoritative red."
icon_state = "hopmantle"
item_state = "hopmantle"
/obj/item/clothing/accessory/poncho/roles/cloak/mantle/cap
name = "site manager mantle"
desc = "A shoulder mantle bearing the colors usually found on a " + JOB_SITE_MANAGER + ", a commanding blue with regal gold inlay."
icon_state = "capmantle"
item_state = "capmantle"
//Boat cloaks
/obj/item/clothing/accessory/poncho/roles/cloak/boat
name = "boat cloak"
desc = "A cloak that might've been worn on boats once or twice. It's just a flappy cape otherwise."
icon_state = "boatcloak"
item_state = "boatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/cap
name = "site manager boat cloak"
icon_state = "capboatcloak"
item_state = "capboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/hop
name = "head of personnel boat cloak"
icon_state = "hopboatcloak"
item_state = "hopboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/security
name = "security boat cloak"
icon_state = "secboatcloak"
item_state = "secboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/engineering
name = "engineering boat cloak"
icon_state = "engboatcloak"
item_state = "engboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/atmos
name = "atmospherics boat cloak"
icon_state = "atmosboatcloak"
item_state = "atmosboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/medical
name = "medical boat cloak"
icon_state = "medboatcloak"
item_state = "medboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/service
name = "service boat cloak"
icon_state = "botboatcloak"
item_state = "botboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/cargo
name = "cargo boat cloak"
icon_state = "supboatcloak"
item_state = "supboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/mining
name = "mining boat cloak"
icon_state = "minboatcloak"
item_state = "minboatcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/boat/science
name = "research boat cloak"
icon_state = "sciboatcloak"
item_state = "sciboatcloak"
//Shrouds
/obj/item/clothing/accessory/poncho/roles/cloak/shroud
name = "shroud cape"
desc = "A sharp looking cape that covers more of one side than the other. Just a bit edgy."
icon_state = "shroud"
item_state = "shroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/cap
name = "site manager shroud"
icon_state = "capshroud"
item_state = "capshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/hop
name = "head of personnel shroud"
icon_state = "hopshroud"
item_state = "hopshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/security
name = "security shroud"
icon_state = "secshroud"
item_state = "secshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/engineering
name = "engineering shroud"
icon_state = "engshroud"
item_state = "engshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/atmos
name = "atmospherics shroud"
icon_state = "atmosshroud"
item_state = "atmosshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/medical
name = "medical shroud"
icon_state = "medshroud"
item_state = "medshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/service
name = "service shroud"
icon_state = "botshroud"
item_state = "botshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/cargo
name = "cargo shroud"
icon_state = "supshroud"
item_state = "supshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/mining
name = "mining shroud"
icon_state = "minshroud"
item_state = "minshroud"
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/science
name = "research shroud"
icon_state = "scishroud"
item_state = "scishroud"
//Crop Jackets
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket
name = "white crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. This one's in plain white, more or less."
icon_state = "cropjacket_white"
item_state = "cropjacket_white"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/blue
name = "blue crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. Let everyone know who's in control of the situation around here."
icon_state = "cropjacket_blue"
item_state = "cropjacket_blue"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/red
name = "red crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. You could probably hide a holster under this without too much trouble."
icon_state = "cropjacket_red"
item_state = "cropjacket_red"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/green
name = "green crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. The faded green tones bring to mind the smell of antiseptics."
icon_state = "cropjacket_green"
item_state = "cropjacket_green"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/purple
name = "purple crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. This doesn't seem like very practical labwear."
icon_state = "cropjacket_purple"
item_state = "cropjacket_purple"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/orange
name = "orange crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. Perfect for keeping cool whilst showing off your gains from shifting crates."
icon_state = "cropjacket_orange"
item_state = "cropjacket_orange"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/charcoal
name = "charcoal crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. Dark and slightly edgy, just like its wearer."
icon_state = "cropjacket_charcoal"
item_state = "cropjacket_charcoal"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/marine
name = "faded reflec crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. Seems to be made of a semi-reflective material, like an EMT's jacket."
icon_state = "cropjacket_marine"
item_state = "cropjacket_marine"
/obj/item/clothing/accessory/poncho/roles/cloak/crop_jacket/drab
name = "drab crop jacket"
desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. This one's a sort of olive-drab kind of colour."
icon_state = "cropjacket_drab"
item_state = "cropjacket_drab"
//Replikant patch & jacket
/obj/item/clothing/accessory/sleekpatch
name = "sleek uniform patch"
desc = "A somewhat old-fashioned embroidered patch of Nanotrasen's logo."
icon_state = "sleekpatch"
item_state = "sleekpatch"
/obj/item/clothing/accessory/poncho/roles/cloak/custom/gestaltjacket
name = "sleek uniform jacket"
desc = "Barely more than a pair of long stirrup sleeves joined by a turtleneck. Has decorative red accents."
icon_state = "gestaltjacket"
item_state = "gestaltjacket"
//Neo Ranger Poncho
/obj/item/clothing/accessory/poncho/roles/neo_ranger
name = "ranger poncho"
desc = "Aim for the Heart, Ramon."
icon_state = "neo_ranger"
item_state = "neo_ranger"
actions_types = list(/datum/action/item_action/adjust_poncho)
special_handling = TRUE
/obj/item/clothing/accessory/poncho/roles/neo_ranger/update_clothing_icon()
. = ..()
if(ismob(src.loc))
var/mob/M = src.loc
M.update_inv_wear_suit()
/obj/item/clothing/accessory/poncho/roles/neo_ranger/attack_self(mob/user)
. = ..(user)
if(.)
return TRUE
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]_open"
src.item_state = "[item_state]_open"
flags_inv = HIDETIE|HIDEHOLSTER
to_chat(user, "You adjust your poncho.")
else
src.icon_state = initial(icon_state)
src.item_state = initial(item_state)
flags_inv = HIDEHOLSTER
to_chat(user, "You adjust your poncho.")
update_clothing_icon()
/obj/item/clothing/accessory/belt
name = "Thin Belt"
desc = "A thin belt for holding your pants up."
icon_state = "belt_thin"
item_state = "belt_thin"
slot_flags = SLOT_TIE | SLOT_BELT
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/belt/thick
name = "Thick Belt"
desc = "A thick belt for holding your pants up."
icon_state = "belt_thick"
item_state = "belt_thick"
/obj/item/clothing/accessory/belt/strap
name = "Strap Belt"
desc = "A belt with no bucklet for holding your pants up."
icon_state = "belt_strap"
item_state = "belt_strap"
/obj/item/clothing/accessory/belt/studded
name = "Studded Belt"
desc = "A studded belt for holding your pants up and looking cool."
icon_state = "belt_studded"
item_state = "belt_studded"
/obj/item/clothing/accessory/bunny_tail
name = "Bunny Tail"
desc = "A little fluffy bunny tail to spice up your outfit."
icon_state = "bunny_tail"
item_state = "bunny_tail"
slot_flags = SLOT_TIE | SLOT_BELT
slot = ACCESSORY_SLOT_DECOR