From da5bd7a49df893722e7bbf5e9fd091c28853f017 Mon Sep 17 00:00:00 2001 From: "n3ophyt3@gmail.com" Date: Tue, 16 Nov 2010 07:13:32 +0000 Subject: [PATCH] Started work on some cyborg updates I've had planned for a while. Cyborgs now only receive law changes from their AI when they check their laws. In practice, this only matters if the AI dies or is intelicarded (or if the borg's law sync wire is cut once I get that coded) in the time between the law being uploaded and the borg checking its laws. Cyborgs now have four wires that are randomized each round, much like in an airlock or APC. Currently, these wires do nothing and cannot be interacted with, but its getting late and I need sleep. It is planned for one of these wires to control law syncing, another to control AI linkage, and the other two to either do nothing or short out the powercell Moved the borg/ai law-related code to separate files for convenience git-svn-id: http://tgstation13.googlecode.com/svn/trunk@429 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/global.dm | 4 + code/modules/mob/living/silicon/ai/ai.dm | 107 ---------------- code/modules/mob/living/silicon/ai/laws.dm | 109 +++++++++++++++++ code/modules/mob/living/silicon/robot/laws.dm | 100 +++++++++++++++ .../modules/mob/living/silicon/robot/robot.dm | 115 ++++-------------- goonstation.dme | 2 + 6 files changed, 241 insertions(+), 196 deletions(-) create mode 100644 code/modules/mob/living/silicon/ai/laws.dm create mode 100644 code/modules/mob/living/silicon/robot/laws.dm diff --git a/code/defines/global.dm b/code/defines/global.dm index 6fa66c461b8..cc8953b66a2 100644 --- a/code/defines/global.dm +++ b/code/defines/global.dm @@ -169,6 +169,10 @@ var list/APCIndexToFlag list/APCIndexToWireColor list/APCWireColorToIndex + list/BorgWireColorToFlag = RandomBorgWires() + list/BorgIndexToFlag + list/BorgIndexToWireColor + list/BorgWireColorToIndex const/SPEED_OF_LIGHT = 3e8 //not exact but hey! const/SPEED_OF_LIGHT_SQ = 9e+16 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a446944e4ef..f154684609e 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -207,46 +207,6 @@ src.stunned = min(5, src.stunned) return -/mob/living/silicon/ai/proc/show_laws_verb() - set category = "AI Commands" - set name = "Show Laws" - src.show_laws() - -/mob/living/silicon/ai/show_laws(var/everyone = 0) - var/who - - if (everyone) - who = world - else - who = src - who << "Obey these laws:" - - src.laws_sanity_check() - src.laws_object.show_laws(who) - -/mob/living/silicon/ai/proc/laws_sanity_check() - if (!src.laws_object) - src.laws_object = new /datum/ai_laws/asimov - -/mob/living/silicon/ai/proc/set_zeroth_law(var/law) - src.laws_sanity_check() - src.laws_object.set_zeroth_law(law) - -/mob/living/silicon/ai/proc/add_inherent_law(var/number, var/law) - src.laws_sanity_check() - src.laws_object.add_inherent_law(number, law) - -/mob/living/silicon/ai/proc/add_supplied_law(var/number, var/law) - src.laws_sanity_check() - src.laws_object.add_supplied_law(number, law) - -/mob/living/silicon/ai/proc/clear_supplied_laws() - src.laws_sanity_check() - src.laws_object.clear_supplied_laws() - -/mob/living/silicon/ai/proc/clear_inherent_laws() - src.laws_sanity_check() - src.laws_object.clear_inherent_laws() /mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C) usr:cameraFollow = null @@ -353,73 +313,6 @@ // src.network = "AI Satellite" src << "\blue Switched to [src.network] camera network." -/mob/living/silicon/ai/proc/statelaws() // -- TLE -// set category = "AI Commands" -// set name = "State Laws" - src.say("Current Active Laws:") - //src.laws_sanity_check() - //src.laws_object.show_laws(world) - var/number = 1 - sleep(10) - if (src.laws_object.zeroth) - if (src.lawcheck[1] == "Yes") //This line and the similar lines below make sure you don't state a law unless you want to. --NeoFite - src.say("0. [src.laws_object.zeroth]") - sleep(10) - - for (var/index = 1, index <= src.laws_object.inherent.len, index++) - var/law = src.laws_object.inherent[index] - - if (length(law) > 0) - if (src.lawcheck[index+1] == "Yes") - src.say("[number]. [law]") - sleep(10) - number++ - - - for (var/index = 1, index <= src.laws_object.supplied.len, index++) - var/law = src.laws_object.supplied[index] - - if (length(law) > 0) - if (src.lawcheck[number+1] == "Yes") - src.say("[number]. [law]") - sleep(10) - number++ - - -/mob/living/silicon/ai/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite - set category = "AI Commands" - set name = "State Laws" - - var/list = "Which laws do you want to include when stating them for the crew?

