diff --git a/code/datums/wires/emitter.dm b/code/datums/wires/emitter.dm
new file mode 100644
index 00000000000..e58b3a5e095
--- /dev/null
+++ b/code/datums/wires/emitter.dm
@@ -0,0 +1,13 @@
+
+/datum/wires/emitter
+ randomize = 1 //Only one wire don't need blueprints
+ holder_type = /obj/machinery/power/emitter
+
+/datum/wires/emitter/New(atom/holder)
+ wires = list(WIRE_ZAP)
+ ..()
+
+/datum/wires/emitter/on_pulse(wire)
+ var/obj/machinery/power/emitter/E = holder
+ E.fire_beam()
+ ..()
diff --git a/code/datums/wires/tesla_coil.dm b/code/datums/wires/tesla_coil.dm
new file mode 100644
index 00000000000..fa858a9a8ff
--- /dev/null
+++ b/code/datums/wires/tesla_coil.dm
@@ -0,0 +1,13 @@
+
+/datum/wires/tesla_coil
+ randomize = 1 //Only one wire don't need blueprints
+ holder_type = /obj/machinery/power/tesla_coil
+
+/datum/wires/tesla_coil/New(atom/holder)
+ wires = list(WIRE_ZAP)
+ ..()
+
+/datum/wires/tesla_coil/on_pulse(wire)
+ var/obj/machinery/power/tesla_coil/C = holder
+ C.zap()
+ ..()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index ecd3c09664d..242d64c5a14 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -33,6 +33,7 @@
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null)
B.apply_default_parts(src)
RefreshParts()
+ wires = new /datum/wires/emitter(src)
/obj/item/weapon/circuitboard/machine/emitter
name = "Emitter (Machine Board)"
@@ -153,8 +154,7 @@
src.active = 0
update_icon()
return
- if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
-
+ if(src.active == 1)
if(!active_power_usage || avail(active_power_usage))
add_load(active_power_usage)
if(!powered)
@@ -168,40 +168,45 @@
investigate_log("lost power and turned off","singulo")
log_game("Emitter lost power in ([x],[y],[z])")
return
+ fire_beam()
- src.last_shot = world.time
- if(src.shot_number < 3)
- src.fire_delay = 2
- src.shot_number ++
- else
- src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
- src.shot_number = 0
+/obj/machinery/power/emitter/proc/check_delay()
+ if((src.last_shot + src.fire_delay) <= world.time)
+ return TRUE
+ return FALSE
- var/obj/item/projectile/A = new projectile_type(src.loc)
-
- A.setDir(src.dir)
- playsound(src.loc, projectile_sound, 25, 1)
-
- if(prob(35))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
-
- switch(dir)
- if(NORTH)
- A.yo = 20
- A.xo = 0
- if(EAST)
- A.yo = 0
- A.xo = 20
- if(WEST)
- A.yo = 0
- A.xo = -20
- else // Any other
- A.yo = -20
- A.xo = 0
- A.starting = loc
- A.fire()
+/obj/machinery/power/emitter/proc/fire_beam()
+ if(!check_delay())
+ return FALSE
+ src.last_shot = world.time
+ if(src.shot_number < 3)
+ src.fire_delay = 20
+ src.shot_number ++
+ else
+ src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
+ src.shot_number = 0
+ var/obj/item/projectile/A = new projectile_type(src.loc)
+ A.setDir(src.dir)
+ playsound(src.loc, projectile_sound, 25, 1)
+ if(prob(35))
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ switch(dir)
+ if(NORTH)
+ A.yo = 20
+ A.xo = 0
+ if(EAST)
+ A.yo = 0
+ A.xo = 20
+ if(WEST)
+ A.yo = 0
+ A.xo = -20
+ else // Any other
+ A.yo = -20
+ A.xo = 0
+ A.starting = loc
+ A.fire()
/obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user)
if(state == EM_WELDED)
@@ -269,6 +274,10 @@
user << "Access denied."
return
+ if(is_wire_tool(W) && panel_open)
+ wires.interact(user)
+ return
+
if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W))
return
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index b216804cd8a..f4d303c0199 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -13,11 +13,14 @@
var/power_loss = 2
var/input_power_multiplier = 1
+ var/zap_cooldown = 100
+ var/last_zap = 0
/obj/machinery/power/tesla_coil/New()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/tesla_coil(null)
B.apply_default_parts(src)
+ wires = new /datum/wires/tesla_coil(src)
/obj/item/weapon/circuitboard/machine/tesla_coil
name = "Tesla Coil (Machine Board)"
@@ -27,8 +30,10 @@
/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
+ zap_cooldown = 100
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
power_multiplier += C.rating
+ zap_cooldown -= (C.rating * 20)
input_power_multiplier = power_multiplier
/obj/machinery/power/tesla_coil/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
@@ -56,6 +61,10 @@
if(default_deconstruction_crowbar(W))
return
+ if(is_wire_tool(W) && panel_open)
+ wires.interact(user)
+ return
+
return ..()
/obj/machinery/power/tesla_coil/attack_hand(mob/user)
@@ -77,6 +86,19 @@
else
..()
+/obj/machinery/power/tesla_coil/proc/zap()
+ if((last_zap + zap_cooldown) > world.time)
+ return FALSE
+ last_zap = world.time
+ var/coeff = (12 - (input_power_multiplier * 3))
+ coeff = max(coeff, 1)
+ var/shock_coeff = (5 - input_power_multiplier)
+ shock_coeff = max(shock_coeff, 1)
+ var/power = (powernet.avail/coeff)
+ add_load(power)
+ playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
+ tesla_zap(src, 10, power/shock_coeff)
+
/obj/machinery/power/grounding_rod
name = "Grounding Rod"
desc = "Keep an area from being fried from Edison's Bane."
diff --git a/tgstation.dme b/tgstation.dme
index b40034afdb6..159451962c7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -285,6 +285,7 @@
#include "code\datums\wires\airlock.dm"
#include "code\datums\wires\apc.dm"
#include "code\datums\wires\autolathe.dm"
+#include "code\datums\wires\emitter.dm"
#include "code\datums\wires\explosive.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
@@ -293,6 +294,7 @@
#include "code\datums\wires\robot.dm"
#include "code\datums\wires\suit_storage_unit.dm"
#include "code\datums\wires\syndicatebomb.dm"
+#include "code\datums\wires\tesla_coil.dm"
#include "code\datums\wires\vending.dm"
#include "code\datums\wires\wires.dm"
#include "code\game\alternate_appearance.dm"