Merge pull request #8560 from PsiOmegaDelta/PCAILaws

PC AI laws.
This commit is contained in:
Chinsky
2015-03-30 21:23:34 +03:00
12 changed files with 293 additions and 222 deletions

View File

@@ -311,13 +311,6 @@ var/list/ai_verbs_default = list(
//usr <<"You can only change your display once!"
//return
/mob/living/silicon/ai/proc/is_malf()
if(ticker.mode.name == "AI malfunction")
for (var/datum/mind/malfai in malf.current_antagonists)
if (mind == malfai)
return malf
return 0
// displays the malf_ai information if the AI is the malf
/mob/living/silicon/ai/show_malf_ai()
if(malf && malf.hacked_apcs.len >= 3)

View File

@@ -16,8 +16,7 @@
src.laws.show_laws(who)
/mob/living/silicon/ai/add_ion_law(var/law)
src.laws_sanity_check()
src.laws.add_ion_law(law)
..()
for(var/mob/living/silicon/robot/R in mob_list)
if(R.lawupdate && (R.connected_ai == src))
R.show_laws()

View File

@@ -12,6 +12,7 @@
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg)
laws_sanity_check()
laws.set_zeroth_law(law, law_borg)
log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]")
/mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg)
..()
@@ -21,28 +22,39 @@
/mob/living/silicon/proc/add_ion_law(var/law)
laws_sanity_check()
laws.add_ion_law(law)
log_and_message_admins("has given [src] the ion law: [law]")
/mob/living/silicon/proc/add_inherent_law(var/law, var/state_law = 1)
/mob/living/silicon/proc/add_inherent_law(var/law)
laws_sanity_check()
laws.add_inherent_law(law, state_law)
laws.add_inherent_law(law)
log_and_message_admins("has given [src] the inherent law: [law]")
/mob/living/silicon/proc/add_supplied_law(var/number, var/law)
laws_sanity_check()
laws.add_supplied_law(number, law)
log_and_message_admins("has given [src] the supplied law: [law]")
/mob/living/silicon/proc/delete_law(var/datum/ai_law/law)
laws_sanity_check()
laws.delete_law(law)
log_and_message_admins("has deleted a law belonging to [src]: [law.law]")
/mob/living/silicon/proc/clear_inherent_laws()
laws_sanity_check()
laws.clear_inherent_laws()
log_and_message_admins("cleared the inherent laws of [src]")
/mob/living/silicon/proc/clear_ion_laws()
laws_sanity_check()
laws.clear_ion_laws()
/mob/living/silicon/proc/add_supplied_law(var/number, var/law, var/state_law = 1)
laws_sanity_check()
laws.add_supplied_law(number, law, state_law)
log_and_message_admins("cleared the ion laws of [src]")
/mob/living/silicon/proc/clear_supplied_laws()
laws_sanity_check()
laws.clear_supplied_laws()
log_and_message_admins("cleared the supplied laws of [src]")
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws, var/use_statement_order = 1) // -- TLE
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws)
var/prefix = ""
switch(lawchannel)
if(MAIN_CHANNEL) prefix = ";"
@@ -50,9 +62,9 @@
else
prefix = get_radio_key_from_channel(lawchannel == "Holopad" ? "department" : lawchannel) + " "
dostatelaws(lawchannel, prefix, laws, use_statement_order)
dostatelaws(lawchannel, prefix, laws)
/mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws, var/use_statement_order)
/mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws)
if(stating_laws[prefix])
src << "<span class='notice'>[method]: Already stating laws using this communication method.</span>"
return
@@ -62,7 +74,7 @@
var/can_state = statelaw("[prefix]Current Active Laws:")
for(var/datum/ai_law/law in laws.laws_to_state())
can_state = statelaw("[prefix][law.get_index(use_statement_order)]. [law.law]")
can_state = statelaw("[prefix][law.get_index()]. [law.law]")
if(!can_state)
src << "<span class='danger'>[method]: Unable to state laws. Communication method unavailable.</span>"
@@ -81,3 +93,7 @@
channels += common_radio.channels
channels += additional_law_channels
return channels
/mob/living/silicon/proc/lawsync()
laws_sanity_check()
laws.sort_laws()

View File

@@ -38,11 +38,12 @@
who << "<b>Remember, you are not bound to any AI, you are not required to listen to them.</b>"
/mob/living/silicon/robot/proc/lawsync()
/mob/living/silicon/robot/lawsync()
laws_sanity_check()
var/datum/ai_laws/master = connected_ai ? connected_ai.laws : null
var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null
if (master)
master.sync(src)
..()
return
/mob/living/silicon/robot/proc/robot_checklaws()

View File

@@ -1200,6 +1200,7 @@
/mob/living/silicon/robot/proc/disconnect_from_ai()
if(connected_ai)
sync() // One last sync attempt
connected_ai.connected_robots -= src
connected_ai = null

View File

