mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 18:02:57 +00:00
re-do the whole goddamn thing.
This commit is contained in:
13
code/__SANDCODE/HELPERS/silicon.dm
Normal file
13
code/__SANDCODE/HELPERS/silicon.dm
Normal file
@@ -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.<br>"
|
||||
admin_warning += "Laws:<br>"
|
||||
admin_warning += english_list(Silicon.laws.get_law_list(TRUE), "No laws", "<br>", "<br>")
|
||||
Silicon.laws.show_laws(player_client)
|
||||
message_admins(examine_block(admin_warning))
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = "<b>Obey these laws:</b>")
|
||||
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("<center>[title]</center><br>[english_list(printable_laws, "No laws", "<br>", "<br>")]"))
|
||||
|
||||
/datum/ai_laws/proc/clear_zeroth_law(force) //only removes zeroth from antag ai if force is 1
|
||||
if(force)
|
||||
|
||||
@@ -466,37 +466,21 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<a href='?_src_=prefs;preference=ai_core_icon;task=input'><b>Preferred AI Core Display:</b> [preferred_ai_core_display]</a><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=sec_dept;task=input'><b>Preferred Security Department:</b> [prefered_security_department]</a><BR>"
|
||||
|
||||
dat += "<td valign='top'>"
|
||||
dat += "<h2>Silicon preferences</h2>"
|
||||
if(!CONFIG_GET(flag/allow_silicon_choosing_laws))
|
||||
dat += "<i>The server has disabled choosing your own laws, you can still choose and save, but it won't do anything in-game.</i><br>"
|
||||
dat += "<b>Starting lawset:</b> <a href='?_src_=prefs;task=input;preference=silicon_lawset'>[silicon_lawset ? silicon_lawset : "No custom"]</a><br>"
|
||||
dat += "<b>Starting lawset:</b> <a href='?_src_=prefs;task=input;preference=silicon_lawset'>[silicon_lawset ? silicon_lawset : "Server default"]</a><br>"
|
||||
|
||||
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]<br>"
|
||||
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]<br>"
|
||||
qdel(law_datum) // hiss i hate everything in this else
|
||||
break
|
||||
else
|
||||
dat += "I was unable to find the laws for your lawset, sorry <font style='translate: rotate(90deg)'>:(</font>"
|
||||
var/datum/ai_laws/law_datum = GLOB.all_law_datums[config_laws[silicon_lawset]]
|
||||
if(law_datum)
|
||||
dat += "<i>[law_datum]</i><br>"
|
||||
dat += english_list(law_datum.get_law_list(TRUE),
|
||||
"I was unable to find the laws for your lawset, sorry <font style='translate: rotate(90deg)'>:(</font>",
|
||||
"<br>", "<br>")
|
||||
|
||||
dat += "</td>"
|
||||
|
||||
dat += "</tr></table>"
|
||||
dat += "</td></tr></table>"
|
||||
//Character background
|
||||
if(BACKGROUND_CHAR_TAB)
|
||||
dat += "<table width='100%'><tr><td width='30%' valign='top'>"
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
who = world
|
||||
else
|
||||
who = src
|
||||
to_chat(who, "<b>Obey these laws:</b>")
|
||||
|
||||
src.laws_sanity_check()
|
||||
src.laws.show_laws(who)
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
to_chat(src, "<b>No AI selected to sync laws with, disabling lawsync protocol.</b>")
|
||||
lawupdate = 0
|
||||
|
||||
to_chat(who, "<b>Obey these laws:</b>")
|
||||
laws.show_laws(who)
|
||||
if (shell) //AI shell
|
||||
to_chat(who, "<b>Remember, you are an AI remotely controlling your shell, other AIs can be ignored.</b>")
|
||||
|
||||
@@ -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
|
||||
|
||||
8
modular_sand/code/_globalvars/lists/silicon.dm
Normal file
8
modular_sand/code/_globalvars/lists/silicon.dm
Normal file
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user