From 73e33a788e7b4f5040be84b570f137b49a68491a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA?= Date: Fri, 20 Oct 2023 16:43:14 +0500 Subject: [PATCH 1/7] Choosable Laws. --- code/modules/client/preferences.dm | 46 ++++++++++++++++++- code/modules/client/preferences_savefile.dm | 3 ++ config/sandstorm/config.txt | 30 ++++++++++++ .../configuration/entries/sandstorm.dm | 6 +++ .../code/modules/jobs/job_types/ai.dm | 12 +++++ .../code/modules/jobs/job_types/cyborg.dm | 11 +++++ tgstation.dme | 2 + 7 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 modular_sand/code/modules/jobs/job_types/ai.dm create mode 100644 modular_sand/code/modules/jobs/job_types/cyborg.dm diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index af83e0eee7..9f6c7e9b8f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -280,6 +280,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/tcg_cards = list() var/list/tcg_decks = list() + var/silicon_lawset + /datum/preferences/New(client/C) parent = C @@ -464,7 +466,37 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Preferred AI Core Display: [preferred_ai_core_display]
" dat += "Preferred Security Department: [prefered_security_department]
" - dat += "" + dat += "" + dat += "

Silicon preferences

" + if(!CONFIG_GET(flag/allow_silicon_choosing_laws)) + dat += "The server has disabled choosing your own laws, you can still choose and save, but it won't do anything in-game.
" + dat += "Starting lawset: [silicon_lawset ? silicon_lawset : "No custom"]
" + + if(silicon_lawset) + var/list/config_laws = CONFIG_GET(keyed_list/choosable_laws) + var/obj/item/aiModule/law_board = GLOB.all_law_boards[text2path(config_laws[silicon_lawset])] + if(law_board) + var/law_number = 1 + if(length(law_board.laws)) + for(var/law_text in law_board.laws) + dat += "[law_number]: [law_text]
" + law_number++ + else if(istype(law_board, /obj/item/aiModule/core/full)) + var/obj/item/aiModule/core/full/full_boardtype = law_board + for(var/datum/ai_laws/law_prototype in typesof(/datum/ai_laws)) + if(full_boardtype.law_id != initial(law_prototype.id)) + continue + var/datum/ai_laws/law_datum = new law_prototype + for(var/law_text in law_datum.get_law_list(TRUE)) + dat += "[law_text]
" + qdel(law_datum) // hiss i hate everything in this else + break + else + dat += "I was unable to find the laws for your lawset, sorry :(" + + dat += "" + + dat += "" //Character background if(BACKGROUND_CHAR_TAB) dat += "" - - dat += "
" @@ -2737,6 +2769,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/pickedPDASkin = input(user, "Choose your PDA reskin.", "Character Preference", pda_skin) as null|anything in GLOB.pda_reskins 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) + if(picked_lawset) + 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 if (!isnull(desiredlength)) @@ -3775,6 +3811,14 @@ 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 2fa13df825..7464d63be0 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -472,6 +472,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["pda_style"] >> pda_style S["pda_color"] >> pda_color S["pda_skin"] >> pda_skin + S["silicon_lawset"] >> silicon_lawset // Custom hotkeys S["key_bindings"] >> key_bindings @@ -540,6 +541,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style)) pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color)) pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT) + silicon_lawset = sanitize_inlist(silicon_lawset, CONFIG_GET(keyed_list/choosable_laws), null) screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) autostand = sanitize_integer(autostand, 0, 1, initial(autostand)) @@ -661,6 +663,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["pda_style"], pda_style) WRITE_FILE(S["pda_color"], pda_color) WRITE_FILE(S["pda_skin"], pda_skin) + WRITE_FILE(S["silicon_lawset"], silicon_lawset) WRITE_FILE(S["key_bindings"], key_bindings) WRITE_FILE(S["modless_key_bindings"], modless_key_bindings) WRITE_FILE(S["favorite_outfits"], favorite_outfits) diff --git a/config/sandstorm/config.txt b/config/sandstorm/config.txt index f10679d513..e1f7390671 100644 --- a/config/sandstorm/config.txt +++ b/config/sandstorm/config.txt @@ -27,3 +27,33 @@ MAX_STUPOR_HYPNO_DURATION 12000 ## Reveal Everything ## ## Uncomment to reveal everything on roundend #REVEAL_EVERYTHING + +## This allows players to select their laws as a preference and is applied when they join roundstart/latejoin +## It won't work if there is an active AI or if they're borged +ALLOW_SILICON_CHOOSING_LAWS + +## 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 + +## 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 + +## 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 diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm.dm b/modular_sand/code/controllers/configuration/entries/sandstorm.dm index 08b515fda8..6a1102df2d 100644 --- a/modular_sand/code/controllers/configuration/entries/sandstorm.dm +++ b/modular_sand/code/controllers/configuration/entries/sandstorm.dm @@ -20,3 +20,9 @@ min_val = 10 /datum/config_entry/flag/reveal_everything // On Round end, reveal roles and ghosts + +/datum/config_entry/flag/allow_silicon_choosing_laws + +/datum/config_entry/keyed_list/choosable_laws + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT diff --git a/modular_sand/code/modules/jobs/job_types/ai.dm b/modular_sand/code/modules/jobs/job_types/ai.dm new file mode 100644 index 0000000000..d214482fbe --- /dev/null +++ b/modular_sand/code/modules/jobs/job_types/ai.dm @@ -0,0 +1,12 @@ +/datum/job/ai/after_spawn(mob/H, client/C, 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) diff --git a/modular_sand/code/modules/jobs/job_types/cyborg.dm b/modular_sand/code/modules/jobs/job_types/cyborg.dm new file mode 100644 index 0000000000..45cf5ae1f2 --- /dev/null +++ b/modular_sand/code/modules/jobs/job_types/cyborg.dm @@ -0,0 +1,11 @@ +/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, client/player_client) + . = ..() + 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) diff --git a/tgstation.dme b/tgstation.dme index 33f09c534d..84700f8e58 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4166,6 +4166,8 @@ #include "modular_sand\code\modules\integrated_electronics\subtypes\output.dm" #include "modular_sand\code\modules\jobs\job_types\_job.dm" #include "modular_sand\code\modules\jobs\job_types\_job_alt_titles.dm" +#include "modular_sand\code\modules\jobs\job_types\ai.dm" +#include "modular_sand\code\modules\jobs\job_types\cyborg.dm" #include "modular_sand\code\modules\jobs\job_types\prisoner.dm" #include "modular_sand\code\modules\keybindings\keybind\carbon.dm" #include "modular_sand\code\modules\language\dragon.dm" From 3aa3aead3d0281caa28fde44389d0290f3f98b4b Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 20 Oct 2023 17:48:13 -0300 Subject: [PATCH 2/7] re-do the whole goddamn thing. --- code/__SANDCODE/HELPERS/silicon.dm | 13 +++++ .../controllers/configuration/config_entry.dm | 8 +++- code/datums/ai_laws.dm | 5 +- code/modules/client/preferences.dm | 44 +++++------------ code/modules/client/preferences_savefile.dm | 2 +- code/modules/mob/living/silicon/ai/laws.dm | 1 - code/modules/mob/living/silicon/robot/laws.dm | 1 - config/sandstorm/config.txt | 47 ++++++++++--------- .../code/_globalvars/lists/silicon.dm | 8 ++++ .../configuration/entries/sandstorm.dm | 4 +- .../code/modules/jobs/job_types/ai.dm | 11 ++--- .../code/modules/jobs/job_types/cyborg.dm | 9 +--- tgstation.dme | 2 + 13 files changed, 78 insertions(+), 77 deletions(-) create mode 100644 code/__SANDCODE/HELPERS/silicon.dm create mode 100644 modular_sand/code/_globalvars/lists/silicon.dm 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("
[title]

[english_list(printable_laws, "No laws", "
", "
")]")) /datum/ai_laws/proc/clear_zeroth_law(force) //only removes zeroth from antag ai if force is 1 if(force) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 9f6c7e9b8f..42f50f70d0 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -466,37 +466,21 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Preferred AI Core Display: [preferred_ai_core_display]
" dat += "Preferred Security Department: [prefered_security_department]
" - dat += "
" dat += "

Silicon preferences

" if(!CONFIG_GET(flag/allow_silicon_choosing_laws)) dat += "The server has disabled choosing your own laws, you can still choose and save, but it won't do anything in-game.
" - dat += "Starting lawset: [silicon_lawset ? silicon_lawset : "No custom"]
" + dat += "Starting lawset: [silicon_lawset ? silicon_lawset : "Server default"]
" if(silicon_lawset) var/list/config_laws = CONFIG_GET(keyed_list/choosable_laws) - var/obj/item/aiModule/law_board = GLOB.all_law_boards[text2path(config_laws[silicon_lawset])] - if(law_board) - var/law_number = 1 - if(length(law_board.laws)) - for(var/law_text in law_board.laws) - dat += "[law_number]: [law_text]
" - law_number++ - else if(istype(law_board, /obj/item/aiModule/core/full)) - var/obj/item/aiModule/core/full/full_boardtype = law_board - for(var/datum/ai_laws/law_prototype in typesof(/datum/ai_laws)) - if(full_boardtype.law_id != initial(law_prototype.id)) - continue - var/datum/ai_laws/law_datum = new law_prototype - for(var/law_text in law_datum.get_law_list(TRUE)) - dat += "[law_text]
" - qdel(law_datum) // hiss i hate everything in this else - break - else - dat += "I was unable to find the laws for your lawset, sorry :(" + var/datum/ai_laws/law_datum = GLOB.all_law_datums[config_laws[silicon_lawset]] + if(law_datum) + dat += "[law_datum]
" + dat += english_list(law_datum.get_law_list(TRUE), + "I was unable to find the laws for your lawset, sorry :(", + "
", "
") - dat += "
" + dat += "" //Character background if(BACKGROUND_CHAR_TAB) dat += "
" @@ -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" From 2c4ff7b448a47c27254b0233f6fd737f4751854d Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 20 Oct 2023 17:55:09 -0300 Subject: [PATCH 3/7] trailing newline --- .../code/controllers/configuration/entries/sandstorm.dm | 2 +- modular_sand/code/modules/jobs/job_types/ai.dm | 1 - modular_sand/code/modules/jobs/job_types/cyborg.dm | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm.dm b/modular_sand/code/controllers/configuration/entries/sandstorm.dm index ff2aae6811..155cfb32c5 100644 --- a/modular_sand/code/controllers/configuration/entries/sandstorm.dm +++ b/modular_sand/code/controllers/configuration/entries/sandstorm.dm @@ -27,4 +27,4 @@ key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_TYPE splitter = " | " - lowercase_key = FALSE \ No newline at end of file + lowercase_key = FALSE diff --git a/modular_sand/code/modules/jobs/job_types/ai.dm b/modular_sand/code/modules/jobs/job_types/ai.dm index 3f1a89b186..5f80699ea7 100644 --- a/modular_sand/code/modules/jobs/job_types/ai.dm +++ b/modular_sand/code/modules/jobs/job_types/ai.dm @@ -4,4 +4,3 @@ return 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 5f0ac05d29..668728f52b 100644 --- a/modular_sand/code/modules/jobs/job_types/cyborg.dm +++ b/modular_sand/code/modules/jobs/job_types/cyborg.dm @@ -3,4 +3,4 @@ if(!istype(R)) return - setup_silicon_law_prefs(R, player_client) \ No newline at end of file + setup_silicon_law_prefs(R, player_client) From f12f8fc2f25c58dad23c63af7ce2de6cadfbd91b Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 20 Oct 2023 18:04:16 -0300 Subject: [PATCH 4/7] ye --- modular_sand/code/_globalvars/lists/silicon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_sand/code/_globalvars/lists/silicon.dm b/modular_sand/code/_globalvars/lists/silicon.dm index 0f75fef235..bac66a4b04 100644 --- a/modular_sand/code/_globalvars/lists/silicon.dm +++ b/modular_sand/code/_globalvars/lists/silicon.dm @@ -3,6 +3,6 @@ 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) + for(var/datum/ai_laws/law_datum as anything in typesof(/datum/ai_laws) - list(/datum/ai_laws/malfunction, /datum/ai_laws/custom)) LAZYSET(law_datums, law_datum, new law_datum()) return law_datums From 0a7b3a8c8e118d32a1c18a317e2c26a1eb14a9bd Mon Sep 17 00:00:00 2001 From: Sandstorm Bot <85452301+Sandstorm-Bot@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:15:52 +0000 Subject: [PATCH 5/7] Automatic changelog generation for PR #351 [ci skip] --- html/changelogs/AutoChangeLog-pr-351.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-351.yml diff --git a/html/changelogs/AutoChangeLog-pr-351.yml b/html/changelogs/AutoChangeLog-pr-351.yml new file mode 100644 index 0000000000..bad57b5968 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-351.yml @@ -0,0 +1,5 @@ +author: SmiLeYre and SandPoot. +delete-after: true +changes: + - rscadd: Silicons can choose their lawset if allowed by the server host (enabled + in configs). From 3f05f09959b513085438e333f27180b00760c5ca Mon Sep 17 00:00:00 2001 From: Sandstorm Bot <85452301+Sandstorm-Bot@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:16:50 +0000 Subject: [PATCH 6/7] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-351.yml | 5 ----- html/changelogs/archive/2023-10.yml | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-351.yml diff --git a/html/changelogs/AutoChangeLog-pr-351.yml b/html/changelogs/AutoChangeLog-pr-351.yml deleted file mode 100644 index bad57b5968..0000000000 --- a/html/changelogs/AutoChangeLog-pr-351.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: SmiLeYre and SandPoot. -delete-after: true -changes: - - rscadd: Silicons can choose their lawset if allowed by the server host (enabled - in configs). diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 97fcafd7a9..ac9cc64a54 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -4,3 +4,7 @@ - rscadd: Plushies can be renamed. - rscadd: Added some extra plushies. - imageadd: Added held sprite for most modular plushies. +2023-10-20: + SmiLeYre and SandPoot.: + - rscadd: Silicons can choose their lawset if allowed by the server host (enabled + in configs). From 7f707da2bc1794a3897229c3833e5311fd4f604a Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 20 Oct 2023 18:26:09 -0300 Subject: [PATCH 7/7] forgor --- code/__SANDCODE/HELPERS/silicon.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__SANDCODE/HELPERS/silicon.dm b/code/__SANDCODE/HELPERS/silicon.dm index 1d7c3760c8..8483fc30c5 100644 --- a/code/__SANDCODE/HELPERS/silicon.dm +++ b/code/__SANDCODE/HELPERS/silicon.dm @@ -1,4 +1,7 @@ /proc/setup_silicon_law_prefs(mob/living/silicon/Silicon, client/player_client) + if(!CONFIG_GET(flag/allow_silicon_choosing_laws)) + return + if(!player_client.prefs.silicon_lawset) return