diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index b0676eabdc7..777a7625fe7 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -231,6 +231,13 @@
to_chat(user, "The door bolt lights have been enabled.")
update_icon()
+// FIRE ALARMS
+
+/obj/machinery/firealarm/AICtrlClick()
+ if(enabled)
+ reset()
+ else
+ alarm()
// AI-CONTROLLED SLIP GENERATOR IN AI CORE
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index f9e5cbf3e5a..e61b9bdc8b6 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -170,6 +170,9 @@
/obj/machinery/ai_slipper/BorgAltClick() //Dispenses liquid if on
Activate()
+/obj/machinery/firealarm/BorgCtrlClick()
+ AICtrlClick()
+
/*
As with AI, these are not used in click code,
because the code for robots is specific, not generic.
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index b387f404d8c..911f85be753 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -33,6 +33,7 @@ FIRE ALARM
var/last_process = 0
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
+ var/enabled = FALSE
var/report_fire_alarms = TRUE // Should triggered fire alarms also trigger an actual alarm?
var/show_alert_level = TRUE // Should fire alarms display the current alert level?
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index ee9cec18c89..8f34314f717 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -83,6 +83,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/lockcharge //Used when locking down a borg to preserve cell charge
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
+ var/can_lock_cover = FALSE //Used to set if a borg can re-lock its cover.
var/has_camera = TRUE
var/pdahide = 0 //Used to hide the borg from the messenger list
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
@@ -752,6 +753,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(allowed(W))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
+ to_chat(src, "[user] [ locked ? "locked" : "unlocked"] your interface.")
update_icons()
else
to_chat(user, "Access denied.")
@@ -768,7 +770,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(!user.drop_item())
return
if(U.action(src))
- to_chat(user, "You apply the upgrade to [src].")
+ user.visible_message("[user] applied [U] to [src].", "You apply [U] to [src].")
U.forceMove(src)
else
to_chat(user, "Upgrade error.")
@@ -964,16 +966,24 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
update_icons()
return
-/mob/living/silicon/robot/verb/unlock_own_cover()
+/mob/living/silicon/robot/verb/toggle_own_cover()
set category = "Robot Commands"
- set name = "Unlock Cover"
- set desc = "Unlocks your own cover if it is locked. You can not lock it again. A human will have to lock it for you."
- if(locked)
- switch(alert("You can not lock your cover again, are you sure?\n (You can still ask for a human to lock it)", "Unlock Own Cover", "Yes", "No"))
- if("Yes")
- locked = 0
- update_icons()
- to_chat(usr, "You unlock your cover.")
+ set name = "Toggle Cover"
+ set desc = "Toggles the lock on your cover."
+
+ if(can_lock_cover)
+ if(alert("Are you sure?", locked ? "Unlock Cover" : "Lock Cover", "Yes", "No") == "Yes")
+ locked = !locked
+ update_icons()
+ to_chat(usr, "You [locked ? "lock" : "unlock"] your cover.")
+ return
+ if(!locked)
+ to_chat(usr, "You cannot lock your cover yourself. Find a robotocist.")
+ return
+ if(alert("You cannnot lock your own cover again. Are you sure?\n You will need a robotocist to re-lock you.", "Unlock Own Cover", "Yes", "No") == "Yes")
+ locked = !locked
+ update_icons()
+ to_chat(usr, "You unlock your cover.")
/mob/living/silicon/robot/attack_ghost(mob/user)
if(wiresexposed)
@@ -1403,6 +1413,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
modtype = "Commando"
faction = list("nanotrasen")
is_emaggable = FALSE
+ can_lock_cover = TRUE
default_cell_type = /obj/item/stock_parts/cell/bluespace
/mob/living/silicon/robot/deathsquad/init(alien = FALSE, connect_to_AI = TRUE, mob/living/silicon/ai/ai_to_sync_to = null)
@@ -1431,6 +1442,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
static_radio_channels = 1
allow_rename = FALSE
weapons_unlock = TRUE
+ can_lock_cover = TRUE
default_cell_type = /obj/item/stock_parts/cell/super
var/eprefix = "Amber"
@@ -1487,6 +1499,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
ear_protection = 1 // Immunity to the audio part of flashbangs
emp_protection = TRUE // Immunity to EMP, due to heavy shielding
damage_protection = 20 // Reduce all incoming damage by this number. Very high in the case of /destroyer borgs, since it is an admin-only borg.
+ can_lock_cover = TRUE
default_cell_type = /obj/item/stock_parts/cell/bluespace
/mob/living/silicon/robot/destroyer/init(alien = FALSE, connect_to_AI = TRUE, mob/living/silicon/ai/ai_to_sync_to = null)
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
index f5b58696059..cfc6e1bd59d 100644
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/syndicate.dm
@@ -11,6 +11,7 @@
modtype = "Syndicate"
req_access = list(ACCESS_SYNDICATE)
ionpulse = 1
+ can_lock_cover = TRUE
lawchannel = "State"
var/playstyle_string = "You are a Syndicate assault cyborg!
\
You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \