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