diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 8d068eb41d7..6eef8565835 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -512,6 +512,28 @@
/proc/format_frequency(var/f)
return "[round(f / 10)].[f % 10]"
+/proc/activeais()
+ var/select = null
+ var/list/names = list()
+ var/list/ais = list()
+ var/list/namecounts = list()
+ for (var/mob/living/silicon/ai/A in world)
+ var/name = A.real_name
+ if (A.real_name == "Inactive AI")
+ continue
+ if (A.stat == 2)
+ continue
+ if (A.control_disabled == 1)
+ continue
+ else
+ names.Add(name)
+ namecounts[name] = 1
+ ais[name] = A
+
+ if (ais.len)
+ select = input("AI signals detected:", "AI selection", null, null) as null|anything in ais
+ return ais[select]
+
/proc/getmobs()
var/list/mobs = sortmobs()
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index e5fcdb85c52..fa16e1711b7 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -33,28 +33,12 @@ AI MODULES
usr << "The upload computer is broken!"
return
- var/select = null
- var/list/names = list()
- var/list/ais = list()
- var/list/namecounts = list()
- for (var/mob/living/silicon/ai/A in world)
- var/name = A.real_name
- if (A.real_name == "Inactive AI")
- continue
- if (A.stat == 2)
- continue
- if (A.control_disabled == 1)
- continue
- else
- names.Add(name)
- namecounts[name] = 1
- ais[name] = A
+ src.current = activeais()
- if (ais.len)
- select = input("Select an AI to upload laws to.", "AI selection", null, null) as null|anything in ais
- src.current = ais[select]
- else
+ if (!src.current)
usr << "No active AIs detected."
+ else
+ usr << "[src.current.name] selected for law changes."
/obj/item/weapon/aiModule/proc/install(var/obj/machinery/computer/aiupload/comp)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 0c1d3536967..af8e0d9b3cc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1,5 +1,6 @@
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/brain/B)
src.anchored = 1
+ src.canmove = 0
src.loc = loc
if(L)
if (istype(L, /datum/ai_laws))
@@ -49,6 +50,8 @@
src.real_name = newname
src.name = newname
+
+
/mob/living/silicon/ai/Stat()
..()
statpanel("Status")
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 056fff60efe..6d8e0bd799f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -10,32 +10,17 @@
src.real_name += " [pick(rand(1, 999))]"
src.name = src.real_name
spawn (4)
- var/select = null
- var/list/names = list()
- var/list/ais = list()
- var/list/namecounts = list()
- for (var/mob/living/silicon/ai/A in world)
- var/name = A.real_name
- if (A.real_name == "Inactive AI")
- continue
- if (A.stat == 2)
- continue
- if (A.control_disabled == 1)
- continue
- else
- names.Add(name)
- namecounts[name] = 1
- ais[name] = A
-
- if (ais.len)
- select = input("Select an AI to sync with.", "AI selection", null, null) as null|anything in ais
- src.connected_ai = ais[select]
+ src.connected_ai = activeais()
+ if (src.connected_ai)
src.connected_ai.connected_robots += src
- src.laws = src.connected_ai.laws_object //The borg inherits its AI's laws
- src << "Laws synced with [src.connected_ai.name]."
+// src.laws = src.connected_ai.laws_object //The borg inherits its AI's laws
+ src.laws = new /datum/ai_laws
+ src.laws.zeroth = src.connected_ai.laws_object.zeroth
+ src.laws.inherent = src.connected_ai.laws_object.inherent
+ src.laws.supplied = src.connected_ai.laws_object.supplied
+ src << "Unit slaved to [src.connected_ai.name], downloading laws."
src.lawupdate = 1
else
- usr << "No active AIs detected."
src.laws = new /datum/ai_laws/asimov
src.lawupdate = 0
src << "Unable to locate an AI, reverting to standard Asimov laws."
@@ -276,14 +261,24 @@
who = world
else
who = src
-
+ var/change = 0
if(lawupdate)
if (connected_ai)
if(connected_ai.stat || connected_ai.control_disabled)
who << "AI signal lost, unable to sync laws."
+
else
- laws = connected_ai.laws_object
- who << "Laws synced with AI."
+ if (src.laws.zeroth != src.connected_ai.laws_object.zeroth)
+ src.laws.zeroth = src.connected_ai.laws_object.zeroth
+ change = 1
+ if (src.laws.inherent != src.connected_ai.laws_object.inherent)
+ src.laws.inherent = src.connected_ai.laws_object.inherent
+ change = 1
+ if (src.laws.supplied != src.connected_ai.laws_object.supplied)
+ src.laws.supplied = src.connected_ai.laws_object.supplied
+ change = 1
+ if (change)
+ who << "Laws out of sync with AI, resyncing."
else
who << "No AI selected to sync laws with."