diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
index 4906c6bdd4fd..94b91d88af85 100644
--- a/code/__DEFINES/clothing.dm
+++ b/code/__DEFINES/clothing.dm
@@ -37,3 +37,53 @@
/// How much integrity does a shirt lose every time we bite it?
#define MOTH_EATING_CLOTHING_DAMAGE 15
*/
+
+// Base equipment delays
+/// Delay base for full-body coverage suit slot items. (hardsuits, spacesuits, radsuits, etc.)
+#define EQUIP_DELAY_OVERSUIT (6 SECONDS)
+
+/// Delay base for suit slot items
+#define EQUIP_DELAY_SUIT (4 SECONDS)
+
+/// Delay base for hard-body shoes and boots.
+#define EQUIP_DELAY_BOOTS (2 SECONDS)
+/// Delay base for hard-body, strapped, or otherwise head-covering hats.
+#define EQUIP_DELAY_HELMET (2 SECONDS)
+/// Delay base for shoes.
+#define EQUIP_DELAY_SHOES (2 SECONDS)
+/// Delay base for suit and cloak slot items that are trivially removed or put on. (Coats, Jackets, Ponchos, etc.)
+#define EQUIP_DELAY_COAT (2 SECONDS)
+/// Delay base for Undersuits.
+#define EQUIP_DELAY_UNDERSUIT (2 SECONDS)
+
+/// Delay base for masks.
+#define EQUIP_DELAY_MASK (1 SECONDS)
+/// Delay base for back-worn objects.
+#define EQUIP_DELAY_BACK (1 SECONDS)
+/// Delay base for belts.
+#define EQUIP_DELAY_BELT (1 SECONDS)
+/// Delay base for hats.
+#define EQUIP_DELAY_HAT (1 SECONDS)
+/// Delay base for gloves.
+#define EQUIP_DELAY_GLOVES (1 SECONDS)
+/// Delay base for glasses.
+#define EQUIP_DELAY_EYEWEAR (1 SECONDS)
+
+// Flags for self equipping items
+/// Allow movement during equip/unequip
+#define EQUIP_ALLOW_MOVEMENT (1<<0)
+/// Apply a slowdown when equipping or unequipping.
+#define EQUIP_SLOWDOWN (1<<1)
+
+//sound defines for equipping and unequipping
+#define EQUIP_SOUND_VFAST_GENERIC 'sound/items/equip/equipping_vfast_generic.ogg'
+#define UNEQUIP_SOUND_VFAST_GENERIC 'sound/items/equip/unequipping_vfast_generic.ogg'
+
+#define EQUIP_SOUND_SHORT_GENERIC 'sound/items/equip/equipping_short_generic.ogg'
+#define UNEQUIP_SOUND_SHORT_GENERIC 'sound/items/equip/unequipping_short_generic.ogg'
+
+#define EQUIP_SOUND_MED_GENERIC 'sound/items/equip/equipping_med_generic.ogg'
+#define UNEQUIP_SOUND_MED_GENERIC 'sound/items/equip/unequipping_med_generic.ogg'
+
+#define EQUIP_SOUND_LONG_GENERIC 'sound/items/equip/equipping_long_generic.ogg'
+#define UNEQUIP_SOUND_LONG_GENERIC 'sound/items/equip/unequipping_long_generic.ogg'
diff --git a/code/__DEFINES/timed_action.dm b/code/__DEFINES/timed_action.dm
index 90572cdc5416..92710e0f7ce5 100644
--- a/code/__DEFINES/timed_action.dm
+++ b/code/__DEFINES/timed_action.dm
@@ -8,3 +8,5 @@
#define IGNORE_HELD_ITEM (1<<2)
/// Can do the action even if the mob is incapacitated
#define IGNORE_INCAPACITATED (1<<3)
+/// Can do the action even if the mob changes active hand
+#define IGNORE_HAND_CHANGE (1<<4)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 10c919d64ea9..ddd2bc5b0df6 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -307,6 +307,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_WIELDED "wielded" //The item is currently being wielded
#define TRAIT_FORCE_SUIT_STORAGE "force_suit_storage" // the item can be worn in suit storage without an outerclothing
+/// Equipping or unequipping an item
+#define TRAIT_EQUIPPING_OR_UNEQUIPPING "equipping_or_unequipping"
+
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 31ce8dceee49..c03b5961c29e 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -308,6 +308,7 @@ GLOBAL_LIST_EMPTY(species_list)
drifting = TRUE
var/holding = user.get_active_held_item()
+ var/whichhand = user.active_hand_index
delay *= user.do_after_coefficent()
@@ -337,6 +338,7 @@ GLOBAL_LIST_EMPTY(species_list)
// Check flags
if(QDELETED(user) \
|| (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
+ || (!(timed_action_flags & IGNORE_HAND_CHANGE) && user.active_hand_index != whichhand) \
|| (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
|| (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \
|| (extra_checks && !extra_checks.Invoke()))
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index f0805e0d06be..21494ea94ad1 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -184,7 +184,7 @@
var/image/item_overlay = image(holding)
item_overlay.alpha = 92
- if(!user.can_equip(holding, slot_id, TRUE))
+ if(!user.can_equip(holding, slot_id, TRUE, TRUE))
item_overlay.color = "#FF0000"
else
item_overlay.color = "#00ff00"
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index fab8ffdf3a2c..6350d737d31b 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -518,7 +518,7 @@
playsound(A, "rustle", 50, TRUE, -5)
if(istype(over_object, /atom/movable/screen/inventory/hand))
var/atom/movable/screen/inventory/hand/H = over_object
- M.putItemFromInventoryInHandIfPossible(A, H.held_index)
+ M.putItemFromInventoryInHandIfPossible(A, H.held_index, FALSE, TRUE)
return
A.add_fingerprint(M)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 65ff09df9c6f..c4358a71714d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -78,12 +78,20 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/usesound
///Used when yate into a mob
var/mob_throw_hit_sound
- ///Sound used when equipping the item into a valid slot
+ ///Sound used when an item has been equipped into a valid slot
var/equip_sound
///Sound uses when picking the item up (into your hands)
var/pickup_sound
///Sound uses when dropping the item, or when its thrown.
var/drop_sound
+ ///Sound used when an item is being equipped with equip_delay
+ var/equipping_sound
+ ///Sound used when an item is being unequipped with equip_delay
+ var/unequipping_sound
+
+ ///flags used for equip_delay
+ var/equip_self_flags = NONE
+
///Whether or not we use stealthy audio levels for this item's attack sounds
var/stealthy_audio = FALSE
@@ -462,7 +470,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
- if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
+ if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src, use_unequip_delay = TRUE))
return
remove_outline()
diff --git a/code/game/objects/items/gear_packs.dm b/code/game/objects/items/gear_packs.dm
index 65db4ffa28c9..0e80c407261c 100644
--- a/code/game/objects/items/gear_packs.dm
+++ b/code/game/objects/items/gear_packs.dm
@@ -24,6 +24,13 @@
var/obj/item/gear_handle/gear_handle_type = /obj/item/gear_handle
var/obj/item/gear_handle/gear_handle
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BACK
+ equip_delay_other = EQUIP_DELAY_BACK * 1.5
+ strip_delay = EQUIP_DELAY_BACK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/gear_pack/get_cell()
return cell
@@ -106,7 +113,7 @@
var/mob/M = loc
if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand))
var/atom/movable/screen/inventory/hand/H = over_object
- M.putItemFromInventoryInHandIfPossible(src, H.held_index)
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index, FALSE, TRUE)
/obj/item/gear_pack/attackby(obj/item/W, mob/user, params)
if(W == gear_handle)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 34eba9a25191..d785eacd9c87 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -32,6 +32,13 @@
supports_variations = VOX_VARIATION | KEPORI_VARIATION
kepori_override_icon = 'icons/mob/clothing/back/backpacks_kepori.dmi'
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_BACK
+ equip_delay_other = EQUIP_DELAY_BACK * 1.5
+ strip_delay = EQUIP_DELAY_BACK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/storage/backpack/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
@@ -44,11 +51,6 @@
* Backpack Types
*/
-/obj/item/storage/backpack/old/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_combined_w_class = 12
-
/obj/item/storage/backpack/holding
name = "bag of holding"
desc = "A backpack that opens into a localized pocket of bluespace."
@@ -181,6 +183,12 @@
greyscale_icon_state = "satchel"
greyscale_colors = list(list(11, 12), list(17, 18), list(10, 11))
+ equipping_sound = null
+ unequipping_sound = null
+ equip_delay_self = null
+ equip_delay_other = EQUIP_DELAY_BACK
+ strip_delay = EQUIP_DELAY_BACK
+
/obj/item/storage/backpack/satchel/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 3247ceb443cd..966fc8899276 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -16,6 +16,13 @@
greyscale_icon_state = "belt"
greyscale_colors = list(list(16, 12), list(15, 11), list(13, 12))
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_BELT
+ equip_delay_other = EQUIP_DELAY_BELT * 1.5
+ strip_delay = EQUIP_DELAY_BELT * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/storage/belt/update_overlays()
. = ..()
if(!content_overlays)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index c07c52a57e84..35df35d5ee23 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -3,6 +3,11 @@
resistance_flags = FLAMMABLE
max_integrity = 200
integrity_failure = 0.4
+
+ equip_sound = 'sound/items/equip/cloth_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+
var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var
///What level of bright light protection item has.
var/flash_protect = FLASH_PROTECTION_NONE
@@ -11,7 +16,8 @@
var/visor_flags = 0 //flags that are added/removed when an item is adjusted up/down
var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv
var/visor_flags_cover = 0 //same as above, but for flags_cover
-//what to toggle when toggled with weldingvisortoggle()
+
+ //what to toggle when toggled with weldingvisortoggle()
var/visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_VISIONFLAGS | VISOR_DARKNESSVIEW | VISOR_INVISVIEW
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
@@ -67,7 +73,7 @@
if(!M.incapacitated() && loc == M && istype(over_object, /atom/movable/screen/inventory/hand))
var/atom/movable/screen/inventory/hand/H = over_object
- if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
+ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index, FALSE, TRUE))
add_fingerprint(usr)
/obj/item/reagent_containers/food/snacks/clothing
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 5e5f11e0ba77..1c37e3e1fe87 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -8,13 +8,20 @@
w_class = WEIGHT_CLASS_SMALL
flags_cover = GLASSESCOVERSEYES
slot_flags = ITEM_SLOT_EYES
- strip_delay = 20
- equip_delay_other = 25
resistance_flags = NONE
custom_materials = list(/datum/material/glass = 250)
supports_variations = VOX_VARIATION
greyscale_colors = list(list(14, 26), list(17, 26))
greyscale_icon_state = "glasses"
+
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_EYEWEAR
+ equip_delay_other = EQUIP_DELAY_EYEWEAR * 1.5
+ strip_delay = EQUIP_DELAY_EYEWEAR * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
var/vision_flags = 0
var/darkness_view = 2//Base human is 2
var/invis_view = SEE_INVISIBLE_LIVING //admin only for now
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index ea0062359c9a..5de024a9c42d 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -11,8 +11,14 @@
slot_flags = ITEM_SLOT_GLOVES
attack_verb = list("challenged")
var/transfer_prints = FALSE
- strip_delay = 20
- equip_delay_other = 40
+
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_GLOVES
+ equip_delay_other = EQUIP_DELAY_GLOVES + (3 SECONDS)
+ strip_delay = EQUIP_DELAY_GLOVES + (3 SECONDS)
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
cuttable = TRUE
clothamnt = 2
greyscale_colors = list(list(10, 13), list(11, 14), list(9, 12))
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index e74c788faa99..8b3a29f017ab 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -14,6 +14,13 @@
supports_variations = VOX_VARIATION
blood_overlay_type = "helmet"
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_HAT
+ equip_delay_other = EQUIP_DELAY_HAT * 1.5
+ strip_delay = EQUIP_DELAY_HAT * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them.
/obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing)
. = ..()
@@ -44,7 +51,7 @@
///if the hat manages to knock something off
if(H.dropItemToGround(WH))
H.visible_message("[src] knocks [WH] off [H]'s head!", "[WH] is suddenly knocked off your head by [src]!")
- if(H.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD, 0, 1, 1))
+ if(H.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD, 0, 1, 1, TRUE))
H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!")
return
if(iscyborg(hit_atom))
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 4247405d873e..e479b4aaebbe 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -7,6 +7,13 @@
clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
+
/obj/item/clothing/head/hardhat
name = "hard hat"
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight."
@@ -24,6 +31,13 @@
light_on = FALSE
dog_fashion = /datum/dog_fashion/head
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
+
///Determines used sprites: hardhat[on]_[hat_type] and hardhat[on]_[hat_type]2 (lying down sprite)
var/hat_type = "yellow"
///Whether the headlamp is on or off.
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 75103c5f524a..8e89f35d806b 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -16,6 +16,13 @@
flags_cover = HEADCOVERSEYES
//flags_inv = HIDEHAIR // nah
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
+
dog_fashion = /datum/dog_fashion/head/helmet
//if a flashlight can be mounted. if it has a flashlight and this is false, it is permanently attached.
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 0c638fb75e2c..865e391abad5 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -42,6 +42,13 @@
clothing_flags = SNUG_FIT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
+
/obj/item/clothing/head/snowman
name = "Snowman Head"
desc = "A ball of white styrofoam. So festive."
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 3cd7c022887c..de54afa17b0d 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -30,6 +30,13 @@
resistance_flags = FIRE_PROOF
clothing_flags = SNUG_FIT
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
+
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index a1ddb98a3474..d8713138ba97 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -16,6 +16,13 @@
resistance_flags = NONE
supports_variations = SNOUTED_VARIATION | SNOUTED_SMALL_VARIATION | VOX_VARIATION
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
adjustmask(user)
@@ -71,6 +78,13 @@
w_class = WEIGHT_CLASS_SMALL
modifies_speech = TRUE
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/luchador/handle_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(message[1] != "*")
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index ea6719e1fb63..d24e4efb2640 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -14,6 +14,14 @@
visor_flags_cover = MASKCOVERSMOUTH
resistance_flags = NONE
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/clothing/mask/breath/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 4fd1df88f0bc..021fad6c01e2 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -11,6 +11,14 @@
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/clothing/mask/gas/atmos
name = "atmospheric gas mask"
desc = "Improved gas mask utilized by atmospheric technicians. Still not very good at blocking gas flow, but it's flameproof!"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index d2b573711051..0374c15b8caa 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -8,6 +8,13 @@
gas_transfer_coefficient = 0.9
equip_delay_other = 20
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -31,6 +38,13 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0)
actions_types = list(/datum/action/item_action/adjust)
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/surgical/attack_self(mob/user)
adjustmask(user)
@@ -154,6 +168,13 @@
clothing_flags = VOICEBOX_TOGGLABLE
modifies_speech = TRUE
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/frog/cursed
clothing_flags = NONE
@@ -176,6 +197,13 @@
w_class = WEIGHT_CLASS_SMALL
modifies_speech = TRUE
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args)
if(!(clothing_flags & VOICEBOX_DISABLED))
speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
@@ -200,6 +228,13 @@
w_class = WEIGHT_CLASS_SMALL
clothing_flags = VOICEBOX_TOGGLABLE
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args)
if(!(clothing_flags & VOICEBOX_DISABLED))
speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
@@ -223,6 +258,13 @@
flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
+ equipping_sound = EQUIP_SOUND_VFAST_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_VFAST_GENERIC
+ equip_delay_self = EQUIP_DELAY_MASK
+ equip_delay_other = EQUIP_DELAY_MASK * 1.5
+ strip_delay = EQUIP_DELAY_MASK * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT
+
/obj/item/clothing/mask/rat/fox
name = "fox mask"
desc = "A mask made of soft vinyl and latex, representing the head of a fox."
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 687bf7bf7e72..710922a4f5f8 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -14,8 +14,12 @@
supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION | KEPORI_VARIATION
permeability_coefficient = 0.5
- slowdown = SHOES_SLOWDOWN
- strip_delay = 1 SECONDS
+
+ equip_delay_self = EQUIP_DELAY_SHOES
+ equip_delay_other = EQUIP_DELAY_SHOES * 1.5
+ strip_delay = EQUIP_DELAY_SHOES * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
blood_overlay_type = "shoe"
var/offset = 0
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 6bb64c2caebb..e0e084af0207 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -13,6 +13,13 @@
supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
set category = "Object"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 839dd3565ada..93c6bf562f5a 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -16,6 +16,13 @@
lace_time = 12 SECONDS
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
@@ -67,6 +74,12 @@
can_be_tied = FALSE
greyscale_icon_state = "boots"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/jackboots
name = "jackboots"
desc = "Ankle-high combat boots for combat scenarios or combat situations. All combat, all the time."
@@ -82,6 +95,13 @@
can_be_tied = FALSE
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/jackboots/fast
slowdown = -1
@@ -99,6 +119,13 @@
lace_time = 8 SECONDS
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/workboots
name = "work boots"
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
@@ -113,6 +140,12 @@
lace_time = 8 SECONDS
greyscale_icon_state = "boots"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/winterboots/ice_boots
name = "ice hiking boots"
desc = "A pair of winter boots with special grips on the bottom, designed to prevent slipping on frozen surfaces."
@@ -151,6 +184,13 @@
var/recharging_time = 0 //time until next dash
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action)
if(!isliving(user))
return
@@ -211,6 +251,13 @@
can_be_tied = FALSE
greyscale_icon_state = "boots"
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_BOOTS
+ equip_delay_other = EQUIP_DELAY_BOOTS * 1.5
+ strip_delay = EQUIP_DELAY_BOOTS * 1.5
+
/obj/item/clothing/shoes/cowboy/Initialize()
. = ..()
if(prob(2))
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index f96ad54adb88..f540c175df5a 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -23,6 +23,7 @@
dog_fashion = null
content_overlays = FALSE
pocket_storage_component_path = null
+ equip_self_flags = null
/obj/item/clothing/suit/space
name = "space suit"
@@ -49,3 +50,4 @@
resistance_flags = NONE
greyscale_colors = list(list(17, 16), list(9, 17), list(13, 13))
greyscale_icon_state = "spacesuit"
+ equip_self_flags = null
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 00e527a3161a..6542baf36c16 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -23,6 +23,11 @@
var/grace_count = 0
var/datum/looping_sound/geiger/soundloop
+ //fuck you 15 year old hardsuit code
+ equip_delay_self = null
+ equip_delay_other = null
+ strip_delay = null
+
/obj/item/clothing/head/helmet/space/hardsuit/Initialize()
. = ..()
soundloop = new(list(), FALSE, TRUE)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 6f8269357eb2..0fff8b84f592 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -61,6 +61,9 @@
flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF | SEALS_EYES
visor_flags_inv = HIDEEYES|HIDEFACE
+ //remove when phorids suck less
+ equip_delay_self = null
+
// WS Begin - plasmeme command helmets buff - used for RD bomb scanner
/obj/item/clothing/head/helmet/space/plasmaman/proc/display_visor_message(msg)
var/mob/wearer = loc
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index cd8a24e20ae0..75497fca5a7b 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -18,6 +18,14 @@
supports_variations = VOX_VARIATION
mob_overlay_icon = 'icons/mob/clothing/suit.dmi'
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_LONG_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_LONG_GENERIC
+ equip_delay_self = EQUIP_DELAY_OVERSUIT
+ equip_delay_other = EQUIP_DELAY_OVERSUIT * 1.5
+ strip_delay = EQUIP_DELAY_OVERSUIT * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
. = ..()
if(!isinhands)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index f3fd5dc403a9..92a9556008f2 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -17,6 +17,13 @@
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
+ equipping_sound = EQUIP_SOUND_MED_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_MED_GENERIC
+ equip_delay_self = EQUIP_DELAY_SUIT
+ equip_delay_other = EQUIP_DELAY_SUIT * 1.5
+ strip_delay = EQUIP_DELAY_SUIT * 1.5
+ equip_self_flags = null
+
/obj/item/clothing/suit/armor/Initialize()
. = ..()
if(!allowed)
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index c62d0e92b8c0..fbba6443faf7 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -9,6 +9,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
/obj/item/clothing/suit/bio_suit
name = "bio suit"
@@ -29,6 +30,8 @@
strip_delay = 70
equip_delay_other = 70
resistance_flags = ACID_PROOF
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equip_self_flags = null
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 1524a4aa6466..1ab2f26c7df7 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -11,6 +11,12 @@
greyscale_colors = list(list(11, 15), list(12, 22), list(12, 22))
greyscale_icon_state = "cloak"
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+ equip_self_flags = EQUIP_ALLOW_MOVEMENT | EQUIP_SLOWDOWN
+
/obj/item/clothing/neck/cloak/hos
name = "head of security's cloak"
desc = "Worn by Securistan, ruling their watch with an iron fist."
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 03822d3f7a11..9b20dd2395c1 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -14,6 +14,13 @@
body_parts_covered = CHEST|GROIN
allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants)
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
+
/obj/item/clothing/suit/apron/waders
name = "horticultural waders"
desc = "A pair of heavy duty leather waders, perfect for insulating your soft flesh from spills, soil and thorns."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 83ec8abff93c..e51da946cbc6 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -198,6 +198,14 @@
icon_state = "cybersun_suit"
item_state = "cybersun_suit"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+
+ equip_sound = 'sound/items/equip/cloth_equip.ogg'
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/straight_jacket
name = "straight jacket"
desc = "A suit that completely restrains the wearer. Manufactured by Antyphun Corp." //Straight jacket is antifun
@@ -219,12 +227,24 @@
icon_state = "ianshirt"
item_state = "ianshirt"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/nerdshirt
name = "gamer shirt"
desc = "A baggy shirt with vintage game character Super Weasel Kid. Why would anyone wear this?"
icon_state = "nerdshirt"
item_state = "nerdshirt"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/jacket
name = "bomber jacket"
desc = "Aviators not included."
@@ -235,6 +255,12 @@
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "This makes you feel like the coolest guy in town!"
@@ -312,6 +338,12 @@
icon_state = "gothcoat"
item_state = "gothcoat"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/caution
name = "wet floor sign"
desc = "No running."
@@ -328,6 +360,12 @@
attack_verb = list("warned", "cautioned", "smashed")
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/head/hooded/ablative
name = "ablative hood"
desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a visor for cool-o-vision."
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 0eb5a90676c6..8166af12d301 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -8,6 +8,13 @@
var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this
pocket_storage_component_path = FALSE
+ equip_sound = 'sound/items/equip/cloth_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/hooded/Initialize()
. = ..()
MakeHood()
@@ -98,6 +105,13 @@
icon = 'icons/obj/clothing/suits/toggle.dmi'
mob_overlay_icon = 'icons/mob/clothing/suits/toggle.dmi'
+ equip_sound = 'sound/items/equip/cloth_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_COAT
+ equip_delay_other = EQUIP_DELAY_COAT * 1.5
+ strip_delay = EQUIP_DELAY_COAT * 1.5
+
/obj/item/clothing/suit/toggle/AltClick(mob/user)
..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 88661d6b835c..d0d49a7619c6 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -29,9 +29,8 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- strip_delay = 60
- equip_delay_other = 60
resistance_flags = FIRE_PROOF
+ equip_self_flags = null
/obj/item/clothing/suit/fire/firefighter
icon_state = "firesuit"
@@ -70,6 +69,12 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_HELMET
+ equip_delay_other = EQUIP_DELAY_HELMET * 1.5
+ strip_delay = EQUIP_DELAY_HELMET * 1.5
/obj/item/clothing/suit/bomb_suit
name = "bomb suit"
@@ -93,7 +98,7 @@
strip_delay = 70
equip_delay_other = 70
resistance_flags = NONE
-
+ equip_self_flags = null
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuit_sec"
@@ -130,6 +135,7 @@
resistance_flags = NONE
flags_1 = RAD_PROTECT_CONTENTS_1
supports_variations = VOX_VARIATION
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
/obj/item/clothing/suit/radiation
name = "radiation suit"
@@ -152,6 +158,8 @@
resistance_flags = NONE
flags_1 = RAD_PROTECT_CONTENTS_1
supports_variations = VOX_VARIATION
+ equip_sound = 'sound/items/equip/straps_equip.ogg'
+ equip_self_flags = null
/obj/item/clothing/head/radiation/space
name = "low-pressure radiation helmet"
@@ -166,6 +174,8 @@
flash_protect = FLASH_PROTECTION_WELDER
strip_delay = 50
equip_delay_other = 50
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equip_self_flags = null
/obj/item/clothing/suit/radiation/space
name = "low-pressure radiation suit"
@@ -182,4 +192,5 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
strip_delay = 80
equip_delay_other = 80
-
+ equip_sound = 'sound/items/equip/armor_equip.ogg'
+ equip_self_flags = null
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 7445eb2ad55a..2b1a6eb76572 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -16,6 +16,12 @@
greyscale_colors = list(list(15, 17), list(10, 19), list(15, 10))
greyscale_icon_state = "under"
+ equipping_sound = EQUIP_SOUND_SHORT_GENERIC
+ unequipping_sound = UNEQUIP_SOUND_SHORT_GENERIC
+ equip_delay_self = EQUIP_DELAY_UNDERSUIT
+ equip_delay_other = EQUIP_DELAY_UNDERSUIT * 1.5
+ strip_delay = EQUIP_DELAY_UNDERSUIT * 1.5
+
var/has_sensor = HAS_SENSORS // For the crew computer
var/random_sensor = TRUE
var/sensor_mode = NO_SENSORS
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 019d731a2708..d1d950e5779e 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -63,6 +63,9 @@
var/extinguishes_left = 5
cuttable = FALSE
+ //remove when phorids suck less
+ equip_delay_self = null
+
/obj/item/clothing/under/plasmaman/skirt //WS edit plasmaman customization
name = "plasma enviroskirt"
icon_state = "plasmaskirt"
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 0d9dab7a035f..54b7fe483a13 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -254,10 +254,10 @@
return FALSE
return TRUE
-/mob/proc/putItemFromInventoryInHandIfPossible(obj/item/I, hand_index, force_removal = FALSE)
+/mob/proc/putItemFromInventoryInHandIfPossible(obj/item/I, hand_index, force_removal = FALSE, use_unequip_delay = FALSE)
if(!can_put_in_hand(I, hand_index))
return FALSE
- if(!temporarilyRemoveItemFromInventory(I, force_removal))
+ if(!temporarilyRemoveItemFromInventory(I, force_removal, use_unequip_delay = use_unequip_delay))
return FALSE
I.remove_item_from_storage(src)
if(!put_in_hand(I, hand_index))
@@ -273,8 +273,8 @@
* * Will pass FALSE if the item can not be dropped due to TRAIT_NODROP via doUnEquip()
* If the item can be dropped, it will be forceMove()'d to the ground and the turf's Entered() will be called.
*/
-/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE)
- . = doUnEquip(I, force, drop_location(), FALSE, silent = silent)
+/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE, use_unequip_delay = FALSE)
+ . = doUnEquip(I, force, drop_location(), FALSE, silent = silent, use_unequip_delay = use_unequip_delay)
if(. && I && !(I.item_flags & NO_PIXEL_RANDOM_DROP)) //ensure the item exists and that it was dropped properly.
I.pixel_x = rand(-6,6)
I.pixel_y = rand(-6,6)
@@ -285,13 +285,13 @@
//visibly unequips I but it is NOT MOVED AND REMAINS IN SRC
//item MUST BE FORCEMOVE'D OR QDEL'D
-/mob/proc/temporarilyRemoveItemFromInventory(obj/item/I, force = FALSE, idrop = TRUE)
- return doUnEquip(I, force, null, TRUE, idrop, silent = TRUE)
+/mob/proc/temporarilyRemoveItemFromInventory(obj/item/I, force = FALSE, idrop = TRUE, use_unequip_delay = FALSE)
+ return doUnEquip(I, force, null, TRUE, idrop, silent = TRUE, use_unequip_delay = use_unequip_delay)
//DO NOT CALL THIS PROC
//use one of the above 3 helper procs
//you may override it, but do not modify the args
-/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress.
+/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress.
//Use no_move if the item is just gonna be immediately moved afterward
//Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced
PROTECTED_PROC(TRUE)
@@ -301,6 +301,14 @@
if(HAS_TRAIT(I, TRAIT_NODROP) && !force)
return FALSE
+ if(HAS_TRAIT(src, TRAIT_EQUIPPING_OR_UNEQUIPPING))//shim because our do_after is less neat than daedalus's
+ to_chat(src, span_warning("You're already unequipping something!"))
+ return FALSE
+
+ var/static/list/exclude_from_unequip_delay = list(null, ITEM_SLOT_RPOCKET, ITEM_SLOT_LPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_HANDS)
+ if(use_unequip_delay && !(get_slot_by_item(I) in exclude_from_unequip_delay) && !unequip_delay_self_check(I))
+ return FALSE
+
var/hand_index = get_held_index_of_item(I)
if(hand_index)
held_items[hand_index] = null
@@ -500,3 +508,84 @@
add_bodypart(BP)
hand_bodyparts[i] = BP
..() //Don't redraw hands until we have organs for them
+
+
+/// Called when a mob is equipping an item to itself.
+/mob/proc/equip_delay_self_check(obj/item/equipped, bypass_delay)
+ return TRUE
+
+/// Called when a mob is unequipping an item from itself.
+/mob/proc/unequip_delay_self_check(obj/item/unequipped, bypass_delay)
+ return TRUE
+
+#define EQUIPPING_INTERACTION_KEY(item) "equipping_item_[ref(item)]"
+
+/mob/living/carbon/human/equip_delay_self_check(obj/item/equipped, bypass_delay)
+ if(!equipped.equip_delay_self || bypass_delay)
+ return TRUE
+
+ if(DOING_INTERACTION(src, EQUIPPING_INTERACTION_KEY(equipped)))
+ return FALSE
+
+ visible_message(
+ span_notice("[src] starts to put on [equipped]..."),
+ span_notice("You start to put on [equipped]...")
+ )
+
+ . = equipped.do_equip_wait(src, equipped.equipping_sound)
+
+ if(.)
+ visible_message(
+ span_notice("[src] puts on [equipped]."),
+ span_notice("You put on [equipped].")
+ )
+
+/mob/living/carbon/human/unequip_delay_self_check(obj/item/unequipped)
+ if(!unequipped.equip_delay_self || is_holding(unequipped))
+ return TRUE
+
+ if(DOING_INTERACTION(src, EQUIPPING_INTERACTION_KEY(unequipped)))
+ return FALSE
+
+ visible_message(
+ span_notice("[src] starts to take off [unequipped]..."),
+ span_notice("You start to take off [unequipped]...")
+ )
+
+ . = unequipped.do_equip_wait(src, unequipped.unequipping_sound)
+
+ if(.)
+ visible_message(
+ span_notice("[src] takes off [unequipped]."),
+ span_notice("You takes off [unequipped].")
+ )
+
+
+/// Called by equip_delay_self and unequip_delay_self.
+/obj/item/proc/do_equip_wait(mob/living/equipping, soundtoplay)
+
+ var/flags = NONE
+ if(equip_self_flags & EQUIP_ALLOW_MOVEMENT)
+ flags |= IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE
+
+ if(equip_self_flags & EQUIP_SLOWDOWN)
+ equipping.add_movespeed_modifier(/datum/movespeed_modifier/equipping)
+
+ var/ourchannel
+ if(soundtoplay)
+ ourchannel = SSsounds.random_available_channel()
+ playsound(equipping.loc, soundtoplay, 35, channel = ourchannel)
+
+ ADD_TRAIT(equipping, TRAIT_EQUIPPING_OR_UNEQUIPPING, ref(src))
+
+ . = do_after(equipping, equip_delay_self, equipping, flags, interaction_key = EQUIPPING_INTERACTION_KEY(src))
+
+ if(ourchannel)
+ playsound(equipping.loc, null, 35, channel = ourchannel)
+
+ REMOVE_TRAIT(equipping, TRAIT_EQUIPPING_OR_UNEQUIPPING, ref(src))
+
+ if(!HAS_TRAIT(equipping, TRAIT_EQUIPPING_OR_UNEQUIPPING))
+ equipping.remove_movespeed_modifier(/datum/movespeed_modifier/equipping)
+
+#undef EQUIPPING_INTERACTION_KEY
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
index 9628545b3cce..227dcc78f45c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
. = ..()
if(!. || !I)
return
diff --git a/code/modules/mob/living/carbon/alien/larva/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm
index 23c461aa83c8..6212dd4b4b8f 100644
--- a/code/modules/mob/living/carbon/alien/larva/inventory.dm
+++ b/code/modules/mob/living/carbon/alien/larva/inventory.dm
@@ -1,3 +1,3 @@
//can't unequip since it can't equip anything
-/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
return
diff --git a/code/modules/mob/living/carbon/hologram/hologram_inventory.dm b/code/modules/mob/living/carbon/hologram/hologram_inventory.dm
index f7f98bf5ebbe..7d6650b4d539 100644
--- a/code/modules/mob/living/carbon/hologram/hologram_inventory.dm
+++ b/code/modules/mob/living/carbon/hologram/hologram_inventory.dm
@@ -5,7 +5,7 @@
//Drone hands
-/mob/living/simple_animal/hologram/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/simple_animal/hologram/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
if(..())
update_inv_hands()
if(I == internal_storage)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 12e152c0f3d9..d0c323797eac 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -228,7 +228,7 @@
var/obj/item/thing = sloties
. += thing?.slowdown
-/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 43e764561272..53de44fcd934 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1105,7 +1105,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!H.get_bodypart(BODY_ZONE_HEAD))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_NECK)
if(H.wear_neck && !swap)
return FALSE
@@ -1117,13 +1117,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!(I.slot_flags & ITEM_SLOT_BACK))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_OCLOTHING)
if(H.wear_suit && !swap)
return FALSE
if(!(I.slot_flags & ITEM_SLOT_OCLOTHING))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_GLOVES)
if(H.gloves && !swap)
return FALSE
@@ -1131,7 +1131,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(H.num_hands < 2)
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_FEET)
if(H.shoes && !swap)
return FALSE
@@ -1143,7 +1143,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!disable_warning)
to_chat(H, "This footwear isn't compatible with your feet!")
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_BELT)
if(H.belt && !swap)
return FALSE
@@ -1156,7 +1156,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!(I.slot_flags & ITEM_SLOT_BELT))
return
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_EYES)
if(H.glasses && !swap)
return FALSE
@@ -1167,7 +1167,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES)
if(E?.no_glasses)
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_HEAD)
if(H.head && !swap)
return FALSE
@@ -1175,7 +1175,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!H.get_bodypart(BODY_ZONE_HEAD))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_EARS)
if(H.ears && !swap)
return FALSE
@@ -1183,13 +1183,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!H.get_bodypart(BODY_ZONE_HEAD))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_ICLOTHING)
if(H.w_uniform && !swap)
return FALSE
if(!(I.slot_flags & ITEM_SLOT_ICLOTHING))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_ID)
if(H.wear_id)
if(SEND_SIGNAL(H.wear_id, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE))
@@ -1203,7 +1203,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!(I.slot_flags & ITEM_SLOT_ID))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
if(ITEM_SLOT_LPOCKET)
if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them.
return FALSE
@@ -1278,11 +1278,22 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
return FALSE //Unsupported slot
-/datum/species/proc/equip_delay_self_check(obj/item/I, mob/living/carbon/human/H, bypass_equip_delay_self)
- if(!I.equip_delay_self || bypass_equip_delay_self)
+/datum/species/proc/equip_delay_self_check(obj/item/to_equip, mob/living/carbon/human/ourhuman, bypass_equip_delay_self)
+ if(!to_equip.equip_delay_self || bypass_equip_delay_self)
return TRUE
- H.visible_message("[H] start putting on [I]...", "You start putting on [I]...")
- return do_after(H, I.equip_delay_self, target = H)
+
+ ourhuman.visible_message(
+ span_notice("[ourhuman] start putting on [to_equip]..."),
+ span_notice("You start putting on [to_equip]...")
+ )
+
+ . = to_equip.do_equip_wait(ourhuman, to_equip.equipping_sound)
+
+ if(.)
+ ourhuman.visible_message(
+ span_notice("[src] puts on [to_equip]."),
+ span_notice("You puts on [to_equip].")
+ )
/datum/species/proc/before_equip_job(datum/job/J, mob/living/carbon/human/H)
return
diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm
index 501f0b357515..c79ac3aaf68e 100644
--- a/code/modules/mob/living/carbon/human/species_types/kepori.dm
+++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm
@@ -145,7 +145,7 @@
//ya ain't got no biters to put it in sir
if(!H.get_bodypart(BODY_ZONE_HEAD))
return FALSE
- return equip_delay_self_check(I, H, bypass_equip_delay_self)
+ return H.equip_delay_self_check(I, bypass_equip_delay_self)
/datum/species/kepori/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
. = ..()
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 9525ebd6ec9b..f1cbd3156723 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -129,7 +129,7 @@
/mob/living/carbon/proc/has_equipped(obj/item/item, slot, initial = FALSE)
return item.equipped(src, slot, initial)
-/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
return
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
index f560043a0df8..5f83b3675319 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
@@ -6,7 +6,7 @@
//Drone hands
-/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
if(..())
update_inv_hands()
if(I == head)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 56478ebc7853..ed502837dc9a 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -237,7 +237,7 @@
Feedon(Food)
return ..()
-/mob/living/simple_animal/slime/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
+/mob/living/simple_animal/slime/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE, use_unequip_delay = FALSE)
return
/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
index 7a9e710c9382..77bfcab43aca 100644
--- a/code/modules/mod/mod_clothes.dm
+++ b/code/modules/mod/mod_clothes.dm
@@ -12,6 +12,12 @@
obj_flags = IMMUTABLE_SLOW
visor_flags = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|ALLOWINTERNALS
+ equipping_sound = null
+ unequipping_sound = null
+ equip_delay_self = null
+ strip_delay = null
+ equip_self_flags = null
+
/obj/item/clothing/suit/mod
name = "MOD chestplate"
desc = "A chestplate for a MODsuit."
@@ -26,6 +32,12 @@
cold_protection = CHEST|GROIN
obj_flags = IMMUTABLE_SLOW
+ equipping_sound = null
+ unequipping_sound = null
+ equip_delay_self = null
+ strip_delay = null
+ equip_self_flags = null
+
/obj/item/clothing/gloves/mod
name = "MOD gauntlets"
desc = "A pair of gauntlets for a MODsuit."
@@ -39,6 +51,12 @@
cold_protection = HANDS|ARMS
obj_flags = IMMUTABLE_SLOW
+ equipping_sound = null
+ unequipping_sound = null
+ equip_delay_self = null
+ strip_delay = null
+ equip_self_flags = null
+
/obj/item/clothing/shoes/mod
name = "MOD boots"
desc = "A pair of boots for a MODsuit."
@@ -54,3 +72,9 @@
supports_variations = DIGITIGRADE_VARIATION
can_be_tied = FALSE
visor_flags_inv = HIDESHOES
+
+ equipping_sound = null
+ unequipping_sound = null
+ equip_delay_self = null
+ strip_delay = null
+ equip_self_flags = null
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 37b9cf6e2ac7..5f6cfc4465e8 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -278,7 +278,7 @@
return
if(!wearer.incapacitated())
var/atom/movable/screen/inventory/hand/ui_hand = over_object
- if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index))
+ if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index, FALSE, TRUE))
add_fingerprint(usr)
return ..()
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index 4c967a58a7ec..6759b8a47f46 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -20,3 +20,6 @@
/datum/movespeed_modifier/sphere
multiplicative_slowdown = -0.5
+
+/datum/movespeed_modifier/equipping
+ multiplicative_slowdown = 1.5
diff --git a/sound/items/equip/armor_equip.ogg b/sound/items/equip/armor_equip.ogg
new file mode 100644
index 000000000000..d023d726a03f
Binary files /dev/null and b/sound/items/equip/armor_equip.ogg differ
diff --git a/sound/items/equip/cloth_equip.ogg b/sound/items/equip/cloth_equip.ogg
new file mode 100644
index 000000000000..f989b7d383dd
Binary files /dev/null and b/sound/items/equip/cloth_equip.ogg differ
diff --git a/sound/items/equip/equipping_long_generic.ogg b/sound/items/equip/equipping_long_generic.ogg
new file mode 100644
index 000000000000..57bcabf02e32
Binary files /dev/null and b/sound/items/equip/equipping_long_generic.ogg differ
diff --git a/sound/items/equip/equipping_med_generic.ogg b/sound/items/equip/equipping_med_generic.ogg
new file mode 100644
index 000000000000..3c51be8d8a05
Binary files /dev/null and b/sound/items/equip/equipping_med_generic.ogg differ
diff --git a/sound/items/equip/equipping_short_generic.ogg b/sound/items/equip/equipping_short_generic.ogg
new file mode 100644
index 000000000000..5f100eb4b313
Binary files /dev/null and b/sound/items/equip/equipping_short_generic.ogg differ
diff --git a/sound/items/equip/equipping_vfast_generic.ogg b/sound/items/equip/equipping_vfast_generic.ogg
new file mode 100644
index 000000000000..76bec9532106
Binary files /dev/null and b/sound/items/equip/equipping_vfast_generic.ogg differ
diff --git a/sound/items/equip/latex_equip.ogg b/sound/items/equip/latex_equip.ogg
new file mode 100644
index 000000000000..33f025a17775
Binary files /dev/null and b/sound/items/equip/latex_equip.ogg differ
diff --git a/sound/items/equip/straps_equip.ogg b/sound/items/equip/straps_equip.ogg
new file mode 100644
index 000000000000..f9e86cea3e8e
Binary files /dev/null and b/sound/items/equip/straps_equip.ogg differ
diff --git a/sound/items/equip/unequipping_long_generic.ogg b/sound/items/equip/unequipping_long_generic.ogg
new file mode 100644
index 000000000000..135eb3d64339
Binary files /dev/null and b/sound/items/equip/unequipping_long_generic.ogg differ
diff --git a/sound/items/equip/unequipping_med_generic.ogg b/sound/items/equip/unequipping_med_generic.ogg
new file mode 100644
index 000000000000..fb8231389758
Binary files /dev/null and b/sound/items/equip/unequipping_med_generic.ogg differ
diff --git a/sound/items/equip/unequipping_short_generic.ogg b/sound/items/equip/unequipping_short_generic.ogg
new file mode 100644
index 000000000000..bebe9d2bf7d5
Binary files /dev/null and b/sound/items/equip/unequipping_short_generic.ogg differ
diff --git a/sound/items/equip/unequipping_vfast_generic.ogg b/sound/items/equip/unequipping_vfast_generic.ogg
new file mode 100644
index 000000000000..4d63e1aec624
Binary files /dev/null and b/sound/items/equip/unequipping_vfast_generic.ogg differ