diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm
index fe2acfa3023..a6042386b3d 100644
--- a/code/_onclick/click_override.dm
+++ b/code/_onclick/click_override.dm
@@ -74,7 +74,7 @@
L.Weaken(3)
else
if(P.unlimited_power)
- L.electrocute_act(1000, P, 0) //Just kill them
+ L.electrocute_act(1000, P, safety = TRUE, override = TRUE) //Just kill them
else
electrocute_mob(L, C, P)
break
diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm
index ba00d0f226b..dcca0cfc919 100644
--- a/code/datums/spells/lightning.dm
+++ b/code/datums/spells/lightning.dm
@@ -88,7 +88,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
var/mob/living/current = target
if(bounces < 1)
if(damaging)
- current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
+ current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
else
current.AdjustJitter(1000) //High numbers for violent convulsions
current.do_jitter_animation(current.jitteriness)
@@ -99,7 +99,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1)
else
if(damaging)
- current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
+ current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
else
current.AdjustJitter(1000) //High numbers for violent convulsions
current.do_jitter_animation(current.jitteriness)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index e0f329bb0a4..eab9d86922d 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -393,6 +393,11 @@
break
return
+/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ if(!tesla_shock)
+ return FALSE
+ return ..()
+
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
do_attack_animation(target)
to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.")
@@ -513,7 +518,7 @@
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
- L.electrocute_act(0, src, 1, 1)
+ L.electrocute_act(0, src, 1, TRUE, TRUE)
if(isrobot(L) || L.isSynthetic())
L.Weaken(5)
qdel(src)
diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning.dm b/code/game/gamemodes/miniantags/guardian/types/lightning.dm
index 3aaeebbc513..88d5a43143d 100644
--- a/code/game/gamemodes/miniantags/guardian/types/lightning.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/lightning.dm
@@ -99,7 +99,6 @@
if(istype(G) && G.summoner == summoner)
continue
if(successfulshocks > 4)
- //L.electrocute_act(30, src) //shocks for 30 burn damage
L.visible_message(
"[L] was shocked by the lightning chain!", \
"You are shocked by the lightning chain!", \
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index c201b1bc45d..cdb55aa1b31 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -215,11 +215,11 @@
if(!L.on) //wait, wait, don't shock me
return
flick("[L.base_state]2", L)
- for(var/mob/living/carbon/human/M in view(shock_range, L))
+ for(var/mob/living/M in view(shock_range, L))
if(M == user)
return
M.Beam(L,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5)
- M.electrocute_act(shock_damage, "[L.name]", safety=1)
+ M.electrocute_act(shock_damage, L, safety = TRUE)
do_sparks(4, 0, M)
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index db5c2b6e9c3..04b62594412 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -81,6 +81,7 @@
power_channel = ENVIRON
req_one_access = list(access_atmospherics, access_engine_equip)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
+ siemens_strength = 1
var/alarm_id = null
var/frequency = ATMOS_VENTSCRUB
//var/skipprocess = 0 //Experimenting
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 54153118131..9dca7566a31 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -51,6 +51,7 @@ var/list/airlock_overlays = list()
explosion_block = 1
assemblytype = /obj/structure/door_assembly
normalspeed = 1
+ siemens_strength = 1
var/security_level = 0 //How much are wires secured
var/aiControlDisabled = FALSE //If TRUE, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
var/hackProof = FALSE // if TRUE, this door can't be hacked by the AI
@@ -70,7 +71,7 @@ var/list/airlock_overlays = list()
var/lockdownbyai = 0
var/justzap = 0
var/obj/item/airlock_electronics/electronics
- var/hasShocked = 0 //Prevents multiple shocks from happening
+ var/shockCooldown = FALSE //Prevents multiple shocks from happening
var/obj/item/note //Any papers pinned to the airlock
var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to
var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass"
@@ -173,10 +174,8 @@ About the new airlock wires panel:
else /*if(justzap)*/
return
else if(user.hallucination > 50 && prob(10) && !operating)
- to_chat(user, "You feel a powerful shock course through your body!")
- user.adjustStaminaLoss(50)
- user.AdjustStunned(5)
- return
+ if(user.electrocute_act(50, src, 1, illusion = TRUE)) // We'll just go with a flat 50 damage, instead of doing powernet checks
+ return
..(user)
/obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user)
@@ -296,16 +295,14 @@ About the new airlock wires panel:
// The preceding comment was borrowed from the grille's shock script
/obj/machinery/door/airlock/shock(mob/user, prb)
if(!arePowerSystemsOn())
- return 0
- if(hasShocked)
- return 0 //Already shocked someone recently?
+ return FALSE
+ if(shockCooldown > world.time)
+ return FALSE //Already shocked someone recently?
if(..())
- hasShocked = 1
- sleep(10)
- hasShocked = 0
- return 1
+ shockCooldown = world.time + 10
+ return TRUE
else
- return 0
+ return FALSE
//Checks if the user can get shocked and shocks him if it can. Returns TRUE if it happened
/obj/machinery/door/airlock/proc/shock_user(mob/user, prob)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6e5605cd232..c74ee23d25c 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -119,6 +119,7 @@ Class Procs:
var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
atom_say_verb = "beeps"
var/defer_process = 0
+ var/siemens_strength = 0.7 // how badly will it shock you?
/obj/machinery/Initialize()
addAtProcessing()
@@ -575,16 +576,13 @@ Class Procs:
/obj/machinery/proc/shock(mob/user, prb)
if(inoperable())
- return 0
+ return FALSE
if(!prob(prb))
- return 0
- if((TK in user.mutations) && !Adjacent(user))
- return 0
+ return FALSE
do_sparks(5, 1, src)
- if(electrocute_mob(user, get_area(src), src, 0.7))
- if(user.stunned)
- return 1
- return 0
+ if(electrocute_mob(user, get_area(src), src, siemens_strength, TRUE))
+ return TRUE
+ return FALSE
//called on machinery construction (i.e from frame to machinery) but not on initialization
/obj/machinery/proc/on_construction()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index b09d80bd804..9e9847baaaa 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -427,8 +427,8 @@
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
- if(electrocute_mob(user, get_area(src), src, 1))
- return 1
+ if(electrocute_mob(user, src, src, 1, TRUE))
+ return TRUE
/obj/machinery/suit_storage_unit/relaymove(mob/user)
if(locked)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index c06e5d82244..154d4438530 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -245,20 +245,20 @@
/obj/structure/grille/proc/shock(mob/user, prb)
if(!anchored || broken) // unanchored/broken grilles are never connected
- return 0
+ return FALSE
if(!prob(prb))
- return 0
+ return FALSE
if(!in_range(src, user))//To prevent TK and mech users from getting shocked
- return 0
+ return FALSE
var/turf/T = get_turf(src)
var/obj/structure/cable/C = T.get_cable_node()
if(C)
- if(electrocute_mob(user, C, src))
+ if(electrocute_mob(user, C, src, 1, TRUE))
do_sparks(3, 1, src)
- return 1
+ return TRUE
else
- return 0
- return 0
+ return FALSE
+ return FALSE
/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index e5c0fc85722..67ee4b6ac00 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -116,9 +116,9 @@
if(.)
return
if(!shockcd)
- if(ismob(user))
+ if(isliving(user))
var/mob/living/M = user
- M.electrocute_act(15,"Energy Barrier", safety=1)
+ M.electrocute_act(15, "Energy Barrier", safety = TRUE)
shockcd = TRUE
addtimer(CALLBACK(src, .proc/cooldown), 5)
@@ -130,6 +130,6 @@
return
var/mob/living/M = AM
- M.electrocute_act(15, "Energy Barrier", safety = 1)
+ M.electrocute_act(15, "Energy Barrier", safety = TRUE)
shockcd = TRUE
addtimer(CALLBACK(src, .proc/cooldown), 5)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c2b6a388ca1..adab72d5404 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1878,7 +1878,7 @@
var/logmsg = null
switch(punishment)
if("Lightning bolt")
- M.electrocute_act(5, "Lightning Bolt", safety=1)
+ M.electrocute_act(5, "Lightning Bolt", safety = TRUE, override = TRUE)
playsound(get_turf(M), 'sound/magic/lightningshock.ogg', 50, 1, -1)
M.adjustFireLoss(75)
M.Weaken(5)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 2e95d21e10b..ef450f4a52f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -234,14 +234,14 @@
/datum/plant_gene/trait/cell_charge/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/power = G.seed.potency*rate
if(prob(power))
- C.electrocute_act(round(power), G, 1, 1)
+ C.electrocute_act(round(power), G, 1, TRUE)
/datum/plant_gene/trait/cell_charge/on_squash(obj/item/reagent_containers/food/snacks/grown/G, atom/target)
- if(iscarbon(target))
+ if(isliving(target))
var/mob/living/carbon/C = target
var/power = G.seed.potency*rate
if(prob(power))
- C.electrocute_act(round(power), G, 1, 1)
+ C.electrocute_act(round(power), G, 1, TRUE)
/datum/plant_gene/trait/cell_charge/on_consume(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
if(!G.reagents.total_volume)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 0f1c5d91df1..277bbbd8789 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -134,43 +134,48 @@
M.forceMove(get_turf(src))
visible_message("[M] bursts out of [src]!")
-/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0)
+/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage)
if(status_flags & GODMODE) //godmode
- return 0
+ return FALSE
if(NO_SHOCK in mutations) //shockproof
- return 0
+ return FALSE
if(tesla_shock && tesla_ignore)
return FALSE
shock_damage *= siemens_coeff
- if(shock_damage<1 && !override)
- return 0
+ if(dna && dna.species)
+ shock_damage *= dna.species.siemens_coeff
+ if(shock_damage < 1 && !override)
+ return FALSE
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
- take_overall_damage(0,shock_damage, TRUE, used_weapon = "Electrocution")
- shock_internal_organs(shock_damage)
+ if(illusion)
+ adjustStaminaLoss(shock_damage)
+ else
+ take_overall_damage(0, shock_damage, TRUE, used_weapon = "Electrocution")
+ shock_internal_organs(shock_damage)
visible_message(
- "[src] was shocked by \the [source]!", \
- "You feel a powerful shock coursing through your body!", \
- "You hear a heavy electrical crack." \
- )
+ "[src] was shocked by \the [source]!",
+ "You feel a powerful shock coursing through your body!",
+ "You hear a heavy electrical crack.")
AdjustJitter(1000) //High numbers for violent convulsions
do_jitter_animation(jitteriness)
AdjustStuttering(2)
- if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5))
+ if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun)
Stun(2)
spawn(20)
AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
- if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5))
+ if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun)
Stun(3)
Weaken(3)
if(shock_damage > 200)
src.visible_message(
- "[src] was arc flashed by the [source]!", \
- "The [source] arc flashes and electrocutes you!", \
- "You hear a lightning-like crack!" \
- )
+ "[src] was arc flashed by the [source]!",
+ "The [source] arc flashes and electrocutes you!",
+ "You hear a lightning-like crack!")
playsound(loc, 'sound/effects/eleczap.ogg', 50, 1, -1)
- explosion(src.loc,-1,0,2,2)
+ explosion(loc, -1, 0, 2, 2)
+
if(override)
return override
else
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 937640b2c73..bd5817e8867 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -551,13 +551,8 @@
dna.species.update_sight(src)
-//Removed the horrible safety parameter. It was only being used by ninja code anyways.
-//Now checks siemens_coefficient of the affected area by default
-/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0)
- if(status_flags & GODMODE) //godmode
- return 0
- if(NO_SHOCK in mutations) //shockproof
- return 0
+//Added a safety check in case you want to shock a human mob directly through electrocute_act.
+/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
if(tesla_shock)
var/total_coeff = 1
if(gloves)
@@ -575,20 +570,18 @@
siemens_coeff = 0
else if(!safety)
var/gloves_siemens_coeff = 1
- var/species_siemens_coeff = 1
if(gloves)
var/obj/item/clothing/gloves/G = gloves
gloves_siemens_coeff = G.siemens_coefficient
- if(dna.species)
- species_siemens_coeff = dna.species.siemens_coeff
- siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
- if(undergoing_cardiac_arrest())
+ siemens_coeff = gloves_siemens_coeff
+ if(undergoing_cardiac_arrest() && !illusion)
if(shock_damage * siemens_coeff >= 1 && prob(25))
set_heartattack(FALSE)
if(stat == CONSCIOUS)
to_chat(src, "You feel your heart beating again!")
- . = ..()
+ dna.species.spec_electrocute_act(src, shock_damage, source, siemens_coeff, safety, override, tesla_shock, illusion, stun)
+ . = ..(shock_damage, source, siemens_coeff, safety, override, tesla_shock, illusion, stun)
/mob/living/carbon/human/Topic(href, href_list)
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 36d8ae5b678..d9a501d2251 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -309,6 +309,9 @@
/datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
return
+/datum/species/proc/spec_electrocute_act(mob/living/carbon/human/H, shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ return
+
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.help_act(user, target))//adminfu only...
return TRUE
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3182c829466..88b17124451 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -55,8 +55,22 @@
/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
return 0
-/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0)
- return 0 //only carbon liveforms have this proc
+/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage)
+ if(status_flags & GODMODE) //godmode
+ return FALSE
+ if(NO_SHOCK in mutations) //shockproof
+ return FALSE
+ if(tesla_shock && tesla_ignore)
+ return FALSE
+ if(shock_damage > 0)
+ if(!illusion)
+ adjustFireLoss(shock_damage)
+ visible_message(
+ "[src] was shocked by \the [source]!",
+ "You feel a powerful shock coursing through your body!",
+ "You hear a heavy electrical crack.")
+ return shock_damage
/mob/living/emp_act(severity)
var/list/L = src.get_contents()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index cdd36a59b80..5c19dcb0d7a 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -71,6 +71,9 @@
/mob/living/silicon/drop_item()
return
+/mob/living/silicon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ return FALSE //So borgs they don't die trying to fix wiring
+
/mob/living/silicon/emp_act(severity)
switch(severity)
if(1)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index a6fcf4b5a20..2b3d11357d1 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -85,6 +85,9 @@
/mob/living/simple_animal/hostile/construct/narsie_act()
return
+/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
+ return FALSE
+
/////////////////Juggernaut///////////////
diff --git a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
index 9ac2d899456..244edaeedec 100644
--- a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
+++ b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
@@ -142,7 +142,7 @@
return
-/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)//prevents runtimes with machine fuckery
+/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) //prevents runtimes with machine fuckery
return FALSE
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 1f7af8e4204..e8aab46dbbe 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -49,6 +49,7 @@
anchored = 1
use_power = NO_POWER_USE
req_access = list(access_engine_equip)
+ siemens_strength = 1
var/spooky=0
var/area/area
var/areastring = null
@@ -535,7 +536,7 @@
if(C.amount >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
- if(prob(50) && electrocute_mob(usr, N, N))
+ if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
do_sparks(5, 1, src)
return
C.use(10)
@@ -1237,13 +1238,13 @@
if(prob(5))
var/list/shock_mobs = list()
for(var/C in view(get_turf(src), 5)) //We only want to shock a single random mob in range, not every one.
- if(iscarbon(C))
- shock_mobs +=C
+ if(isliving(C))
+ shock_mobs += C
if(shock_mobs.len)
- var/mob/living/carbon/S = pick(shock_mobs)
- S.electrocute_act(rand(5,25), "electrical arc")
- playsound(get_turf(S), 'sound/effects/eleczap.ogg', 75, 1)
- Beam(S,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
+ var/mob/living/L = pick(shock_mobs)
+ L.electrocute_act(rand(5, 25), "electrical arc")
+ playsound(get_turf(L), 'sound/effects/eleczap.ogg', 75, 1)
+ Beam(L, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5)
else // no cell, switch everything off
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 238d2e43599..c71bc3e7c8c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -191,14 +191,14 @@ By design, d1 is the smallest direction and d2 is the highest
src.add_fingerprint(user)
// shock the user with probability prb
-/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0)
+/obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1)
if(!prob(prb))
- return 0
+ return FALSE
if(electrocute_mob(user, powernet, src, siemens_coeff))
do_sparks(5, 1, src)
- return 1
+ return TRUE
else
- return 0
+ return FALSE
//explosion handling
/obj/structure/cable/ex_act(severity)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 192ef9d792e..dfe10113f12 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -162,23 +162,10 @@
ex_act(EXPLODE_DEVASTATE)
/obj/item/stock_parts/cell/proc/get_electrocute_damage()
- switch(charge)
- if(5000000 to INFINITY)
- return min(rand(200, 300),rand(200, 300))
- if(4000000 to 5000000 - 1)
- return min(rand(80, 180),rand(80, 180))
- if(1000000 to 4000000 - 1)
- return min(rand(50, 160),rand(50, 160))
- if(200000 to 1000000 - 1)
- return min(rand(25, 80),rand(25, 80))
- if(100000 to 200000 - 1)//Ave powernet
- return min(rand(20, 60),rand(20, 60))
- if(50000 to 100000 - 1)
- return min(rand(15, 40),rand(15, 40))
- if(1000 to 50000 - 1)
- return min(rand(10, 20),rand(10, 20))
- else
- return 0
+ if(charge >= 1000)
+ return Clamp(20 + round(charge / 25000), 20, 195) + rand(-5, 5)
+ else
+ return 0
// Cell variants
/obj/item/stock_parts/cell/empty/New()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 8dda1ed8731..a0bee89e0be 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -353,7 +353,7 @@
M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
if(on && (W.flags & CONDUCT))
if(prob(12))
- electrocute_mob(user, get_area(src), src, 0.3)
+ electrocute_mob(user, get_area(src), src, 0.3, TRUE)
broken()
else
@@ -387,7 +387,7 @@
if(has_power() && (W.flags & CONDUCT))
do_sparks(3, 1, src)
if(prob(75))
- electrocute_mob(user, get_area(src), src, rand(0.7,1.0))
+ electrocute_mob(user, get_area(src), src, rand(0.7, 1), TRUE)
// returns whether this light has power
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 69b27eff562..3e5d614896e 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -298,34 +298,37 @@
//power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null
//source is an object caused electrocuting (airlock, grille, etc)
//No animations will be performed by this proc.
-/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
+/proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
if(!istype(M))
- return 0
+ return FALSE
if(istype(M.loc,/obj/mecha))
- return 0 //feckin mechs are dumb
+ return FALSE //feckin mechs are dumb
+ if(dist_check)
+ if(!in_range(source, M))
+ return FALSE
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient == 0)
- return 0 //to avoid spamming with insulated glvoes on
+ return FALSE //to avoid spamming with insulated glvoes on
var/area/source_area
- if(istype(power_source,/area))
+ if(istype(power_source, /area))
source_area = power_source
power_source = source_area.get_apc()
- if(istype(power_source,/obj/structure/cable))
+ if(istype(power_source, /obj/structure/cable))
var/obj/structure/cable/Cable = power_source
power_source = Cable.powernet
var/datum/powernet/PN
var/obj/item/stock_parts/cell/cell
- if(istype(power_source,/datum/powernet))
+ if(istype(power_source, /datum/powernet))
PN = power_source
else if(istype(power_source,/obj/item/stock_parts/cell))
cell = power_source
- else if(istype(power_source,/obj/machinery/power/apc))
+ else if(istype(power_source, /obj/machinery/power/apc))
var/obj/machinery/power/apc/apc = power_source
cell = apc.cell
if(apc.terminal)
@@ -344,7 +347,7 @@
if(cell)
cell_damage = cell.get_electrocute_damage()
var/shock_damage = 0
- if(PN_damage>=cell_damage)
+ if(PN_damage >= cell_damage)
power_source = PN
shock_damage = PN_damage
else
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index a07d854380d..228b4232968 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -128,23 +128,10 @@
newavail = 0
/datum/powernet/proc/get_electrocute_damage()
- switch(avail)
- if(5000000 to INFINITY)
- return min(rand(200,300),rand(200,300))
- if(4000000 to 5000000)
- return min(rand(80,180),rand(80,180))
- if(1000000 to 4000000)
- return min(rand(50,160),rand(50,160))
- if(200000 to 1000000)
- return min(rand(25,80),rand(25,80))
- if(100000 to 200000)//Ave powernet
- return min(rand(20,60),rand(20,60))
- if(50000 to 100000)
- return min(rand(15,40),rand(15,40))
- if(1000 to 50000)
- return min(rand(10,20),rand(10,20))
- else
- return 0
+ if(avail >= 1000)
+ return Clamp(20 + round(avail / 25000), 20, 195) + rand(-5, 5)
+ else
+ return 0
////////////////////////////////////////////////
// Misc.
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index a0e84f8455a..6c8eba8fb62 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -78,7 +78,7 @@
if(isliving(user))
var/shock_damage = min(rand(30,40),rand(30,40))
- if(iscarbon(user))
+ if(isliving(user) && !issilicon(user))
var/stun = min(shock_damage, 15)
user.Stun(stun)
user.Weaken(10)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 6d5d0226e69..2884fc18b4c 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -183,7 +183,7 @@
playsound(src.loc, I.usesound, 50, 1)
if(do_after(user, 50 * I.toolspeed, target = src))
- if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
+ if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) //animate the electrocution if uncautious and unlucky
do_sparks(5, 1, src)
return
@@ -320,7 +320,7 @@
if(do_after(user, 50, target = src))
var/turf/T = get_turf(user)
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
- if(prob(50) && electrocute_mob(user, N, N)) //animate the electrocution if uncautious and unlucky
+ if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky
do_sparks(5, 1, src)
return
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index e5005708c67..19948c94a36 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -115,6 +115,16 @@
/obj/singularity/energy_ball/Bumped(atom/A)
dust_mobs(A)
+/obj/singularity/energy_ball/attack_tk(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ to_chat(C, "That was a shockingly dumb idea.")
+ var/obj/item/organ/internal/brain/B = C.get_int_organ(/obj/item/organ/internal/brain)
+ C.ghostize(0)
+ if(B)
+ B.remove(C)
+ qdel(B)
+
/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
if(istype(target))
target.orbiting_balls += src
@@ -130,6 +140,10 @@
qdel(src)
/obj/singularity/energy_ball/proc/dust_mobs(atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.incorporeal_move || L.status_flags & GODMODE)
+ return
if(!iscarbon(A))
return
for(var/obj/machinery/power/grounding_rod/GR in orange(src, 2))
@@ -155,7 +169,6 @@
var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
/obj/machinery/power/emitter,
/obj/machinery/field/generator,
- /mob/living/simple_animal,
/obj/machinery/particle_accelerator/control_box,
/obj/structure/particle_accelerator/fuel_chamber,
/obj/structure/particle_accelerator/particle_emitter/center,
@@ -165,6 +178,9 @@
/obj/structure/particle_accelerator/end_cap,
/obj/machinery/field/containment,
/obj/structure/disposalpipe,
+ /obj/structure/disposaloutlet,
+ /obj/machinery/disposal/deliveryChute,
+ /obj/machinery/camera,
/obj/structure/sign,
/obj/machinery/gateway,
/obj/structure/grille,
@@ -255,7 +271,7 @@
else if(closest_mob)
var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5)
- closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = 1)
+ closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = TRUE)
if(issilicon(closest_mob))
var/mob/living/silicon/S = closest_mob
if(stun_mobs)
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 76d06cc43a1..4cf50c9f661 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -1171,6 +1171,6 @@
shock_timer++
if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable
shock_timer = 0
- M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
+ M.electrocute_act(rand(5, 20), "Teslium in their body", 1, TRUE) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
return ..()
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index a21a7fcf1c2..f2740676314 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -376,9 +376,9 @@
/datum/chemical_reaction/shock_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
- for(var/mob/living/carbon/C in view(min(8, round(created_volume * 2)), T))
- C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results.
- C.electrocute_act(3.5, "electrical blast")
+ for(var/mob/living/L in view(min(8, round(created_volume * 2)), T))
+ L.Beam(T, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results.
+ L.electrocute_act(3.5, "electrical blast")
holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched.
holder.del_reagent("uranium")