diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index b3028f13c90..13f9dd8f49d 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -5,39 +5,51 @@
origin_tech = "materials=2;combat=3"
light_power = 10
light_color = LIGHT_COLOR_WHITE
- var/light_time = 2
- var/range = 7
+
+ var/light_time = 0.2 SECONDS // The duration the area is illuminated
+ var/range = 7 // The range in tiles of the flashbang
/obj/item/grenade/flashbang/prime()
update_mob()
- var/flashbang_turf = get_turf(src)
- if(!flashbang_turf)
- return
+ var/turf/T = get_turf(src)
+ if(T)
+ // VFX and SFX
+ do_sparks(rand(5, 9), FALSE, src)
+ playsound(T, 'sound/effects/bang.ogg', 100, TRUE)
+ new /obj/effect/dummy/lighting_obj(T, light_color, range + 2, light_power, light_time)
- set_light(7)
-
- do_sparks(rand(5, 9), FALSE, src)
- playsound(flashbang_turf, 'sound/effects/bang.ogg', 25, 1)
- bang(flashbang_turf, src, range)
-
- for(var/obj/structure/blob/B in hear(8, flashbang_turf)) //Blob damage here
- var/damage = round(30 / (get_dist(B, get_turf(src)) + 1))
- B.take_damage(damage, BURN, "melee", 0)
-
- spawn(light_time)
- qdel(src)
+ // Stunning & damaging mechanic
+ bang(T, src, range)
+ qdel(src)
+/**
+ * Creates a flashing effect that blinds and deafens mobs within range
+ *
+ * Also damages blobs
+ * Arguments:
+ * * T - The turf to flash
+ * * A - The flashing atom
+ * * range - The range in tiles of the flash
+ * * flash - Whether to flash (blind)
+ * * bang - Whether to bang (deafen)
+ */
/proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE)
+ // Blob damage
+ for(var/obj/structure/blob/B in hear(range + 1, T))
+ var/damage = round(30 / (get_dist(B, T) + 1))
+ B.take_damage(damage, BURN, "melee", FALSE)
+
+ // Flashing mechanic
+ var/source_turf = get_turf(A)
for(var/mob/living/M in hearers(range, T))
if(M.stat == DEAD)
continue
M.show_message("BANG", 2)
- //Checking for protections
- var/ear_safety = M.check_ear_prot()
- var/distance = max(1, get_dist(get_turf(A), get_turf(M)))
+ var/distance = max(1, get_dist(source_turf, get_turf(M)))
+ var/stun_amount = max(10 / distance, 3)
- //Flash
+ // Flash
if(flash)
if(M.weakeyes)
M.visible_message("[M] screams and collapses!")
@@ -49,21 +61,20 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(E)
- E.receive_damage(8, 1)
-
+ E.receive_damage(8, TRUE)
if(M.flash_eyes(affect_silicon = TRUE))
- M.Stun(max(10 / distance, 3))
- M.Weaken(max(10 / distance, 3))
+ M.Stun(stun_amount)
+ M.Weaken(stun_amount)
-
- //Bang
+ // Bang
+ var/ear_safety = M.check_ear_prot()
if(bang)
- if(!distance || A.loc == M || A.loc == M.loc) //Holding on person or being exactly where lies is significantly more dangerous and voids protection
+ if(!distance || A.loc == M || A.loc == M.loc) // Holding on person or being exactly where lies is significantly more dangerous and voids protection
M.Stun(10)
M.Weaken(10)
if(!ear_safety)
- M.Stun(max(10 / distance, 3))
- M.Weaken(max(10 / distance, 3))
+ M.Stun(stun_amount)
+ M.Weaken(stun_amount)
M.AdjustEarDamage(rand(0, 5), 15)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -74,6 +85,5 @@
if(prob(ears.ear_damage - 5))
to_chat(M, "You can't hear anything!")
M.BecomeDeaf()
- else
- if(ears.ear_damage >= 5)
- to_chat(M, "Your ears start to ring!")
+ else if(ears.ear_damage >= 5)
+ to_chat(M, "Your ears start to ring!")