diff --git a/baystation12.dme b/baystation12.dme
index af6e369282f..ac88dd46faf 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -889,6 +889,7 @@
#include "code\modules\clothing\gloves\boxing.dm"
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
+#include "code\modules\clothing\gloves\stungloves.dm"
#include "code\modules\clothing\head\collectable.dm"
#include "code\modules\clothing\head\hardhat.dm"
#include "code\modules\clothing\head\helmet.dm"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 0a91d596f76..46feaf7ab44 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -51,3 +51,152 @@
item_state = "ggloves"
permeability_coefficient = 0.05
siemens_coefficient = 0.50 //thick work gloves
+
+/obj/item/clothing/gloves/watch
+ desc = "A small wristwatch, capable of telling time."
+ name = "watch"
+ icon_state = "watch"
+ item_state = "watchgloves"
+ w_class = 1
+ wired = 1
+ species_restricted = null
+
+ verb/checktime()
+ set category = "Object"
+ set name = "Check Time"
+ set src in usr
+
+ if(wired && !clipped)
+ usr << "You check your watch, spotting a digital collection of numbers reading '[worldtime2text()]'. Today's date is '[time2text(world.time, "Month DD")]. [game_year]'."
+ if (emergency_shuttle.get_status_panel_eta())
+ usr << "\red The shuttle's status is reported as: [emergency_shuttle.get_status_panel_eta()]."
+ else if(wired && clipped)
+ usr << "You check your watch realising it's still open"
+ else
+ usr << "You check your watch as it dawns on you that it's broken"
+
+ verb/pointatwatch()
+ set category = "Object"
+ set name = "Point at watch"
+ set src in usr
+
+ if(wired && !clipped)
+ usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes.", "You point down at the [src], an arrogant look about your eyes.")
+ else if(wired && clipped)
+ usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open", "You point down at the [src], an arrogant look about your eyes.")
+ else
+ usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken", "You point down at the [src], an arrogant look about your eyes.")
+
+ examine(mob/user)
+ ..()
+ if (get_dist(src, user) <= 1)
+ checktime()
+
+ attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if (clipped) //Using clipped because adding a new var for something is dumb
+ user.visible_message("\blue [user] screws the cover of the [src] closed.","\blue You screw the cover of the [src] closed..")
+ clipped = 0
+ return
+// playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ user.visible_message("\blue [user] unscrew the cover of the [src].","\blue You unscrew the cover of the [src].")
+ clipped = 1
+ return
+ if(wired)
+ return
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if (!clipped)
+ user << "The [src] is not open."
+ return
+
+ if(wired)
+ user << "The [src] are already wired."
+ return
+
+ if(C.amount < 2)
+ user << "There is not enough wire to cover the [src]."
+ return
+
+ C.use(2)
+ wired = 1
+ user << "You repair some wires in the [src]."
+ return
+
+ emp_act(severity)
+ if(prob(50/severity))
+ wired = 0
+ ..()
+
+ /*
+ Forcegloves. They amplify force from melee hits as well as muck up disarm and stuff a little.
+ Has bits of code in item_attack.dm, stungloves.dm, human_attackhand, human_defense
+ */
+
+
+/obj/item/clothing/gloves/force // this pair should be put in r&d if you choose to do so. and also the hos office locker. do it okay
+
+ desc = "These gloves bend gravity and bluespace, dampening inertia and augmenting the wearer's melee capabilities."
+ name = "force gloves"
+ icon_state = "black"
+ item_state = "swat_gl"
+ siemens_coefficient = 0.6
+ permeability_coefficient = 0.05
+
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+
+ var/active = 1 //i am actually too lazy to code an on/off switch so if you want it off, take them off for now. yes.
+ var/amplification = 2
+
+/obj/item/clothing/gloves/force/basic //dooo iiiitttttt
+ desc = "These gloves bend gravity and bluespace, providing a cheap boost to the effectiveness of your average security staff."
+ name = "basic force gloves" //do it skull do it give it to all sec the forums agree go
+ amplification = 1 //just do it
+
+/obj/item/clothing/gloves/force/syndicate //for syndies. pda, *maybe* nuke team or ert. up to you. maybe just use the amp 2 variant.
+ desc = "These gloves bend gravity and bluespace, dampening inertia and augmenting the wearer's melee capabilities."
+ name = "enhanced force gloves"
+ icon_state = "black"
+ item_state = "swat_gl"
+ amplification = 2.5 //because *2.5 is kind of scary okay. sometimes you want the scary effect. sometimes not.
+
+
+/* this is too cluttered. i'd rather keep it simple.
+
+ verb/toggleGloves() //also this doesn't actually do anything yet. if you want to code in on/off, it needs interactions with the human attackhand file.
+ set category = "Object"
+ set name = "Toggle Forceglove Activity"
+ set src in usr
+
+ if (active == 0)
+ active = 1
+ amplification = 1.5
+ usr << "You squeeze twice, activating the gloves and amplifying the force of your blows. Your hands tingle pleasantly."
+
+ else if (active == 1)
+ active = 0
+ amplification = 1
+ usr << "You deactivate the forcegloves. Your hands feel heavy."
+
+ verb/toggleForceAmp()
+ set category = "Object"
+ set name = "Toggle Force-Amplification Level"
+ set src in usr
+
+ if (active == 0)
+ usr << "You wiggle your fingers, but the gloves aren't active. You activate them, setting the gloves to their lowest setting: Lethal. You will now hit 1.5x as hard."
+ amplification = 1.5
+ else if (amplification < 1.5 || amplification == 2.5 )
+ amplification = 1.5
+ usr << "You wiggle your fingers, setting the gloves to their lowest setting: Lethal. You will now hit 1.5x as hard."
+ else if (amplification == 1.5)
+ amplification = 2
+ usr << "You wiggle your fingers, setting the gloves to the medium setting: Very Lethal. You will now hit twice as hard."
+ else if (amplification == 2)
+ amplification = 2.5
+ usr << "You wiggle your fingers, setting the gloves to the highest setting: Extremely Lethal. You will now hit 2.5x as hard."
+
+*/
diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm
new file mode 100644
index 00000000000..02ca6e7a731
--- /dev/null
+++ b/code/modules/clothing/gloves/stungloves.dm
@@ -0,0 +1,93 @@
+/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user)
+ if(istype(src, /obj/item/clothing/gloves/boxing)) //quick fix for stunglove overlay not working nicely with boxing gloves.
+ user << "That won't work." //i'm not putting my lips on that!
+ ..()
+ return
+ else if(istype(src, /obj/item/clothing/gloves/force))
+ user << "That seems like a terrible idea."
+ ..()
+ return
+
+ //add wires
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if (clipped)
+ user << "The [src] are too badly mangled for wiring."
+ return
+
+ if(wired)
+ user << "The [src] are already wired."
+ return
+
+ if(C.amount < 2)
+ user << "There is not enough wire to cover the [src]."
+ return
+
+ C.use(2)
+ wired = 1
+ siemens_coefficient = 3.0
+ user << "You wrap some wires around the [src]."
+ update_icon()
+ return
+
+ //add cell
+ else if(istype(W, /obj/item/weapon/cell))
+ if(!wired)
+ user << "The [src] need to be wired first."
+ else if(!cell)
+ user.drop_item()
+ W.loc = src
+ cell = W
+ w_class = 3.0
+ user << "You attach the [cell] to the [src]."
+ update_icon()
+ else
+ user << "A [cell] is already attached to the [src]."
+ return
+
+ else if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
+
+ //stunglove stuff
+ if(cell)
+ cell.update_icon()
+ user << "You cut the [cell] away from the [src]."
+ cell.loc = get_turf(src.loc)
+ cell = null
+ w_class = 2.0
+ update_icon()
+ return
+ if(wired) //wires disappear into the void because fuck that shit
+ wired = 0
+ siemens_coefficient = initial(siemens_coefficient)
+ user << "You cut the wires away from the [src]."
+ update_icon()
+ return
+
+ //clipping fingertips
+ if(!clipped)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ user.visible_message("\red [user] cuts the fingertips off of the [src].","\red You cut the fingertips off of the [src].")
+
+ clipped = 1
+ name = "mangled [name]"
+ desc = "[desc]
They have had the fingertips cut off of them."
+ if("exclude" in species_restricted)
+ species_restricted -= "Unathi"
+ species_restricted -= "Tajaran"
+ return
+ else
+ user << "The [src] have already been clipped!"
+ update_icon()
+ return
+
+ return
+
+ ..()
+
+/obj/item/clothing/gloves/update_icon()
+ ..()
+ overlays.Cut()
+ if(wired)
+ overlays += "gloves_wire"
+ if(cell)
+ overlays += "gloves_cell"
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 9c17339e4cb..c5ef55f9e83 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -24,6 +24,42 @@
H.do_attack_animation(src)
return 0
+ if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves))
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(G.cell)
+ if(M.a_intent == I_HURT)//Stungloves. Any contact will stun the alien.
+ if(G.cell.charge >= 2500)
+ G.cell.use(G.cell.charge) //So it drains the cell.
+ visible_message("\red [src] has been touched with the stun gloves by [M]!")
+ M.attack_log += text("\[[time_stamp()]\] Stungloved [src.name] ([src.ckey])")
+ src.attack_log += text("\[[time_stamp()]\] Has been stungloved by [M.name] ([M.ckey])")
+
+ msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (JMP)")
+
+ var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
+ apply_effects(5,5,0,0,5,0,0,armorblock)
+ apply_damage(rand(5,25), BURN, M.zone_sel.selecting,armorblock)
+
+ if(prob(15))
+ playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ M.visible_message("\red The power source on [M]'s stun gloves overloads in a terrific fashion!", "\red Your jury rigged stun gloves malfunction!", "\red You hear a loud sparking.")
+
+ if(prob(50))
+ M.apply_damage(rand(1,5), BURN)
+
+ for(M in viewers(3, null))
+ var/safety = M:eyecheck()
+ if(!safety)
+ if(!M.blinded)
+ flick("flash", M.flash)
+
+ return 1
+ else
+ M << "\red Not enough charge! "
+ visible_message("\red [src] has been touched with the stun gloves by [M]!")
+ return
+
+
if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove))
H.do_attack_animation(src)
var/damage = rand(0, 9)
@@ -104,6 +140,11 @@
H.do_attack_animation(src)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/force))
+ G.state = GRAB_AGGRESSIVE
+ G.icon_state = "grabbed1"
+ visible_message("[M] gets a strong grip on [src]!")
+ return 1
visible_message("[M] has grabbed [src] passively!")
return 1
@@ -209,8 +250,11 @@
if(HULK in H.mutations)
real_damage *= 2 // Hulks do twice the damage
rand_damage *= 2
- real_damage = max(1, real_damage)
+ real_damage = max(1, real_damage)
+ if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/force))
+ var/obj/item/clothing/gloves/force/X = H.gloves
+ real_damage *= X.amplification
var/armour = run_armor_check(affecting, "melee")
// Apply additional unarmed effects.
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
@@ -244,16 +288,40 @@
var/randn = rand(1, 100)
if(!(species.flags & NO_SLIP) && randn <= 25)
- var/armor_check = run_armor_check(affecting, "melee")
- apply_effect(3, WEAKEN, armor_check)
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(armor_check < 2)
- visible_message("[M] has pushed [src]!")
+ if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/force))
+ apply_effect(6, WEAKEN, run_armor_check(affecting, "melee"))
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("\red [M] hurls [src] to the floor!")
+ step_away(src,M,15)
+ sleep(3)
+ step_away(src,M,15)
+ return
+
else
- visible_message("[M] attempted to push [src]!")
- return
+ var/armor_check = run_armor_check(affecting, "melee")
+ apply_effect(3, WEAKEN, armor_check)
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ if(armor_check < 2)
+ visible_message("[M] has pushed [src]!")
+ else
+ visible_message("[M] attempted to push [src]!")
+ return
if(randn <= 60)
+ if(H.gloves && istype(H.gloves,/obj/item/clothing/gloves/force))
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("\red [M] shoves, sending [src] flying!")
+ step_away(src,M,15)
+ sleep(1)
+ step_away(src,M,15)
+ sleep(1)
+ step_away(src,M,15)
+ sleep(1)
+ step_away(src,M,15)
+ sleep(1)
+ apply_effect(1, WEAKEN, run_armor_check(affecting, "melee"))
+ return
+
//See about breaking grips or pulls
if(break_all_grabs(M))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 5facabb6bc0..5bc3dba05ff 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -211,6 +211,13 @@ emp_act
if(user.a_intent == "disarm") effective_force = round(I.force/2)
var/hit_area = affecting.name
+ // forceglove amplification
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/X = user
+ if(X.gloves && istype(X.gloves,/obj/item/clothing/gloves/force))
+ var/obj/item/clothing/gloves/force/G = X.gloves
+ effective_force *= G.amplification
+
if((user != src) && check_shields(effective_force, "the [I.name]"))
return 0
@@ -482,4 +489,3 @@ emp_act
perm += perm_by_part[part]
return perm
-
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 3ddb262453a..0f201430e5b 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1375,6 +1375,19 @@ datum/design/item/weapon/phoronpistol
materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000)
build_path = /obj/item/weapon/gun/energy/toxgun
+/*This is all the station gets for producable force gloves. It's a high-risk item and thus considered contraband
+outside of RnD without paperwork with the RD's stamp on it. */
+datum/design/item/forcegloves
+ name = "Force Gloves"
+ desc = "These gloves bend gravity and bluespace, dampening inertia and augmenting the wearer's melee capabilities."
+ id = "forcegloves"
+ req_tech = list("combat" = 3,"bluespace" = 3, "engineering" = 3, "magnets" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 4000)
+ build_path = "/obj/item/clothing/gloves/force/basic"
+ locked = 1
+ category = "Weapons"
+
/////////////////////////////////////////
/////////////////Mining//////////////////
/////////////////////////////////////////
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 3bf562b707d..88b945bfec9 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