Security Flashbangs cannot be instantly detonated anymore. (#86704)

## About The Pull Request

Removes the option of setting a sec flashbang to instant detonation.

## Why It's Good For The Game

My reasoning from my previous PR hasn't really changed, so excuse me for
the few copypasted bits.

Flashbang grenades are one of the best tools in Security arsenal. they
are available round-start, widely abundant, and part of the reason why
they are so strong is how rare ear protection tends to be.

But what tilts the scale from strong to just unfair, in my opinion, is
the combination of instant detonation and being able to pierce ear
protection entirely on adjacent tiles.

This is a hardcoded stun by the way, You could literally have no eyes
nor ears and it won't make a difference.

I initially considered just reducing the radius at which penetration
occurs, but i failed to consider how it would probably result in an
unintended buff due to the ability to drag a primed flashbang.

So instead, after discussing options with a few other people, including
mantainers I think the sanest option is to remove the ability for
instant detonation.

You can still technically run at someone as a desperate attempt to
disarm them, but they'll have a sliver of chance to react.

Flashbangs should be used as grenades, not as instant unreactable
hardstuns, this strategy requiring teamwork to pull off doesn't justify
it being completely unfair and unreactable on the receiver.

## Changelog

🆑
balance: Security Flashbangs can no longer be primed for instant
detonation.
/🆑

---------

Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
This commit is contained in:
EnterTheJake
2024-09-19 20:57:51 +02:00
committed by GitHub
co-authored by Xander3359 Time-Green
parent 67e8143761
commit baaa96c357
2 changed files with 36 additions and 15 deletions
+35 -15
View File
@@ -51,6 +51,8 @@
var/shrapnel_radius
///Did we add the component responsible for spawning shrapnel to this?
var/shrapnel_initialized
///Possible timers that can be assigned for detonation. Values are strings in SECONDS
var/list/possible_fuse_time = list("Instant", "3", "4", "5")
/obj/item/grenade/Initialize(mapload)
. = ..()
@@ -210,7 +212,10 @@
return FALSE
if(change_det_time())
tool.play_tool_sound(src)
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
if(det_time == 0)
to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous."))
else
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
return TRUE
/obj/item/grenade/multitool_act(mob/living/user, obj/item/tool)
@@ -220,7 +225,7 @@
. = TRUE
var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5))
var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", possible_fuse_time)
if (isnull(newtime))
return
if(!user.can_perform_action(src))
@@ -228,25 +233,40 @@
if(newtime == "Instant" && change_det_time(0))
to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous."))
return
newtime = round(newtime)
newtime = round(text2num(newtime))
if(change_det_time(newtime))
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
/obj/item/grenade/proc/change_det_time(time) //Time uses real time.
/**
* Sets det_time to a number in SECONDS
*
* if time is passed as an argument, `det_time` will be `time SECONDS`
*
* Cycles the duration of the fuse of the grenade `det_time` based on the options provided in list/possible_fuse_time
*/
/obj/item/grenade/proc/change_det_time(time)
. = TRUE
//Multitool
if(!isnull(time))
det_time = round(clamp(time * 10, 0, 5 SECONDS))
det_time = round(clamp(time SECONDS, 0, 5 SECONDS)) //This is fine for now but consider making this a variable if you want >5s fuse
return
//Screwdriver
if(det_time == 0)
det_time = "Instant"
else
var/previous_time = det_time
switch(det_time)
if (0)
det_time = 3 SECONDS
if (3 SECONDS)
det_time = 5 SECONDS
if (5 SECONDS)
det_time = 0
if(det_time == previous_time)
det_time = 5 SECONDS
det_time = num2text(det_time * 0.1)
var/old_selection = possible_fuse_time.Find(det_time) //Position of det_time in the list
if(old_selection >= possible_fuse_time.len)
det_time = possible_fuse_time[1]
else
det_time = possible_fuse_time[old_selection+1]
if(det_time == "Instant")
det_time = 0 //String to num conversion because I hate coders
return
det_time = text2num(det_time) SECONDS
/obj/item/grenade/attack_paw(mob/user, list/modifiers)
return attack_hand(user, modifiers)
@@ -4,6 +4,7 @@
inhand_icon_state = "flashbang"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
possible_fuse_time = list("3", "4", "5")
var/flashbang_range = 7 //how many tiles away the mob will be stunned.
/obj/item/grenade/flashbang/apply_grenade_fantasy_bonuses(quality)