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!")