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"