@@ -333,3 +333,14 @@
for(var/obj/machinery/camera/C in A.cameras())
cameratext += "[(cameratext == "")? "" : "|"]<A HREF=?src=\ref[src];switchcamera=\ref[C]>[C.c_tag]</A>"
src << "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])"
/mob/living/silicon/proc/is_traitor()
return mind && (mind in traitors.current_antagonists)
/mob/living/silicon/proc/is_malf()
return mind && (mind in malf.current_antagonists)
/mob/living/silicon/proc/is_malf_or_traitor()
return is_traitor() || is_malf()

View File

@@ -49,30 +49,26 @@
var/datum/ai_law/AL = locate(href_list["ref"]) in owner.laws.all_laws()
if(AL)
var/state_law = text2num(href_list["state_law"])
AL.state_law = state_law
owner.laws.set_state_law(AL, state_law)
return 1
if(href_list["add_zeroth_law"])
if(zeroth_law && is_admin(usr) && !owner.laws.zeroth_law)
log_and_message_admins("has given [owner] a new zeroth law: [zeroth_law]")
owner.set_zeroth_law(zeroth_law)
return 1
if(href_list["add_ion_law"])
if(ion_law && is_malf(usr))
log_and_message_admins("has given [owner] a new ion law: [ion_law]")
owner.add_ion_law(ion_law)
return 1
if(href_list["add_inherent_law"])
if(inherent_law && is_malf(usr))
log_and_message_admins("has given [owner] a new inherent law: [inherent_law]")
owner.add_inherent_law(inherent_law)
return 1
if(href_list["add_supplied_law"])
if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_malf(usr))
log_and_message_admins("has given [owner] a new supplied law: [supplied_law]")
owner.add_supplied_law(supplied_law_position, supplied_law)
return 1
@@ -120,8 +116,7 @@
if(is_malf(usr))
var/datum/ai_law/AL = locate(href_list["delete_law"]) in owner.laws.all_laws()
if(AL && is_malf(usr))
log_and_message_admins("has deleted a law belonging to [owner]: [AL.law]")
owner.laws.delete_law(AL)
owner.delete_law(AL)
return 1
if(href_list["state_laws"])
@@ -143,15 +138,6 @@
current_view = 0
return 1
if(href_list["sync_laws"])
if(owner.isAI())
sync_laws(owner)
else
var/mob/living/silicon/robot/R = owner
sync_laws(R.connected_ai)
usr << "<span class='notice'>Sync complete.</span>"
return 1
if(href_list["notify_laws"])
owner << "<span class='danger'>Law Notice</span>"
owner.laws.show_laws(owner)
@@ -164,9 +150,11 @@
usr << "<span class='notice>Laws displayed.</span>"
return 1
return 0
/obj/nano_module/law_manager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
owner.laws.sort_laws()
owner.lawsync()
data["ion_law_nr"] = ionnum()
data["ion_law"] = ion_law
@@ -175,7 +163,7 @@
data["supplied_law"] = supplied_law
data["supplied_law_position"] = supplied_law_position
package_laws(data, "zeroth_laws", list(owner.laws.zeroth_law, owner.laws.zeroth_law_borg))
package_laws(data, "zeroth_laws", list(owner.laws.zeroth_law))
package_laws(data, "ion_laws", owner.laws.ion_laws)
package_laws(data, "inherent_laws", owner.laws.inherent_laws)
package_laws(data, "supplied_laws", owner.laws.supplied_laws)
@@ -209,7 +197,7 @@
/obj/nano_module/law_manager/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws)
var/packaged_laws[0]
for(var/datum/ai_law/AL in laws)
packaged_laws[++packaged_laws.len] = list("law" = sanitize(AL.law), "index" = AL.get_index(), "state" = AL.state_law, "ref" = "\ref[AL]")
packaged_laws[++packaged_laws.len] = list("law" = sanitize(AL.law), "index" = AL.get_index(), "state" = owner.laws.get_state_law(AL), "ref" = "\ref[AL]")
data[field] = packaged_laws
data["has_[field]"] = packaged_laws.len
@@ -226,16 +214,13 @@
return law_sets
/obj/nano_module/law_manager/proc/is_malf(var/mob/user)
return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_loose()
/mob/living/silicon/proc/is_malf_loose()
return mind && (mind.special_role == "malfunction" || mind.special_role == "traitor")
return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_or_traitor()
/mob/living/silicon/proc/is_ai_malf()
return 0
/mob/living/silicon/robot/is_ai_malf()
return is_slaved() && connected_ai.is_malf_loose()
return is_slaved() && connected_ai.is_malf_or_traitor()
/mob/living/silicon/ai/is_ai_malf()
return 0

View File

@@ -358,7 +358,7 @@ datum/design/aimodule/safeguard
build_path = /obj/item/weapon/aiModule/safeguard
datum/design/aimodule/onehuman
name = "OneHuman"
name = "OneCrewMember"
id = "onehuman"
req_tech = list("programming" = 4, "materials" = 6)
build_path = /obj/item/weapon/aiModule/oneHuman