mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 23:27:34 +01:00
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.  ## 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user