diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 62d7e7b311c..8eec816a50c 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -102,7 +102,16 @@
flashfail = 1
else if(issilicon(M))
- M.Weaken(rand(5,10))
+ flashfail = 0
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ if(R.has_active_type(/obj/item/borg/combat/shield))
+ var/obj/item/borg/combat/shield/shield = locate() in R
+ if(shield)
+ if(shield.active)
+ shield.adjust_flash_count(R, 1)
+ flashfail = 1
else
flashfail = 1
@@ -125,6 +134,7 @@
else
user.visible_message("[user] overloads [M]'s sensors with the flash!")
+ M.Weaken(rand(5,10))
else
user.visible_message("[user] fails to blind [M] with the flash!")
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 190649129f8..f516486f026 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -715,7 +715,9 @@
overlays += "[panelprefix]-openpanel -c"
if(has_active_type(/obj/item/borg/combat/shield))
- overlays += "[module_sprites[icontype]]-shield"
+ var/obj/item/borg/combat/shield/shield = locate() in src
+ if(shield && shield.active)
+ overlays += "[module_sprites[icontype]]-shield"
if(modtype == "Combat")
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index fd446ef3ec2..b1436f423ec 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -70,7 +70,7 @@
//Combat shielding absorbs a percentage of damage directly into the cell.
if(has_active_type(/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = locate() in src
- if(shield)
+ if(shield && shield.active)
//Shields absorb a certain percentage of damage based on their power setting.
var/absorb_brute = brute*shield.shield_level
var/absorb_burn = burn*shield.shield_level
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 4a68510aed6..953010c33ea 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -298,11 +298,54 @@
desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge."
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
- var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
+ var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
+ var/active = 1 //If the shield is on
+ var/flash_count = 0 //Counter for how many times the shield has been flashed
+ var/overload_threshold = 3 //Number of flashes it takes to overload the shield
+ var/shield_refresh = 15 SECONDS //Time it takes for the shield to reboot after destabilizing
+ var/overload_time = 0 //Stores the time of overload
+ var/last_flash = 0 //Stores the time of last flash
+
+/obj/item/borg/combat/shield/New()
+ processing_objects.Add(src)
+ ..()
+
+/obj/item/borg/combat/shield/Destroy()
+ processing_objects.Remove(src)
+ ..()
/obj/item/borg/combat/shield/attack_self(var/mob/living/user)
set_shield_level()
+/obj/item/borg/combat/shield/process()
+ if(active)
+ if(flash_count && (last_flash + shield_refresh < world.time))
+ flash_count = 0
+ last_flash = 0
+ else if(overload_time + shield_refresh < world.time)
+ active = 1
+ flash_count = 0
+ overload_time = 0
+
+ var/mob/living/user = src.loc
+ user.visible_message("[user]'s shield reactivates!", "Your shield reactivates!.")
+ user.update_icon()
+
+/obj/item/borg/combat/shield/proc/adjust_flash_count(var/mob/living/user, amount)
+ if(active) //Can't destabilize a shield that's not on
+ flash_count += amount
+
+ if(amount > 0)
+ last_flash = world.time
+ if(flash_count >= overload_threshold)
+ overload(user)
+
+/obj/item/borg/combat/shield/proc/overload(var/mob/living/user)
+ active = 0
+ user.visible_message("[user]'s shield destabilizes!", "Your shield destabilizes!.")
+ user.update_icon()
+ overload_time = world.time
+
/obj/item/borg/combat/shield/verb/set_shield_level()
set name = "Set shield level"
set category = "Object"