/obj/machinery/power/energy_accumulator/tesla_coil name = "tesla coil" desc = "For the union!" icon = 'icons/obj/machines/engine/tesla_coil.dmi' icon_state = "coil0" // Executing a traitor caught releasing tesla was never this fun! can_buckle = TRUE buckle_lying = 0 buckle_requires_restraints = TRUE can_change_cable_layer = TRUE circuit = /obj/item/circuitboard/machine/tesla_coil ///Flags of the zap that the coil releases when the wire is pulsed var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN ///Multiplier for power conversion var/input_power_multiplier = 1 ///Cooldown between pulsed zaps var/zap_cooldown = 100 ///Reference to the last zap done var/last_zap = 0 //Variables to calculate sound based on stored_energy to give engineers an audioclue of the magnitude of energy production. ///Calculated range of zap sounds based on power var/zap_sound_range = 0 ///Calculated volume of zap sounds based on power var/zap_sound_volume = 0 /obj/machinery/power/energy_accumulator/tesla_coil/anchored anchored = TRUE /obj/machinery/power/energy_accumulator/tesla_coil/Initialize(mapload) . = ..() set_wires(new /datum/wires/tesla_coil(src)) /obj/machinery/power/energy_accumulator/tesla_coil/cable_layer_act(mob/living/user, obj/item/tool) if(panel_open) return NONE if(anchored) balloon_alert(user, "unanchor first!") return ITEM_INTERACT_BLOCKING return ..() /obj/machinery/power/energy_accumulator/tesla_coil/RefreshParts() . = ..() var/power_multiplier = 0 zap_cooldown = 100 for(var/datum/stock_part/capacitor/capacitor in component_parts) power_multiplier += capacitor.tier zap_cooldown -= (capacitor.tier * 20) input_power_multiplier = max(1 * (power_multiplier / 8), 0.25) //Max out at 50% efficency. /obj/machinery/power/energy_accumulator/tesla_coil/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads:
" + \ "Power generation at [input_power_multiplier*100]%.
" + \ "Shock interval at [zap_cooldown*0.1] seconds.
" + \ "Stored [display_energy(get_stored_joules())].
" + \ "Processing [display_power(processed_energy)].") /obj/machinery/power/energy_accumulator/tesla_coil/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) if(panel_open) icon_state = "coil_open[anchored]" else icon_state = "coil[anchored]" update_cable_icons_on_turf(get_turf(src)) /obj/machinery/power/energy_accumulator/tesla_coil/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS /obj/machinery/power/energy_accumulator/tesla_coil/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W)) return if(default_deconstruction_crowbar(W)) return if(is_wire_tool(W) && panel_open) wires.interact(user) return return ..() /obj/machinery/power/energy_accumulator/tesla_coil/process(seconds_per_tick) . = ..() zap_sound_volume = min(energy_to_power(processed_energy) / (4 KILO WATTS), 100) // 1 sound volume per 4kW. zap_sound_range = min(energy_to_power(processed_energy) / (80 KILO WATTS), 10) // 1 sound range per 80kW. /obj/machinery/power/energy_accumulator/tesla_coil/zap_act(power, zap_flags) if(!anchored || panel_open) return ..() ADD_TRAIT(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED) addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED), 1 SECONDS) flick("coilhit", src) if(!(zap_flags & ZAP_GENERATES_POWER)) //Prevent infinite recursive power return 0 if(zap_flags & ZAP_LOW_POWER_GEN) power /= 10 zap_buckle_check(power) var/power_removed = powernet ? power * input_power_multiplier : power stored_energy += max(power_removed, 0) return max(power - power_removed, 0) //You get back the amount we didn't use /obj/machinery/power/energy_accumulator/tesla_coil/proc/zap() if((last_zap + zap_cooldown) > world.time || !powernet) return FALSE last_zap = world.time var/power = (powernet.avail) * 0.2 * input_power_multiplier //Always always always use more then you output for the love of god power = min(surplus(), power) //Take the smaller of the two add_load(power) playsound(src.loc, 'sound/effects/magic/lightningshock.ogg', zap_sound_volume, TRUE, zap_sound_range) tesla_zap(source = src, zap_range = 10, power = power, cutoff = 1e3, zap_flags = zap_flags) zap_buckle_check(power) /obj/machinery/power/energy_accumulator/grounding_rod name = "grounding rod" desc = "Keeps an area from being fried by Edison's Bane." icon = 'icons/obj/machines/engine/tesla_coil.dmi' icon_state = "grounding_rod0" anchored = FALSE density = TRUE wants_powernet = FALSE circuit = /obj/item/circuitboard/machine/grounding_rod can_buckle = TRUE buckle_lying = 0 buckle_requires_restraints = TRUE /obj/machinery/power/energy_accumulator/grounding_rod/anchored anchored = TRUE /obj/machinery/power/energy_accumulator/grounding_rod/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads:
" + \ "Recently grounded [display_energy(get_stored_joules())].
" + \ "This energy would sustainably release [display_power(calculate_sustainable_power(), convert = FALSE)].") /obj/machinery/power/energy_accumulator/grounding_rod/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) if(panel_open) icon_state = "grounding_rod_open[anchored]" else icon_state = "grounding_rod[anchored]" /obj/machinery/power/energy_accumulator/grounding_rod/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS /obj/machinery/power/energy_accumulator/grounding_rod/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", W)) return if(default_deconstruction_crowbar(W)) return return ..() /obj/machinery/power/energy_accumulator/grounding_rod/zap_act(energy, zap_flags) if(anchored && !panel_open) flick("grounding_rodhit", src) zap_buckle_check(energy) stored_energy += energy return 0 else . = ..() /obj/machinery/power/energy_accumulator/grounding_rod/release_energy(joules = 0) stored_energy -= joules processed_energy = joules return FALSE //Grounding rods don't release energy to the grid.