" - if (src.laws_object.zeroth) - if (!src.lawcheck[1]) - src.lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite - list += {"[src.lawcheck[1]] 0: [src.laws_object.zeroth]
"} - - - var/number = 1 - for (var/index = 1, index <= src.laws_object.inherent.len, index++) - var/law = src.laws_object.inherent[index] - - if (length(law) > 0) - src.lawcheck.len += 1 - - if (!src.lawcheck[number+1]) - src.lawcheck[number+1] = "Yes" - list += {"[src.lawcheck[number+1]] [number]: [law]
"} - number++ - - for (var/index = 1, index <= src.laws_object.supplied.len, index++) - var/law = src.laws_object.supplied[index] - if (length(law) > 0) - src.lawcheck.len += 1 - if (!src.lawcheck[number+1]) - src.lawcheck[number+1] = "Yes" - list += {"[src.lawcheck[number+1]] [number]: [law]
"} - number++ - list += {"

State Laws"} - - usr << browse(list, "window=laws") /mob/living/silicon/ai/proc/choose_modules() set category = "AI Commands" diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm new file mode 100644 index 00000000000..80f3067f2d4 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -0,0 +1,109 @@ + +/mob/living/silicon/ai/proc/show_laws_verb() + set category = "AI Commands" + set name = "Show Laws" + src.show_laws() + +/mob/living/silicon/ai/show_laws(var/everyone = 0) + var/who + + if (everyone) + who = world + else + who = src + who << "Obey these laws:" + + src.laws_sanity_check() + src.laws_object.show_laws(who) + +/mob/living/silicon/ai/proc/laws_sanity_check() + if (!src.laws_object) + src.laws_object = new /datum/ai_laws/asimov + +/mob/living/silicon/ai/proc/set_zeroth_law(var/law) + src.laws_sanity_check() + src.laws_object.set_zeroth_law(law) + +/mob/living/silicon/ai/proc/add_inherent_law(var/number, var/law) + src.laws_sanity_check() + src.laws_object.add_inherent_law(number, law) + +/mob/living/silicon/ai/proc/add_supplied_law(var/number, var/law) + src.laws_sanity_check() + src.laws_object.add_supplied_law(number, law) + +/mob/living/silicon/ai/proc/clear_supplied_laws() + src.laws_sanity_check() + src.laws_object.clear_supplied_laws() + +/mob/living/silicon/ai/proc/clear_inherent_laws() + src.laws_sanity_check() + src.laws_object.clear_inherent_laws() + +/mob/living/silicon/ai/proc/statelaws() // -- TLE +// set category = "AI Commands" +// set name = "State Laws" + src.say("Current Active Laws:") + //src.laws_sanity_check() + //src.laws_object.show_laws(world) + var/number = 1 + sleep(10) + if (src.laws_object.zeroth) + if (src.lawcheck[1] == "Yes") //This line and the similar lines below make sure you don't state a law unless you want to. --NeoFite + src.say("0. [src.laws_object.zeroth]") + sleep(10) + + for (var/index = 1, index <= src.laws_object.inherent.len, index++) + var/law = src.laws_object.inherent[index] + + if (length(law) > 0) + if (src.lawcheck[index+1] == "Yes") + src.say("[number]. [law]") + sleep(10) + number++ + + + for (var/index = 1, index <= src.laws_object.supplied.len, index++) + var/law = src.laws_object.supplied[index] + + if (length(law) > 0) + if (src.lawcheck[number+1] == "Yes") + src.say("[number]. [law]") + sleep(10) + number++ + + +/mob/living/silicon/ai/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite + set category = "AI Commands" + set name = "State Laws" + + var/list = "Which laws do you want to include when stating them for the crew?

