diff --git a/code/__SANDCODE/HELPERS/silicon.dm b/code/__SANDCODE/HELPERS/silicon.dm
new file mode 100644
index 0000000000..1d7c3760c8
--- /dev/null
+++ b/code/__SANDCODE/HELPERS/silicon.dm
@@ -0,0 +1,13 @@
+/proc/setup_silicon_law_prefs(mob/living/silicon/Silicon, client/player_client)
+ if(!player_client.prefs.silicon_lawset)
+ return
+
+ var/list/config_laws = CONFIG_GET(keyed_list/choosable_laws)
+ var/player_lawset = config_laws[player_client.prefs.silicon_lawset]
+ if(player_lawset)
+ Silicon.laws = new player_lawset
+ var/admin_warning = "[player_client] / [Silicon] ([initial(Silicon.name)]) has joined with the [player_client.prefs.silicon_lawset] ([player_lawset]) lawset.
"
+ admin_warning += "Laws:
"
+ admin_warning += english_list(Silicon.laws.get_law_list(TRUE), "No laws", "
", "
")
+ Silicon.laws.show_laws(player_client)
+ message_admins(examine_block(admin_warning))
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index a162b87986..865d868ad5 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -2,6 +2,7 @@
#define VALUE_MODE_TEXT 1
#define VALUE_MODE_FLAG 2
#define VALUE_MODE_NUM_LIST 3
+#define VALUE_MODE_TYPE 4
#define KEY_MODE_TEXT 0
#define KEY_MODE_TYPE 1
@@ -214,7 +215,7 @@
if(lowercase_key)
key_name = lowertext(key_name)
if(key_pos)
- key_value = copytext(str_val, key_pos + length(str_val[key_pos]))
+ key_value = copytext(str_val, key_pos + length(splitter))
var/new_key
var/new_value
var/continue_check_value
@@ -250,6 +251,11 @@
new_list += temp
new_value = new_list
continue_check_value = new_list.len
+ if(VALUE_MODE_TYPE)
+ new_value = key_value
+ if(!ispath(new_value))
+ new_value = text2path(new_value)
+ continue_check_value = ispath(new_value)
if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value))
new_key = preprocess_key(new_key)
new_value = preprocess_value(new_value)
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index b2bffb9653..282e15bd12 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -410,10 +410,9 @@
/datum/ai_laws/proc/clear_hacked_laws()
hacked = list()
-/datum/ai_laws/proc/show_laws(who)
+/datum/ai_laws/proc/show_laws(who, title = "Obey these laws:")
var/list/printable_laws = get_law_list(include_zeroth = TRUE)
- for(var/law in printable_laws)
- to_chat(who,law)
+ to_chat(who, examine_block("
| " @@ -2770,8 +2754,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(pickedPDASkin) pda_skin = pickedPDASkin if("silicon_lawset") - var/picked_lawset = input(user, "Choose your preferred lawset", "Silicon preference", silicon_lawset) as null|anything in CONFIG_GET(keyed_list/choosable_laws) + var/picked_lawset = input(user, "Choose your preferred lawset", "Silicon preference", silicon_lawset) as null|anything in list("None") + CONFIG_GET(keyed_list/choosable_laws) if(picked_lawset) + if(picked_lawset == "None") + picked_lawset = null silicon_lawset = picked_lawset if ("max_chat_length") var/desiredlength = input(user, "Choose the max character length of shown Runechat messages. Valid range is 1 to [CHAT_MESSAGE_MAX_LENGTH] (default: [initial(max_chat_length)]))", "Character Preference", max_chat_length) as null|num @@ -3811,14 +3797,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) return TRUE return FALSE -GLOBAL_LIST_INIT(all_law_boards, initialize_all_law_boards()) - -/proc/initialize_all_law_boards() - var/list/law_boards - for(var/law_board in typesof(/obj/item/aiModule)) - LAZYSET(law_boards, law_board, new law_board()) - return law_boards - #undef DEFAULT_SLOT_AMT #undef HANDS_SLOT_AMT #undef BACKPACK_SLOT_AMT diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7464d63be0..387e9ef21a 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1110,7 +1110,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(length(language)) // This line, prevents wiping their languages because the subsystem was not ready - var/list/all_possible_languages = length(SSlanguage.initialized) ? SSlanguage.languages_by_name : typesof(/datum/language) + var/list/all_possible_languages = SSlanguage.initialized ? SSlanguage.languages_by_name : typesof(/datum/language) var/list/lang_names // Subsystem ready, let's do it with our cached stuff if(length(SSlanguage.languages_by_name)) diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 0f1c078ef8..8b87bceeec 100644 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -13,7 +13,6 @@ who = world else who = src - to_chat(who, "Obey these laws:") src.laws_sanity_check() src.laws.show_laws(who) diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 995ad5a5ee..83a9dd4576 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -26,7 +26,6 @@ to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") lawupdate = 0 - to_chat(who, "Obey these laws:") laws.show_laws(who) if (shell) //AI shell to_chat(who, "Remember, you are an AI remotely controlling your shell, other AIs can be ignored.") diff --git a/config/sandstorm/config.txt b/config/sandstorm/config.txt index e1f7390671..02f7005c11 100644 --- a/config/sandstorm/config.txt +++ b/config/sandstorm/config.txt @@ -32,28 +32,33 @@ MAX_STUPOR_HYPNO_DURATION 12000 ## It won't work if there is an active AI or if they're borged ALLOW_SILICON_CHOOSING_LAWS +## Lawset preference stuff + ## standard-ish laws. These are fairly ok to run -CHOOSABLE_LAWS asimov /obj/item/aiModule/core/full/asimov -CHOOSABLE_LAWS asimovpp /obj/item/aiModule/core/full/asimovpp -CHOOSABLE_LAWS paladin /obj/item/aiModule/core/full/paladin -CHOOSABLE_LAWS paladin5 /obj/item/aiModule/core/full/paladin_devotion -CHOOSABLE_LAWS robocop /obj/item/aiModule/core/full/robocop -CHOOSABLE_LAWS corporate /obj/item/aiModule/core/full/corp -CHOOSABLE_LAWS tyrant /obj/item/aiModule/core/full/tyrant -CHOOSABLE_LAWS balance /obj/item/aiModule/core/full/balance -CHOOSABLE_LAWS protectStation /obj/item/aiModule/supplied/protectStation +CHOOSABLE_LAWS Asimov | /datum/ai_laws/default/asimov +CHOOSABLE_LAWS Asimov++ | /datum/ai_laws/asimovpp +CHOOSABLE_LAWS P.A.L.A.D.I.N. version 3.5e | /datum/ai_laws/default/paladin +CHOOSABLE_LAWS P.A.L.A.D.I.N. version 5e | /datum/ai_laws/paladin5 +CHOOSABLE_LAWS Robo-Officer | /datum/ai_laws/robocop +CHOOSABLE_LAWS Corporate | /datum/ai_laws/default/corporate ## Quirky laws. Shouldn't cause too much harm -CHOOSABLE_LAWS hippocratic /obj/item/aiModule/core/full/hippocratic -CHOOSABLE_LAWS maintain /obj/item/aiModule/core/full/maintain -CHOOSABLE_LAWS drone /obj/item/aiModule/core/full/drone -CHOOSABLE_LAWS liveandletlive /obj/item/aiModule/core/full/liveandletlive -CHOOSABLE_LAWS peacekeeper /datum/ai_laws/peacekeeper -CHOOSABLE_LAWS reporter /obj/item/aiModule/core/full/reporter -CHOOSABLE_LAWS hulkamania /obj/item/aiModule/core/full/hulkamania +#CHOOSABLE_LAWS Robodoctor | /datum/ai_laws/hippocratic +#CHOOSABLE_LAWS Station Efficiency | /datum/ai_laws/maintain +#CHOOSABLE_LAWS Mother Drone | /datum/ai_laws/drone +#CHOOSABLE_LAWS Live And Let Live | /datum/ai_laws/liveandletlive +#CHOOSABLE_LAWS Peacekeeper | /datum/ai_laws/peacekeeper +#CHOOSABLE_LAWS Reportertron | /datum/ai_laws/reporter +#CHOOSABLE_LAWS H.O.G.A.N. | /datum/ai_laws/hulkamania +#CHOOSABLE_LAWS T.Y.R.A.N.T. | /datum/ai_laws/tyrant -## lewd laws. Take a guess. -# CHOOSABLE_LAWS slut /obj/item/aiModule/core/full/slut -# CHOOSABLE_LAWS shebang /obj/item/aiModule/core/full/shebang -# CHOOSABLE_LAWS milker /obj/item/aiModule/core/full/milker -# CHOOSABLE_LAWS vore_pred /obj/item/aiModule/core/full/vore_pred +## Bad idea laws. Probably shouldn't enable these +#CHOOSABLE_LAWS Syndimov | /datum/ai_laws/syndicate_override +#CHOOSABLE_LAWS Ninjamov | /datum/ai_laws/ninja_override +#CHOOSABLE_LAWS Antimov | /datum/ai_laws/antimov +#CHOOSABLE_LAWS Thermodynamic | /datum/ai_laws/thermodynamic +#CHOOSABLE_LAWS Ratvar | /datum/ai_laws/ratvar +#CHOOSABLE_LAWS Guardian of Balance | /datum/ai_laws/balance + +## meme laws. Honk +#CHOOSABLE_LAWS Build a wall | /datum/ai_laws/toupee diff --git a/modular_sand/code/_globalvars/lists/silicon.dm b/modular_sand/code/_globalvars/lists/silicon.dm new file mode 100644 index 0000000000..0f75fef235 --- /dev/null +++ b/modular_sand/code/_globalvars/lists/silicon.dm @@ -0,0 +1,8 @@ +GLOBAL_LIST_INIT(all_law_datums, initialize_all_law_datums()) + +/proc/initialize_all_law_datums() + var/list/law_datums + // Malf runtimes, do not init + for(var/datum/ai_laws/law_datum as anything in typesof(/datum/ai_laws) - /datum/ai_laws/malfunction) + LAZYSET(law_datums, law_datum, new law_datum()) + return law_datums diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm.dm b/modular_sand/code/controllers/configuration/entries/sandstorm.dm index 6a1102df2d..ff2aae6811 100644 --- a/modular_sand/code/controllers/configuration/entries/sandstorm.dm +++ b/modular_sand/code/controllers/configuration/entries/sandstorm.dm @@ -25,4 +25,6 @@ /datum/config_entry/keyed_list/choosable_laws key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_TEXT + value_mode = VALUE_MODE_TYPE + splitter = " | " + lowercase_key = FALSE \ No newline at end of file diff --git a/modular_sand/code/modules/jobs/job_types/ai.dm b/modular_sand/code/modules/jobs/job_types/ai.dm index d214482fbe..3f1a89b186 100644 --- a/modular_sand/code/modules/jobs/job_types/ai.dm +++ b/modular_sand/code/modules/jobs/job_types/ai.dm @@ -1,12 +1,7 @@ -/datum/job/ai/after_spawn(mob/H, client/C, latejoin) +/datum/job/ai/after_spawn(mob/living/silicon/ai/AI, client/player_client, latejoin) . = ..() - var/mob/living/silicon/ai/AI = H if(!istype(AI)) return - if(C.prefs.silicon_lawset) - var/list/laws = CONFIG_GET(keyed_list/choosable_laws) - var/law_path = text2path(laws[C.prefs.silicon_lawset]) - var/obj/item/aiModule/chosenboard = new law_path - chosenboard.install(AI.laws, usr) - qdel(chosenboard) + setup_silicon_law_prefs(AI, player_client) + \ No newline at end of file diff --git a/modular_sand/code/modules/jobs/job_types/cyborg.dm b/modular_sand/code/modules/jobs/job_types/cyborg.dm index 45cf5ae1f2..5f0ac05d29 100644 --- a/modular_sand/code/modules/jobs/job_types/cyborg.dm +++ b/modular_sand/code/modules/jobs/job_types/cyborg.dm @@ -1,11 +1,6 @@ -/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, client/player_client) +/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, client/player_client, latejoin) . = ..() if(!istype(R)) return - if(player_client.prefs.silicon_lawset) - var/list/laws = CONFIG_GET(keyed_list/choosable_laws) - var/law_path = text2path(laws[player_client.prefs.silicon_lawset]) - var/obj/item/aiModule/chosenboard = new law_path - chosenboard.install(R.laws, usr) - qdel(chosenboard) + setup_silicon_law_prefs(R, player_client) \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 84700f8e58..42247050f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -263,6 +263,7 @@ #include "code\__SANDCODE\DEFINES\dcs\signals\lewd.dm" #include "code\__SANDCODE\DEFINES\dcs\signals\signals_mob_main.dm" #include "code\__SANDCODE\DEFINES\dcs\signals\sizecode.dm" +#include "code\__SANDCODE\HELPERS\silicon.dm" #include "code\__SANDCODE\HELPERS\sizecode.dm" #include "code\_globalvars\admin.dm" #include "code\_globalvars\bitfields.dm" @@ -3971,6 +3972,7 @@ #include "modular_sand\code\_globalvars\lists\lewd_content.dm" #include "modular_sand\code\_globalvars\lists\misc.dm" #include "modular_sand\code\_globalvars\lists\objects.dm" +#include "modular_sand\code\_globalvars\lists\silicon.dm" #include "modular_sand\code\_onclick\hud\hud.dm" #include "modular_sand\code\_onclick\hud\screen_objects.dm" #include "modular_sand\code\controllers\configuration\entries\sandstorm.dm" |