Nightmare's Light Eater Gets "Critical Hits" (See Inside) (#80670)

## About The Pull Request

This PR adds a new mechanic for Nightmare, which I've dubbed "critical
strikes". If Nightmare stays in jaunt for 15 seconds, its light eater
will get a red glow in the inventory, along with a balloon alert which
says, "critical strike ready". Visually, it looks like this:

![image](https://github.com/tgstation/tgstation/assets/47086570/1510e98b-9a8c-41e6-8575-ef8826be198a)
If Nightmare hits a mob with the light eater in this state, one of four
things will happen:

- If its a carbon that isn't a hulk, the carbon will be stunned for 1
second, dropping their items in the process
- If its a cyborg, the cyborg will be stunned for 2 seconds (twice the
health, twice the fear factor required)
- If its a simple/basic mob or a hulk, the mob will take double damage
from the strike (50 as opposed to 25)
- If the target is dead, you'll note how you wasted the critical strike,
but had fun doing it

While the stun itself is not very long, it will cause crew to drop their
held items and be unable to act for a short duration, which should be
useful for ambushing lone wolves and causing more prepared crew to have
to scramble to get their gear off the floor when caught.

If the Nightmare uses the critical strike, it will go away and require
Nightmare to stay in jaunt for 15 more seconds in order to regain it.
Manifesting while your critical strike is recharging will also stop and
reset the timer.

## Why It's Good For The Game

Nightmare is simple, gory fun, and there's nothing wrong with that.
However, Nightmare performs poorly in any scenario where someone has
some basic gear, since it lacks the ability to use stun batons, has no
armor, and has no stun resistance itself, which means how much a
Nightmare can actually do tends to be very little. While some buff
proposals seek to add complexity to playing the role, I think this one
is clean and simple to use while effectively buffing their proficiency
in 1v1 combat (perfect for an ambush playstyle), giving players a reason
to be afraid of going up against or getting caught out by the Nightmare
alone.

## Changelog
🆑
balance: Nightmare's Light Eater can now stun targets under certain
conditions.
/🆑
This commit is contained in:
IndieanaJones
2024-01-11 17:08:27 -05:00
committed by GitHub
parent 1c026f4f3b
commit beee24a4b5
2 changed files with 59 additions and 2 deletions
@@ -18,6 +18,10 @@
hitsound = 'sound/weapons/bladeslice.ogg'
wound_bonus = -30
bare_wound_bonus = 20
///If this is true, our next hit will be critcal, temporarily stunning our target
var/has_crit = FALSE
///The timer which controls our next crit
var/crit_timer
/obj/item/light_eater/Initialize(mapload)
. = ..()
@@ -27,3 +31,55 @@
effectiveness = 70, \
)
AddComponent(/datum/component/light_eater)
/obj/item/light_eater/equipped(mob/user, slot, initial = FALSE)
. = ..()
if(!user?.mind?.has_antag_datum(/datum/antagonist/nightmare))
return
RegisterSignal(user, COMSIG_MOB_ENTER_JAUNT, PROC_REF(prepare_crit_timer))
RegisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT, PROC_REF(stop_crit_timer))
/obj/item/light_eater/dropped(mob/user, silent = FALSE)
. = ..()
if(!user?.mind?.has_antag_datum(/datum/antagonist/nightmare))
return
UnregisterSignal(user, COMSIG_MOB_ENTER_JAUNT)
UnregisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT)
remove_crit()
/obj/item/light_eater/attack(mob/living/target, mob/living/user, params)
. = ..()
if(!has_crit)
return
playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100, TRUE)
var/datum/dna/target_dna = target.has_dna()
if(target.stat == DEAD)
user.visible_message(span_warning("[user] gores [target] with [src]!"), span_warning("You gore [target] with [src], which doesn't accomplish much, but it does make you feel a little better."))
else if(!target_dna?.check_mutation(/datum/mutation/human/hulk) && (iscarbon(target) || issilicon(target)))
user.visible_message(span_boldwarning("[user] gores [target] with [src], bringing them to a halt!"), span_userdanger("You gore [target] with [src], bringing them to a halt!"))
target.Paralyze(issilicon(target) ? 2 SECONDS : 1 SECONDS)
else
user.visible_message(span_boldwarning("[user] gores [target] with [src], ripping into them!"), span_userdanger("You gore [target] with [src], ripping into them!"))
target.apply_damage(damage = force, forced = TRUE)
remove_crit()
/obj/item/light_eater/proc/prepare_crit_timer()
crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 15 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE)
/obj/item/light_eater/proc/stop_crit_timer()
deltimer(crit_timer)
/obj/item/light_eater/proc/add_crit()
if(has_crit)
return
has_crit = TRUE
add_filter("crit_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5))
if(ismob(loc))
loc.balloon_alert(loc, "critical strike ready")
/obj/item/light_eater/proc/remove_crit()
if(!has_crit)
return
has_crit = FALSE
remove_filter("crit_glow")
stop_crit_timer()
@@ -11,7 +11,7 @@ const noticestyle = {
export const AntagInfoNightmare = (props) => {
return (
<Window width={620} height={340}>
<Window width={620} height={380}>
<Window.Content backgroundColor="#0d0d0d">
<Stack fill>
<Stack.Item width="46.2%">
@@ -63,7 +63,8 @@ export const AntagInfoNightmare = (props) => {
</LabeledList.Item>
<LabeledList.Item label="Light Eater">
Your twisted appendage. It will consume the light of what it
touches, be it victim or object.
touches, be it victim or object. After 15 seconds of being in
jaunt, stabbing a foe will stun them or do extra damage.
</LabeledList.Item>
</LabeledList>
</Section>