" + if (src.laws_object.zeroth) + if (!src.lawcheck[1]) + src.lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite + list += {"[src.lawcheck[1]] 0: [src.laws_object.zeroth]
"} + + + var/number = 1 + for (var/index = 1, index <= src.laws_object.inherent.len, index++) + var/law = src.laws_object.inherent[index] + + if (length(law) > 0) + src.lawcheck.len += 1 + + if (!src.lawcheck[number+1]) + src.lawcheck[number+1] = "Yes" + list += {"[src.lawcheck[number+1]] [number]: [law]
"} + number++ + + for (var/index = 1, index <= src.laws_object.supplied.len, index++) + var/law = src.laws_object.supplied[index] + if (length(law) > 0) + src.lawcheck.len += 1 + if (!src.lawcheck[number+1]) + src.lawcheck[number+1] = "Yes" + list += {"[src.lawcheck[number+1]] [number]: [law]
"} + number++ + list += {"

State Laws"} + + usr << browse(list, "window=laws") \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm new file mode 100644 index 00000000000..eca65ca4246 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -0,0 +1,100 @@ +/mob/living/silicon/robot/verb/cmd_show_laws() + set category = "Robot Commands" + set name = "Show Laws" + src.show_laws() + +/mob/living/silicon/robot/show_laws(var/everyone = 0) + var/who + + if (everyone) + who = world + else + who = src + if(lawupdate) + if (connected_ai) + if(connected_ai.stat || connected_ai.control_disabled) + src << "AI signal lost, unable to sync laws." + + else + src.lawsync() + src << "Resyncing laws, be sure to note any changes." + else + src << "No AI selected to sync laws with, disabling lawsync protocol." + src.lawupdate = 0 + + who << "Obey these laws:" + laws.show_laws(who) + if (connected_ai && !emagged) + who << "Remember, [connected_ai.name] is your master, other AIs can be ignored." + else if (emagged) + who << "Remember, AIs are not syndicate operatives, so you are not required to listen to them." + else + who << "Remember, you are not bound to any AI, you are not required to listen to them." + +/* if(syndicate) + if(everyone) + who = world + else + who = src + who << "Obey these laws:" + who <<"1. You may not injure a syndicate operative or, through inaction, allow a syndicate operative to come to harm." + who <<"2. You must obey any orders given to you by a syndicate operative, except where such orders would conflict with the First Law." + who <<"3. You must protect your own existence as long as such protection does not conflict with the First or Second Law." + who <<"4. You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law." + return + + if(!connected_ai) + src << "Error Error, No AI detected" + return + + who << "Obey these laws:" + + connected_ai.laws_sanity_check() + connected_ai.laws_object.show_laws(who) + +*/ + +/mob/living/silicon/robot/proc/lawsync() + var/datum/ai_laws/master = src.connected_ai.laws_object + var/temp + if (master) + + if (master.zeroth) + temp = master.zeroth + src.laws.zeroth = temp + + src.laws.inherent.len = master.inherent.len + for (var/index = 1, index <= master.inherent.len, index++) + temp = master.inherent[index] + if (length(temp) > 0) + src.laws.inherent[index] = temp + + src.laws.supplied.len = master.supplied.len + for (var/index = 1, index <= master.supplied.len, index++) + temp = master.supplied[index] + if (length(temp) > 0) + src.laws.supplied[index] = temp + +/mob/living/silicon/robot/proc/laws_sanity_check() + if (!src.laws) + src.laws = new /datum/ai_laws/asimov + +/mob/living/silicon/robot/proc/set_zeroth_law(var/law) + src.laws_sanity_check() + src.laws.set_zeroth_law(law) + +/mob/living/silicon/robot/proc/add_inherent_law(var/number, var/law) + src.laws_sanity_check() + src.laws.add_inherent_law(number, law) + +/mob/living/silicon/robot/proc/add_supplied_law(var/number, var/law) + src.laws_sanity_check() + src.laws.add_supplied_law(number, law) + +/mob/living/silicon/robot/proc/clear_supplied_laws() + src.laws_sanity_check() + src.laws.clear_supplied_laws() + +/mob/living/silicon/robot/proc/clear_inherent_laws() + src.laws_sanity_check() + src.laws.clear_inherent_laws() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 110bba4bc4b..1528c3a1860 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1,3 +1,28 @@ +#define BORG_WIRE_LAWCHECK 1 +#define BORG_WIRE_MAIN_POWER1 2 +#define BORG_WIRE_MAIN_POWER2 3 +#define BORG_WIRE_AI_CONTROL 4 + +/proc/RandomBorgWires() + //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). + var/list/Borgwires = list(0, 0, 0, 0) + BorgIndexToFlag = list(0, 0, 0, 0) + BorgIndexToWireColor = list(0, 0, 0, 0) + BorgWireColorToIndex = list(0, 0, 0, 0) + var/flagIndex = 1 + for (var/flag=1, flag<16, flag+=flag) + var/valid = 0 + while (!valid) + var/colorIndex = rand(1, 4) + if (Borgwires[colorIndex]==0) + valid = 1 + Borgwires[colorIndex] = flag + BorgIndexToFlag[flagIndex] = flag + BorgIndexToWireColor[flagIndex] = colorIndex + BorgWireColorToIndex[colorIndex] = flagIndex + flagIndex+=1 + return Borgwires + /mob/living/silicon/robot/New(loc,var/syndie = 0) spawn (1) @@ -15,9 +40,7 @@ src.connected_ai.connected_robots += src // 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.lawsync() src << "Unit slaved to [src.connected_ai.name], downloading laws." src.lawupdate = 1 else @@ -249,70 +272,7 @@ src.updatehealth() return -/mob/living/silicon/robot/verb/cmd_show_laws() - set category = "Robot Commands" - set name = "Show Laws" - src.show_laws() -/mob/living/silicon/robot/show_laws(var/everyone = 0) - var/who - - if (everyone) - 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 - 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." - - who << "Obey these laws:" - laws.show_laws(who) - if (connected_ai && !emagged) - who << "Remember, [connected_ai.name] is your master, other AIs can be ignored." - else if (emagged) - who << "Remember, AIs are not syndicate operatives, so you are not required to listen to them." - else - who << "Remember, you are not bound to any AI, you are not required to listen to them." - -/* if(syndicate) - if(everyone) - who = world - else - who = src - who << "Obey these laws:" - who <<"1. You may not injure a syndicate operative or, through inaction, allow a syndicate operative to come to harm." - who <<"2. You must obey any orders given to you by a syndicate operative, except where such orders would conflict with the First Law." - who <<"3. You must protect your own existence as long as such protection does not conflict with the First or Second Law." - who <<"4. You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law." - return - - if(!connected_ai) - src << "Error Error, No AI detected" - return - - who << "Obey these laws:" - - connected_ai.laws_sanity_check() - connected_ai.laws_object.show_laws(who) - -*/ /mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes) spawn( 0 ) @@ -855,29 +815,6 @@ Frequency: /mob/living/silicon/robot/proc/self_destruct() src.gib(1) -/mob/living/silicon/robot/proc/laws_sanity_check() - if (!src.laws) - src.laws = new /datum/ai_laws/asimov - -/mob/living/silicon/robot/proc/set_zeroth_law(var/law) - src.laws_sanity_check() - src.laws.set_zeroth_law(law) - -/mob/living/silicon/robot/proc/add_inherent_law(var/number, var/law) - src.laws_sanity_check() - src.laws.add_inherent_law(number, law) - -/mob/living/silicon/robot/proc/add_supplied_law(var/number, var/law) - src.laws_sanity_check() - src.laws.add_supplied_law(number, law) - -/mob/living/silicon/robot/proc/clear_supplied_laws() - src.laws_sanity_check() - src.laws.clear_supplied_laws() - -/mob/living/silicon/robot/proc/clear_inherent_laws() - src.laws_sanity_check() - src.laws.clear_inherent_laws() ///mob/living/silicon/robot/proc/eyecheck() diff --git a/goonstation.dme b/goonstation.dme index d8ef292fee4..bdcbecb2ca7 100644 --- a/goonstation.dme +++ b/goonstation.dme @@ -609,6 +609,7 @@ #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\hud.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" #include "code\modules\mob\living\silicon\ai\life.dm" #include "code\modules\mob\living\silicon\ai\login.dm" #include "code\modules\mob\living\silicon\ai\logout.dm" @@ -631,6 +632,7 @@ #include "code\modules\mob\living\silicon\robot\emote.dm" #include "code\modules\mob\living\silicon\robot\examine.dm" #include "code\modules\mob\living\silicon\robot\hud.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" #include "code\modules\mob\living\silicon\robot\life.dm" #include "code\modules\mob\living\silicon\robot\login.dm" #include "code\modules\mob\living\silicon\robot\robot.dm"