diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index 20935e04731..d991a7a162f 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -42,6 +42,7 @@
R.notify_ai(DISCONNECT)
if(new_ai && (new_ai != R.connected_ai))
R.set_connected_ai(new_ai)
+ log_combat(usr, R, "synced cyborg [R.connected_ai ? "from [ADMIN_LOOKUP(R.connected_ai)]": ""] to [ADMIN_LOOKUP(new_ai)]")
if(R.shell)
R.undeploy() //If this borg is an AI shell, disconnect the controlling AI and assign ti to a new AI
R.notify_ai(AI_SHELL)
@@ -49,15 +50,20 @@
R.notify_ai(TRUE)
if(WIRE_CAMERA) // Pulse to disable the camera.
if(!QDELETED(R.builtInCamera) && !R.scrambledcodes)
- R.builtInCamera.toggle_cam(usr, 0)
+ R.builtInCamera.toggle_cam(usr, FALSE)
R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly."))
+ log_combat(usr, R, "toggled cyborg camera to [R.builtInCamera.status ? "on" : "off"] via pulse")
if(WIRE_LAWSYNC) // Forces a law update if possible.
if(R.lawupdate)
R.visible_message(span_notice("[R] gently chimes."), span_notice("LawSync protocol engaged."))
+ log_combat(usr, R, "forcibly synced cyborg laws via pulse")
+ // TODO, log the laws they gained here
R.lawsync()
R.show_laws()
if(WIRE_LOCKDOWN)
R.SetLockdown(!R.lockcharge) // Toggle
+ log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via pulse")
+
if(WIRE_RESET_MODEL)
if(R.has_model())
R.visible_message(span_notice("[R]'s model servos twitch."), span_notice("Your model display flickers."))
@@ -68,6 +74,7 @@
if(WIRE_AI) // Cut the AI wire to reset AI control.
if(!mend)
R.notify_ai(DISCONNECT)
+ log_combat(usr, R, "cut AI wire on cyborg[R.connected_ai ? " and disconnected from [ADMIN_LOOKUP(R.connected_ai)]": ""]")
if(R.shell)
R.undeploy()
R.set_connected_ai(null)
@@ -76,8 +83,10 @@
if(mend)
if(!R.emagged)
R.lawupdate = TRUE
+ log_combat(usr, R, "enabled lawsync via wire")
else if(!R.deployed) //AI shells must always have the same laws as the AI
R.lawupdate = FALSE
+ log_combat(usr, R, "disabled lawsync via wire")
R.logevent("Lawsync Module fault [mend?"cleared":"detected"]")
if (WIRE_CAMERA) // Disable the camera.
if(!QDELETED(R.builtInCamera) && !R.scrambledcodes)
@@ -85,12 +94,15 @@
R.builtInCamera.toggle_cam(usr, 0)
R.visible_message(span_notice("[R]'s camera lens focuses loudly."), span_notice("Your camera lens focuses loudly."))
R.logevent("Camera Module fault [mend?"cleared":"detected"]")
+ log_combat(usr, R, "[mend ? "enabled" : "disabled"] cyborg camera via wire")
if(WIRE_LOCKDOWN) // Simple lockdown.
R.SetLockdown(!mend)
R.logevent("Motor Controller fault [mend?"cleared":"detected"]")
+ log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] via wire")
if(WIRE_RESET_MODEL)
if(R.has_model() && !mend)
R.ResetModel()
+ log_combat(usr, R, "reset the cyborg module via wire")
/datum/wires/robot/can_reveal_wires(mob/user)
if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES))
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index cfbad4b2c3d..afa02344f91 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -390,7 +390,7 @@
icon_state = "[xray_module][default_camera_icon][in_use_lights ? "_in_use" : ""]"
return ..()
-/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
+/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE)
status = !status
if(can_use())
GLOB.cameranet.addCamera(src)
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 6497aa64797..3c90c9d399b 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -83,7 +83,9 @@
if(can_control(usr, R) && !..())
var/turf/T = get_turf(R)
message_admins(span_notice("[ADMIN_LOOKUPFLW(usr)] detonated [key_name_admin(R, R.client)] at [ADMIN_VERBOSEJMP(T)]!"))
- log_game("[span_notice("[key_name(usr)] detonated [key_name(R)]!")]")
+ log_game("[key_name(usr)] detonated [key_name(R)]!")
+ log_combat(usr, R, "detonated cyborg")
+
if(R.connected_ai)
to_chat(R.connected_ai, "
[span_alert("ALERT - Cyborg detonation detected: [R.name]")]
")
R.self_destruct()
@@ -95,6 +97,7 @@
if(can_control(usr, R) && !..())
message_admins(span_notice("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!"))
log_game("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!")
+ log_combat(usr, R, "[!R.lockcharge ? "locked down" : "released"] cyborg")
R.SetLockdown(!R.lockcharge)
to_chat(R, !R.lockcharge ? span_notice("Your lockdown has been lifted!") : span_alert("You have been locked down!"))
if(R.connected_ai)
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 8d449ef1c98..05e6844f6a6 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -100,12 +100,12 @@
if(masterAI)
R.set_connected_ai(masterAI)
R.lawsync()
- R.lawupdate = 1
+ R.lawupdate = TRUE
addtimer(CALLBACK(src, .proc/unlock_new_robot, R), 50)
/obj/machinery/transformer/proc/unlock_new_robot(mob/living/silicon/robot/R)
playsound(src.loc, 'sound/machines/ping.ogg', 50, FALSE)
sleep(30)
if(R)
- R.SetLockdown(0)
+ R.SetLockdown(FALSE)
R.notify_ai(NEW_BORG)
diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm
index e1dcf921556..603f4653068 100644
--- a/code/game/objects/items/AI_modules.dm
+++ b/code/game/objects/items/AI_modules.dm
@@ -56,6 +56,7 @@ AI MODULES
if(tot_laws > CONFIG_GET(number/silicon_max_law_amount) && !bypass_law_amt_check)//allows certain boards to avoid this check, eg: reset
to_chat(user, span_alert("Not enough memory allocated to [law_datum.owner ? law_datum.owner : "the AI core"]'s law processor to handle this amount of laws."))
message_admins("[ADMIN_LOOKUPFLW(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUPFLW(law_datum.owner) : "an AI core"] that would exceed the law cap.")
+ log_game("[ADMIN_LOOKUP(user)] tried to upload laws to [law_datum.owner ? ADMIN_LOOKUP(law_datum.owner) : "an AI core"] that would exceed the law cap.")
overflow = TRUE
var/law2log = transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log
@@ -68,9 +69,23 @@ AI MODULES
var/time = time2text(world.realtime,"hh:mm:ss")
var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core"
var/aikey = law_datum.owner ? law_datum.owner.ckey : "null"
- GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""]")
- log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]) from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]")
- message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]")
+
+ //affected cyborgs are cyborgs linked to the AI with lawsync enabled
+ var/affected_cyborgs = list()
+ var/list/borg_txt = list()
+ var/list/borg_flw = list()
+ if(isAI(law_datum.owner))
+ var/mob/living/silicon/ai/owner = law_datum.owner
+ for(var/mob/living/silicon/robot/owned_borg as anything in owner.connected_robots)
+ if(owned_borg.connected_ai && owned_borg.lawupdate)
+ affected_cyborgs += owned_borg
+ borg_flw += "[ADMIN_LOOKUPFLW(owned_borg)], "
+ borg_txt += "[ADMIN_LOOKUP(owned_borg)], "
+
+ borg_txt = borg_txt.Join()
+ GLOB.lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""], [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]")
+ log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]) from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_txt]" : ""]")
+ message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""] , [length(affected_cyborgs) ? ", impacting synced borgs [borg_flw.Join()]" : ""]")
if(law_datum.owner)
deadchat_broadcast(" changed [span_name("[ainame]")]'s laws at [get_area_name(user, TRUE)].", span_name("[user]"), follow_target=user, message_type=DEADCHAT_LAWCHANGE)
@@ -117,7 +132,7 @@ AI MODULES
to_chat(law_datum.owner, "It would be in your best interest to play along with [sender.real_name] that:")
for(var/failedlaw in laws)
to_chat(law_datum.owner, "[failedlaw]")
- return 1
+ return TRUE
for(var/templaw in laws)
if(law_datum.owner)
@@ -190,7 +205,7 @@ AI MODULES
/obj/item/ai_module/zeroth/onehuman/install(datum/ai_laws/law_datum, mob/user)
if(!targetName)
to_chat(user, span_alert("No name detected on module, please enter one."))
- return 0
+ return FALSE
..()
/obj/item/ai_module/zeroth/onehuman/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 210651954f6..d422fb166a5 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -588,7 +588,7 @@
playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1)
sleep(12)
if(!prev_lockcharge)
- R.SetLockdown(0)
+ R.SetLockdown(FALSE)
R.set_anchored(FALSE)
R.notransform = FALSE
R.resize = 2