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"