Enhances AI law and borg logging (#59684)

Persistent logging for sometimes disputed actions

The "impacted cyborgs" is useful for reconstructing which borgs were synced to an AI at what time, which sometimes may not be clear from logs
This commit is contained in:
bloons3
2021-06-30 18:16:23 -03:00
committed by GitHub
parent 2d597584c8
commit 6e01f2901f
6 changed files with 41 additions and 11 deletions
+13 -1
View File
@@ -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))
+1 -1
View File
@@ -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)
+4 -1
View File
@@ -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, "<br><br>[span_alert("ALERT - Cyborg detonation detected: [R.name]")]<br>")
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)
+2 -2
View File
@@ -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)
+20 -5
View File
@@ -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] <B>:</B> [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] <B>:</B> [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("<b> changed [span_name("[ainame]")]'s laws at [get_area_name(user, TRUE)].</b>", 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)
@@ -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