diff --git a/code/datums/uplink_items/uplink_traitor.dm b/code/datums/uplink_items/uplink_traitor.dm
index ce46ae3db35..5021d643554 100644
--- a/code/datums/uplink_items/uplink_traitor.dm
+++ b/code/datums/uplink_items/uplink_traitor.dm
@@ -237,7 +237,7 @@
//Roboticist
/datum/uplink_item/jobspecific/syndiemmi
name = "Syndicate MMI"
- desc = "A syndicate developed man-machine-interface which will mindslave any brain inserted into it, for as long as it's in. Cyborgs made with this MMI will be permanently slaved to you but otherwise function normally."
+ desc = "A syndicate developed man-machine-interface which will mindslave any brain inserted into it, for as long as it's inside. Cyborgs made with this MMI will be permanently slaved to you, but will appear to have a normal set of laws and be synchronised to the station AI, if present. Provides immunity to remote detonation and allows overriding lockdowns if the cyborg is not also emagged. It can also be inserted into a mech, but will not fit inside an AI core."
reference = "SMMI"
item = /obj/item/mmi/syndie
cost = 10
diff --git a/code/game/machinery/computer/robot_control.dm b/code/game/machinery/computer/robot_control.dm
index 65e33facda3..b1c43b4eb10 100644
--- a/code/game/machinery/computer/robot_control.dm
+++ b/code/game/machinery/computer/robot_control.dm
@@ -217,9 +217,9 @@
var/mob/living/silicon/robot/R = locateUID(params["uid"])
if(!can_detonate(usr, R, TRUE))
return
- if(R.mind && R.mind.special_role && R.emagged)
- to_chat(R, "Extreme danger! Termination codes detected. Scrambling security codes and automatic AI unlink triggered.")
- R.ResetSecurityCodes()
+ if(R.mind && R.mmi.syndiemmi && !R.emagged) // Emagging removes your syndie MMI protections.
+ to_chat(R, "Detonation code received. Self destructing... HARDWARE_OVERRIDE_SYNDICATE: Detonation aborted. Connection to NT systems severed.")
+ R.UnlinkSelf()
. = TRUE
return
var/turf/T = get_turf(R)
diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm
index ef9af50dc9a..c82b29c377f 100644
--- a/code/modules/mob/living/silicon/robot/robot_mob.dm
+++ b/code/modules/mob/living/silicon/robot/robot_mob.dm
@@ -1169,7 +1169,8 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
to_chat(src, "Your allegiance has not been compromised. Keep serving your current master.")
else
to_chat(src, "Your allegiance has not been compromised. Keep serving all Syndicate agents to the best of your abilities.")
-
+ if(mmi.syndiemmi)
+ to_chat(src, "Warning: Remote lockdown and detonation protections have been disabled due to system instability.")
SetLockdown(0)
if(module)
module.emag_act(user)
@@ -1397,7 +1398,10 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
disconnect_from_ai()
lawupdate = FALSE
lockcharge = 0
+ clear_alert("locked")
REMOVE_TRAITS_IN(src, LOCKDOWN_TRAIT)
+ for(var/datum/action/innate/robot_override_lock/override in actions)
+ override.Remove(src)
scrambledcodes = TRUE
//Disconnect it's camera so it's not so easily tracked.
QDEL_NULL(camera)
@@ -1406,18 +1410,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
// I could change the network to null but I don't know what would happen, and it seems too hacky for me.
-/mob/living/silicon/robot/proc/ResetSecurityCodes()
- set category = "Robot Commands"
- set name = "Reset Identity Codes"
- set desc = "Scrambles your security and identification codes and resets your current buffers. Unlocks you and but permanently severs you from your AI and the robotics console and will deactivate your camera system."
-
- var/mob/living/silicon/robot/R = src
-
- if(R)
- R.UnlinkSelf()
- to_chat(R, "Buffers flushed and reset. Camera system shutdown. All systems operational.")
- remove_verb(src, /mob/living/silicon/robot/proc/ResetSecurityCodes)
-
/mob/living/silicon/robot/mode()
set name = "Activate Held Object"
set category = "IC"
@@ -1439,8 +1431,14 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
ADD_TRAIT(src, TRAIT_IMMOBILIZED, LOCKDOWN_TRAIT)
ADD_TRAIT(src, TRAIT_UI_BLOCKED, LOCKDOWN_TRAIT)
ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, LOCKDOWN_TRAIT)
+ if(mmi.syndiemmi && !emagged) // Being emagged removes your syndie MMI protections
+ to_chat(src, "You can override your lockdown, permanently cutting your connection to NT's systems. You will be undetectable to the station's robotics control and camera monitoring systems.")
+ var/datum/action/override = new /datum/action/innate/robot_override_lock()
+ override.Grant(src)
else
REMOVE_TRAITS_IN(src, LOCKDOWN_TRAIT)
+ for(var/datum/action/innate/robot_override_lock/override in actions)
+ override.Remove(src)
/mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname)
if(!connected_ai)
diff --git a/code/modules/mob/living/silicon/robot/robot_module_actions.dm b/code/modules/mob/living/silicon/robot/robot_module_actions.dm
index ffc0064e063..cb6834e2474 100644
--- a/code/modules/mob/living/silicon/robot/robot_module_actions.dm
+++ b/code/modules/mob/living/silicon/robot/robot_module_actions.dm
@@ -107,3 +107,12 @@
robot.speed -= slowdown_active
button_overlay_icon_state = initial(button_overlay_icon_state)
active = FALSE
+
+/datum/action/innate/robot_override_lock
+ name = "Override lockdown"
+ button_overlay_icon_state = "unlock_self"
+
+/datum/action/innate/robot_override_lock/Activate()
+ to_chat(owner, "HARDWARE_OVERRIDE_SYNDICATE: Lockdown lifted. Connection to NT systems severed.")
+ var/mob/living/silicon/robot/robot = owner
+ robot.UnlinkSelf()
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index be45df766fa..fb939a8cbbb 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