EMPs on robotic limbs will now disable them for 4-8 seconds rather than causing a 10-20 second full stun (#74570)

## About The Pull Request

EMPs on robotic limbs will now disable them for 10-20 seconds rather
than causing a 10-20 second full stun on the user. Additionally, they
will damage the limb for a little brute and some burn.

Arm EMPs don't do anything special as the limb being disabled already
drops items.

Leg EMPs cause a 10-20 second knockdown, only really applicable if
there's only one robotic leg as two disabled legs KD you anyways.

Chest EMPs cause a 3-6 second standing-up paralyze, visible to the
player by a quite noticeable shaking of their body.

Head EMPs break the optical transponder circuits for 7.5-15 seconds,
effectively giving the user nightmare goggles vision with green instead
of red as the only remaining color.

Tacit approval for the PR at least existing.

![image](https://user-images.githubusercontent.com/53100513/230537462-b06d0bb5-0607-4f83-954c-6b2a0bcdc635.png)
## Why It's Good For The Game

Robotic limbs are not so strong that a glancing EMP that may not even
have been directed at you should stun you for ten, TEN seconds, or
worse, twenty. This is basically legacy stunning from the days of
super-stuns on soap, stunbatons, etc. The code for it was last touched
six years ago.

**_The stats as shown above are not even close to final. I really don't
know or care what the right stats should be in the end. and I'm fine
with making them a 10-20 second timer again. I just put some
reasonable-seeming numbers in as a placeholder. EMPs could also still
cause a short stun if that is deemed necessary. Hell, that could be the
chest effect!_**
## Changelog
🆑
balance: EMPs on robotic limbs will now disable them for 10-20 seconds
rather than causing a 10-20 second full stun on the user. Additionally,
they will damage the limb for a little brute and some burn.
EMPs on robotic limbs will now disable them for 10-20 seconds rather
than causing a 10-20 second full stun on the user. Additionally, they
will damage the limb for a little brute and some burn.
balance: Arm EMPs don't do anything special as the limb being disabled
already drops items.
balance: Leg EMPs cause a 10-20 second knockdown, only really applicable
if there's only one robotic leg as two disabled legs KD you anyways.
balance: Chest EMPs cause a 3-6 second standing-up paralyze, visible to
the player by a quite noticeable shaking of their body.
balance: Head EMPs break the optical transponder circuits for 7.5-15
seconds, effectively giving the user nightmare goggles vision with green
instead of red as the only remaining color.
/🆑
This commit is contained in:
carlarctg
2023-04-28 20:24:40 +00:00
committed by GitHub
parent e08a6bbebb
commit 129c74c945
5 changed files with 76 additions and 12 deletions
+3
View File
@@ -188,6 +188,9 @@
/datum/client_colour/glass_colour/nightmare
colour = list(255,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, -130,0,0,0) //every color is either red or black
/datum/client_colour/malfunction
colour = list(/*R*/ 0,0,0,0, /*G*/ 0,175,0,0, /*B*/ 0,0,0,0, /*A*/ 0,0,0,1, /*C*/0,-130,0,0) // Matrix colors
/datum/client_colour/monochrome
colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
priority = PRIORITY_HIGH //we can't see colors anyway!
@@ -500,19 +500,8 @@
. = ..()
if(. & EMP_PROTECT_CONTENTS)
return
var/informed = FALSE
for(var/obj/item/bodypart/L as anything in src.bodyparts)
if(!IS_ORGANIC_LIMB(L))
if(!informed)
to_chat(src, span_userdanger("You feel a sharp pain as your robotic limbs overload."))
informed = TRUE
switch(severity)
if(1)
L.receive_damage(0,10)
Paralyze(200)
if(2)
L.receive_damage(0,5)
Paralyze(100)
L.emp_act()
/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc
var/list/damaged = list()
@@ -1134,3 +1134,27 @@
owner.update_body_parts()
else
update_icon_dropped()
/obj/item/bodypart/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_WIRES || !(bodytype & BODYTYPE_ROBOTIC))
return FALSE
owner.visible_message(span_danger("[owner]'s [src.name] seems to malfunction!"))
var/time_needed = 10 SECONDS
var/brute_damage = 5 + 1.5 // Augments reduce brute damage by 5.
var/burn_damage = 4 + 2.5 // As above, but for burn it's 4.
if(severity == EMP_HEAVY)
time_needed *= 2
brute_damage *= 2
burn_damage *= 2
receive_damage(brute_damage, burn_damage)
do_sparks(number = 1, cardinal_only = FALSE, source = owner)
ADD_TRAIT(src, TRAIT_PARALYSIS, EMP_TRAIT)
addtimer(CALLBACK(src, PROC_REF(un_paralyze)), time_needed)
return TRUE
/obj/item/bodypart/proc/un_paralyze()
REMOVE_TRAITS_IN(src, EMP_TRAIT)
@@ -100,6 +100,15 @@
damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT)
/obj/item/bodypart/leg/left/robot/emp_act(severity)
. = ..()
if(!.)
return
owner.Knockdown(severity == EMP_HEAVY ? 20 SECONDS : 10 SECONDS)
if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways.
return
to_chat(owner, span_danger("As your [src.name] unexpectedly malfunctions, it causes you to fall to the ground!"))
/obj/item/bodypart/leg/right/robot
name = "cyborg right leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
@@ -130,6 +139,15 @@
damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT)
/obj/item/bodypart/leg/right/robot/emp_act(severity)
. = ..()
if(!.)
return
owner.Knockdown(severity == EMP_HEAVY ? 20 SECONDS : 10 SECONDS)
if(owner.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) // So the message isn't duplicated. If they were stunned beforehand by something else, then the message not showing makes more sense anyways.
return
to_chat(owner, span_danger("As your [src.name] unexpectedly malfunctions, it causes you to fall to the ground!"))
/obj/item/bodypart/chest/robot
name = "cyborg torso"
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
@@ -161,6 +179,19 @@
var/wired = FALSE
var/obj/item/stock_parts/cell/cell = null
/obj/item/bodypart/chest/robot/emp_act(severity)
. = ..()
if(!.)
return
to_chat(owner, span_danger("Your [src.name]'s logic boards temporarily become unresponsive!"))
if(severity == EMP_HEAVY)
owner.Stun(6 SECONDS)
owner.Shake(pixelshiftx = 5, pixelshifty = 2, duration = 4 SECONDS)
return
owner.Stun(3 SECONDS)
owner.Shake(pixelshiftx = 3, pixelshifty = 0, duration = 2.5 SECONDS)
/obj/item/bodypart/chest/robot/get_cell()
return cell
@@ -273,6 +304,22 @@
var/obj/item/assembly/flash/handheld/flash1 = null
var/obj/item/assembly/flash/handheld/flash2 = null
#define EMP_GLITCH "EMP_GLITCH"
/obj/item/bodypart/head/robot/emp_act(severity)
. = ..()
if(!.)
return
to_chat(owner, span_danger("Your [src.name]'s optical transponders glitch out and malfunction!"))
var/glitch_duration = severity == EMP_HEAVY ? 15 SECONDS : 7.5 SECONDS
owner.add_client_colour(/datum/client_colour/malfunction)
addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, remove_client_colour), /datum/client_colour/malfunction), glitch_duration)
#undef EMP_GLITCH
/obj/item/bodypart/head/robot/handle_atom_del(atom/head_atom)
if(head_atom == flash1)
flash1 = null