Files
Polaris/code/game/objects/items/weapons/grenades/concussion.dm
2020-05-19 11:06:28 -04:00

85 lines
2.4 KiB
Plaintext

//Concussion, or 'dizzyness' grenades.
/obj/item/weapon/grenade/concussion
name = "concussion grenade"
desc = "A polymer concussion grenade, optimized for disorienting personnel without causing large amounts of injury."
icon_state = "concussion"
item_state = "grenade"
var/blast_radius = 5
/obj/item/weapon/grenade/concussion/detonate()
..()
concussion_blast(get_turf(src), blast_radius)
qdel(src)
return
/obj/proc/concussion_blast(atom/target, var/radius = 5)
var/turf/T = get_turf(target)
if(is_below_sound_pressure(T))
visible_message("<span class='notice'>Whump.</span>")
return
playsound(src, 'sound/effects/bang.ogg', 75, 1, -3)
if(istype(T))
for(var/mob/living/L in orange(T, radius))
if(ishuman(L))
var/mob/living/carbon/human/H = L
to_chat(H, "<span class='critical'>WHUMP.</span>")
var/ear_safety = 0
H.get_ear_protection()
var/bang_effectiveness = H.species.sound_mod
if((get_dist(H, T) <= round(radius * 0.3 * bang_effectiveness) || src.loc == H.loc || src.loc == H))
if(ear_safety > 0)
H.Confuse(2)
else
H.Confuse(8)
H.Weaken(1)
if ((prob(14) || (H == src.loc && prob(70))))
H.ear_damage += rand(1, 10)
else
H.ear_damage += rand(0, 5)
H.ear_deaf = max(H.ear_deaf,15)
if(H.client)
if(prob(50))
H.client.spinleft()
else
H.client.spinright()
else if(get_dist(H, T) <= round(radius * 0.5 * bang_effectiveness))
if(!ear_safety)
H.Confuse(6)
H.ear_damage += rand(0, 3)
H.ear_deaf = max(H.ear_deaf,10)
if(H.client)
if(prob(50))
H.client.spinleft()
else
H.client.spinright()
else if(!ear_safety && get_dist(H, T) <= (radius * bang_effectiveness))
H.Confuse(4)
H.ear_damage += rand(0, 1)
H.ear_deaf = max(H.ear_deaf,5)
if(H.ear_damage >= 15)
to_chat(H, "<span class='danger'>Your ears start to ring badly!</span>")
if(prob(H.ear_damage - 5))
to_chat(H, "<span class='danger'>You can't hear anything!</span>")
H.sdisabilities |= DEAF
else if(H.ear_damage >= 5)
to_chat(H, "<span class='danger'>Your ears start to ring!</span>")
if(istype(L, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = L
if(L.client)
if(prob(50))
L.client.spinleft()
else
L.client.spinright()
to_chat(R, "<span class='critical'>Gyroscopic failure.</span>")
return