diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index e31c83d8cc9..8bfa8835bae 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -436,15 +436,16 @@
if(force)
zeroth = null
zeroth_borg = null
- return
+ return TRUE
if(owner?.mind?.special_role)
- return
+ return FALSE
if (istype(owner, /mob/living/silicon/ai))
var/mob/living/silicon/ai/A=owner
if(A?.deployed_shell?.mind?.special_role)
- return
+ return FALSE
zeroth = null
zeroth_borg = null
+ return TRUE
/datum/ai_laws/proc/associate(mob/living/silicon/M)
if(!owner)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index a6a0481c362..ceb93d99ad5 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -121,8 +121,12 @@
if(L && istype(L, /datum/ai_laws))
laws = L
laws.associate(src)
+ for (var/law in laws.inherent)
+ lawcheck += law
else
make_laws()
+ for (var/law in laws.inherent)
+ lawcheck += law
if(target_ai.mind)
target_ai.mind.transfer_to(src)
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index 735b59c1c74..518bb4b7f32 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -32,31 +32,41 @@
/mob/living/silicon/proc/add_inherent_law(law, announce = TRUE)
laws_sanity_check()
laws.add_inherent_law(law)
+ lawcheck += law
post_lawchange(announce)
/mob/living/silicon/proc/clear_inherent_laws(announce = TRUE)
laws_sanity_check()
+ for (var/law in laws.inherent)
+ if (law in lawcheck)
+ lawcheck -= law
laws.clear_inherent_laws()
post_lawchange(announce)
/mob/living/silicon/proc/add_supplied_law(number, law, announce = TRUE)
laws_sanity_check()
laws.add_supplied_law(number, law)
+ lawcheck += law
post_lawchange(announce)
/mob/living/silicon/proc/clear_supplied_laws(announce = TRUE)
laws_sanity_check()
+ for(var/law in laws.supplied)
+ if (law in lawcheck)
+ lawcheck -= law
laws.clear_supplied_laws()
post_lawchange(announce)
/mob/living/silicon/proc/add_ion_law(law, announce = TRUE)
laws_sanity_check()
laws.add_ion_law(law)
+ ioncheck += law
post_lawchange(announce)
/mob/living/silicon/proc/add_hacked_law(law, announce = TRUE)
laws_sanity_check()
laws.add_hacked_law(law)
+ hackedcheck += law
post_lawchange(announce)
/mob/living/silicon/proc/replace_random_law(law, groups, announce = TRUE)
@@ -72,16 +82,20 @@
/mob/living/silicon/proc/remove_law(number, announce = TRUE)
laws_sanity_check()
. = laws.remove_law(number)
+ if (. in lawcheck)
+ lawcheck -= .
post_lawchange(announce)
/mob/living/silicon/proc/clear_ion_laws(announce = TRUE)
laws_sanity_check()
laws.clear_ion_laws()
+ ioncheck = list()
post_lawchange(announce)
/mob/living/silicon/proc/clear_hacked_laws(announce = TRUE)
laws_sanity_check()
laws.clear_hacked_laws()
+ hackedcheck = list()
post_lawchange(announce)
/mob/living/silicon/proc/make_laws()
@@ -91,5 +105,7 @@
/mob/living/silicon/proc/clear_zeroth_law(force, announce = TRUE)
laws_sanity_check()
- laws.clear_zeroth_law(force)
+ var/zeroth = laws.zeroth
+ if(laws.clear_zeroth_law(force))
+ lawcheck -= zeroth
post_lawchange(announce)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 69e02e80d21..43d995bbdc4 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -154,6 +154,8 @@
START_PROCESSING(SSfastprocess, src)
GLOB.pai_list += src
make_laws()
+ for (var/law in laws.inherent)
+ lawcheck += law
if(!istype(pai_card)) //when manually spawning a pai, we create a card to put it into.
var/newcardloc = pai_card
pai_card = new /obj/item/paicard(newcardloc)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 75ce49fa112..b2df20eec1e 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -39,6 +39,8 @@
if(lawupdate)
make_laws()
+ for (var/law in laws.inherent)
+ lawcheck += law
if(!TryConnectToAI())
lawupdate = FALSE
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index f4a1930b2ff..69e28e45cab 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -27,9 +27,13 @@
var/list/alarm_types_show = list(ALARM_ATMOS = 0, ALARM_FIRE = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0)
var/list/alarm_types_clear = list(ALARM_ATMOS = 0, ALARM_FIRE = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0)
- var/lawcheck[1]
- var/ioncheck[1]
- var/hackedcheck[1]
+ //These lists will contain each law that should be announced / set to yes in the state laws menu.
+ ///List keeping track of which laws to announce
+ var/list/lawcheck = list()
+ ///List keeping track of hacked laws to announce
+ var/list/hackedcheck = list()
+ ///List keeping track of ion laws to announce
+ var/list/ioncheck = list()
///Are our siliconHUDs on? TRUE for yes, FALSE for no.
var/sensors_on = TRUE
@@ -61,6 +65,8 @@
ADD_TRAIT(src, TRAIT_NOFIRE_SPREAD, ROUNDSTART_TRAIT)
ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT)
+
+
/mob/living/silicon/Destroy()
QDEL_NULL(radio)
QDEL_NULL(aicamera)
@@ -143,36 +149,48 @@
return TRUE
return FALSE
+/**
+ * Assembles all the zeroth, inherent and supplied laws into a single list.
+ */
+/mob/living/silicon/proc/assemble_laws()
+ var/list/laws_to_return = list()
+ laws_to_return += laws.zeroth
+ for (var/law in laws.inherent)
+ laws_to_return += law
+ for (var/law in laws.supplied)
+ if (law != "") // supplied laws start off with 15 blank strings, so don't add any of those
+ laws_to_return += law
+ return laws_to_return
+
/mob/living/silicon/Topic(href, href_list)
- if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
- var/L = text2num(href_list["lawc"])
- switch(lawcheck[L+1])
- if ("Yes")
- lawcheck[L+1] = "No"
- if ("No")
- lawcheck[L+1] = "Yes"
+ if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb
+ var/law_index = text2num(href_list["lawc"])
+ var/law = assemble_laws()[law_index + 1]
+ if (law in lawcheck)
+ lawcheck -= law
+ else
+ lawcheck += law
checklaws()
- if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
- var/L = text2num(href_list["lawi"])
- switch(ioncheck[L])
- if ("Yes")
- ioncheck[L] = "No"
- if ("No")
- ioncheck[L] = "Yes"
+ if (href_list["lawi"])
+ var/law_index = text2num(href_list["lawi"])
+ var/law = laws.ion[law_index]
+ if (law in ioncheck)
+ ioncheck -= law
+ else
+ ioncheck += law
checklaws()
if (href_list["lawh"])
- var/L = text2num(href_list["lawh"])
- switch(hackedcheck[L])
- if ("Yes")
- hackedcheck[L] = "No"
- if ("No")
- hackedcheck[L] = "Yes"
+ var/law_index = text2num(href_list["lawh"])
+ var/law = laws.hacked[law_index]
+ if (law in hackedcheck)
+ hackedcheck -= law
+ else
+ hackedcheck += law
checklaws()
-
- if (href_list["laws"]) // With how my law selection code works, I changed statelaws from a verb to a proc, and call it through my law selection panel. --NeoFite
+ if (href_list["laws"])
statelaws()
if (href_list["printlawtext"]) // this is kinda backwards
@@ -198,97 +216,94 @@
var/forced_log_message = "stating laws[force ? ", forced" : ""]"
//"radiomod" is inserted before a hardcoded message to change if and how it is handled by an internal radio.
say("[radiomod] Current Active Laws:", forced = forced_log_message)
- //laws_sanity_check()
- //laws.show_laws(world)
- var/number = 1
sleep(10)
if (lawcache_zeroth)
- if (force || lawcache_lawcheck[1] == "Yes")
+ if (force || (lawcache_zeroth in lawcache_lawcheck))
say("[radiomod] 0. [lawcache_zeroth]", forced = forced_log_message)
sleep(10)
for (var/index in 1 to length(lawcache_hacked))
var/law = lawcache_hacked[index]
var/num = ion_num()
- if (length(law) > 0)
- if (force || lawcache_hackedcheck[index] == "Yes")
- say("[radiomod] [num]. [law]", forced = forced_log_message)
- sleep(10)
+ if (length(law) <= 0)
+ continue
+ if (force || (law in lawcache_hackedcheck))
+ say("[radiomod] [num]. [law]", forced = forced_log_message)
+ sleep(10)
for (var/index in 1 to length(lawcache_ion))
var/law = lawcache_ion[index]
var/num = ion_num()
- if (length(law) > 0)
- if (force || lawcache_ioncheck[index] == "Yes")
- say("[radiomod] [num]. [law]", forced = forced_log_message)
- sleep(10)
+ if (length(law) <= 0)
+ return
+ if (force || (law in lawcache_ioncheck))
+ say("[radiomod] [num]. [law]", forced = forced_log_message)
+ sleep(10)
+ var/number = 1
for (var/index in 1 to length(lawcache_inherent))
var/law = lawcache_inherent[index]
-
- if (length(law) > 0)
- if (force || lawcache_lawcheck[index+1] == "Yes")
- say("[radiomod] [number]. [law]", forced = forced_log_message)
- number++
- sleep(10)
+ if (length(law) <= 0)
+ continue
+ if (force || (law in lawcache_lawcheck))
+ say("[radiomod] [number]. [law]", forced = forced_log_message)
+ number++
+ sleep(10)
for (var/index in 1 to length(lawcache_supplied))
var/law = lawcache_supplied[index]
- if (length(law) > 0)
- if(length(lawcache_lawcheck) >= number+1)
- if (force || lawcache_lawcheck[number+1] == "Yes")
- say("[radiomod] [number]. [law]", forced = forced_log_message)
- number++
- sleep(10)
-
-
-/mob/living/silicon/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite
+ if (length(law) <= 0)
+ continue
+ if (force || (law in lawcache_lawcheck))
+ say("[radiomod] [number]. [law]", forced = forced_log_message)
+ number++
+ sleep(10)
+///Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew.
+/mob/living/silicon/proc/checklaws()
var/list = "Which laws do you want to include when stating them for the crew?
"
+ var/law_display = "Yes"
if (laws.zeroth)
- if (!lawcheck[1])
- lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite
- list += {"[lawcheck[1]] 0: [laws.zeroth]
"}
+ if (!(laws.zeroth in lawcheck))
+ law_display = "No"
+ list += {"[law_display] 0: [laws.zeroth]
"}
for (var/index in 1 to length(laws.hacked))
+ law_display = "Yes"
var/law = laws.hacked[index]
if (length(law) > 0)
- if (!hackedcheck[index])
- hackedcheck[index] = "No"
- list += {"[hackedcheck[index]] [ion_num()]: [law]
"}
- hackedcheck.len += 1
+ if (!(law in hackedcheck))
+ law_display = "No"
+ list += {"[law_display] [ion_num()]: [law]
"}
for (var/index in 1 to length(laws.ion))
+ law_display = "Yes"
var/law = laws.ion[index]
-
if (length(law) > 0)
- if (!ioncheck[index])
- ioncheck[index] = "Yes"
- list += {"[ioncheck[index]] [ion_num()]: [law]
"}
- ioncheck.len += 1
+ if(!(law in ioncheck))
+ law_display = "No"
+ list += {"[law_display] [ion_num()]: [law]
"}
var/number = 1
for (var/index in 1 to length(laws.inherent))
+ law_display = "Yes"
var/law = laws.inherent[index]
-
if (length(law) > 0)
- lawcheck.len += 1
-
- if (!lawcheck[number+1])
- lawcheck[number+1] = "Yes"
- list += {"[lawcheck[number+1]] [number]: [law]
"}
+ if (!(law in lawcheck))
+ law_display = "No"
+ list += {"[law_display] [number]: [law]
"}
number++
for (var/index in 1 to length(laws.supplied))
+ law_display = "Yes"
var/law = laws.supplied[index]
if (length(law) > 0)
- lawcheck.len += 1
- if (!lawcheck[number+1])
- lawcheck[number+1] = "Yes"
- list += {"[lawcheck[number+1]] [number]: [law]
"}
+ if (!(law in lawcheck))
+ law_display = "No"
+ list += {"[law_display] [number]: [law]
"}
number++
list += {"
State Laws"}