From ec59c6aaa36781bd9d56ecdb91b941e0128e72ca Mon Sep 17 00:00:00 2001 From: Syndie Kate <116040301+F-e-r-n@users.noreply.github.com> Date: Sat, 21 Sep 2024 20:34:46 -0400 Subject: [PATCH] Adds Power gloves as a new engineering traitor item! (#1797) * Adds Power Gloves NO GOON CODE WAS USED IN THE MAKING OF THIS PR -Adds Power Gloves: a traitor item that takes excess power from a wire underfoot and allows you to zap people with it -Changes the tesla_zap proc to have customizable bounces and max damage * Removed energy_ball dependancy -Changed tesla_zap into a specific glove_tesla_zap -Added more checks, finalized sounds. TODO: fix range bug * Final Fixed range bug, changed a few flavortext things and made icons fit in with default actions. * Fixes border Changes the overlay_icon_state to be an actual overlay, fixing the error sprite. * Improve readability Moves if else statements slightly to improve readability Co-authored-by: AlbertNanotracen <155601848+AlbertNanotracen@users.noreply.github.com> * Final2, ELECTRIC boogaloo Uncaps burn damage with a... Mostly sane equation. Adds in dusting. May need extra balancing if too powerful. * Requested changes Sets code up to standards. * Formatting fix Literally just moved equals signs * Power is sane changes units to be easily readable * Name change * hopefully this works? * oops * erm? * you silly goober * silly goober mode * minor refactor and logging Refactors checks to be more efficient, logs when electrocute acts are completed. * fixes my stupidity seriously what the fuck was i smoking * guh * guh pt2 * Lights now flicker and atmos techs can buy them :] * sigh * Some minor fixes and clarifications * Fixes range bug, adds activation messages * HOLY SHIT OOOOOOPS * MORE fixes * name formatting change --------- Co-authored-by: AlbertNanotracen <155601848+AlbertNanotracen@users.noreply.github.com> Co-authored-by: Lucy --- .../modules/clothing/gloves/power_gloves.dm | 107 ++++++++++++++++++ .../code/modules/uplink/uplink_items/job.dm | 7 ++ .../sound/weapons/powerglovestarget.ogg | Bin 0 -> 15191 bytes tgstation.dme | 1 + 4 files changed, 115 insertions(+) create mode 100644 monkestation/code/modules/clothing/gloves/power_gloves.dm create mode 100644 monkestation/sound/weapons/powerglovestarget.ogg diff --git a/monkestation/code/modules/clothing/gloves/power_gloves.dm b/monkestation/code/modules/clothing/gloves/power_gloves.dm new file mode 100644 index 000000000000..b643bc69ee92 --- /dev/null +++ b/monkestation/code/modules/clothing/gloves/power_gloves.dm @@ -0,0 +1,107 @@ +/obj/item/clothing/gloves/color/yellow/power_gloves + name = "power gloves" + desc = "Insulated gloves with onboard machinery that appears to be able to redirect the electrical current towards a creature. It only works if there is a powered cable underneath the user." + armor_type = /datum/armor/power_gloves + var/datum/action/cooldown/spell/pointed/glove_zap/zap = new + +/obj/item/clothing/gloves/color/yellow/power_gloves/Destroy() + QDEL_NULL(zap) + return ..() + +/datum/armor/power_gloves + acid = 50 + bio = 50 + fire = 80 + +/datum/action/cooldown/spell/pointed/glove_zap + name = "Unleash Electricity" + desc = "INFINITE POWAHHH!!! Blast your foes with the electricity surging beneath your feet!" + button_icon_state = "lightning" + cooldown_time = 15 SECONDS + spell_max_level = 1 + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_INCAPACITATED + sparks_amt = 4 + spell_requirements = SPELL_REQUIRES_HUMAN + antimagic_flags = NONE + background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND + overlay_icon_state = "bg_default_border" + active_msg = "You feel a faint buzz of electricity from beneath your feet." + deactive_msg = "You feel the buzz of electricity dissipate." + +//had to recreate tesla zap into a pointed version +/datum/action/cooldown/spell/pointed/glove_zap/proc/target_tesla_zap(atom/source, atom/target, power, zap_flags = ZAP_DEFAULT_FLAGS, max_damage = INFINITY) + // damage the shock causes, be wary of fucking with the function without extensive testing. + var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round( 5*(ROOT (4, (power)))), max_damage) + rand(-5, 5)) : 0 + //24 damage at 10 KW, 75 damage at 1 MW, 132 at 10 MW, 420 at 1 GW (nice) + var/mob/living/electrocute_victim = target + var/dust_power = 10 GW + var/heavy_emp_threshold = 1 MW + + source.Beam(target, icon_state="lightning[rand(1,12)]", time = 5) //Creates lightning beam + var/zapdir = get_dir(source, target) + if(zapdir) + . = zapdir + + if(!isliving(target)) + return + + if(power >= dust_power) //Dusts if there's enough in the grid + electrocute_victim.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) + log_combat(owner, target, "zapped", /obj/item/clothing/gloves/color/yellow/power_gloves, "[power] watts were used resulting in [shock_damage] damage.") + + else + electrocute_victim.dust(TRUE, FALSE, TRUE) + log_combat(owner, target, "zapped", /obj/item/clothing/gloves/color/yellow/power_gloves, "[power] watts were used resulting in the target dusting.") + return + + + if(issilicon(target)) //sillycons get emp'd + var/mob/living/silicon/silicon_target = target + if (power <= 10 KW) + silicon_target.emp_act(EMP_LIGHT) + else if (power <=heavy_emp_threshold) + silicon_target.emp_act(EMP_HEAVY) + +/datum/action/cooldown/spell/pointed/glove_zap/proc/glove_nerd_zap(atom/target, /mob/living/owner) + var/turf/owner_turf = get_turf(owner) + var/obj/structure/cable/cable_target = owner_turf.get_cable_node() //Gets power from underfoot node + var/heavy_zap = 100 MW + if(!cable_target) + owner.balloon_alert(owner, "Stand on a cable!") + return + var/surplus = cable_target.surplus() + if(surplus <= 1 KW) + owner.balloon_alert(owner, "Not enough power in the grid!") + return + else + playsound(owner, 'monkestation/sound/weapons/powerglovestarget.ogg', 35, TRUE, -1) + if(do_after(owner, 3 SECONDS, target, IGNORE_TARGET_LOC_CHANGE)) + for(var/obj/machinery/light/light in get_area(owner)) + light.flicker(amount = rand(3, 6)) + if(get_dist(owner, target) >= cast_range) + owner.balloon_alert(owner, "Target moved out of range!") + return + else + var/calculated_power = surplus/20 //Calc_power, change division to balance + target_tesla_zap(owner, target, calculated_power, SHOCK_NOSTUN, INFINITY) + StartCooldown() + if(surplus <= heavy_zap) //plays a separate sound at 2 MW excess + playsound(target, 'sound/magic/lightningshock.ogg', 50, TRUE, -1) + else + playsound(target, 'sound/magic/lightningbolt.ogg', 50, TRUE, -1) + +/obj/item/clothing/gloves/color/yellow/power_gloves/equipped(mob/living/owner, slot) + . = ..() + if (slot & ITEM_SLOT_GLOVES) + zap.Grant(owner) + +/obj/item/clothing/gloves/color/yellow/power_gloves/dropped(mob/living/owner, slot) + . = ..() + if (owner.get_item_by_slot(ITEM_SLOT_GLOVES) == src) + zap.Remove(owner) + +/datum/action/cooldown/spell/pointed/glove_zap/InterceptClickOn(mob/living/user, params, atom/target) + . = ..() + glove_nerd_zap(target, user) + return TRUE + diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm index b69c2d2de964..f3a3087710cb 100644 --- a/monkestation/code/modules/uplink/uplink_items/job.dm +++ b/monkestation/code/modules/uplink/uplink_items/job.dm @@ -71,3 +71,10 @@ item = /obj/item/disk/plantgene/syndicate cost = 20 restricted_roles = list(JOB_BOTANIST) + +/datum/uplink_item/role_restricted/power_gloves + name = "Power Gloves" + desc = "Are the Engineers on your station creating too much power? Use this to set them in their place. T-ray scanner not included" + cost = 8 + item = /obj/item/clothing/gloves/color/yellow/power_gloves + restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) diff --git a/monkestation/sound/weapons/powerglovestarget.ogg b/monkestation/sound/weapons/powerglovestarget.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d5ad9c7ffcb780a38c75da7f40100e99b2227d52 GIT binary patch literal 15191 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 i^@>u4z}se}cz%5Q`Wk!-?D+ECxxbh?9&!NW