diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 81f01219b8..3ea4d0a870 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -197,10 +197,9 @@ var/list/banned_edits = list(NAMEOF(src, entries_by_type), NAMEOF(src, entries), NAMEOF(src, directory)) return !(var_name in banned_edits) && ..() -/datum/controller/configuration/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Edit", src) - stat("[name]:", statclick) +/datum/controller/configuration/stat_entry(msg) + msg = "Edit" + return msg /// Your typical GET but returns a config. /datum/controller/configuration/proc/GetEntryDatum(entry_type) diff --git a/code/controllers/controller.dm b/code/controllers/controller.dm index c9d5f1e565..1f0a01a072 100644 --- a/code/controllers/controller.dm +++ b/code/controllers/controller.dm @@ -16,4 +16,4 @@ /datum/controller/proc/Recover() -/datum/controller/proc/stat_entry() +/datum/controller/proc/stat_entry(msg) diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 3ce770b66d..148822cdd1 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -95,8 +95,6 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe/proc/defcon_pretty() return defcon -/datum/controller/failsafe/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")) +/datum/controller/failsafe/stat_entry(msg) + msg = "Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])" + return msg diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index a085b26410..6b5fb294ea 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -24,11 +24,9 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) //fuck off kevinz return QDEL_HINT_IWILLGC -/datum/controller/global_vars/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat("Globals:", statclick.update("Edit")) +/datum/controller/global_vars/stat_entry(msg) + msg = "Edit" + return msg /datum/controller/global_vars/vv_edit_var(var_name, var_value) if(gvars_datum_protected_varlist[var_name]) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 8a381558a9..1b5c7e5e83 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -615,13 +615,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new skip_ticks = 1 -/datum/controller/master/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) +/datum/controller/master/stat_entry(msg) + msg = "(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])" + return msg - stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)") - stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])")) - stat("Misc Subsystems", misc_statclick) /datum/controller/master/StartLoadingMap() //disallow more than one map to load at once, multithreading it will just cause race conditions diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index ef10e0626c..81fa77dc6c 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(profiler) /datum/controller/subsystem/profiler/stat_entry(msg) msg += "F:[round(fetch_cost,1)]ms" msg += "|W:[round(write_cost,1)]ms" - ..(msg) + return msg /datum/controller/subsystem/profiler/Initialize() if(CONFIG_GET(flag/auto_profile)) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index d0e54f63d7..47d7bd8fd9 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -32,11 +32,11 @@ SUBSYSTEM_DEF(statpanels) list("CPU:", world.cpu), list("Instances:", "[num2text(world.contents.len, 10)]"), list("World Time:", "[world.time]"), - list("Globals:", "Edit", "\ref[GLOB]"), - list("[config]:", "Edit", "\ref[config]"), - list("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))"), - list("Master Controller:", Master ? "(TickRate:[Master.processing]) (Iteration:[Master.iteration])" : "ERROR", "\ref[Master]"), - list("Failsafe Controller:", Failsafe ? "Defcon: [Failsafe.defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])" : "ERROR", "\ref[Failsafe]"), + list("Globals:", GLOB.stat_entry(), "\ref[GLOB]"), + list("[config]:", config.stat_entry(), "\ref[config]"), + list("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)"), + list("Master Controller:", Master.stat_entry(), "\ref[Master]"), + list("Failsafe Controller:", Failsafe.stat_entry(), "\ref[Failsafe]"), list("","") ) for(var/ss in Master.subsystems) @@ -94,6 +94,10 @@ SUBSYSTEM_DEF(statpanels) if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override) continue overrides += target_image.loc + if(!(REF(target_mob.listed_turf) in cached_images)) + target << browse_rsc(getFlatIcon(target_mob.listed_turf, no_anim = TRUE), "[REF(target_mob.listed_turf)].png") + cached_images += REF(target_mob.listed_turf) + turfitems[++turfitems.len] = list("[target_mob.listed_turf]", REF(target_mob.listed_turf), "[REF(target_mob.listed_turf)].png") for(var/tc in target_mob.listed_turf) var/atom/movable/turf_content = tc if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 6ede0415da..593579c469 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -40,7 +40,7 @@ new_ai = select_active_ai(R) R.notify_ai(DISCONNECT) if(new_ai && (new_ai != R.connected_ai)) - R.connected_ai = new_ai + R.set_connected_ai(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) @@ -69,7 +69,7 @@ R.notify_ai(DISCONNECT) if(R.shell) R.undeploy() - R.connected_ai = null + R.set_connected_ai(null) if(WIRE_LAWSYNC) // Cut the law wire, and the borg will no longer receive law updates from its AI. Repair and it will re-sync. if(mend) if(!R.emagged) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index a2d4b9eb7e..8bca58a7de 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -100,7 +100,7 @@ // So he can't jump out the gate right away. R.SetLockdown() if(masterAI) - R.connected_ai = masterAI + R.set_connected_ai(masterAI) R.lawsync() R.lawupdate = 1 addtimer(CALLBACK(src, .proc/unlock_new_robot, R), 50) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 6621095b72..a9cd4c33a7 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -281,12 +281,12 @@ O.custom_name = created_name O.locked = panel_locked if(!aisync) - lawsync = 0 - O.connected_ai = null + lawsync = FALSE + O.set_connected_ai(null) else O.notify_ai(NEW_BORG) if(forced_ai) - O.connected_ai = forced_ai + O.set_connected_ai(forced_ai) if(!lawsync) O.lawupdate = 0 if(M.laws.id == DEFAULT_AI_LAWID) @@ -337,10 +337,10 @@ if(!aisync) lawsync = FALSE - O.connected_ai = null + O.set_connected_ai(null) else if(forced_ai) - O.connected_ai = forced_ai + O.set_connected_ai(forced_ai) O.notify_ai(AI_SHELL) if(!lawsync) O.lawupdate = FALSE diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 2dd5bcb806..be22c889f0 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -199,7 +199,7 @@ borg.notify_ai(DISCONNECT) if(borg.shell) borg.undeploy() - borg.connected_ai = newai + borg.set_connected_ai(newai) borg.notify_ai(TRUE) message_admins("[key_name_admin(user)] slaved [ADMIN_LOOKUPFLW(borg)] to the AI [ADMIN_LOOKUPFLW(newai)].") log_admin("[key_name(user)] slaved [key_name(borg)] to the AI [key_name(newai)].") @@ -207,7 +207,7 @@ borg.notify_ai(DISCONNECT) if(borg.shell) borg.undeploy() - borg.connected_ai = null + borg.set_connected_ai(null) message_admins("[key_name_admin(user)] freed [ADMIN_LOOKUPFLW(borg)] from being slaved to an AI.") log_admin("[key_name(user)] freed [key_name(borg)] from being slaved to an AI.") if (borg.lawupdate) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c9b667c74f..6143bde602 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -99,7 +99,7 @@ radio.keyslot = null //END CITADEL EDIT if(connected_ai) - connected_ai.connected_robots -= src + set_connected_ai(null) if(shell) GLOB.available_ai_shells -= src else @@ -560,11 +560,10 @@ gib() /mob/living/silicon/robot/proc/UnlinkSelf() - if(src.connected_ai) - connected_ai.connected_robots -= src - src.connected_ai = null - lawupdate = 0 - scrambledcodes = 1 + set_connected_ai(null) + lawupdate = FALSE + locked_down = FALSE + scrambledcodes = TRUE //Disconnect it's camera so it's not so easily tracked. if(!QDELETED(builtInCamera)) QDEL_NULL(builtInCamera) @@ -586,10 +585,10 @@ W.attack_self(src) -/mob/living/silicon/robot/proc/SetLockdown(state = 1) +/mob/living/silicon/robot/proc/SetLockdown(state = TRUE) // They stay locked down if their wire is cut. if(wires.is_cut(WIRE_LOCKDOWN)) - state = 1 + state = TRUE if(state) throw_alert("locked", /obj/screen/alert/locked) else @@ -991,7 +990,7 @@ builtInCamera.c_tag = real_name //update the camera name too mainframe = AI deployed = TRUE - connected_ai = mainframe + set_connected_ai(mainframe) mainframe.connected_robots |= src lawupdate = TRUE lawsync() @@ -1090,9 +1089,8 @@ . = ..(user) /mob/living/silicon/robot/proc/TryConnectToAI() - connected_ai = select_active_ai_with_fewest_borgs() + set_connected_ai(select_active_ai_with_fewest_borgs(z)) if(connected_ai) - connected_ai.connected_robots += src lawsync() lawupdate = 1 return TRUE @@ -1134,7 +1132,7 @@ /mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_health = 1) if(istype(cell)) - cell.charge -= amount*5 + cell.charge -= amount * 5 /mob/living/silicon/robot/verb/viewmanifest() set category = "Robot Commands" @@ -1143,3 +1141,14 @@ if(usr.stat == DEAD) return //won't work if dead ai_roster() + +/mob/living/silicon/robot/proc/set_connected_ai(new_ai) + if(connected_ai == new_ai) + return + . = connected_ai + connected_ai = new_ai + if(.) + var/mob/living/silicon/ai/old_ai = . + old_ai.connected_robots -= src + if(connected_ai) + connected_ai.connected_robots |= src diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 746c4f469d..a0ea9b735c 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -138,8 +138,8 @@ /mob/living/silicon/robot/proc/beep_boop_rogue_bot(mob/user) SetEmagged(1) SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown - lawupdate = 0 - connected_ai = null + lawupdate = FALSE + set_connected_ai(null) message_admins("[ADMIN_LOOKUPFLW(user)] emagged cyborg [ADMIN_LOOKUPFLW(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") var/time = time2text(world.realtime,"hh:mm:ss")