mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 13:38:41 +01:00
[MIRROR] Allows uniforms to have multiple accessories attached, removes armor from accessories [MDB IGNORE] (#22404)
* Allows uniforms to have multiple accessories attached, removes armor from accessories * Update code/modules/clothing/suits/_suits.dm * Update code/modules/clothing/under/_under.dm * merge conflicts pt1 * Updates some modular stuff --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com> Co-authored-by: Giz <vinylspiders@gmail.com> Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
This commit is contained in:
co-authored by
MrMelbert
Pinta
Giz
Giz
parent
4aff5c8efc
commit
d85e590b8d
@@ -1,6 +1,21 @@
|
||||
// /obj/item/clothing
|
||||
/// (/obj/item/clothing, visor_state) - When a clothing gets it's visor toggled.
|
||||
#define COMSIG_CLOTHING_VISOR_TOGGLE "clothing_visor_toggle"
|
||||
// /obj/item/clothing
|
||||
/// Sent when mobs try to equip clothing on others through attacking
|
||||
#define COMSIG_CLOTHING_ATTACK_EQUIP "clothing_attack_equip"
|
||||
/// From an undersuit being adjusted: ()
|
||||
#define COMSIG_CLOTHING_UNDER_ADJUSTED "clothing_under_adjusted"
|
||||
|
||||
// Accessory sending to clothing
|
||||
/// /obj/item/clothing/accessory/successful_attach : (obj/item/clothing/under/attached_to)
|
||||
/// The accessory, at the point of signal sent, is in the clothing's accessory list / loc
|
||||
#define COMSIG_CLOTHING_ACCESSORY_ATTACHED "clothing_accessory_pinned"
|
||||
/// /obj/item/clothing/accessory/detach : (obj/item/clothing/under/detach_from)
|
||||
/// The accessory, at the point of signal sent, is no longer in the accessory list but may still be in the loc
|
||||
#define COMSIG_CLOTHING_ACCESSORY_DETACHED "clothing_accessory_unpinned"
|
||||
|
||||
// To accessories themselves
|
||||
/// /obj/item/clothing/accessory/successful_attach : (obj/item/clothing/under/attached_to)
|
||||
/// The accessory, at the point of signal sent, is in the clothing's accessory list / loc
|
||||
#define COMSIG_ACCESSORY_ATTACHED "accessory_pinned"
|
||||
/// /obj/item/clothing/accessory/detach : (obj/item/clothing/under/detach_from)
|
||||
/// The accessory, at the point of signal sent, is no longer in the accessory list but may still be in the loc
|
||||
#define COMSIG_ACCESSORY_DETACHED "accessory_unpinned"
|
||||
|
||||
@@ -194,8 +194,8 @@
|
||||
timeout = 3 MINUTES
|
||||
|
||||
/datum/mood_event/hope_lavaland
|
||||
description = "What a peculiar emblem. It makes me feel hopeful for my future."
|
||||
mood_change = 10
|
||||
description = "What a peculiar emblem. It makes me feel hopeful for my future."
|
||||
mood_change = 6
|
||||
|
||||
/datum/mood_event/confident_mane
|
||||
description = "I'm feeling confident with a head full of hair."
|
||||
|
||||
@@ -1192,8 +1192,7 @@
|
||||
medical_record_text = "Patient's immune system responds violently to [allergy_string]"
|
||||
|
||||
var/mob/living/carbon/human/human_holder = quirk_holder
|
||||
var/obj/item/clothing/accessory/allergy_dogtag/dogtag = new(get_turf(human_holder))
|
||||
dogtag.display = allergy_string
|
||||
var/obj/item/clothing/accessory/dogtag/allergy/dogtag = new(get_turf(human_holder), allergy_string)
|
||||
|
||||
give_item_to_holder(dogtag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS), flavour_text = "Make sure medical staff can see this...")
|
||||
|
||||
|
||||
+13
-8
@@ -238,19 +238,24 @@ FAN HUDs! For identifying other fans on-sight.
|
||||
|
||||
/mob/living/carbon/human/proc/fan_hud_set_fandom()
|
||||
var/image/holder = hud_list[FAN_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
var/icon/hud_icon = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = hud_icon.Height() - world.icon_size
|
||||
holder.icon_state = "hudfan_no"
|
||||
var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING)
|
||||
if(!U)
|
||||
|
||||
var/obj/item/clothing/under/undershirt = w_uniform
|
||||
if(!istype(undershirt))
|
||||
set_hud_image_inactive(FAN_HUD)
|
||||
return
|
||||
|
||||
if(istype(U.attached_accessory, /obj/item/clothing/accessory/mime_fan_pin))
|
||||
holder.icon_state = "mime_fan_pin"
|
||||
for(var/accessory in undershirt.attached_accessories)
|
||||
if(istype(accessory, /obj/item/clothing/accessory/mime_fan_pin))
|
||||
holder.icon_state = "mime_fan_pin"
|
||||
break
|
||||
|
||||
if(istype(accessory, /obj/item/clothing/accessory/clown_enjoyer_pin))
|
||||
holder.icon_state = "clown_enjoyer_pin"
|
||||
break
|
||||
|
||||
else if(istype(U.attached_accessory, /obj/item/clothing/accessory/clown_enjoyer_pin))
|
||||
holder.icon_state = "clown_enjoyer_pin"
|
||||
set_hud_image_active(FAN_HUD)
|
||||
return
|
||||
|
||||
|
||||
@@ -293,7 +293,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
|
||||
if(.)
|
||||
var/obj/item/clothing/under/U = .
|
||||
can_adjust = initial(U.can_adjust)
|
||||
if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable
|
||||
if(!can_adjust && adjusted == ALT_STYLE) //we deadjust the uniform if it's now unadjustable
|
||||
toggle_jumpsuit_adjust()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/machine_wash(obj/machinery/washing_machine/washer)
|
||||
|
||||
@@ -41,14 +41,16 @@
|
||||
. += mutable_appearance(bloodfile2use, "[blood_overlay_type]blood")
|
||||
//SKYRAT EDIT CHANGE END
|
||||
|
||||
var/mob/living/carbon/human/M = loc
|
||||
if(!ishuman(M) || !M.w_uniform)
|
||||
var/mob/living/carbon/human/wearer = loc
|
||||
if(!ishuman(wearer) || !wearer.w_uniform)
|
||||
return
|
||||
var/obj/item/clothing/under/U = M.w_uniform
|
||||
if(istype(U) && U.attached_accessory)
|
||||
var/obj/item/clothing/accessory/A = U.attached_accessory
|
||||
if(A.above_suit)
|
||||
. += U.modify_accessory_overlay() // SKYRAT EDIT CHANGE - ORIGINAL: . += U.accessory_overlay
|
||||
var/obj/item/clothing/under/undershirt = wearer.w_uniform
|
||||
if(!istype(undershirt) || !LAZYLEN(undershirt.attached_accessories))
|
||||
return
|
||||
|
||||
var/obj/item/clothing/accessory/displayed = undershirt.attached_accessories[1]
|
||||
if(displayed.above_suit)
|
||||
. += undershirt.modify_accessory_overlay() // SKYRAT EDIT CHANGE - ORIGINAL: . += undershirt.accessory_overlay
|
||||
|
||||
/obj/item/clothing/suit/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
|
||||
..()
|
||||
|
||||
@@ -11,15 +11,35 @@
|
||||
drop_sound = 'sound/items/handling/cloth_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
|
||||
limb_integrity = 30
|
||||
|
||||
/// Has this undersuit been freshly laundered and, as such, imparts a mood bonus for wearing
|
||||
var/freshly_laundered = FALSE
|
||||
|
||||
// Alt style handling
|
||||
/// Can this suit be adjustd up or down to an alt style
|
||||
var/can_adjust = TRUE
|
||||
/// If adjusted what style are we currently using?
|
||||
var/adjusted = NORMAL_STYLE
|
||||
/// For adjusted/rolled-down jumpsuits. FALSE = exposes chest and arms, TRUE = exposes arms only
|
||||
var/alt_covers_chest = FALSE
|
||||
/// The variable containing the flags for how the woman uniform cropping is supposed to interact with the sprite.
|
||||
var/female_sprite_flags = FEMALE_UNIFORM_FULL
|
||||
var/has_sensor = HAS_SENSORS // For the crew computer
|
||||
|
||||
// Sensor handling
|
||||
/// Does this undersuit have suit sensors in general
|
||||
var/has_sensor = HAS_SENSORS
|
||||
/// Does this undersuit spawn with a random sensor value
|
||||
var/random_sensor = TRUE
|
||||
/// What is the active sensor mode of this udnersuit
|
||||
var/sensor_mode = NO_SENSORS
|
||||
var/can_adjust = TRUE
|
||||
var/adjusted = NORMAL_STYLE
|
||||
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
|
||||
var/obj/item/clothing/accessory/attached_accessory
|
||||
|
||||
// Accessory handling (Can be componentized eventually)
|
||||
/// The max number of accessories we can have on this suit.
|
||||
var/max_number_of_accessories = 5
|
||||
/// A list of all accessories attached to us.
|
||||
var/list/obj/item/clothing/accessory/attached_accessories
|
||||
/// The overlay of the accessory we're demonstrating. Only index 1 will show up.
|
||||
/// This is the overlay on the MOB, not the item itself.
|
||||
var/mutable_appearance/accessory_overlay
|
||||
|
||||
/datum/armor/clothing_under
|
||||
@@ -32,32 +52,32 @@
|
||||
//make the sensor mode favor higher levels, except coords.
|
||||
sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF)
|
||||
register_context()
|
||||
AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING, body = TRUE)
|
||||
|
||||
/obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
|
||||
var/screentip_change = FALSE
|
||||
. = NONE
|
||||
|
||||
if(isnull(held_item) && has_sensor == HAS_SENSORS)
|
||||
context[SCREENTIP_CONTEXT_RMB] = "Toggle suit sensors"
|
||||
screentip_change = TRUE
|
||||
. = CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
if(istype(held_item, /obj/item/clothing/accessory) && !attached_accessory)
|
||||
var/obj/item/clothing/accessory/accessory = held_item
|
||||
if(accessory.can_attach_accessory(src, user))
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Attach accessory"
|
||||
screentip_change = TRUE
|
||||
if(istype(held_item, /obj/item/clothing/accessory) && length(attached_accessories) < max_number_of_accessories)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Attach accessory"
|
||||
. = CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
if(LAZYLEN(attached_accessories))
|
||||
context[SCREENTIP_CONTEXT_ALT_RMB] = "Remove accessory"
|
||||
. = CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
if(istype(held_item, /obj/item/stack/cable_coil) && has_sensor == BROKEN_SENSORS)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Repair suit sensors"
|
||||
screentip_change = TRUE
|
||||
. = CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
if(attached_accessory)
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove accessory"
|
||||
screentip_change = TRUE
|
||||
else if(can_adjust)
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = adjusted == ALT_STYLE ? "Wear normally" : "Wear casually"
|
||||
screentip_change = TRUE
|
||||
if(can_adjust && adjusted != DIGITIGRADE_STYLE)
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Wear [adjusted == ALT_STYLE ? "normally" : "casually"]"
|
||||
. = CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
return screentip_change ? CONTEXTUAL_SCREENTIP_SET : NONE
|
||||
return .
|
||||
|
||||
/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use = null, mutant_styles = NONE)
|
||||
. = ..()
|
||||
@@ -71,15 +91,18 @@
|
||||
if(accessory_overlay)
|
||||
. += modify_accessory_overlay() // SKYRAT EDIT CHANGE - ORIGINAL: . += accessory_overlay
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
|
||||
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
C.use(1)
|
||||
/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, params)
|
||||
if(has_sensor == BROKEN_SENSORS && istype(attacking_item, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/cabling = attacking_item
|
||||
to_chat(user, span_notice("You repair the suit sensors on [src] with [cabling]."))
|
||||
cabling.use(1)
|
||||
has_sensor = HAS_SENSORS
|
||||
to_chat(user,span_notice("You repair the suit sensors on [src] with [C]."))
|
||||
return TRUE
|
||||
if(!attach_accessory(I, user))
|
||||
return ..()
|
||||
|
||||
if(istype(attacking_item, /obj/item/clothing/accessory))
|
||||
return attach_accessory(attacking_item, user)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/attack_hand_secondary(mob/user, params)
|
||||
. = ..()
|
||||
@@ -90,67 +113,55 @@
|
||||
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
||||
|
||||
/obj/item/clothing/under/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
|
||||
..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_worn_undersuit()
|
||||
. = ..()
|
||||
if(damaged_state == CLOTHING_SHREDDED && has_sensor > NO_SENSORS)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
else if(damaged_state == CLOTHING_PRISTINE && has_sensor == BROKEN_SENSORS)
|
||||
has_sensor = HAS_SENSORS
|
||||
update_appearance()
|
||||
|
||||
/obj/item/clothing/under/emp_act(severity)
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
return
|
||||
if(has_sensor > NO_SENSORS)
|
||||
if(severity <= EMP_HEAVY)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M,span_warning("[src]'s sensors short out!"))
|
||||
else
|
||||
sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M,span_warning("The sensors on the [src] change rapidly!"))
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/ooman = loc
|
||||
if(ooman.w_uniform == src)
|
||||
ooman.update_suit_sensors()
|
||||
if(has_sensor == NO_SENSORS || has_sensor == BROKEN_SENSORS)
|
||||
return
|
||||
|
||||
if(severity <= EMP_HEAVY)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M,span_warning("[src]'s sensors short out!"))
|
||||
|
||||
else
|
||||
sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M,span_warning("The sensors on the [src] change rapidly!"))
|
||||
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/ooman = loc
|
||||
if(ooman.w_uniform == src)
|
||||
ooman.update_suit_sensors()
|
||||
|
||||
/obj/item/clothing/under/visual_equipped(mob/user, slot)
|
||||
..()
|
||||
if(adjusted)
|
||||
adjusted = NORMAL_STYLE
|
||||
female_sprite_flags = initial(female_sprite_flags)
|
||||
if(!alt_covers_chest)
|
||||
body_parts_covered |= CHEST
|
||||
. = ..()
|
||||
if(adjusted == ALT_STYLE)
|
||||
adjust_to_normal()
|
||||
|
||||
/* SKYRAT EDIT REMOVAL - This breaks jumpsuit adjustment. Plus, we don't support it.
|
||||
if((supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.bodytype & BODYTYPE_DIGITIGRADE)
|
||||
var/mob/living/carbon/human/wearer = user
|
||||
if(wearer.bodytype & BODYTYPE_DIGITIGRADE)
|
||||
adjusted = DIGITIGRADE_STYLE
|
||||
H.update_worn_undersuit()
|
||||
*/ // SKYRAT EDIT END
|
||||
update_appearance()
|
||||
*/ // SKYRAT EDIT END
|
||||
|
||||
if(attached_accessory && !(slot & ITEM_SLOT_HANDS) && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
attached_accessory.on_uniform_equip(src, user)
|
||||
H.fan_hud_set_fandom()
|
||||
if(attached_accessory.above_suit)
|
||||
H.update_worn_oversuit()
|
||||
|
||||
/obj/item/clothing/under/dropped(mob/user)
|
||||
if(attached_accessory)
|
||||
attached_accessory.on_uniform_dropped(src, user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.fan_hud_set_fandom()
|
||||
if(attached_accessory.above_suit)
|
||||
H.update_worn_oversuit()
|
||||
/obj/item/clothing/under/equipped(mob/living/user, slot)
|
||||
..()
|
||||
if((slot & ITEM_SLOT_ICLOTHING) && freshly_laundered)
|
||||
freshly_laundered = FALSE
|
||||
user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
|
||||
|
||||
/mob/living/carbon/human/update_suit_sensors()
|
||||
. = ..()
|
||||
@@ -166,78 +177,98 @@
|
||||
/mob/living/carbon/human/dummy/update_sensor_list()
|
||||
return
|
||||
|
||||
/obj/item/clothing/under/proc/attach_accessory(obj/item/tool, mob/user, notifyAttach = 1)
|
||||
. = FALSE
|
||||
if(!istype(tool, /obj/item/clothing/accessory))
|
||||
// End suit sensor handling
|
||||
|
||||
/// Attach the passed accessory to the clothing item
|
||||
/obj/item/clothing/under/proc/attach_accessory(obj/item/clothing/accessory/accessory, mob/living/user, attach_message = TRUE)
|
||||
if(!istype(accessory))
|
||||
return
|
||||
var/obj/item/clothing/accessory/accessory = tool
|
||||
if(attached_accessory)
|
||||
if(length(attached_accessories) >= max_number_of_accessories)
|
||||
if(user)
|
||||
to_chat(user, span_warning("[src] already has an accessory."))
|
||||
balloon_alert(user, "too many accessories!")
|
||||
return
|
||||
|
||||
if(!accessory.can_attach_accessory(src, user)) //Make sure the suit has a place to put the accessory.
|
||||
if(!accessory.can_attach_accessory(src, user))
|
||||
return
|
||||
if(user && !user.temporarilyRemoveItemFromInventory(accessory))
|
||||
return
|
||||
if(!accessory.attach(src, user))
|
||||
return
|
||||
|
||||
. = TRUE
|
||||
if(user && notifyAttach)
|
||||
to_chat(user, span_notice("You attach [accessory] to [src]."))
|
||||
LAZYADD(attached_accessories, accessory)
|
||||
accessory.forceMove(src)
|
||||
// Allow for accessories to react to the acccessory list now
|
||||
accessory.successful_attach(src)
|
||||
|
||||
var/accessory_color = attached_accessory.icon_state
|
||||
accessory_overlay = mutable_appearance(attached_accessory.worn_icon, "[accessory_color]")
|
||||
accessory_overlay.alpha = attached_accessory.alpha
|
||||
accessory_overlay.color = attached_accessory.color
|
||||
if(user && attach_message)
|
||||
balloon_alert(user, "accessory attached")
|
||||
|
||||
if(isnull(accessory_overlay))
|
||||
create_accessory_overlay()
|
||||
|
||||
update_appearance()
|
||||
if(!ishuman(loc))
|
||||
return TRUE
|
||||
|
||||
/// Removes (pops) the topmost accessory from the accessories list and puts it in the user's hands if supplied
|
||||
/obj/item/clothing/under/proc/pop_accessory(mob/living/user, attach_message = TRUE)
|
||||
var/obj/item/clothing/accessory/popped_accessory = attached_accessories[1]
|
||||
remove_accessory(popped_accessory)
|
||||
|
||||
if(!user)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/holder = loc
|
||||
holder.update_worn_undersuit()
|
||||
holder.update_worn_oversuit()
|
||||
holder.fan_hud_set_fandom()
|
||||
user.put_in_hands(popped_accessory)
|
||||
if(attach_message)
|
||||
popped_accessory.balloon_alert(user, "accessory removed")
|
||||
|
||||
/obj/item/clothing/under/proc/remove_accessory(mob/user)
|
||||
. = FALSE
|
||||
if(!isliving(user))
|
||||
return
|
||||
if(!can_use(user))
|
||||
return
|
||||
/// Removes the passed accesory from our accessories list
|
||||
/obj/item/clothing/under/proc/remove_accessory(obj/item/clothing/accessory/removed)
|
||||
if(removed == attached_accessories[1])
|
||||
accessory_overlay = null
|
||||
|
||||
if(!attached_accessory)
|
||||
return
|
||||
// Remove it from the list before detaching
|
||||
LAZYREMOVE(attached_accessories, removed)
|
||||
removed.detach(src)
|
||||
|
||||
. = TRUE
|
||||
var/obj/item/clothing/accessory/accessory = attached_accessory
|
||||
attached_accessory.detach(src, user)
|
||||
if(user.put_in_hands(accessory))
|
||||
to_chat(user, span_notice("You detach [accessory] from [src]."))
|
||||
else
|
||||
to_chat(user, span_notice("You detach [accessory] from [src] and it falls on the floor."))
|
||||
if(isnull(accessory_overlay) && LAZYLEN(attached_accessories))
|
||||
create_accessory_overlay()
|
||||
|
||||
update_appearance()
|
||||
if(!ishuman(loc))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/holder = loc
|
||||
holder.update_worn_undersuit()
|
||||
holder.update_worn_oversuit()
|
||||
holder.fan_hud_set_fandom()
|
||||
/// Handles creating the worn overlay mutable appearance
|
||||
/// Only the first accessory attached is displayed (currently)
|
||||
/obj/item/clothing/under/proc/create_accessory_overlay()
|
||||
var/obj/item/clothing/accessory/prime_accessory = attached_accessories[1]
|
||||
accessory_overlay = mutable_appearance(prime_accessory.worn_icon, prime_accessory.icon_state)
|
||||
accessory_overlay.alpha = prime_accessory.alpha
|
||||
accessory_overlay.color = prime_accessory.color
|
||||
|
||||
/obj/item/clothing/under/Exited(atom/movable/gone, direction)
|
||||
. = ..()
|
||||
// If one of our accessories was moved out, handle it
|
||||
if(gone in attached_accessories)
|
||||
remove_accessory(gone)
|
||||
|
||||
/// Helper to remove all attachments to the passed location
|
||||
/obj/item/clothing/under/proc/dump_attachments(atom/drop_to = drop_location())
|
||||
for(var/obj/item/clothing/accessory/worn_accessory as anything in attached_accessories)
|
||||
remove_accessory(worn_accessory)
|
||||
worn_accessory.forceMove(drop_to)
|
||||
|
||||
/obj/item/clothing/under/atom_destruction(damage_flag)
|
||||
dump_attachments()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/Destroy()
|
||||
QDEL_LAZYLIST(attached_accessories)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/examine(mob/user)
|
||||
. = ..()
|
||||
if(can_adjust)
|
||||
if(adjusted == ALT_STYLE)
|
||||
. += "Alt-click on [src] to wear it normally."
|
||||
else
|
||||
. += "Alt-click on [src] to wear it casually."
|
||||
if (has_sensor == BROKEN_SENSORS)
|
||||
. += "Its sensors appear to be shorted out."
|
||||
. += "Alt-click on [src] to wear it [adjusted == ALT_STYLE ? "normally" : "casually"]."
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
. += "Its sensors appear to be shorted out. You could repair it with some cabling."
|
||||
else if(has_sensor > NO_SENSORS)
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_OFF)
|
||||
@@ -248,48 +279,34 @@
|
||||
. += "Its vital tracker appears to be enabled."
|
||||
if(SENSOR_COORDS)
|
||||
. += "Its vital tracker and tracking beacon appear to be enabled."
|
||||
if(attached_accessory)
|
||||
. += "\A [attached_accessory] is attached to it."
|
||||
if(LAZYLEN(attached_accessories))
|
||||
var/list/accessories = list_accessories_with_icon(user)
|
||||
. += "It has [english_list(accessories)] attached."
|
||||
. += "Alt-Right-Click to remove [attached_accessories[1]]."
|
||||
|
||||
/// Helper to list out all accessories with an icon besides it, for use in examine
|
||||
/obj/item/clothing/under/proc/list_accessories_with_icon(mob/user)
|
||||
var/list/all_accessories = list()
|
||||
for(var/obj/item/clothing/accessory/attached as anything in attached_accessories)
|
||||
all_accessories += attached.get_examine_string(user)
|
||||
|
||||
return all_accessories
|
||||
|
||||
/obj/item/clothing/under/verb/toggle()
|
||||
set name = "Adjust Suit Sensors"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
var/mob/user_mob = usr
|
||||
if (isdead(user_mob))
|
||||
return
|
||||
if (!can_use(user_mob))
|
||||
return
|
||||
if(has_sensor == LOCKED_SENSORS)
|
||||
to_chat(user_mob, "The controls are locked.")
|
||||
return
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
to_chat(user_mob, "The sensors have shorted out!")
|
||||
return
|
||||
if(has_sensor <= NO_SENSORS)
|
||||
to_chat(user_mob, "This suit does not have any sensors.")
|
||||
if(!can_toggle_sensors(user_mob))
|
||||
return
|
||||
|
||||
var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon")
|
||||
var/switchMode = tgui_input_list(user_mob, "Select a sensor mode", "Suit Sensors", modes, modes[sensor_mode + 1])
|
||||
if(isnull(switchMode))
|
||||
return
|
||||
|
||||
if (!can_use(user_mob)) //make sure they didn't hold the window open.
|
||||
return
|
||||
if(get_dist(user_mob, src) > 1)
|
||||
to_chat(user_mob, span_warning("You have moved too far away!"))
|
||||
if(!can_toggle_sensors(user_mob))
|
||||
return
|
||||
|
||||
if(has_sensor == LOCKED_SENSORS)
|
||||
to_chat(user_mob, "The controls are locked.")
|
||||
return
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
to_chat(user_mob, "The sensors have shorted out!")
|
||||
return
|
||||
if(has_sensor <= NO_SENSORS)
|
||||
to_chat(user_mob, "This suit does not have any sensors.")
|
||||
return
|
||||
sensor_mode = modes.Find(switchMode) - 1
|
||||
if (loc == user_mob)
|
||||
switch(sensor_mode)
|
||||
@@ -307,78 +324,114 @@
|
||||
if(H.w_uniform == src)
|
||||
H.update_suit_sensors()
|
||||
|
||||
/// Checks if the toggler is allowed to toggle suit sensors currently
|
||||
/obj/item/clothing/under/proc/can_toggle_sensors(mob/toggler)
|
||||
if(!can_use(toggler) || toggler.stat == DEAD) //make sure they didn't hold the window open.
|
||||
return FALSE
|
||||
if(get_dist(toggler, src) > 1)
|
||||
balloon_alert(toggler, "too far!")
|
||||
return FALSE
|
||||
|
||||
switch(has_sensor)
|
||||
if(LOCKED_SENSORS)
|
||||
balloon_alert(toggler, "sensor controls locked!")
|
||||
return FALSE
|
||||
if(BROKEN_SENSORS)
|
||||
balloon_alert(toggler, "sensors shorted!")
|
||||
return FALSE
|
||||
if(NO_SENSORS)
|
||||
balloon_alert(toggler, "no sensors to ajdust!")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/under/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
if(!can_adjust)
|
||||
balloon_alert(user, "can't be adjusted!")
|
||||
return
|
||||
if(!can_use(user))
|
||||
return
|
||||
rolldown()
|
||||
|
||||
/obj/item/clothing/under/alt_click_secondary(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
if(!LAZYLEN(attached_accessories))
|
||||
balloon_alert(user, "no accessories to remove!")
|
||||
return
|
||||
if(!user.can_perform_action(src, NEED_DEXTERITY))
|
||||
return
|
||||
if(attached_accessory)
|
||||
remove_accessory(user)
|
||||
else
|
||||
rolldown()
|
||||
|
||||
pop_accessory(user)
|
||||
|
||||
/obj/item/clothing/under/verb/jumpsuit_adjust()
|
||||
set name = "Adjust Jumpsuit Style"
|
||||
set category = null
|
||||
set src in usr
|
||||
|
||||
if(!can_adjust)
|
||||
balloon_alert(usr, "can't be adjusted!")
|
||||
return
|
||||
if(!can_use(usr))
|
||||
return
|
||||
rolldown()
|
||||
|
||||
/obj/item/clothing/under/proc/rolldown()
|
||||
if(!can_use(usr))
|
||||
return
|
||||
if(!can_adjust)
|
||||
to_chat(usr, span_warning("You cannot wear this suit any differently!"))
|
||||
return
|
||||
if(toggle_jumpsuit_adjust())
|
||||
to_chat(usr, span_notice("You adjust the suit to wear it more casually."))
|
||||
else
|
||||
to_chat(usr, span_notice("You adjust the suit back to normal."))
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.update_worn_undersuit()
|
||||
H.update_body()
|
||||
|
||||
update_appearance()
|
||||
|
||||
/// Helper to toggle the jumpsuit style, if possible
|
||||
/// Returns the new state
|
||||
/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
|
||||
if(adjusted == DIGITIGRADE_STYLE)
|
||||
return
|
||||
adjusted = !adjusted
|
||||
if(adjusted)
|
||||
if(!(female_sprite_flags & FEMALE_UNIFORM_TOP_ONLY))
|
||||
female_sprite_flags = NO_FEMALE_UNIFORM
|
||||
if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted (and also the arms, realistically)
|
||||
body_parts_covered &= ~CHEST
|
||||
body_parts_covered &= ~ARMS
|
||||
else
|
||||
female_sprite_flags = initial(female_sprite_flags)
|
||||
if(!alt_covers_chest)
|
||||
body_parts_covered |= CHEST
|
||||
body_parts_covered |= ARMS
|
||||
if(!LAZYLEN(damage_by_parts))
|
||||
return adjusted
|
||||
for(var/zone in list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) // ugly check to make sure we don't reenable protection on a disabled part
|
||||
if(damage_by_parts[zone] > limb_integrity)
|
||||
body_parts_covered &= body_zone2cover_flags(zone)
|
||||
switch(adjusted)
|
||||
if(DIGITIGRADE_STYLE)
|
||||
return
|
||||
|
||||
if(NORMAL_STYLE)
|
||||
adjust_to_alt()
|
||||
|
||||
if(ALT_STYLE)
|
||||
adjust_to_normal()
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_CLOTHING_UNDER_ADJUSTED)
|
||||
return adjusted
|
||||
|
||||
/// Helper to reset to normal jumpsuit state
|
||||
/obj/item/clothing/under/proc/adjust_to_normal()
|
||||
adjusted = NORMAL_STYLE
|
||||
female_sprite_flags = initial(female_sprite_flags)
|
||||
if(!alt_covers_chest)
|
||||
body_parts_covered |= CHEST
|
||||
body_parts_covered |= ARMS
|
||||
if(LAZYLEN(damage_by_parts))
|
||||
// ugly check to make sure we don't reenable protection on a disabled part
|
||||
for(var/zone in list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
|
||||
if(damage_by_parts[zone] > limb_integrity)
|
||||
body_parts_covered &= body_zone2cover_flags(zone)
|
||||
|
||||
/// Helper to adjust to alt jumpsuit state
|
||||
/obj/item/clothing/under/proc/adjust_to_alt()
|
||||
adjusted = ALT_STYLE
|
||||
if(!(female_sprite_flags & FEMALE_UNIFORM_TOP_ONLY))
|
||||
female_sprite_flags = NO_FEMALE_UNIFORM
|
||||
if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted (and also the arms, realistically)
|
||||
body_parts_covered &= ~CHEST
|
||||
body_parts_covered &= ~ARMS
|
||||
|
||||
/obj/item/clothing/under/can_use(mob/user)
|
||||
if(ismob(user) && !user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/rank
|
||||
dying_key = DYE_REGISTRY_UNDER
|
||||
|
||||
/obj/item/clothing/under/proc/dump_attachment()
|
||||
if(!attached_accessory)
|
||||
return
|
||||
var/atom/drop_location = drop_location()
|
||||
attached_accessory.transform *= 2
|
||||
attached_accessory.pixel_x -= 8
|
||||
attached_accessory.pixel_y += 8
|
||||
if(drop_location)
|
||||
attached_accessory.forceMove(drop_location)
|
||||
cut_overlays()
|
||||
attached_accessory = null
|
||||
accessory_overlay = null
|
||||
update_appearance()
|
||||
|
||||
/obj/item/clothing/under/rank/atom_destruction(damage_flag)
|
||||
dump_attachment()
|
||||
return ..()
|
||||
|
||||
@@ -1,523 +0,0 @@
|
||||
/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals and armbands, this accessory system is being kept as-is
|
||||
name = "Accessory"
|
||||
desc = "Something has gone wrong!"
|
||||
icon = 'icons/obj/clothing/accessories.dmi'
|
||||
worn_icon = 'icons/mob/clothing/accessories.dmi'
|
||||
icon_state = "plasma"
|
||||
inhand_icon_state = "" //no inhands
|
||||
slot_flags = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
/// Whether or not the accessory displays through suits and the like.
|
||||
var/above_suit = TRUE
|
||||
/// TRUE if shown as a small icon in corner, FALSE if overlayed
|
||||
var/minimize_when_attached = TRUE
|
||||
/// What equipment slot the accessory attaches to.
|
||||
var/attachment_slot = CHEST
|
||||
|
||||
/obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/U, mob/user)
|
||||
if(!attachment_slot || (U && U.body_parts_covered & attachment_slot))
|
||||
return TRUE
|
||||
if(user)
|
||||
to_chat(user, span_warning("There doesn't seem to be anywhere to put [src]..."))
|
||||
|
||||
/obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user)
|
||||
if(atom_storage)
|
||||
if(U.atom_storage)
|
||||
return FALSE
|
||||
U.clone_storage(atom_storage)
|
||||
U.atom_storage.set_real_location(src)
|
||||
U.attached_accessory = src
|
||||
forceMove(U)
|
||||
layer = FLOAT_LAYER
|
||||
plane = FLOAT_PLANE
|
||||
if(minimize_when_attached)
|
||||
transform *= 0.5 //halve the size so it doesn't overpower the under
|
||||
pixel_x += 8
|
||||
pixel_y -= 8
|
||||
U.add_overlay(src)
|
||||
|
||||
U.set_armor(U.get_armor().add_other_armor(get_armor()))
|
||||
|
||||
if(isliving(user))
|
||||
on_uniform_equip(U, user)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/U, user)
|
||||
if(U.atom_storage && U.atom_storage.real_location?.resolve() == src)
|
||||
QDEL_NULL(U.atom_storage)
|
||||
|
||||
U.set_armor(U.get_armor().subtract_other_armor(get_armor()))
|
||||
|
||||
if(isliving(user))
|
||||
on_uniform_dropped(U, user)
|
||||
|
||||
if(minimize_when_attached)
|
||||
transform *= 2
|
||||
pixel_x -= 8
|
||||
pixel_y += 8
|
||||
layer = initial(layer)
|
||||
SET_PLANE_IMPLICIT(src, initial(plane))
|
||||
U.cut_overlays()
|
||||
U.attached_accessory = null
|
||||
U.accessory_overlay = null
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user)
|
||||
return
|
||||
|
||||
/obj/item/clothing/accessory/proc/on_uniform_dropped(obj/item/clothing/under/U, user)
|
||||
return
|
||||
|
||||
/obj/item/clothing/accessory/attack_self_secondary(mob/user)
|
||||
if(user.can_perform_action(src, NEED_DEXTERITY))
|
||||
above_suit = !above_suit
|
||||
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/accessory/examine(mob/user)
|
||||
. = ..()
|
||||
. += span_notice("\The [src] can be attached to a uniform. Alt-click to remove it once attached.")
|
||||
. += span_notice("\The [src] can be worn above or below your suit. Right-click to toggle.")
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat
|
||||
name = "waistcoat"
|
||||
desc = "For some classy, murderous fun."
|
||||
icon_state = "waistcoat"
|
||||
inhand_icon_state = "wcoat"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = null
|
||||
greyscale_config = /datum/greyscale_config/waistcoat
|
||||
greyscale_config_worn = /datum/greyscale_config/waistcoat_worn
|
||||
greyscale_colors = "#414344"
|
||||
flags_1 = IS_PLAYER_COLORABLE_1
|
||||
|
||||
/obj/item/clothing/accessory/vest_sheriff
|
||||
name = "sheriff vest"
|
||||
desc = "Now you just have to pick your favourite deputy."
|
||||
icon_state = "vest_sheriff"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
inhand_icon_state = "vest_sheriff"
|
||||
minimize_when_attached = TRUE
|
||||
attachment_slot = null
|
||||
|
||||
/obj/item/clothing/accessory/maidcorset
|
||||
name = "maid corset"
|
||||
desc = "The final touch that holds it all together."
|
||||
icon_state = "maidcorset"
|
||||
inhand_icon_state = "maidapron"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = null
|
||||
|
||||
/obj/item/clothing/accessory/maidapron
|
||||
name = "maid apron"
|
||||
desc = "The best part of a maid costume."
|
||||
icon_state = "maidapron"
|
||||
inhand_icon_state = "maidapron"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = null
|
||||
|
||||
//////////
|
||||
//Medals//
|
||||
//////////
|
||||
|
||||
/obj/item/clothing/accessory/medal
|
||||
name = "bronze medal"
|
||||
desc = "A bronze medal."
|
||||
icon_state = "bronze"
|
||||
custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT)
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/medaltype = "medal" //Sprite used for medalbox
|
||||
var/commended = FALSE
|
||||
|
||||
//Pinning medals on people
|
||||
/obj/item/clothing/accessory/medal/attack(mob/living/carbon/human/M, mob/living/user)
|
||||
if(ishuman(M) && !user.combat_mode)
|
||||
|
||||
if(M.wear_suit)
|
||||
if((M.wear_suit.flags_inv & HIDEJUMPSUIT)) //Check if the jumpsuit is covered
|
||||
to_chat(user, span_warning("Medals can only be pinned on jumpsuits."))
|
||||
return
|
||||
|
||||
if(M.w_uniform)
|
||||
var/obj/item/clothing/under/U = M.w_uniform
|
||||
var/delay = 20
|
||||
if(user == M)
|
||||
delay = 0
|
||||
else
|
||||
user.visible_message(span_notice("[user] is trying to pin [src] on [M]'s chest."), \
|
||||
span_notice("You try to pin [src] on [M]'s chest."))
|
||||
var/input
|
||||
if(!commended && user != M)
|
||||
input = tgui_input_text(user, "Reason for this commendation? It will be recorded by Nanotrasen.", "Commendation", max_length = 140)
|
||||
if(do_after(user, delay, target = M))
|
||||
if(U.attach_accessory(src, user, 0)) //Attach it, do not notify the user of the attachment
|
||||
if(user == M)
|
||||
to_chat(user, span_notice("You attach [src] to [U]."))
|
||||
else
|
||||
user.visible_message(span_notice("[user] pins \the [src] on [M]'s chest."), \
|
||||
span_notice("You pin \the [src] on [M]'s chest."))
|
||||
if(input)
|
||||
SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[user.real_name]", "commendee" = "[M.real_name]", "medal" = "[src]", "reason" = input))
|
||||
GLOB.commendations += "[user.real_name] awarded <b>[M.real_name]</b> the <span class='medaltext'>[name]</span>! \n- [input]"
|
||||
commended = TRUE
|
||||
desc += "<br>The inscription reads: [input] - [user.real_name]"
|
||||
M.log_message("was given the following commendation by <b>[key_name(user)]</b>: [input]", LOG_GAME, color = "green")
|
||||
message_admins("<b>[key_name_admin(M)]</b> was given the following commendation by <b>[key_name_admin(user)]</b>: [input]")
|
||||
add_memory_in_range(M, 7, /datum/memory/received_medal, protagonist = M, deuteragonist = user, medal_type = src, medal_text = input)
|
||||
|
||||
else
|
||||
to_chat(user, span_warning("Medals can only be pinned on jumpsuits!"))
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/clothing/accessory/medal/conduct
|
||||
name = "distinguished conduct medal"
|
||||
desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew."
|
||||
|
||||
/obj/item/clothing/accessory/medal/bronze_heart
|
||||
name = "bronze heart medal"
|
||||
desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty."
|
||||
icon_state = "bronze_heart"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon
|
||||
name = "ribbon"
|
||||
desc = "A ribbon"
|
||||
icon_state = "cargo"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon/cargo
|
||||
name = "\"cargo tech of the shift\" award"
|
||||
desc = "An award bestowed only upon those cargotechs who have exhibited devotion to their duty in keeping with the highest traditions of Cargonia."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver
|
||||
name = "silver medal"
|
||||
desc = "A silver medal."
|
||||
icon_state = "silver"
|
||||
medaltype = "medal-silver"
|
||||
custom_materials = list(/datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/valor
|
||||
name = "medal of valor"
|
||||
desc = "A silver medal awarded for acts of exceptional valor."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/security
|
||||
name = "robust security award"
|
||||
desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/excellence
|
||||
name = "\proper the head of personnel award for outstanding achievement in the field of excellence"
|
||||
desc = "Nanotrasen's dictionary defines excellence as \"the quality or condition of being excellent\". This is awarded to those rare crewmembers who fit that definition."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/bureaucracy
|
||||
name = "\improper Excellence in Bureaucracy Medal"
|
||||
desc = "Awarded for exemplary managerial services rendered while under contract with Nanotrasen."
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold
|
||||
name = "gold medal"
|
||||
desc = "A prestigious golden medal."
|
||||
icon_state = "gold"
|
||||
medaltype = "medal-gold"
|
||||
custom_materials = list(/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/clothing/accessory/medal/med_medal
|
||||
name = "exemplary performance medal"
|
||||
desc = "A medal awarded to those who have shown distinguished conduct, performance, and initiative within the medical department."
|
||||
icon_state = "med_medal"
|
||||
|
||||
/obj/item/clothing/accessory/medal/med_medal2
|
||||
name = "excellence in medicine medal"
|
||||
desc = "A medal awarded to those who have shown legendary performance, competence, and initiative beyond all expectations within the medical department."
|
||||
icon_state = "med_medal2"
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold/captain
|
||||
name = "medal of captaincy"
|
||||
desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew."
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold/heroism
|
||||
name = "medal of exceptional heroism"
|
||||
desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma
|
||||
name = "plasma medal"
|
||||
desc = "An eccentric medal made of plasma."
|
||||
icon_state = "plasma"
|
||||
medaltype = "medal-plasma"
|
||||
armor_type = /datum/armor/medal_plasma
|
||||
custom_materials = list(/datum/material/plasma=HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/datum/armor/medal_plasma
|
||||
fire = -10
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/atmos_sensitive, mapload)
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
|
||||
return exposed_temperature > 300
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature)
|
||||
atmos_spawn_air("[GAS_PLASMA]=20;[TURF_TEMPERATURE(exposed_temperature)]")
|
||||
visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!"))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/nobel_science
|
||||
name = "nobel sciences award"
|
||||
desc = "A plasma medal which represents significant contributions to the field of science or engineering."
|
||||
|
||||
|
||||
|
||||
////////////
|
||||
//Armbands//
|
||||
////////////
|
||||
|
||||
/obj/item/clothing/accessory/armband
|
||||
name = "red armband"
|
||||
desc = "A fancy red armband!"
|
||||
icon_state = "redband"
|
||||
attachment_slot = null
|
||||
|
||||
/obj/item/clothing/accessory/armband/deputy
|
||||
name = "security deputy armband"
|
||||
desc = "An armband, worn by personnel authorized to act as a deputy of station security."
|
||||
|
||||
/obj/item/clothing/accessory/armband/cargo
|
||||
name = "cargo bay guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown."
|
||||
icon_state = "cargoband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/engine
|
||||
name = "engineering guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!"
|
||||
icon_state = "engieband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/science
|
||||
name = "science guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple."
|
||||
icon_state = "rndband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/hydro
|
||||
name = "hydroponics guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue."
|
||||
icon_state = "hydroband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/med
|
||||
name = "medical guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white."
|
||||
icon_state = "medband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/medblue
|
||||
name = "medical guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue."
|
||||
icon_state = "medblueband"
|
||||
|
||||
//////////////
|
||||
//OBJECTION!//
|
||||
//////////////
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge
|
||||
name = "attorney's badge"
|
||||
desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
|
||||
icon_state = "lawyerbadge"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
|
||||
if(prob(1))
|
||||
user.say("The testimony contradicts the evidence!", forced = "attorney's badge")
|
||||
user.visible_message(span_notice("[user] shows [user.p_their()] attorney's badge."), span_notice("You show your attorney's badge."))
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U, mob/living/user)
|
||||
RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, PROC_REF(table_slam))
|
||||
user.bubble_icon = "lawyer"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_uniform_dropped(obj/item/clothing/under/U, mob/living/user)
|
||||
UnregisterSignal(user, COMSIG_LIVING_SLAM_TABLE)
|
||||
user.bubble_icon = initial(user.bubble_icon)
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/proc/table_slam(mob/living/source, obj/structure/table/the_table)
|
||||
SIGNAL_HANDLER
|
||||
INVOKE_ASYNC(src, PROC_REF(handle_table_slam), source)
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/proc/handle_table_slam(mob/living/user)
|
||||
user.say("Objection!!", spans = list(SPAN_YELL), forced=TRUE)
|
||||
|
||||
////////////////
|
||||
//HA HA! NERD!//
|
||||
////////////////
|
||||
/obj/item/clothing/accessory/pocketprotector
|
||||
name = "pocket protector"
|
||||
desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one."
|
||||
icon_state = "pocketprotector"
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
create_storage(storage_type = /datum/storage/pockets/pocketprotector)
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/detach(obj/item/clothing/under/U, user)
|
||||
var/drop_loc = drop_location()
|
||||
for(var/atom/movable/held as anything in src)
|
||||
held.forceMove(drop_loc)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/full/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
new /obj/item/pen/red(src)
|
||||
new /obj/item/pen(src)
|
||||
new /obj/item/pen/blue(src)
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/lipstick/random(src)
|
||||
|
||||
////////////////
|
||||
//REAL BIG FAN//
|
||||
////////////////
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin
|
||||
name = "\improper Clown Pin"
|
||||
desc = "A pin to show off your appreciation for clowns and clowning!"
|
||||
icon_state = "clown_enjoyer_pin"
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin/on_uniform_equip(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(HAS_TRAIT(L, TRAIT_CLOWN_ENJOYER))
|
||||
L.add_mood_event("clown_enjoyer_pin", /datum/mood_event/clown_enjoyer_pin)
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin/on_uniform_dropped(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(HAS_TRAIT(L, TRAIT_CLOWN_ENJOYER))
|
||||
L.clear_mood_event("clown_enjoyer_pin")
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin
|
||||
name = "\improper Mime Pin"
|
||||
desc = "A pin to show off your appreciation for mimes and miming!"
|
||||
icon_state = "mime_fan_pin"
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin/on_uniform_equip(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(HAS_TRAIT(L, TRAIT_MIME_FAN))
|
||||
L.add_mood_event("mime_fan_pin", /datum/mood_event/mime_fan_pin)
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin/on_uniform_dropped(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(HAS_TRAIT(L, TRAIT_MIME_FAN))
|
||||
L.clear_mood_event("mime_fan_pin")
|
||||
|
||||
////////////////
|
||||
//OONGA BOONGA//
|
||||
////////////////
|
||||
|
||||
/obj/item/clothing/accessory/talisman
|
||||
name = "bone talisman"
|
||||
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
|
||||
icon_state = "talisman"
|
||||
armor_type = /datum/armor/accessory_talisman
|
||||
attachment_slot = null
|
||||
|
||||
/datum/armor/accessory_talisman
|
||||
melee = 5
|
||||
bullet = 5
|
||||
laser = 5
|
||||
energy = 5
|
||||
bomb = 20
|
||||
bio = 20
|
||||
acid = 25
|
||||
|
||||
/obj/item/clothing/accessory/skullcodpiece
|
||||
name = "skull codpiece"
|
||||
desc = "A skull shaped ornament, intended to protect the important things in life."
|
||||
icon_state = "skull"
|
||||
armor_type = /datum/armor/accessory_skullcodpiece
|
||||
attachment_slot = GROIN
|
||||
|
||||
/datum/armor/accessory_skullcodpiece
|
||||
melee = 5
|
||||
bullet = 5
|
||||
laser = 5
|
||||
energy = 5
|
||||
bomb = 20
|
||||
bio = 20
|
||||
acid = 25
|
||||
|
||||
/obj/item/clothing/accessory/skilt
|
||||
name = "Sinew Skirt"
|
||||
desc = "For the last time. IT'S A KILT not a skirt."
|
||||
icon_state = "skilt"
|
||||
minimize_when_attached = FALSE
|
||||
armor_type = /datum/armor/accessory_skilt
|
||||
attachment_slot = GROIN
|
||||
|
||||
/datum/armor/accessory_skilt
|
||||
melee = 5
|
||||
bullet = 5
|
||||
laser = 5
|
||||
energy = 5
|
||||
bomb = 20
|
||||
bio = 20
|
||||
acid = 25
|
||||
|
||||
/obj/item/clothing/accessory/allergy_dogtag
|
||||
name = "Allergy dogtag"
|
||||
desc = "Dogtag with a list of your allergies"
|
||||
icon_state = "allergy"
|
||||
minimize_when_attached = TRUE
|
||||
attachment_slot = CHEST
|
||||
///Display message
|
||||
var/display
|
||||
|
||||
/obj/item/clothing/accessory/allergy_dogtag/examine(mob/user)
|
||||
. = ..()
|
||||
. += "The dogtag has a listing of allergies : [display]"
|
||||
|
||||
/obj/item/clothing/accessory/allergy_dogtag/on_uniform_equip(obj/item/clothing/under/U, user)
|
||||
. = ..()
|
||||
RegisterSignal(U,COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
|
||||
/obj/item/clothing/accessory/allergy_dogtag/on_uniform_dropped(obj/item/clothing/under/U, user)
|
||||
. = ..()
|
||||
UnregisterSignal(U,COMSIG_ATOM_EXAMINE)
|
||||
|
||||
///What happens when we examine the uniform
|
||||
/obj/item/clothing/accessory/allergy_dogtag/proc/on_examine(datum/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
examine_list += "The dogtag has a listing of allergies : [display]"
|
||||
|
||||
/* MODULAR SKYRAT - OVERRIDDEN IN (\modular_skyrat\modules\customization\modules\clothing\under\accessories.dm)
|
||||
/// Reskins for the pride pin accessory, mapped by display name to icon state
|
||||
GLOBAL_LIST_INIT(pride_pin_reskins, list(
|
||||
"Rainbow Pride" = "pride",
|
||||
"Bisexual Pride" = "pride_bi",
|
||||
"Pansexual Pride" = "pride_pan",
|
||||
"Asexual Pride" = "pride_ace",
|
||||
"Non-binary Pride" = "pride_enby",
|
||||
"Transgender Pride" = "pride_trans",
|
||||
"Intersex Pride" = "pride_intersex",
|
||||
"Lesbian Pride" = "pride_lesbian",
|
||||
))
|
||||
*/
|
||||
/obj/item/clothing/accessory/pride
|
||||
name = "pride pin"
|
||||
desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!"
|
||||
icon_state = "pride"
|
||||
obj_flags = UNIQUE_RENAME
|
||||
infinite_reskin = TRUE
|
||||
|
||||
/obj/item/clothing/accessory/pride/Initialize(mapload)
|
||||
. = ..()
|
||||
unique_reskin = GLOB.pride_pin_reskins
|
||||
|
||||
/obj/item/clothing/accessory/deaf_pin
|
||||
name = "deaf personnel pin"
|
||||
desc = "Indicates that the wearer is deaf."
|
||||
icon_state = "deaf_pin"
|
||||
@@ -0,0 +1,185 @@
|
||||
/**
|
||||
* Clothing accessories.
|
||||
*
|
||||
* These items can be slotted onto an undershirt to provide a bit of flair.
|
||||
*
|
||||
* These should be very light on their effects. Armor should be avoided entirely.
|
||||
*
|
||||
* Multiple accessories can be equipped on a mob, and only the firstmost one is shown on their sprite.
|
||||
* The rest are still shown on examine, but this may create unfair circumstances when you can't examine someone.
|
||||
*/
|
||||
/obj/item/clothing/accessory
|
||||
name = "Accessory"
|
||||
desc = "Something has gone wrong!"
|
||||
icon = 'icons/obj/clothing/accessories.dmi'
|
||||
worn_icon = 'icons/mob/clothing/accessories.dmi'
|
||||
icon_state = "plasma"
|
||||
inhand_icon_state = "" //no inhands
|
||||
slot_flags = NONE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
/// Whether or not the accessory displays through suits and the like.
|
||||
var/above_suit = TRUE
|
||||
/// TRUE if shown as a small icon in corner, FALSE if overlayed
|
||||
var/minimize_when_attached = TRUE
|
||||
/// What equipment slot the accessory attaches to.
|
||||
/// If NONE, can always attach, while if supplied, can only attach if the clothing covers this slot.
|
||||
var/attachment_slot = CHEST
|
||||
|
||||
/obj/item/clothing/accessory/Initialize(mapload)
|
||||
. = ..()
|
||||
register_context()
|
||||
|
||||
/**
|
||||
* Can we be attached to the passed clothing article?
|
||||
*/
|
||||
/obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user)
|
||||
if(!istype(attach_to))
|
||||
CRASH("[type] - can_attach_accessory called with an invalid item to attach to. (got: [attach_to])")
|
||||
|
||||
if(atom_storage && attach_to.atom_storage)
|
||||
if(user)
|
||||
attach_to.balloon_alert(user, "isn't compatible!")
|
||||
return FALSE
|
||||
|
||||
if(attachment_slot && !(attach_to.body_parts_covered & attachment_slot))
|
||||
if(user)
|
||||
attach_to.balloon_alert(user, "can't attach there!")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Actually attach this accessory to the passed clothing article.
|
||||
*
|
||||
* The accessory is not yet within the clothing's loc at this point, this hapens after success.
|
||||
*/
|
||||
/obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/attach_to, mob/living/attacher)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
if(atom_storage)
|
||||
attach_to.clone_storage(atom_storage)
|
||||
attach_to.atom_storage.set_real_location(src)
|
||||
|
||||
var/num_other_accessories = LAZYLEN(attach_to.attached_accessories)
|
||||
layer = FLOAT_LAYER + clamp(attach_to.max_number_of_accessories - num_other_accessories, 0, 10)
|
||||
plane = FLOAT_PLANE
|
||||
|
||||
if(minimize_when_attached)
|
||||
transform *= 0.5
|
||||
pixel_x += 8
|
||||
pixel_y += (-8 + LAZYLEN(attach_to.attached_accessories) * 2)
|
||||
|
||||
RegisterSignal(attach_to, COMSIG_ITEM_EQUIPPED, PROC_REF(on_uniform_equipped))
|
||||
RegisterSignal(attach_to, COMSIG_ITEM_DROPPED, PROC_REF(on_uniform_dropped))
|
||||
RegisterSignal(attach_to, COMSIG_CLOTHING_UNDER_ADJUSTED, PROC_REF(on_uniform_adjusted))
|
||||
RegisterSignal(attach_to, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_uniform_update))
|
||||
|
||||
return TRUE
|
||||
|
||||
/// Called after attach is completely successful and the accessory is in the clothing's loc
|
||||
/obj/item/clothing/accessory/proc/successful_attach(obj/item/clothing/under/attached_to)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
// Do on-equip effects if we're already equipped
|
||||
var/mob/worn_on = attached_to.loc
|
||||
if(istype(worn_on))
|
||||
on_uniform_equipped(attached_to, worn_on, worn_on.get_slot_by_item(attached_to))
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_ACCESSORY_ATTACHED, attached_to)
|
||||
SEND_SIGNAL(attached_to, COMSIG_CLOTHING_ACCESSORY_ATTACHED, src)
|
||||
|
||||
/**
|
||||
* Detach this accessory from the passed clothing article
|
||||
*
|
||||
* We may have exited the clothing's loc at this point
|
||||
*/
|
||||
/obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/detach_from)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
if(IS_WEAKREF_OF(src, detach_from.atom_storage?.real_location))
|
||||
// Ensure void items do not stick around
|
||||
atom_storage.close_all()
|
||||
detach_from.atom_storage.close_all()
|
||||
// And clean up the storage we made
|
||||
QDEL_NULL(detach_from.atom_storage)
|
||||
|
||||
UnregisterSignal(detach_from, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_CLOTHING_UNDER_ADJUSTED, COMSIG_ATOM_UPDATE_OVERLAYS))
|
||||
var/mob/dropped_from = detach_from.loc
|
||||
if(istype(dropped_from))
|
||||
on_uniform_dropped(detach_from, dropped_from)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_ACCESSORY_DETACHED, detach_from)
|
||||
SEND_SIGNAL(detach_from, COMSIG_CLOTHING_ACCESSORY_DETACHED, src)
|
||||
|
||||
if(minimize_when_attached)
|
||||
transform *= 2
|
||||
// just randomize position
|
||||
pixel_x = rand(4, -4)
|
||||
pixel_y = rand(4, -4)
|
||||
|
||||
layer = initial(layer)
|
||||
SET_PLANE_IMPLICIT(src, initial(plane))
|
||||
return TRUE
|
||||
|
||||
/// Signal proc for [COMSIG_ITEM_EQUIPPED] on the uniform we're pinned to
|
||||
/obj/item/clothing/accessory/proc/on_uniform_equipped(obj/item/clothing/under/source, mob/living/user, slot)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!(slot & source.slot_flags))
|
||||
return
|
||||
|
||||
accessory_equipped(source, user)
|
||||
|
||||
/// Signal proc for [COMSIG_ITEM_DROPPED] on the uniform we're pinned to
|
||||
/obj/item/clothing/accessory/proc/on_uniform_dropped(obj/item/clothing/under/source, mob/living/user)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
accessory_dropped(source, user)
|
||||
user.update_clothing(ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING)
|
||||
|
||||
/// Called when the uniform this accessory is pinned to is equipped in a valid slot
|
||||
/obj/item/clothing/accessory/proc/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
return
|
||||
|
||||
/// Called when the uniform this accessory is pinned to is dropped
|
||||
/obj/item/clothing/accessory/proc/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
return
|
||||
|
||||
/// Signal proc for [COMSIG_CLOTHING_UNDER_ADJUSTED] on the uniform we're pinned to
|
||||
/// Checks if we can no longer be attached to the uniform, and if so, drops us
|
||||
/obj/item/clothing/accessory/proc/on_uniform_adjusted(obj/item/clothing/under/source)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(can_attach_accessory(source))
|
||||
return
|
||||
|
||||
source.remove_accessory(src)
|
||||
forceMove(source.drop_location())
|
||||
source.visible_message(span_warning("[src] falls off of [source]!"))
|
||||
|
||||
/// Signal proc for [COMSIG_ATOM_UPDATE_OVERLAYS] on the uniform we're pinned to to add our overlays to the inventory icon
|
||||
/obj/item/clothing/accessory/proc/on_uniform_update(obj/item/source, list/overlays)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
overlays |= src
|
||||
|
||||
/obj/item/clothing/accessory/attack_self_secondary(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(user.can_perform_action(src, NEED_DEXTERITY))
|
||||
above_suit = !above_suit
|
||||
balloon_alert(user, "wearing [above_suit ? "above" : "below"] suits")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/accessory/examine(mob/user)
|
||||
. = ..()
|
||||
. += "It can be attached to a uniform."
|
||||
. += "It can be worn above or below your suit. Right-click to toggle."
|
||||
|
||||
/obj/item/clothing/accessory/add_context(atom/source, list/context, obj/item/held_item, mob/user)
|
||||
if(!isnull(held_item))
|
||||
return NONE
|
||||
|
||||
context[SCREENTIP_CONTEXT_RMB] = "Wear [above_suit ? "below" : "above"] suit"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
@@ -0,0 +1,40 @@
|
||||
// Armbands, which go around a sleeve of a shirt.
|
||||
/obj/item/clothing/accessory/armband
|
||||
name = "red armband"
|
||||
desc = "A fancy red armband!"
|
||||
icon_state = "redband"
|
||||
attachment_slot = NONE
|
||||
|
||||
/obj/item/clothing/accessory/armband/deputy
|
||||
name = "security deputy armband"
|
||||
desc = "An armband, worn by personnel authorized to act as a deputy of station security."
|
||||
|
||||
/obj/item/clothing/accessory/armband/cargo
|
||||
name = "cargo bay guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown."
|
||||
icon_state = "cargoband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/engine
|
||||
name = "engineering guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!"
|
||||
icon_state = "engieband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/science
|
||||
name = "science guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple."
|
||||
icon_state = "rndband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/hydro
|
||||
name = "hydroponics guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue."
|
||||
icon_state = "hydroband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/med
|
||||
name = "medical guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white."
|
||||
icon_state = "medband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/medblue
|
||||
name = "medical guard armband"
|
||||
desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue."
|
||||
icon_state = "medblueband"
|
||||
@@ -0,0 +1,201 @@
|
||||
// Badges, pins, and other very small items that slot onto a shirt.
|
||||
/obj/item/clothing/accessory/lawyers_badge
|
||||
name = "attorney's badge"
|
||||
desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
|
||||
icon_state = "lawyerbadge"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/interact(mob/user)
|
||||
. = ..()
|
||||
if(prob(1))
|
||||
user.say("The testimony contradicts the evidence!", forced = "[src]")
|
||||
user.visible_message(span_notice("[user] shows [user.p_their()] attorney's badge."), span_notice("You show your attorney's badge."))
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, PROC_REF(table_slam))
|
||||
user.bubble_icon = "lawyer"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
UnregisterSignal(user, COMSIG_LIVING_SLAM_TABLE)
|
||||
user.bubble_icon = initial(user.bubble_icon)
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/proc/table_slam(mob/living/source, obj/structure/table/the_table)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
ASYNC
|
||||
source.say("Objection!!", spans = list(SPAN_YELL), forced = "[src]")
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin
|
||||
name = "\improper Clown Pin"
|
||||
desc = "A pin to show off your appreciation for clowns and clowning!"
|
||||
icon_state = "clown_enjoyer_pin"
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(locate(/obj/item/clothing/accessory/mime_fan_pin) in attach_to.attached_accessories)
|
||||
if(user)
|
||||
attach_to.balloon_alert(user, "can't pick both sides!")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
if(HAS_TRAIT(user, TRAIT_CLOWN_ENJOYER))
|
||||
user.add_mood_event("clown_enjoyer_pin", /datum/mood_event/clown_enjoyer_pin)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_equipper = user
|
||||
human_equipper.fan_hud_set_fandom()
|
||||
|
||||
/obj/item/clothing/accessory/clown_enjoyer_pin/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
user.clear_mood_event("clown_enjoyer_pin")
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_equipper = user
|
||||
human_equipper.fan_hud_set_fandom()
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin
|
||||
name = "\improper Mime Pin"
|
||||
desc = "A pin to show off your appreciation for mimes and miming!"
|
||||
icon_state = "mime_fan_pin"
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(locate(/obj/item/clothing/accessory/clown_enjoyer_pin) in attach_to.attached_accessories)
|
||||
if(user)
|
||||
attach_to.balloon_alert(user, "can't pick both sides!")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
if(HAS_TRAIT(user, TRAIT_MIME_FAN))
|
||||
user.add_mood_event("mime_fan_pin", /datum/mood_event/mime_fan_pin)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_equipper = user
|
||||
human_equipper.fan_hud_set_fandom()
|
||||
|
||||
/obj/item/clothing/accessory/mime_fan_pin/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
user.clear_mood_event("mime_fan_pin")
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_equipper = user
|
||||
human_equipper.fan_hud_set_fandom()
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector
|
||||
name = "pocket protector"
|
||||
desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one."
|
||||
icon_state = "pocketprotector"
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/Initialize(mapload)
|
||||
. = ..()
|
||||
create_storage(storage_type = /datum/storage/pockets/pocketprotector)
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/can_attach_accessory(obj/item/clothing/under/attach_to, mob/living/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
if(!isnull(attach_to.atom_storage))
|
||||
if(user)
|
||||
attach_to.balloon_alert(user, "not compatible!")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/full
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/full/Initialize(mapload)
|
||||
. = ..()
|
||||
new /obj/item/pen/red(src)
|
||||
new /obj/item/pen(src)
|
||||
new /obj/item/pen/blue(src)
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/cosmetology
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/lipstick/random(src)
|
||||
|
||||
/obj/item/clothing/accessory/dogtag
|
||||
name = "Dogtag"
|
||||
desc = "Can't wear a collar, but this is fine?"
|
||||
icon_state = "allergy"
|
||||
attachment_slot = NONE // actually NECK but that doesn't make sense
|
||||
/// What message is displayed when our dogtags / its clothes / its wearer is examined
|
||||
var/display = "Nothing!"
|
||||
|
||||
/obj/item/clothing/accessory/dogtag/examine(mob/user)
|
||||
. = ..()
|
||||
. += display
|
||||
|
||||
// Examining the clothes will display the examine message of the dogtag
|
||||
/obj/item/clothing/accessory/dogtag/attach(obj/item/clothing/under/attach_to, mob/living/attacher)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
RegisterSignal(attach_to, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
|
||||
/obj/item/clothing/accessory/dogtag/detach(obj/item/clothing/under/detach_from)
|
||||
. = ..()
|
||||
UnregisterSignal(detach_from, COMSIG_ATOM_EXAMINE)
|
||||
|
||||
// Double examining the person wearing the clothes will display the examine message of the dogtag
|
||||
/obj/item/clothing/accessory/dogtag/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
RegisterSignal(user, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine))
|
||||
|
||||
/obj/item/clothing/accessory/dogtag/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
UnregisterSignal(user, COMSIG_ATOM_EXAMINE_MORE)
|
||||
|
||||
/// Adds the examine message to the clothes and mob.
|
||||
/obj/item/clothing/accessory/dogtag/proc/on_examine(datum/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
// Only show the examine message if we're close (2 tiles)
|
||||
if(!IN_GIVEN_RANGE(get_turf(user), get_turf(src), 2))
|
||||
return
|
||||
|
||||
if(ismob(source))
|
||||
// Examining a mob wearing the clothes, wearing the dogtag will also show the message
|
||||
examine_list += "A dogtag is hanging around [source.p_their()] neck: [display]"
|
||||
else
|
||||
examine_list += "A dogtag is attached to [source]: [display]"
|
||||
|
||||
/obj/item/clothing/accessory/dogtag/allergy
|
||||
name = "Allergy dogtag"
|
||||
desc = "A dogtag with a listing of allergies."
|
||||
|
||||
/obj/item/clothing/accessory/dogtag/allergy/Initialize(mapload, allergy_string)
|
||||
. = ..()
|
||||
if(allergy_string)
|
||||
display = span_notice("The dogtag has a listing of allergies: [allergy_string]")
|
||||
else
|
||||
display = span_notice("The dogtag is all scratched up.")
|
||||
|
||||
/* MODULAR SKYRAT - OVERRIDDEN IN (\modular_skyrat\modules\customization\modules\clothing\under\accessories.dm)
|
||||
/// Reskins for the pride pin accessory, mapped by display name to icon state
|
||||
GLOBAL_LIST_INIT(pride_pin_reskins, list(
|
||||
"Rainbow Pride" = "pride",
|
||||
"Bisexual Pride" = "pride_bi",
|
||||
"Pansexual Pride" = "pride_pan",
|
||||
"Asexual Pride" = "pride_ace",
|
||||
"Non-binary Pride" = "pride_enby",
|
||||
"Transgender Pride" = "pride_trans",
|
||||
"Intersex Pride" = "pride_intersex",
|
||||
"Lesbian Pride" = "pride_lesbian",
|
||||
))
|
||||
*/
|
||||
|
||||
/obj/item/clothing/accessory/pride
|
||||
name = "pride pin"
|
||||
desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!"
|
||||
icon_state = "pride"
|
||||
obj_flags = UNIQUE_RENAME
|
||||
infinite_reskin = TRUE
|
||||
|
||||
/obj/item/clothing/accessory/pride/Initialize(mapload)
|
||||
. = ..()
|
||||
unique_reskin = GLOB.pride_pin_reskins
|
||||
|
||||
/obj/item/clothing/accessory/deaf_pin
|
||||
name = "deaf personnel pin"
|
||||
desc = "Indicates that the wearer is deaf."
|
||||
icon_state = "deaf_pin"
|
||||
@@ -0,0 +1,140 @@
|
||||
/obj/item/clothing/accessory/medal
|
||||
name = "bronze medal"
|
||||
desc = "A bronze medal."
|
||||
icon_state = "bronze"
|
||||
custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
resistance_flags = FIRE_PROOF
|
||||
/// Sprite used for medalbox
|
||||
var/medaltype = "medal"
|
||||
/// Has this been use for a commendation?
|
||||
var/commended = FALSE
|
||||
|
||||
// If someone adds SHOULD_NOT_SLEEP anywhere up the chain, this will need to be reworked
|
||||
/obj/item/clothing/accessory/medal/attach(obj/item/clothing/under/attach_to, mob/living/attacher)
|
||||
if(isnull(attacher))
|
||||
// Do normal attach
|
||||
return ..()
|
||||
|
||||
var/mob/living/distinguished = attach_to.loc
|
||||
if(!istype(distinguished) || distinguished == attacher)
|
||||
// Do normal attach
|
||||
return ..()
|
||||
|
||||
// Do a do_after before we attach, and allow us to include a commendation message.
|
||||
attacher.visible_message(
|
||||
span_notice("[attacher] is trying to pin [src] on [distinguished]'s chest."),
|
||||
span_notice("You try to pin [src] on [distinguished]'s chest."),
|
||||
)
|
||||
|
||||
var/input
|
||||
if(!commended)
|
||||
input = tgui_input_text(attacher, "Reason for this commendation? It will be recorded by Nanotrasen.", "Commendation", max_length = 140)
|
||||
|
||||
if(!do_after(attacher, 2 SECONDS, distinguished))
|
||||
return FALSE
|
||||
|
||||
attacher.visible_message(
|
||||
span_notice("[attacher] pins [src] on [distinguished]'s chest."),
|
||||
span_notice("You pin [src] on [distinguished]'s chest."),
|
||||
)
|
||||
if(!input)
|
||||
return FALSE
|
||||
|
||||
commended = TRUE
|
||||
SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[attacher.real_name]", "commendee" = "[distinguished.real_name]", "medal" = "[src]", "reason" = input))
|
||||
GLOB.commendations += "[attacher.real_name] awarded <b>[distinguished.real_name]</b> the <span class='medaltext'>[name]</span>! \n- [input]"
|
||||
desc += "<br>The inscription reads: [input] - [attacher.real_name]"
|
||||
distinguished.log_message("was given the following commendation by <b>[key_name(attacher)]</b>: [input]", LOG_GAME, color = "green")
|
||||
message_admins("<b>[key_name_admin(distinguished)]</b> was given the following commendation by <b>[key_name_admin(attacher)]</b>: [input]")
|
||||
add_memory_in_range(distinguished, 7, /datum/memory/received_medal, protagonist = distinguished, deuteragonist = attacher, medal_type = src, medal_text = input)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/accessory/medal/conduct
|
||||
name = "distinguished conduct medal"
|
||||
desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew."
|
||||
|
||||
/obj/item/clothing/accessory/medal/bronze_heart
|
||||
name = "bronze heart medal"
|
||||
desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty."
|
||||
icon_state = "bronze_heart"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon
|
||||
name = "ribbon"
|
||||
desc = "A ribbon"
|
||||
icon_state = "cargo"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon/cargo
|
||||
name = "\"cargo tech of the shift\" award"
|
||||
desc = "An award bestowed only upon those cargotechs who have exhibited devotion to their duty in keeping with the highest traditions of Cargonia."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver
|
||||
name = "silver medal"
|
||||
desc = "A silver medal."
|
||||
icon_state = "silver"
|
||||
medaltype = "medal-silver"
|
||||
custom_materials = list(/datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/valor
|
||||
name = "medal of valor"
|
||||
desc = "A silver medal awarded for acts of exceptional valor."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/security
|
||||
name = "robust security award"
|
||||
desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/excellence
|
||||
name = "\proper the head of personnel award for outstanding achievement in the field of excellence"
|
||||
desc = "Nanotrasen's dictionary defines excellence as \"the quality or condition of being excellent\". This is awarded to those rare crewmembers who fit that definition."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver/bureaucracy
|
||||
name = "\improper Excellence in Bureaucracy Medal"
|
||||
desc = "Awarded for exemplary managerial services rendered while under contract with Nanotrasen."
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold
|
||||
name = "gold medal"
|
||||
desc = "A prestigious golden medal."
|
||||
icon_state = "gold"
|
||||
medaltype = "medal-gold"
|
||||
custom_materials = list(/datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/clothing/accessory/medal/med_medal
|
||||
name = "exemplary performance medal"
|
||||
desc = "A medal awarded to those who have shown distinguished conduct, performance, and initiative within the medical department."
|
||||
icon_state = "med_medal"
|
||||
|
||||
/obj/item/clothing/accessory/medal/med_medal2
|
||||
name = "excellence in medicine medal"
|
||||
desc = "A medal awarded to those who have shown legendary performance, competence, and initiative beyond all expectations within the medical department."
|
||||
icon_state = "med_medal2"
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold/captain
|
||||
name = "medal of captaincy"
|
||||
desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew."
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/accessory/medal/gold/heroism
|
||||
name = "medal of exceptional heroism"
|
||||
desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma
|
||||
name = "plasma medal"
|
||||
desc = "An eccentric medal made of plasma."
|
||||
icon_state = "plasma"
|
||||
medaltype = "medal-plasma"
|
||||
custom_materials = list(/datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/atmos_sensitive, mapload)
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
|
||||
return exposed_temperature > 300
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/atmos_expose(datum/gas_mixture/air, exposed_temperature)
|
||||
atmos_spawn_air("[GAS_PLASMA]=20;[TURF_TEMPERATURE(exposed_temperature)]")
|
||||
visible_message(span_danger("\The [src] bursts into flame!"), span_userdanger("Your [src] bursts into flame!"))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/accessory/medal/plasma/nobel_science
|
||||
name = "nobel sciences award"
|
||||
desc = "A plasma medal which represents significant contributions to the field of science or engineering."
|
||||
@@ -0,0 +1,19 @@
|
||||
// Tribal undershirt accessories, made from bone or sinew.
|
||||
/obj/item/clothing/accessory/talisman
|
||||
name = "bone talisman"
|
||||
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
|
||||
icon_state = "talisman"
|
||||
attachment_slot = NONE
|
||||
|
||||
/obj/item/clothing/accessory/skullcodpiece
|
||||
name = "skull codpiece"
|
||||
desc = "A skull shaped ornament, intended to protect the important things in life."
|
||||
icon_state = "skull"
|
||||
attachment_slot = GROIN
|
||||
|
||||
/obj/item/clothing/accessory/skilt
|
||||
name = "Sinew Skirt"
|
||||
desc = "For the last time. IT'S A KILT not a skirt."
|
||||
icon_state = "skilt"
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = GROIN
|
||||
@@ -0,0 +1,44 @@
|
||||
// Accessories that mostly or entirely cover a shirt.
|
||||
/obj/item/clothing/accessory/waistcoat
|
||||
name = "waistcoat"
|
||||
desc = "For some classy, murderous fun."
|
||||
icon_state = "waistcoat"
|
||||
inhand_icon_state = "wcoat"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = NONE
|
||||
greyscale_config = /datum/greyscale_config/waistcoat
|
||||
greyscale_config_worn = /datum/greyscale_config/waistcoat_worn
|
||||
greyscale_colors = "#414344"
|
||||
flags_1 = IS_PLAYER_COLORABLE_1
|
||||
|
||||
/obj/item/clothing/accessory/vest_sheriff
|
||||
name = "sheriff vest"
|
||||
desc = "Now you just have to pick your favourite deputy."
|
||||
icon_state = "vest_sheriff"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
inhand_icon_state = "vest_sheriff"
|
||||
minimize_when_attached = TRUE
|
||||
attachment_slot = NONE
|
||||
|
||||
/obj/item/clothing/accessory/maidcorset
|
||||
name = "maid corset"
|
||||
desc = "The final touch that holds it all together."
|
||||
icon_state = "maidcorset"
|
||||
inhand_icon_state = "maidapron"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = NONE
|
||||
|
||||
/obj/item/clothing/accessory/maidapron
|
||||
name = "maid apron"
|
||||
desc = "The best part of a maid costume."
|
||||
icon_state = "maidapron"
|
||||
inhand_icon_state = "maidapron"
|
||||
lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi'
|
||||
minimize_when_attached = FALSE
|
||||
attachment_slot = NONE
|
||||
@@ -315,9 +315,9 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf
|
||||
for(var/atom/movable/atom_contents as anything in holo_atom) //make sure that things inside of a holoitem are moved outside before destroying it
|
||||
atom_contents.forceMove(target_turf)
|
||||
|
||||
if(istype(holo_atom, /obj/item/clothing/under/rank))
|
||||
if(istype(holo_atom, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/holo_clothing = holo_atom
|
||||
holo_clothing.dump_attachment()
|
||||
holo_clothing.dump_attachments()
|
||||
|
||||
if(!silent)
|
||||
visible_message(span_notice("[holo_atom] fades away!"))
|
||||
|
||||
@@ -66,13 +66,14 @@
|
||||
//uniform
|
||||
if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !(w_uniform.item_flags & EXAMINE_SKIP))
|
||||
//accessory
|
||||
var/accessory_msg
|
||||
var/accessory_message = ""
|
||||
if(istype(w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/U = w_uniform
|
||||
if(U.attached_accessory)
|
||||
accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]"
|
||||
var/obj/item/clothing/under/undershirt = w_uniform
|
||||
var/list/accessories = undershirt.list_accessories_with_icon(user)
|
||||
if(length(accessories))
|
||||
accessory_message = " with [english_list(accessories)] attached"
|
||||
|
||||
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
|
||||
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_message]."
|
||||
//head
|
||||
if(head && !(obscured & ITEM_SLOT_HEAD) && !(head.item_flags & EXAMINE_SKIP))
|
||||
. += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
|
||||
|
||||
@@ -184,15 +184,11 @@
|
||||
icon_state = "hope"
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(L?.mind)
|
||||
L.add_mood_event("hope_lavaland", /datum/mood_event/hope_lavaland)
|
||||
/obj/item/clothing/accessory/pandora_hope/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
user.add_mood_event("hope_lavaland", /datum/mood_event/hope_lavaland)
|
||||
|
||||
/obj/item/clothing/accessory/pandora_hope/on_uniform_dropped(obj/item/clothing/under/U, user)
|
||||
var/mob/living/L = user
|
||||
if(L?.mind)
|
||||
L.clear_mood_event("hope_lavaland")
|
||||
/obj/item/clothing/accessory/pandora_hope/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
|
||||
user.clear_mood_event("hope_lavaland")
|
||||
|
||||
#undef SINGULAR_SHOT
|
||||
#undef MAGIC_BOX
|
||||
|
||||
@@ -105,11 +105,11 @@
|
||||
. = ..()
|
||||
. += "The dogtag reads: I breathe [breath_type]."
|
||||
|
||||
/obj/item/clothing/accessory/breathing/on_uniform_equip(obj/item/clothing/under/uniform, user)
|
||||
/obj/item/clothing/accessory/breathing/accessory_equipped(obj/item/clothing/under/uniform, user)
|
||||
. = ..()
|
||||
RegisterSignal(uniform, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
|
||||
/obj/item/clothing/accessory/breathing/on_uniform_dropped(obj/item/clothing/under/uniform, user)
|
||||
/obj/item/clothing/accessory/breathing/accessory_dropped(obj/item/clothing/under/uniform, user)
|
||||
. = ..()
|
||||
UnregisterSignal(uniform, COMSIG_ATOM_EXAMINE)
|
||||
|
||||
|
||||
@@ -84,10 +84,11 @@
|
||||
|
||||
/obj/item/clothing/under/costume/lewdmaid/attach_accessory(obj/item/attack_item)
|
||||
. = ..()
|
||||
var/accessory_color = attached_accessory.icon_state
|
||||
var/obj/item/clothing/accessory/prime_accessory = attached_accessories[1]
|
||||
var/accessory_color = prime_accessory.icon_state
|
||||
accessory_overlay = mutable_appearance('modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_items/lewd_items.dmi', "[accessory_color]", ABOVE_MOB_LAYER + 0.1)
|
||||
accessory_overlay.alpha = attached_accessory.alpha
|
||||
accessory_overlay.color = attached_accessory.color
|
||||
accessory_overlay.alpha = prime_accessory.alpha
|
||||
accessory_overlay.color = prime_accessory.color
|
||||
if(!ishuman(loc))
|
||||
return TRUE
|
||||
var/mob/living/carbon/human/wearer = loc
|
||||
|
||||
+6
-1
@@ -3380,7 +3380,6 @@
|
||||
#include "code\modules\clothing\suits\wintercoats.dm"
|
||||
#include "code\modules\clothing\suits\wiz_robe.dm"
|
||||
#include "code\modules\clothing\under\_under.dm"
|
||||
#include "code\modules\clothing\under\accessories.dm"
|
||||
#include "code\modules\clothing\under\color.dm"
|
||||
#include "code\modules\clothing\under\costume.dm"
|
||||
#include "code\modules\clothing\under\ethereal.dm"
|
||||
@@ -3391,6 +3390,12 @@
|
||||
#include "code\modules\clothing\under\suits.dm"
|
||||
#include "code\modules\clothing\under\syndicate.dm"
|
||||
#include "code\modules\clothing\under\trek.dm"
|
||||
#include "code\modules\clothing\under\accessories\_accessories.dm"
|
||||
#include "code\modules\clothing\under\accessories\armbands.dm"
|
||||
#include "code\modules\clothing\under\accessories\badges.dm"
|
||||
#include "code\modules\clothing\under\accessories\medals.dm"
|
||||
#include "code\modules\clothing\under\accessories\tribal.dm"
|
||||
#include "code\modules\clothing\under\accessories\vests.dm"
|
||||
#include "code\modules\clothing\under\jobs\cargo.dm"
|
||||
#include "code\modules\clothing\under\jobs\centcom.dm"
|
||||
#include "code\modules\clothing\under\jobs\command.dm"
|
||||
|
||||
Reference in New Issue
Block a user