mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-10 00:43:14 +00:00
Reworked electrocute_act to fit my fantasy while squashing some bugs. (#45291)
* Reworked electrocute_act This still isn't perfect, ideally this would use flags and stuff but I don't have the energy for a change of that size. * Removes spec_electrocute_act and makes the species siemens_coeff actually work. * Readds the secondary shock
This commit is contained in:
@@ -209,47 +209,36 @@
|
||||
var/obj/item/organ/O = X
|
||||
O.emp_act(severity)
|
||||
|
||||
/mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
if(tesla_shock && (flags_1 & TESLA_IGNORE_1))
|
||||
return FALSE
|
||||
if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
|
||||
return FALSE
|
||||
shock_damage *= siemens_coeff
|
||||
if(dna && dna.species)
|
||||
shock_damage *= dna.species.siemens_coeff
|
||||
if(shock_damage<1 && !override)
|
||||
return 0
|
||||
if(reagents.has_reagent(/datum/reagent/teslium))
|
||||
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
|
||||
if(illusion)
|
||||
adjustStaminaLoss(shock_damage)
|
||||
else
|
||||
take_overall_damage(0,shock_damage)
|
||||
visible_message(
|
||||
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
///Adds to the parent by also adding functionality to propagate shocks through pulling and doing some fluff effects.
|
||||
/mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
|
||||
. = ..()
|
||||
//Pulling
|
||||
if(iscarbon(pulling) && !illusion && source != pulling)
|
||||
var/mob/living/carbon/C = pulling
|
||||
C.electrocute_act(shock_damage*0.75, src, 1, 0, override, 0, illusion, stun)
|
||||
if(iscarbon(pulledby) && !illusion && source != pulledby)
|
||||
var/mob/living/carbon/C = pulledby
|
||||
C.electrocute_act(shock_damage*0.75, src, 1, 0, override, 0, illusion, stun)
|
||||
jitteriness += 1000 //High numbers for violent convulsions
|
||||
//Stun
|
||||
var/should_stun = (!tesla_shock || siemens_coeff > 0.5) && stun
|
||||
if(should_stun)
|
||||
Paralyze(40)
|
||||
//Jitter and other fluff.
|
||||
jitteriness += 1000
|
||||
do_jitter_animation(jitteriness)
|
||||
stuttering += 2
|
||||
if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun)
|
||||
Paralyze(40)
|
||||
spawn(20)
|
||||
jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less
|
||||
if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun)
|
||||
Paralyze(60)
|
||||
addtimer(CALLBACK(src, .proc/secondary_shock, should_stun), 20)
|
||||
if(override)
|
||||
return override
|
||||
else
|
||||
return shock_damage
|
||||
|
||||
///Called slightly after electrocute act to reduce jittering and apply a secondary stun.
|
||||
/mob/living/carbon/proc/secondary_shock(should_stun)
|
||||
jitteriness = max(jitteriness - 990, 10)
|
||||
if(should_stun)
|
||||
Paralyze(60)
|
||||
|
||||
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
|
||||
if(on_fire)
|
||||
to_chat(M, "<span class='warning'>You can't put [p_them()] out with just your bare hands!</span>")
|
||||
|
||||
@@ -439,43 +439,35 @@
|
||||
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
|
||||
|
||||
//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, source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
if(tesla_shock)
|
||||
var/total_coeff = 1
|
||||
if(gloves)
|
||||
var/obj/item/clothing/gloves/G = gloves
|
||||
if(G.siemens_coefficient <= 0)
|
||||
total_coeff -= 0.5
|
||||
///Calculates the siemens coeff based on clothing and species, can also restart hearts.
|
||||
/mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = FALSE, override = 0, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
|
||||
//Calculates the siemens coeff based on clothing. Completely ignores the arguments
|
||||
if(tesla_shock) //I hate this entire block. This gets the siemens_coeff for tesla shocks
|
||||
if(gloves && gloves.siemens_coefficient <= 0)
|
||||
siemens_coeff -= 0.5
|
||||
if(wear_suit)
|
||||
var/obj/item/clothing/suit/S = wear_suit
|
||||
if(S.siemens_coefficient <= 0)
|
||||
total_coeff -= 0.95
|
||||
else if(S.siemens_coefficient == (-1))
|
||||
total_coeff -= 1
|
||||
siemens_coeff = total_coeff
|
||||
if(flags_1 & TESLA_IGNORE_1)
|
||||
siemens_coeff = 0
|
||||
else if(!safety)
|
||||
var/gloves_siemens_coeff = 1
|
||||
if(wear_suit.siemens_coefficient == -1)
|
||||
siemens_coeff -= 1
|
||||
else if(wear_suit.siemens_coefficient <= 0)
|
||||
siemens_coeff -= 0.95
|
||||
siemens_coeff = max(siemens_coeff, 0)
|
||||
else if(!safety) //This gets the siemens_coeff for all non tesla shocks
|
||||
if(gloves)
|
||||
var/obj/item/clothing/gloves/G = gloves
|
||||
gloves_siemens_coeff = G.siemens_coefficient
|
||||
siemens_coeff = gloves_siemens_coeff
|
||||
siemens_coeff *= gloves.siemens_coefficient
|
||||
siemens_coeff *= physiology.siemens_coeff
|
||||
siemens_coeff *= dna.species.siemens_coeff
|
||||
. = ..()
|
||||
//Don't go further if the shock was blocked/too weak.
|
||||
if(!.)
|
||||
return
|
||||
//Note we both check that the user is in cardiac arrest and can actually heartattack
|
||||
//If they can't, they're missing their heart and this would runtime
|
||||
if(undergoing_cardiac_arrest() && can_heartattack() && !illusion)
|
||||
if(shock_damage * siemens_coeff >= 1 && prob(25))
|
||||
var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART)
|
||||
heart.beating = TRUE
|
||||
if(stat == CONSCIOUS)
|
||||
if(heart.Restart() && stat == CONSCIOUS)
|
||||
to_chat(src, "<span class='notice'>You feel your heart beating again!</span>")
|
||||
siemens_coeff *= physiology.siemens_coeff
|
||||
|
||||
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)
|
||||
if(.)
|
||||
electrocution_animation(40)
|
||||
electrocution_animation(40)
|
||||
|
||||
/mob/living/carbon/human/emag_act(mob/user)
|
||||
.=..()
|
||||
|
||||
@@ -1156,9 +1156,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/datum/species/proc/spec_emag_act(mob/living/carbon/human/H, mob/user)
|
||||
return
|
||||
|
||||
/datum/species/proc/spec_electrocute_act(mob/living/carbon/human/H, shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
return
|
||||
|
||||
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(!((target.health < 0 || HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !(target.mobility_flags & MOBILITY_STAND)))
|
||||
target.help_shake_act(user)
|
||||
|
||||
@@ -319,21 +319,26 @@
|
||||
take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1))
|
||||
return 1
|
||||
|
||||
/mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage)
|
||||
///As the name suggests, this should be called to apply electric shocks.
|
||||
/mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, safety, override, tesla_shock, illusion, stun)
|
||||
shock_damage *= siemens_coeff
|
||||
if(tesla_shock && (flags_1 & TESLA_IGNORE_1))
|
||||
return FALSE
|
||||
if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
|
||||
return FALSE
|
||||
if(shock_damage > 0)
|
||||
if(!illusion)
|
||||
adjustFireLoss(shock_damage)
|
||||
visible_message(
|
||||
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
return shock_damage
|
||||
if(shock_damage < 1 && !override)
|
||||
return FALSE
|
||||
if(!illusion)
|
||||
adjustFireLoss(shock_damage)
|
||||
else
|
||||
adjustStaminaLoss(shock_damage)
|
||||
visible_message(
|
||||
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
return shock_damage
|
||||
|
||||
/mob/living/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -217,6 +217,18 @@
|
||||
playsound(M, "sparks", 50, 1)
|
||||
..()
|
||||
|
||||
/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/L)
|
||||
. = ..()
|
||||
if(!istype(L))
|
||||
return
|
||||
L.physiology.siemens_coeff *= 2
|
||||
|
||||
/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/human/L)
|
||||
. = ..()
|
||||
if(!istype(L))
|
||||
return
|
||||
L.physiology.siemens_coeff *= 0.5
|
||||
|
||||
/datum/reagent/teslium/energized_jelly
|
||||
name = "Energized Jelly"
|
||||
description = "Electrically-charged jelly. Boosts jellypeople's nervous system, but only shocks other lifeforms."
|
||||
|
||||
Reference in New Issue
Block a user