diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 74fe96ac065..474e5373227 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -79,3 +79,46 @@
ammo_x_offset = 1
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler)
selfcharge = 1
+ var/fail_tick = 0
+ var/fail_chance = 0
+
+/obj/item/weapon/gun/energy/gun/nuclear/process()
+ if(fail_tick > 0)
+ fail_tick--
+ ..()
+
+/obj/item/weapon/gun/energy/gun/nuclear/shoot_live_shot()
+ failcheck()
+ update_icon()
+ ..()
+
+/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck()
+ if(prob(fail_chance) && istype(loc, /mob/living))
+ var/mob/living/M = loc
+ switch(fail_tick)
+ if(0 to 200)
+ fail_tick += (2*(fail_chance))
+ M.rad_act(40)
+ M << "Your [name] feels warmer."
+ if(201 to INFINITY)
+ SSobj.processing.Remove(src)
+ M.rad_act(80)
+ crit_fail = 1
+ M << "Your [name]'s reactor overloads!"
+
+/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity)
+ ..()
+ fail_chance = min(fail_chance + round(15/severity), 100)
+
+/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
+ ..()
+ if(crit_fail)
+ add_overlay("[icon_state]_fail_3")
+ else
+ switch(fail_tick)
+ if(0)
+ add_overlay("[icon_state]_fail_0")
+ if(1 to 150)
+ add_overlay("[icon_state]_fail_1")
+ if(151 to INFINITY)
+ add_overlay("[icon_state]_fail_2")