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) + . = ..()