diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 0d01e3b920d..867f567be00 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -506,6 +506,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Sells for more money on the pirate bounty pad. #define TRAIT_HIGH_VALUE_RANSOM "high_value_ransom" +/// Makes the user handcuff others faster +#define TRAIT_FAST_CUFFING "fast_cuffing" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 82878b2dff1..b30073dd71c 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -195,6 +195,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_FASTMED" = TRAIT_FASTMED, + "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, "TRAIT_FAST_TYING" = TRAIT_FAST_TYING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 221d6ef820d..1043844ddf2 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index fcc432d41f8..40df1e201e6 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -158,6 +158,7 @@ /obj/item/clothing/gloves/krav_maga var/datum/martial_art/krav_maga/style = new + clothing_traits = list(TRAIT_FAST_CUFFING) /obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot) . = ..() diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index d923d4258f0..e00a2aa61f3 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -46,7 +46,9 @@ throw_range = 5 custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5) breakouttime = 1 MINUTES - var/handcuff_time = 3 SECONDS + var/handcuff_time = 4 SECONDS + ///Multiplier for handcuff time + var/handcuff_time_mod = 1 armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 ///Sound that plays when starting to put handcuffs on someone @@ -80,6 +82,11 @@ apply_cuffs(user,user) return + if(HAS_TRAIT(user, TRAIT_FAST_CUFFING)) + handcuff_time_mod = 0.75 + else + handcuff_time_mod = 1 + if(!C.handcuffed) if(C.canBeHandcuffed()) C.visible_message(span_danger("[user] is trying to put [src] on [C]!"), \ @@ -88,7 +95,7 @@ to_chat(C, span_userdanger("As you feel someone grab your wrists, [src] start digging into your skin!")) playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, C, "attempted to handcuff") - if(do_after(user, handcuff_time, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) + if(do_after(user, handcuff_time * handcuff_time_mod, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index 492008d5348..f73b5b13da7 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -108,6 +108,7 @@ do { \ resistance_flags = NONE armor_type = /datum/armor/gloves_chameleon actions_types = list(/datum/action/item_action/chameleon/change/gloves) + clothing_traits = list(TRAIT_FAST_CUFFING) /obj/item/clothing/gloves/chameleon/broken diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 486f44f3504..107e13c2970 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -315,6 +315,9 @@ if (1601 to 35000) . += "[src] offers the wearer robust protection from fire." + if(TRAIT_FAST_CUFFING in clothing_traits) + . += "[src] increase the speed that you handcuff others." + for(var/zone in damage_by_parts) var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 var/zone_name = parse_zone(zone) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index f77f6cc2c67..11230d18d37 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -9,6 +9,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE cut_type = /obj/item/clothing/gloves/fingerless + clothing_traits = list(TRAIT_FAST_CUFFING) // SKYRAT EDIT ADDITION START uses_advanced_reskins = TRUE unique_reskin = list( diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index e69813272d7..77030822716 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -11,6 +11,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor_type = /datum/armor/gloves_combat + clothing_traits = list(TRAIT_FAST_CUFFING) /datum/armor/gloves_combat bio = 90 diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 74de42937e1..d7fb34ae7c7 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -88,6 +88,7 @@ strip_delay = 60 armor_type = /datum/armor/captain_gloves resistance_flags = NONE + clothing_traits = list(TRAIT_FAST_CUFFING) /datum/armor/captain_gloves bio = 90 @@ -102,7 +103,7 @@ greyscale_colors = null siemens_coefficient = 0.3 armor_type = /datum/armor/latex_gloves - clothing_traits = list(TRAIT_QUICK_CARRY, TRAIT_FINGERPRINT_PASSTHROUGH) + clothing_traits = list(TRAIT_QUICK_CARRY) resistance_flags = NONE /datum/armor/latex_gloves diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 986d8356b1a..a904cd0dd90 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -7,7 +7,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT resistance_flags = NONE custom_premium_price = PAYCHECK_COMMAND * 3.5 - clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) + clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH,TRAIT_FAST_CUFFING) /// For storing our tackler datum so we can remove it after var/datum/component/tackler /// See: [/datum/component/tackler/var/stamina_cost] diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 3bcd0751ce4..0933c7e8f18 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -164,6 +164,7 @@ /obj/item/mod/module/pepper_shoulders, /obj/item/mod/module/criminalcapture, /obj/item/mod/module/dispenser/mirage, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/safeguard @@ -177,6 +178,7 @@ /obj/item/mod/module/megaphone, /obj/item/mod/module/projectile_dampener, /obj/item/mod/module/pepper_shoulders, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack, @@ -191,6 +193,7 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/pathfinder, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack/advanced, @@ -217,6 +220,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -236,6 +240,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -256,6 +261,7 @@ /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -291,6 +297,7 @@ /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -309,6 +316,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, /obj/item/mod/module/flamethrower, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -327,6 +335,7 @@ /obj/item/mod/module/quick_carry, /obj/item/mod/module/visor/diaghud, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) @@ -343,6 +352,7 @@ /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/hat_stabilizer/syndicate, /obj/item/mod/module/tether, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/enchanted @@ -353,6 +363,7 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield/advanced, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/ninja @@ -367,6 +378,7 @@ /obj/item/mod/module/dispenser/ninja, /obj/item/mod/module/dna_lock/reinforced, /obj/item/mod/module/emp_shield/pulse, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/stealth/ninja, @@ -404,6 +416,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, + /obj/item/mod/module/quick_cuff, ) /// The insignia type, insignias show what sort of member of the ERT you're dealing with. var/insignia_type = /obj/item/mod/module/insignia @@ -454,6 +467,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander @@ -483,6 +497,7 @@ /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack, @@ -496,6 +511,7 @@ /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/corporate @@ -559,6 +575,7 @@ /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/anomaly_locked/kinesis/admin, /obj/item/mod/module/shove_blocker, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/stealth/ninja, diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 08ceb4a1bd9..c3b6998c5b5 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -597,3 +597,17 @@ desc = "Layers upon layers of shock dampening plates, just to stop you from getting shoved into a wall by an angry mob. Good luck removing this one." removable = FALSE complexity = 0 + +/obj/item/mod/module/quick_cuff + name = "MOD restraint assist module" + desc = "Enhanced gauntlent grip pads that help with placing individuals in restraints more quickly. Doesn't look like they'll come off." + removable = FALSE + complexity = 0 + +/obj/item/mod/module/quick_cuff/on_suit_activation() + . = ..() + ADD_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT) + +/obj/item/mod/module/quick_cuff/on_suit_deactivation(deleting = FALSE) + . = ..() + REMOVE_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT)