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."