diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 91a8d714021..b87fb3dfd65 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -38,6 +38,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
/// Prevent clicking things below it on the same turf eg. doors/ fulltile windows
#define PREVENT_CLICK_UNDER_1 (1<<11)
#define HOLOGRAM_1 (1<<12)
+/// Prevents mobs from getting chainshocked by teslas and the supermatter
+#define SHOCKED_1 (1<<13)
///Whether /atom/Initialize() has already run for the object
#define INITIALIZED_1 (1<<14)
/// was this spawned by an admin? used for stat tracking stuff.
@@ -45,6 +47,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
/// should not get harmed if this gets caught by an explosion?
#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16)
+
//turf-only flags
#define NOJAUNT_1 (1<<0)
#define UNUSED_RESERVATION_TURF_1 (1<<1)
@@ -94,14 +97,16 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define FREEZE_PROOF (1<<7)
//tesla_zap
-#define TESLA_MACHINE_EXPLOSIVE (1<<0)
-#define TESLA_ALLOW_DUPLICATES (1<<1)
-#define TESLA_OBJ_DAMAGE (1<<2)
-#define TESLA_MOB_DAMAGE (1<<3)
-#define TESLA_MOB_STUN (1<<4)
+#define ZAP_MACHINE_EXPLOSIVE (1<<0)
+#define ZAP_ALLOW_DUPLICATES (1<<1)
+#define ZAP_OBJ_DAMAGE (1<<2)
+#define ZAP_MOB_DAMAGE (1<<3)
+#define ZAP_MOB_STUN (1<<4)
+#define ZAP_IS_TESLA (1<<5)
-#define TESLA_DEFAULT_FLAGS ALL
-#define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN
+#define ZAP_DEFAULT_FLAGS ALL
+#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA
+#define ZAP_SUPERMATTER_FLAGS NONE
//EMP protection
#define EMP_PROTECT_SELF (1<<0)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index ca5adc71796..d6138adc0e5 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -131,8 +131,9 @@ GLOBAL_LIST_INIT(bitfields, list(
"NO_RUINS_1" = NO_RUINS_1,
"PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1,
"HOLOGRAM_1" = HOLOGRAM_1,
+ "SHOCKED_1" = SHOCKED_1,
"INITIALIZED_1" = INITIALIZED_1,
- "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
+ "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1
),
"clothing_flags" = list(
"LAVAPROTECT" = LAVAPROTECT,
@@ -148,12 +149,13 @@ GLOBAL_LIST_INIT(bitfields, list(
"SNUG_FIT" = SNUG_FIT,
"ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER,
),
- "tesla_flags" = list(
- "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
- "TESLA_OBJ_DAMAGE" = TESLA_OBJ_DAMAGE,
- "TESLA_MOB_STUN" = TESLA_MOB_STUN,
- "TESLA_ALLOW_DUPLICATES" = TESLA_ALLOW_DUPLICATES,
- "TESLA_MACHINE_EXPLOSIVE" = TESLA_MACHINE_EXPLOSIVE,
+ "zap_flags" = list(
+ "ZAP_MOB_DAMAGE" = ZAP_MOB_DAMAGE,
+ "ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE,
+ "ZAP_MOB_STUN" = ZAP_MOB_STUN,
+ "ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES,
+ "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE,
+ "ZAP_IS_TESLA" = ZAP_IS_TESLA,
),
"smooth" = list(
"SMOOTH_TRUE" = SMOOTH_TRUE,
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index b856be79af4..7f47d01701b 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -146,3 +146,9 @@
/mob/living/carbon/CanSpreadAirborneDisease()
return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25)))
+
+/mob/living/proc/set_shocked()
+ flags_1 |= SHOCKED_1
+
+/mob/living/proc/reset_shocked()
+ flags_1 &= ~ SHOCKED_1
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 9f94d9ee7b0..b63edb97592 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -531,11 +531,11 @@ Class Procs:
/obj/machinery/proc/can_be_overridden()
. = 1
-/obj/machinery/tesla_act(power, tesla_flags, shocked_objects)
+/obj/machinery/zap_act(power, zap_flags, shocked_objects)
..()
- if(prob(85) && (tesla_flags & TESLA_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE))
+ if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE))
explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
- if(tesla_flags & TESLA_OBJ_DAMAGE)
+ if(zap_flags & ZAP_OBJ_DAMAGE)
take_damage(power/2000, BURN, "energy")
if(prob(40))
emp_act(EMP_LIGHT)
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 8626885bf32..396a034379f 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -227,17 +227,18 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
SSfire_burning.processing -= src
///Called when the obj is hit by a tesla bolt.
-/obj/proc/tesla_act(power, tesla_flags, shocked_targets)
+/obj/proc/zap_act(power, zap_flags, shocked_targets)
if(QDELETED(src))
return
obj_flags |= BEING_SHOCKED
- var/power_bounced = power / 2
- tesla_zap(src, 3, power_bounced, tesla_flags, shocked_targets)
+ if(zap_flags & ZAP_IS_TESLA)
+ var/power_bounced = power / 2
+ tesla_zap(src, 3, power_bounced, zap_flags, shocked_targets)
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
//The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health
-///Only tesla coils and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later.
-/obj/proc/tesla_buckle_check(var/strength)
+///Only tesla coils, vehicles, and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later.
+/obj/proc/zap_buckle_check(var/strength)
if(has_buckled_mobs())
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 5c3b3359dd5..3228dc13107 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -261,7 +261,7 @@
var/obj/structure/cable/C = T.get_cable_node()
if(C)
playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- tesla_zap(src, 3, C.newavail() * 0.01, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN | TESLA_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
+ tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES | ZAP_IS_TESLA) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot.
C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock.
return ..()
diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm
index 8997dbc817a..a52b63ea42b 100644
--- a/code/modules/antagonists/abductor/equipment/glands/electric.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm
@@ -22,5 +22,5 @@
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
/obj/item/organ/heart/gland/electric/proc/zap()
- tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
+ tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA)
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm
index 25523e8ede9..1fb738d9ee1 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -207,7 +207,7 @@
if(prob(100 - severity * 30))
new /obj/effect/temp_visual/emp(get_turf(src))
-/obj/structure/blob/tesla_act(power)
+/obj/structure/blob/zap_act(power)
..()
if(overmind)
if(overmind.blobstrain.tesla_reaction(src, power))
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 6eaabc6c3a9..7911ec7ef0d 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -445,9 +445,9 @@
return
qdel(src)
-/obj/machinery/nuclearbomb/tesla_act(power, tesla_flags)
+/obj/machinery/nuclearbomb/zap_act(power, zap_flags)
..()
- if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
+ if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
#define NUKERANGE 127
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index a4a04e8ba1e..a0e03ffc16b 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -151,9 +151,9 @@
name = "reactive tesla armor"
desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap."
siemens_coefficient = -1
- var/tesla_power = 25000
- var/tesla_range = 20
- var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
+ var/zap_power = 25000
+ var/zap_range = 20
+ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
/obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user)
..()
@@ -176,7 +176,7 @@
owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.")
return
owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!")
- tesla_zap(owner, tesla_range, tesla_power, tesla_flags)
+ tesla_zap(owner, zap_range, zap_power, zap_flags)
reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
return TRUE
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 77f5f7a6e66..4aba944f3a4 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -39,9 +39,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(prob(20))
set_broken()
-/obj/machinery/gravity_generator/tesla_act(power, tesla_flags)
+/obj/machinery/gravity_generator/zap_act(power, zap_flags)
..()
- if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
+ if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
/obj/machinery/gravity_generator/update_icon()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index d29ee4c2456..f0b26db8016 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -725,8 +725,8 @@
on = TRUE
update()
-/obj/machinery/light/tesla_act(power, tesla_flags)
- if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
+/obj/machinery/light/zap_act(power, zap_flags)
+ if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
explosion(src,0,0,0,flame_range = 5, adminlog = 0)
qdel(src)
else
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index c76ba78cb05..e233f1ce353 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -96,6 +96,7 @@
/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume)
overload()
-/obj/machinery/power/rtg/abductor/tesla_act()
+/obj/machinery/power/rtg/abductor/zap_act(tesla_flags)
..() //extend the zap
- overload()
+ if(tesla_flags & ZAP_MACHINE_EXPLOSIVE)
+ overload()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 5e8f5413bd1..90155c83b01 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -31,7 +31,7 @@
#define MOLE_PENALTY_THRESHOLD 1800 //Above this value we can get lord singulo and independent mol damage, below it we can heal damage
#define MOLE_HEAT_PENALTY 350 //Heat damage scales around this. Too hot setups with this amount of moles do regular damage, anything above and below is scaled
//Along with damage_penalty_point, makes flux anomalies.
-#define POWER_PENALTY_THRESHOLD 5000 //The cuttoff on power properly doing damage, pulling shit around, and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity
+#define POWER_PENALTY_THRESHOLD 5000 //The cutoff on power properly doing damage, pulling shit around, and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //+1 bolt of electricity, allows for gravitational anomalies, and higher chances of pyro anomalies
#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //+1 bolt of electricity.
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
@@ -134,9 +134,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/powerloss_dynamic_scaling= 0
var/power_transmission_bonus = 0
var/mole_heat_penalty = 0
-
var/matter_power = 0
-
+ //The cutoff for a bolt jumping, grows with heat, lowers with higher mol count,
+ var/zap_cutoff = 1500
//Temporary values so that we can optimize this
//How much the bullets damage should be multiplied by when it is added to the internal variables
var/config_bullet_energy = 2
@@ -388,7 +388,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//caps damage rate
- //Takes the larger between archived damage + (1.8) and damage
+ //Takes the lower number between archived damage + (1.8) and damage
//This means we can only deal 1.8 damage per function call
damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage)
@@ -453,14 +453,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/temp_factor = 50
if(gasmix_power_ratio > 0.8)
- //with a perfect gas mix, make the power less based on heat
+ //with a perfect gas mix, make the power more based on heat
icon_state = "[base_icon_state]_glow"
else
- //in normal mode, base the produced energy around the heat
+ //in normal mode, power is less effected by heat
temp_factor = 30
icon_state = base_icon_state
- //Reiterating the above, if there is more pluox and n2 then anything else, we receive no power increase from heat
+ //if there is more pluox and n2 then anything else, we receive no power increase from heat
power = max((removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0)
if(prob(50))
@@ -499,7 +499,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
var/D = sqrt(1 / max(1, get_dist(l, src)))
l.hallucination += power * config_hallucination_power * D
- l.hallucination = CLAMP(0, 200, l.hallucination)
+ l.hallucination = CLAMP(l.hallucination, 0, 200)
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
@@ -507,23 +507,29 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//Transitions between one function and another, one we use for the fast inital startup, the other is used to prevent errors with fusion temperatures.
//Use of the second function improves the power gain imparted by using co2
- power = max(power - min(((power/500)**3) * powerloss_inhibitor, power * 0.83 * powerloss_inhibitor),1)
+ power = max(power - min(((power/500)**3) * powerloss_inhibitor, power * 0.83 * powerloss_inhibitor),0)
//After this point power is lowered
//This wraps around to the begining of the function
//Handle high power zaps/anomaly generation
if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) //If the power is above 5000 or if the damage is above 550
-
+ if(removed && removed.temperature)
+ zap_cutoff = CLAMP(3000 - (power * (env.total_moles()) / 10) / env.return_temperature(), 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols
+ else
+ zap_cutoff = 1500
+ //We should always be able to zap our way out of the default enclosure
+ //See supermatter_zap() for more details
+ var/range = CLAMP(power / env.return_pressure() * 10, 2, 8)
if(power > POWER_PENALTY_THRESHOLD)
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10)
- supermatter_zap(src, 5, min(power*2, 20000))
- supermatter_zap(src, 5, min(power*2, 20000))
+ supermatter_zap(src, range, min(power*2, 20000))
+ supermatter_zap(src, range, min(power*2, 20000))
if(power > SEVERE_POWER_PENALTY_THRESHOLD)
- supermatter_zap(src, 5, min(power*2, 20000))
+ supermatter_zap(src, range, min(power*2, 20000))
if(power > CRITICAL_POWER_PENALTY_THRESHOLD)
- supermatter_zap(src, 5, min(power*2, 20000))
+ supermatter_zap(src, range, min(power*2, 20000))
else if (damage > damage_penalty_point && prob(20))
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10)
- supermatter_zap(src, 5, CLAMP(power*2, 4000, 20000))
+ supermatter_zap(src, range, CLAMP(power*2, 4000, 20000))
if(prob(15) && power > POWER_PENALTY_THRESHOLD)
supermatter_pull(src, power/750)
@@ -844,73 +850,95 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(PYRO_ANOMALY)
new /obj/effect/anomaly/pyro(L, 200)
-/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 3, power)
+/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 5, zap_str, list/targets_hit = list())
. = zapstart.dir
- if(power < 1000)
+ //If the strength of the zap decays past the cutoff, we stop
+ if(zap_str < zap_cutoff)
return
+ var/target
+ var/list/arctargets = list()
+ //Making a new copy so additons further down the recursion do not mess with other arcs
+ var/list/targets_copy = targets_hit.Copy()
+ //Lets put this ourself into the do not hit list, so we don't curve back to hit the same thing twice with one arc
+ targets_copy += zapstart
- var/target_atom
- var/mob/living/target_mob
- var/obj/machinery/target_machine
- var/obj/structure/target_structure
- var/list/arctargetsmob = list()
- var/list/arctargetsmachine = list()
- var/list/arctargetsstructure = list()
+ for(var/obj/vehicle/ridden/bicycle/bike in oview(zapstart, range))
+ if(!(bike in targets_copy) && !(bike.obj_flags & BEING_SHOCKED) && bike.can_buckle)//God's not on our side cause he hates idiots.
+ arctargets += bike
- if(prob(20)) //let's not hit all the engineers with every beam and/or segment of the arc
- for(var/mob/living/Z in oview(zapstart, range+2))
- arctargetsmob += Z
- if(arctargetsmob.len)
- var/mob/living/H = pick(arctargetsmob)
- var/atom/A = H
- target_mob = H
- target_atom = A
+ if(!arctargets.len)
+ for(var/obj/machinery/power/tesla_coil/coil in oview(zapstart, range))
+ if(!(coil in targets_copy) && coil.anchored && !(coil.obj_flags & BEING_SHOCKED) && !coil.panel_open && prob(70))//Diversity of death
+ arctargets += coil
- else
- for(var/obj/machinery/X in oview(zapstart, range+2))
- arctargetsmachine += X
- if(arctargetsmachine.len)
- var/obj/machinery/M = pick(arctargetsmachine)
- var/atom/A = M
- target_machine = M
- target_atom = A
+ if(!arctargets.len)
+ for(var/obj/machinery/power/grounding_rod/rod in oview(zapstart, range))
+ //2 rods are safer then one, intended to keep the bolts dangourus
+ //If the sm puts out 2 bolts every half second, then a rod gets ignored every 5 seconds or so.
+ if(rod.anchored && !rod.panel_open && prob(90))
+ arctargets += rod
- else
- for(var/obj/structure/Y in oview(zapstart, range+2))
- arctargetsstructure += Y
- if(arctargetsstructure.len)
- var/obj/structure/O = pick(arctargetsstructure)
- var/atom/A = O
- target_structure = O
- target_atom = A
+ if(!arctargets.len)
+ for(var/mob/living/Z in oview(zapstart, range))
+ if(!(Z in targets_copy) && !(HAS_TRAIT(Z, TRAIT_TESLA_SHOCKIMMUNE)) && !(Z.flags_1 & SHOCKED_1) && Z.stat != DEAD && prob(20))//let's not hit all the engineers with every beam and/or segment of the arc
+ arctargets += Z
- if(target_atom)
- zapstart.Beam(target_atom, icon_state="sm_arc", time=5)
- var/zapdir = get_dir(zapstart, target_atom)
+ if(!arctargets.len)
+ for(var/obj/machinery/X in oview(zapstart, range))
+ if(!(X in targets_copy) && !(X.obj_flags & BEING_SHOCKED) && prob(40))
+ arctargets += X
+
+ if(!arctargets.len)
+ for(var/obj/Y in oview(zapstart, range))
+ if(!(Y in targets_copy) && !(Y.obj_flags & BEING_SHOCKED))
+ arctargets += Y
+
+ if(arctargets.len)//Pick from our pool
+ target = pick(arctargets)
+
+ if(target)//If we found something
+ //Do the animation to zap to it from here
+ zapstart.Beam(target, icon_state="nzcrentrs_power", time=5)
+ var/zapdir = get_dir(zapstart, target)
if(zapdir)
. = zapdir
- if(target_mob)
- target_mob.electrocute_act(rand(5,10), "Supermatter Discharge Bolt", 1, SHOCK_NOSTUN)
- if(prob(15))
- supermatter_zap(target_mob, 5, power / 2)
- supermatter_zap(target_mob, 5, power / 2)
- else
- supermatter_zap(target_mob, 5, power / 1.5)
+ if(istype(target, /obj/machinery/power/tesla_coil))
+ var/obj/machinery/power/tesla_coil/coil = target
+ //In the best situation we can expect this to grow up to 540kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN
+ //The formula for power gen is zap_str * 15 / 2 * capacitor rating, between 1 and 4
+ zap_str = coil.zap_act(zap_str * 15, ZAP_SUPERMATTER_FLAGS, list()) //Coils should take a lot out of the power of the zap
- else if(target_machine)
- if(prob(15))
- supermatter_zap(target_machine, 5, power / 2)
- supermatter_zap(target_machine, 5, power / 2)
- else
- supermatter_zap(target_machine, 5, power / 1.5)
+ else if(istype(target, /obj/machinery/power/grounding_rod))
+ var/obj/machinery/power/grounding_rod/rod = target
+ //We can expect this to do very little, maybe shock the poor soul buckled to it, but that's all.
+ //This is one of our endpoints, if the bolt hits a grounding rod, it stops jumping
+ rod.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list())
+ return
- else if(target_structure)
- if(prob(15))
- supermatter_zap(target_structure, 5, power / 2)
- supermatter_zap(target_structure, 5, power / 2)
+ else if(isliving(target))//If we got a fleshbag on our hands
+ var/mob/living/mob = target
+ mob.set_shocked()
+ addtimer(CALLBACK(mob, /mob/living/proc/reset_shocked), 10)
+ mob.electrocute_act(rand(5,10), "Supermatter Discharge Bolt", 1, SHOCK_NOSTUN)
+ zap_str /= 1.5 //Meatsacks are conductive, makes working in pairs more destructive
+
+ else if(isobj(target))
+ var/obj/junk = target
+ junk.zap_act(zap_str, ZAP_SUPERMATTER_FLAGS, list())
+ zap_str /= 1.8 // worse then living things, better then coils
+ //Then we finish it all up
+ //This gotdamn variable is a boomer and keeps giving me problems
+ var/turf/T = get_turf(target)
+ var/pressure = T.return_air().return_pressure()
+ //We get our range with the strength of the zap and the pressure, the lower the former and the higher the latter the better
+ var/new_range = CLAMP(zap_str / pressure * 10, 2, 7)
+ if(prob(5))
+ zap_str = zap_str - (zap_str/10)
+ supermatter_zap(target, new_range, zap_str, targets_copy)
+ supermatter_zap(target, new_range, zap_str, targets_copy)
else
- supermatter_zap(target_structure, 5, power / 1.5)
+ supermatter_zap(target, new_range, zap_str, targets_copy)
#undef HALLUCINATION_RANGE
#undef GRAVITATIONAL_ANOMALY
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 603a850c236..0e725b59d61 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -13,7 +13,7 @@
circuit = /obj/item/circuitboard/machine/tesla_coil
- var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
+ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
var/power_loss = 2
var/input_power_multiplier = 1
var/zap_cooldown = 100
@@ -78,7 +78,7 @@
return ..()
-/obj/machinery/power/tesla_coil/tesla_act(power, tesla_flags, shocked_targets)
+/obj/machinery/power/tesla_coil/zap_act(power, zap_flags, shocked_targets)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
//don't lose arc power when it's not connected to anything
@@ -86,15 +86,17 @@
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("coilhit", src)
- playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- tesla_zap(src, 5, power_produced, tesla_flags, shocked_targets)
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(D)
D.adjust_money(min(power_produced, 1))
if(istype(linked_techweb))
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 1)) // x4 coils = ~240/m point bonus for R&D
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
- tesla_buckle_check(power)
+ zap_buckle_check(power)
+ playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
+ if(!(zap_flags & ZAP_IS_TESLA))
+ return power_produced
+ tesla_zap(src, 5, power_produced, zap_flags, shocked_targets)
else
..()
@@ -107,8 +109,8 @@
var/power = (powernet.avail/2)
add_load(power)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- tesla_zap(src, 10, power/(coeff/2), tesla_flags)
- tesla_buckle_check(power/(coeff/2))
+ tesla_zap(src, 10, power/(coeff/2), zap_flags)
+ zap_buckle_check(power/(coeff/2))
// Tesla R&D researcher
/obj/machinery/power/tesla_coil/research
@@ -118,21 +120,23 @@
circuit = /obj/item/circuitboard/machine/tesla_coil/research
power_loss = 20 // something something, high voltage + resistance
-/obj/machinery/power/tesla_coil/research/tesla_act(power, tesla_flags, shocked_things)
+/obj/machinery/power/tesla_coil/research/zap_act(power, zap_flags, shocked_targets)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("rpcoilhit", src)
- playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
- tesla_zap(src, 5, power_produced, tesla_flags, shocked_things)
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(D)
D.adjust_money(min(power_produced, 3))
if(istype(linked_techweb))
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 3)) // x4 coils with a pulse per second or so = ~720/m point bonus for R&D
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
- tesla_buckle_check(power)
+ zap_buckle_check(power)
+ playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
+ if(!(zap_flags & ZAP_IS_TESLA))
+ return power_produced
+ tesla_zap(src, 5, power_produced, zap_flags, shocked_targets)
else
..()
@@ -185,9 +189,9 @@
return ..()
-/obj/machinery/power/grounding_rod/tesla_act(var/power)
+/obj/machinery/power/grounding_rod/zap_act(var/power)
if(anchored && !panel_open)
flick("grounding_rodhit", src)
- tesla_buckle_check(power)
+ zap_buckle_check(power)
else
..()
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 15aa25dd4ac..2ce2369f5b9 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -168,20 +168,25 @@
var/mob/living/carbon/C = A
C.dust()
-/proc/tesla_zap(atom/source, zap_range = 3, power, tesla_flags = TESLA_DEFAULT_FLAGS, list/shocked_targets)
+/proc/tesla_zap(atom/source, zap_range = 3, power, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets)
. = source.dir
if(power < 1000)
return
+ /*
+ THIS IS SO FUCKING UGLY AND I HATE IT, but I can't make it nice without making it slower, check*N rather then n. So we're stuck with it.
+ */
var/closest_dist = 0
var/closest_atom
+ var/obj/vehicle/ridden/bicycle/closest_million_dollar_baby
var/obj/machinery/power/tesla_coil/closest_tesla_coil
var/obj/machinery/power/grounding_rod/closest_grounding_rod
+ var/obj/vehicle/ridden/bicycle/closest_rideable
var/mob/living/closest_mob
var/obj/machinery/closest_machine
var/obj/structure/closest_structure
var/obj/structure/blob/closest_blob
- var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure))
+ var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure, /obj/vehicle/ridden))
var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
/obj/machinery/power/emitter,
/obj/machinery/field/generator,
@@ -206,23 +211,32 @@
/obj/structure/frame/machine))
for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types))
- if(!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
+ if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A))
continue
- if(istype(A, /obj/machinery/power/tesla_coil))
+ if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots.
+ var/dist = get_dist(source, A)
+ var/obj/vehicle/ridden/bicycle/B = A
+ if(dist <= zap_range && (dist < closest_dist || !closest_million_dollar_baby) && !(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean
+ closest_dist = dist
+ //we use both of these to save on istype and typecasting overhead later on
+ //while still allowing common code to run before hand
+ closest_million_dollar_baby = B
+ closest_atom = B
+
+ else if(closest_million_dollar_baby)
+ continue //no need checking these other things
+
+ else if(istype(A, /obj/machinery/power/tesla_coil))
var/dist = get_dist(source, A)
var/obj/machinery/power/tesla_coil/C = A
if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(C.obj_flags & BEING_SHOCKED))
closest_dist = dist
-
- //we use both of these to save on istype and typecasting overhead later on
- //while still allowing common code to run before hand
closest_tesla_coil = C
closest_atom = C
-
else if(closest_tesla_coil)
- continue //no need checking these other things
+ continue
else if(istype(A, /obj/machinery/power/grounding_rod))
var/dist = get_dist(source, A)-2
@@ -234,10 +248,21 @@
else if(closest_grounding_rod)
continue
+ else if(istype(A,/obj/vehicle/ridden))
+ var/dist = get_dist(source, A)
+ var/obj/vehicle/ridden/R = A
+ if(dist <= zap_range && (dist < closest_dist || !closest_rideable) && R.can_buckle && !(R.obj_flags & BEING_SHOCKED))
+ closest_rideable = R
+ closest_atom = A
+ closest_dist = dist
+
+ else if(closest_rideable)
+ continue
+
else if(isliving(A))
var/dist = get_dist(source, A)
var/mob/living/L = A
- if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)))
+ if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1))
closest_mob = L
closest_atom = A
closest_dist = dist
@@ -259,7 +284,7 @@
else if(istype(A, /obj/structure/blob))
var/obj/structure/blob/B = A
var/dist = get_dist(source, A)
- if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED))
+ if(dist <= zap_range && (dist < closest_dist || !closest_blob) && !(B.obj_flags & BEING_SHOCKED))
closest_blob = B
closest_atom = A
closest_dist = dist
@@ -270,47 +295,53 @@
else if(isstructure(A))
var/obj/structure/S = A
var/dist = get_dist(source, A)
- if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED))
+ //There's no closest_structure here because there are no checks below this one, re-add it if that changes
+ if(dist <= zap_range && (dist < closest_dist) && !(S.obj_flags & BEING_SHOCKED))
closest_structure = S
closest_atom = A
closest_dist = dist
- else if(closest_structure)
- continue
-
//Alright, we've done our loop, now lets see if was anything interesting in range
if(closest_atom)
//common stuff
source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY)
- if(!(tesla_flags & TESLA_ALLOW_DUPLICATES))
+ if(!(zap_flags & ZAP_ALLOW_DUPLICATES))
LAZYSET(shocked_targets, closest_atom, TRUE)
var/zapdir = get_dir(source, closest_atom)
if(zapdir)
. = zapdir
//per type stuff:
- if(!QDELETED(closest_tesla_coil))
- closest_tesla_coil.tesla_act(power, tesla_flags, shocked_targets)
+ if(!QDELETED(closest_million_dollar_baby))
+ closest_million_dollar_baby.zap_act(power, zap_flags, shocked_targets)
+
+ else if(!QDELETED(closest_tesla_coil))
+ closest_tesla_coil.zap_act(power, zap_flags, shocked_targets)
else if(!QDELETED(closest_grounding_rod))
- closest_grounding_rod.tesla_act(power, tesla_flags, shocked_targets)
+ closest_grounding_rod.zap_act(power, zap_flags, shocked_targets)
+
+ else if(!QDELETED(closest_rideable))
+ closest_rideable.zap_act(power, zap_flags, shocked_targets)
else if(!QDELETED(closest_mob))
- var/shock_damage = (tesla_flags & TESLA_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0
- closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((tesla_flags & TESLA_MOB_STUN) ? NONE : SHOCK_NOSTUN))
+ closest_mob.set_shocked()
+ addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10)
+ var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0
+ closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN))
if(issilicon(closest_mob))
var/mob/living/silicon/S = closest_mob
- if((tesla_flags & TESLA_MOB_STUN) && (tesla_flags & TESLA_MOB_DAMAGE))
+ if((zap_flags & ZAP_MOB_STUN) && (zap_flags & ZAP_MOB_DAMAGE))
S.emp_act(EMP_LIGHT)
- tesla_zap(S, 7, power / 1.5, tesla_flags, shocked_targets) // metallic folks bounce it further
+ tesla_zap(S, 7, power / 1.5, zap_flags, shocked_targets) // metallic folks bounce it further
else
- tesla_zap(closest_mob, 5, power / 1.5, tesla_flags, shocked_targets)
+ tesla_zap(closest_mob, 5, power / 1.5, zap_flags, shocked_targets)
else if(!QDELETED(closest_machine))
- closest_machine.tesla_act(power, tesla_flags, shocked_targets)
+ closest_machine.zap_act(power, zap_flags, shocked_targets)
else if(!QDELETED(closest_blob))
- closest_blob.tesla_act(power, tesla_flags, shocked_targets)
+ closest_blob.zap_act(power, zap_flags, shocked_targets)
else if(!QDELETED(closest_structure))
- closest_structure.tesla_act(power, tesla_flags, shocked_targets)
+ closest_structure.zap_act(power, zap_flags, shocked_targets)
diff --git a/code/modules/power/tesla/generator.dm b/code/modules/power/tesla/generator.dm
index 53d7010806b..260f4128bcf 100644
--- a/code/modules/power/tesla/generator.dm
+++ b/code/modules/power/tesla/generator.dm
@@ -5,6 +5,6 @@
icon_state = "TheSingGen"
creation_type = /obj/singularity/energy_ball
-/obj/machinery/the_singularitygen/tesla/tesla_act(power, tesla_flags)
- if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
+/obj/machinery/the_singularitygen/tesla/zap_act(power, zap_flags)
+ if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
energy += power
diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm
index 032714b0b76..041ecd21b4b 100644
--- a/code/modules/projectiles/projectile/energy/tesla.dm
+++ b/code/modules/projectiles/projectile/energy/tesla.dm
@@ -3,7 +3,7 @@
icon_state = "tesla_projectile"
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
var/chain
- var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
+ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
var/zap_range = 3
var/power = 10000
@@ -14,7 +14,7 @@
/obj/projectile/energy/tesla/on_hit(atom/target)
. = ..()
- tesla_zap(target, zap_range, power, tesla_flags)
+ tesla_zap(target, zap_range, power, zap_flags)
qdel(src)
/obj/projectile/energy/tesla/Destroy()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 41c568dd895..a24ec941b57 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -625,9 +625,9 @@
speed = 0.3
flag = "magic"
- var/tesla_power = 20000
- var/tesla_range = 15
- var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_MOB_STUN | TESLA_OBJ_DAMAGE
+ var/zap_power = 20000
+ var/zap_range = 15
+ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE | ZAP_IS_TESLA
var/chain
var/mob/living/caster
@@ -644,7 +644,7 @@
visible_message("[src] fizzles on contact with [target]!")
qdel(src)
return BULLET_ACT_BLOCK
- tesla_zap(src, tesla_range, tesla_power, tesla_flags)
+ tesla_zap(src, zap_range, zap_power, zap_flags)
qdel(src)
/obj/projectile/magic/aoe/lightning/Destroy()
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 1c8c29ccb6c..121ab55ee48 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -520,7 +520,7 @@
modifier = -100
mix_message = "The teslium starts to spark as electricity arcs away from it!"
mix_sound = 'sound/machines/defib_zap.ogg'
- var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN
+ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_IS_TESLA
/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, created_volume)
var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
@@ -528,15 +528,15 @@
var/T3 = created_volume * 120
sleep(5)
if(created_volume >= 75)
- tesla_zap(holder.my_atom, 7, T1, tesla_flags)
+ tesla_zap(holder.my_atom, 7, T1, zap_flags)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
sleep(15)
if(created_volume >= 40)
- tesla_zap(holder.my_atom, 7, T2, tesla_flags)
+ tesla_zap(holder.my_atom, 7, T2, zap_flags)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
sleep(15)
if(created_volume >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast.
- tesla_zap(holder.my_atom, 7, T3, tesla_flags)
+ tesla_zap(holder.my_atom, 7, T3, zap_flags)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
..()
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 65a42c592df..8d31ab0a4f8 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -77,9 +77,10 @@
/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume)
boom()
-/obj/structure/reagent_dispensers/fueltank/tesla_act()
+/obj/structure/reagent_dispensers/fueltank/zap_act(zap_flags)
..() //extend the zap
- boom()
+ if(ZAP_OBJ_DAMAGE & zap_flags)
+ boom()
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/projectile/P)
. = ..()
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 782d63edbac..c8e6d40eed2 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -101,7 +101,7 @@
action_icon_state = "lightning0"
sound = 'sound/magic/lightningbolt.ogg'
active = FALSE
- projectile_var_overrides = list("tesla_range" = 15, "tesla_power" = 20000, "tesla_flags" = TESLA_MOB_DAMAGE)
+ projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE | ZAP_IS_TESLA)
active_msg = "You energize your hand with arcane lightning!"
deactive_msg = "You let the energy flow out of your hands back into yourself..."
projectile_type = /obj/projectile/magic/aoe/lightning
diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm
index f42d18628dd..40dd0357d1d 100644
--- a/code/modules/vehicles/bicycle.dm
+++ b/code/modules/vehicles/bicycle.dm
@@ -11,10 +11,12 @@
D.vehicle_move_delay = 0
-/obj/vehicle/ridden/bicycle/tesla_act() // :::^^^)))
+/obj/vehicle/ridden/bicycle/zap_act(zap_str, zap_flags, shocked_targets) // :::^^^)))
+ //This didn't work for 3 years because none ever tested it I hate life
name = "fried bicycle"
desc = "Well spent."
color = rgb(63, 23, 4)
can_buckle = FALSE
+ . = ..()
for(var/m in buckled_mobs)
unbuckle_mob(m,1)
diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm
index c25f8f2d93b..2c6c8597375 100644
--- a/code/modules/vehicles/ridden.dm
+++ b/code/modules/vehicles/ridden.dm
@@ -100,3 +100,7 @@
if(!force && occupant_amount() >= max_occupants)
return FALSE
return ..()
+
+/obj/vehicle/ridden/zap_act(zap_str, zap_flags, shocked_targets)
+ zap_buckle_check(zap_str)
+ . = ..()