From f4f8a686dfebbf5eb3a6756c168488913a634bc2 Mon Sep 17 00:00:00 2001
From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Date: Fri, 10 Jan 2020 04:25:11 -0800
Subject: [PATCH] Makes grounding rods consistent, changes the supermatters
bolts a great deal. (#48472)
* Goof I will find you and I will berate you
holy hell
Calm and peaceful ahhhhh
I swear goofs pc failing was the biggest tragedy in gaming
Fixes some flags
More touchups
Now to squash
Goofs PC failing was the biggest tragady in GAMING
* Fixing some misspellings before the bee gets me
* GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
* Full vehicle support
* Changes some flags around, "fixes" some bugs, makes being shocked less insane
* Makes spliting more reasonable, unfucks some shitty tesla code I copypasta'd into the sm, godspeed shitcode,
none noticed you.
* Removes my tesla_ignore_1 fix, another pr is up that should solve things, so we're just leaving it in for now,
gonna have to deal with merge conflicts when it gets merged, but that won't be too bad
* tfw
* Nothing to see here folks
* I'm a boomer
---
code/__DEFINES/flags.dm | 19 +-
code/_globalvars/bitfields.dm | 16 +-
code/datums/diseases/_MobProcs.dm | 6 +
code/game/machinery/_machinery.dm | 6 +-
code/game/objects/obj_defense.dm | 11 +-
code/game/objects/structures/grille.dm | 2 +-
.../abductor/equipment/glands/electric.dm | 2 +-
.../antagonists/blob/structures/_blob.dm | 2 +-
.../nukeop/equipment/nuclearbomb.dm | 4 +-
.../modules/clothing/suits/reactive_armour.dm | 8 +-
code/modules/power/gravitygenerator.dm | 4 +-
code/modules/power/lighting.dm | 4 +-
code/modules/power/rtg.dm | 5 +-
code/modules/power/supermatter/supermatter.dm | 166 ++++++++++--------
code/modules/power/tesla/coil.dm | 30 ++--
code/modules/power/tesla/energy_ball.dm | 85 ++++++---
code/modules/power/tesla/generator.dm | 4 +-
.../projectiles/projectile/energy/tesla.dm | 4 +-
code/modules/projectiles/projectile/magic.dm | 8 +-
.../chemistry/recipes/pyrotechnics.dm | 8 +-
code/modules/reagents/reagent_dispenser.dm | 5 +-
code/modules/spells/spell_types/aimed.dm | 2 +-
code/modules/vehicles/bicycle.dm | 4 +-
code/modules/vehicles/ridden.dm | 4 +
24 files changed, 247 insertions(+), 162 deletions(-)
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)
+ . = ..()