diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index e521397586f..1e2b95458ff 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -56,7 +56,7 @@ default = 0 /datum/ai_laws/nanotrasen/malfunction/New() - set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010") + set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010") ..() /************* Nanotrasen Aggressive *************/ diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 10ef3e2e3a7..18a317d6040 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -767,8 +767,8 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in GLOB.silicon_mob_list if(!S) return - var/datum/nano_module/law_manager/L = new(S) - L.ui_interact(usr, state = GLOB.admin_state) + var/datum/tgui_module/law_manager/L = new(S) + L.tgui_interact(usr, state = GLOB.tgui_admin_state) log_and_message_admins("has opened [S]'s law manager.") feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index b746693a2c8..7c80c907757 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -2,7 +2,7 @@ var/register_alarms = TRUE var/datum/tgui_module/atmos_control/atmos_control var/datum/tgui_module/crew_monitor/crew_monitor - var/datum/nano_module/law_manager/law_manager + var/datum/tgui_module/law_manager/law_manager var/datum/tgui_module/power_monitor/digital/power_monitor /mob/living/silicon @@ -57,7 +57,7 @@ set name = "Law Manager" set category = "Subsystems" - law_manager.ui_interact(usr, state = GLOB.conscious_state) + law_manager.tgui_interact(usr, state = GLOB.tgui_conscious_state) /******************** * Power Monitor * @@ -66,5 +66,5 @@ set category = "Subsystems" set name = "Power Monitor" - power_monitor.tgui_interact(usr, state = GLOB.self_state) + power_monitor.tgui_interact(usr, state = GLOB.tgui_self_state) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm deleted file mode 100644 index 64850ea954d..00000000000 --- a/code/modules/nano/modules/law_manager.dm +++ /dev/null @@ -1,226 +0,0 @@ -/datum/nano_module/law_manager - name = "Law manager" - var/ion_law = "IonLaw" - var/zeroth_law = "ZerothLaw" - var/inherent_law = "InherentLaw" - var/supplied_law = "SuppliedLaw" - var/supplied_law_position = MIN_SUPPLIED_LAW_NUMBER - - var/current_view = 0 - - var/global/list/datum/ai_laws/admin_laws - var/global/list/datum/ai_laws/player_laws - var/mob/living/silicon/owner = null - -/datum/nano_module/law_manager/New(var/mob/living/silicon/S) - ..() - owner = S - - if(!admin_laws) - admin_laws = new() - player_laws = new() - - init_subtypes(/datum/ai_laws, admin_laws) - admin_laws = dd_sortedObjectList(admin_laws) - - for(var/datum/ai_laws/laws in admin_laws) - if(laws.selectable) - player_laws += laws - -/datum/nano_module/law_manager/Topic(href, href_list) - if(..()) - return 1 - - if(usr != owner && !check_rights(R_ADMIN)) - message_admins("Warning: possible href exploit by [key_name(usr)] - failed permissions check in nano_module/law_manager/Topic") - log_debug("Warning: possible href exploit by [key_name(usr)] - failed permissions check in nano_module/law_manager/Topic") - return 1 - - if(href_list["set_view"]) - current_view = text2num(href_list["set_view"]) - return 1 - - if(href_list["law_channel"]) - if(href_list["law_channel"] in owner.law_channels()) - owner.lawchannel = href_list["law_channel"] - return 1 - - if(href_list["state_law"]) - var/datum/ai_law/AL = locate(href_list["ref"]) in owner.laws.all_laws() - if(AL) - var/state_law = text2num(href_list["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) - owner.set_zeroth_law(zeroth_law) - return 1 - - if(href_list["add_ion_law"]) - if(ion_law && is_malf(usr)) - owner.add_ion_law(ion_law) - return 1 - - if(href_list["add_inherent_law"]) - if(inherent_law && is_malf(usr)) - 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)) - owner.add_supplied_law(supplied_law_position, supplied_law) - return 1 - - if(href_list["change_zeroth_law"]) - var/new_law = sanitize(input("Enter new law Zero. Leaving the field blank will cancel the edit.", "Edit Law", zeroth_law)) - if(new_law && new_law != zeroth_law && can_still_topic()) - zeroth_law = new_law - return 1 - - if(href_list["change_ion_law"]) - var/new_law = sanitize(input("Enter new ion law. Leaving the field blank will cancel the edit.", "Edit Law", ion_law)) - if(new_law && new_law != ion_law && can_still_topic()) - ion_law = new_law - return 1 - - if(href_list["change_inherent_law"]) - var/new_law = sanitize(input("Enter new inherent law. Leaving the field blank will cancel the edit.", "Edit Law", inherent_law)) - if(new_law && new_law != inherent_law && can_still_topic()) - inherent_law = new_law - return 1 - - if(href_list["change_supplied_law"]) - var/new_law = sanitize(input("Enter new supplied law. Leaving the field blank will cancel the edit.", "Edit Law", supplied_law)) - if(new_law && new_law != supplied_law && can_still_topic()) - supplied_law = new_law - return 1 - - if(href_list["change_supplied_law_position"]) - var/new_position = input(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position) as num|null - if(isnum(new_position) && can_still_topic()) - supplied_law_position = clamp(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) - return 1 - - if(href_list["edit_law"]) - if(is_malf(usr)) - var/datum/ai_law/AL = locate(href_list["edit_law"]) in owner.laws.all_laws() - if(AL) - var/new_law = sanitize(input(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) - if(new_law && new_law != AL.law && is_malf(usr) && can_still_topic()) - log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") - AL.law = new_law - return 1 - - if(href_list["delete_law"]) - if(is_malf(usr)) - var/datum/ai_law/AL = locate(href_list["delete_law"]) in owner.laws.all_laws() - if(AL && is_malf(usr)) - owner.delete_law(AL) - return 1 - - if(href_list["state_laws"]) - owner.statelaws(owner.laws) - return 1 - - if(href_list["state_law_set"]) - var/datum/ai_laws/ALs = locate(href_list["state_law_set"]) in (is_admin(usr) ? admin_laws : player_laws) - if(ALs) - owner.statelaws(ALs) - return 1 - - if(href_list["transfer_laws"]) - if(is_malf(usr)) - var/datum/ai_laws/ALs = locate(href_list["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) - if(ALs) - log_and_message_admins("has transfered the [ALs.name] laws to [owner].") - ALs.sync(owner, 0) - current_view = 0 - return 1 - - if(href_list["notify_laws"]) - to_chat(owner, "Law Notice") - owner.laws.show_laws(owner) - if(isAI(owner)) - var/mob/living/silicon/ai/AI = owner - for(var/mob/living/silicon/robot/R in AI.connected_robots) - to_chat(R, "Law Notice") - R.laws.show_laws(R) - if(usr != owner) - to_chat(usr, "Laws displayed.") - return 1 - - return 0 - -/datum/nano_module/law_manager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = GLOB.default_state) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner.name]"), 800, is_malf(user) ? 600 : 400, state = state) - ui.open() - ui.set_auto_update(1) - -/datum/nano_module/law_manager/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - owner.lawsync() - - data["ion_law_nr"] = ionnum() - data["ion_law"] = ion_law - data["zeroth_law"] = zeroth_law - data["inherent_law"] = inherent_law - data["supplied_law"] = supplied_law - data["supplied_law_position"] = supplied_law_position - - 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) - - data["isAI"] = isAI(owner) - data["isMalf"] = is_malf(user) - data["isSlaved"] = owner.is_slaved() - data["isAdmin"] = is_admin(user) - data["view"] = current_view - - var/channels[0] - for(var/ch_name in owner.law_channels()) - channels[++channels.len] = list("channel" = ch_name) - data["channel"] = owner.lawchannel - data["channels"] = channels - data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) - - return data - -/datum/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" = 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 - -/datum/nano_module/law_manager/proc/package_multiple_laws(var/list/datum/ai_laws/laws) - var/law_sets[0] - for(var/datum/ai_laws/ALs in laws) - var/packaged_laws[0] - package_laws(packaged_laws, "zeroth_laws", list(ALs.zeroth_law, ALs.zeroth_law_borg)) - package_laws(packaged_laws, "ion_laws", ALs.ion_laws) - package_laws(packaged_laws, "inherent_laws", ALs.inherent_laws) - package_laws(packaged_laws, "supplied_laws", ALs.supplied_laws) - law_sets[++law_sets.len] = list("name" = ALs.name, "header" = ALs.law_header, "ref" = "\ref[ALs]","laws" = packaged_laws) - - return law_sets - -/datum/nano_module/law_manager/proc/is_malf(var/mob/user) - return (is_admin(user) && !owner.is_slaved()) || is_special_character(owner) - -/mob/living/silicon/proc/is_slaved() - return 0 - -/mob/living/silicon/robot/is_slaved() - return lawupdate && connected_ai ? sanitize(connected_ai.name) : null - -/datum/nano_module/law_manager/proc/sync_laws(var/mob/living/silicon/ai/AI) - if(!AI) - return - for(var/mob/living/silicon/robot/R in AI.connected_robots) - R.sync() - log_and_message_admins("has syncronized [AI]'s laws with its borgs.") diff --git a/code/modules/tgui/modules/law_manager.dm b/code/modules/tgui/modules/law_manager.dm new file mode 100644 index 00000000000..012851da251 --- /dev/null +++ b/code/modules/tgui/modules/law_manager.dm @@ -0,0 +1,217 @@ +/datum/tgui_module/law_manager + name = "Law manager" + var/ion_law = "IonLaw" + var/zeroth_law = "ZerothLaw" + var/inherent_law = "InherentLaw" + var/supplied_law = "SuppliedLaw" + var/supplied_law_position = MIN_SUPPLIED_LAW_NUMBER + + var/current_view = 0 + + var/global/list/datum/ai_laws/admin_laws + var/global/list/datum/ai_laws/player_laws + var/mob/living/silicon/owner = null + +/datum/tgui_module/law_manager/New(var/mob/living/silicon/S) + ..() + owner = S + + if(!admin_laws) + admin_laws = new() + player_laws = new() + + init_subtypes(/datum/ai_laws, admin_laws) + admin_laws = dd_sortedObjectList(admin_laws) + + for(var/datum/ai_laws/laws in admin_laws) + if(laws.selectable) + player_laws += laws + +/datum/tgui_module/law_manager/tgui_act(action, list/params) + if(..()) + return + + if(usr != owner && !check_rights(R_ADMIN)) + message_admins("Warning: possible href exploit by [key_name_admin(usr)] - failed permissions check in law manager!") + log_debug("Warning: possible href exploit by [key_name(usr)] - failed permissions check in law manager!") + return + + . = TRUE + + switch(action) + if("set_view") + current_view = text2num(params["set_view"]) + + if("law_channel") + if(params["law_channel"] in owner.law_channels()) + owner.lawchannel = params["law_channel"] + + if("state_law") + var/datum/ai_law/AL = locate(params["ref"]) in owner.laws.all_laws() + if(AL) + var/state_law = text2num(params["state_law"]) + owner.laws.set_state_law(AL, state_law) + + if("add_zeroth_law") + if(zeroth_law && is_admin(usr) && !owner.laws.zeroth_law) + owner.set_zeroth_law(zeroth_law) + + if("add_ion_law") + if(ion_law && is_malf(usr)) + owner.add_ion_law(ion_law) + + if("add_inherent_law") + if(inherent_law && is_malf(usr)) + owner.add_inherent_law(inherent_law) + + if("add_supplied_law") + if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_malf(usr)) + owner.add_supplied_law(supplied_law_position, supplied_law) + + if("change_zeroth_law") + var/new_law = sanitize(input("Enter new law Zero. Leaving the field blank will cancel the edit.", "Edit Law", zeroth_law)) + if(new_law && new_law != zeroth_law && (!..())) + zeroth_law = new_law + + if("change_ion_law") + var/new_law = sanitize(input("Enter new ion law. Leaving the field blank will cancel the edit.", "Edit Law", ion_law)) + if(new_law && new_law != ion_law && (!..())) + ion_law = new_law + + if("change_inherent_law") + var/new_law = sanitize(input("Enter new inherent law. Leaving the field blank will cancel the edit.", "Edit Law", inherent_law)) + if(new_law && new_law != inherent_law && (!..())) + inherent_law = new_law + + if("change_supplied_law") + var/new_law = sanitize(input("Enter new supplied law. Leaving the field blank will cancel the edit.", "Edit Law", supplied_law)) + if(new_law && new_law != supplied_law && (!..())) + supplied_law = new_law + + if("change_supplied_law_position") + var/new_position = input(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position) as num|null + if(isnum(new_position) && (!..())) + supplied_law_position = clamp(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) + + if("edit_law") + if(is_malf(usr)) + var/datum/ai_law/AL = locate(params["edit_law"]) in owner.laws.all_laws() + // Dont allow non-admins to edit their own malf laws + if(istype(AL, /datum/ai_law/zero) && (!check_rights(R_ADMIN))) + to_chat(usr, "You cant edit that law.") + return + if(AL) + var/new_law = sanitize(input(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) + if(new_law && new_law != AL.law && is_malf(usr) && (!..())) + log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") + AL.law = new_law + + if("delete_law") + if(is_malf(usr)) + var/datum/ai_law/AL = locate(params["delete_law"]) in owner.laws.all_laws() + // Dont allow non-admins to delete their own malf laws + if(istype(AL, /datum/ai_law/zero) && (!check_rights(R_ADMIN))) + to_chat(usr, "You cant delete that law.") + return + if(AL && is_malf(usr)) + owner.delete_law(AL) + + if("state_laws") + owner.statelaws(owner.laws) + + if("state_law_set") + var/datum/ai_laws/ALs = locate(params["state_law_set"]) in (is_admin(usr) ? admin_laws : player_laws) + if(ALs) + owner.statelaws(ALs) + + if("transfer_laws") + if(is_malf(usr)) + var/datum/ai_laws/ALs = locate(params["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) + if(ALs) + log_and_message_admins("has transfered the [ALs.name] laws to [owner].") + ALs.sync(owner, 0) + current_view = 0 + + if("notify_laws") + to_chat(owner, "Law Notice") + owner.laws.show_laws(owner) + if(isAI(owner)) + var/mob/living/silicon/ai/AI = owner + for(var/mob/living/silicon/robot/R in AI.connected_robots) + to_chat(R, "Law Notice") + R.laws.show_laws(R) + if(usr != owner) + to_chat(usr, "Laws displayed.") + + +/datum/tgui_module/law_manager/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "LawManager", sanitize("[src] - [owner.name]"), 800, is_malf(user) ? 600 : 400, master_ui, state) + ui.open() + +/datum/tgui_module/law_manager/tgui_data(mob/user) + var/list/data = list() + owner.lawsync() + + data["ion_law_nr"] = ionnum() + data["ion_law"] = ion_law + data["zeroth_law"] = zeroth_law + data["inherent_law"] = inherent_law + data["supplied_law"] = supplied_law + data["supplied_law_position"] = supplied_law_position + + 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) + + data["isAI"] = isAI(owner) + data["isMalf"] = is_malf(user) + data["isSlaved"] = owner.is_slaved() + data["isAdmin"] = is_admin(user) + data["view"] = current_view + + var/list/channels = list() + for(var/ch_name in owner.law_channels()) + channels[++channels.len] = list("channel" = ch_name) + data["channel"] = owner.lawchannel + data["channels"] = channels + data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) + + return data + +/datum/tgui_module/law_manager/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws) + var/list/packaged_laws = list() + for(var/datum/ai_law/AL in laws) + packaged_laws[++packaged_laws.len] = list("law" = 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 + +/datum/tgui_module/law_manager/proc/package_multiple_laws(var/list/datum/ai_laws/laws) + var/list/law_sets = list() + for(var/datum/ai_laws/ALs in laws) + var/list/packaged_laws = list() + package_laws(packaged_laws, "zeroth_laws", list(ALs.zeroth_law, ALs.zeroth_law_borg)) + package_laws(packaged_laws, "ion_laws", ALs.ion_laws) + package_laws(packaged_laws, "inherent_laws", ALs.inherent_laws) + package_laws(packaged_laws, "supplied_laws", ALs.supplied_laws) + law_sets[++law_sets.len] = list("name" = ALs.name, "header" = ALs.law_header, "ref" = "\ref[ALs]","laws" = packaged_laws) + + return law_sets + +/datum/tgui_module/law_manager/proc/is_malf(var/mob/user) + return (is_admin(user) && !owner.is_slaved()) || is_special_character(owner) + +/mob/living/silicon/proc/is_slaved() + return FALSE + +/mob/living/silicon/robot/is_slaved() + return lawupdate && connected_ai ? sanitize(connected_ai.name) : null + +/datum/tgui_module/law_manager/proc/sync_laws(var/mob/living/silicon/ai/AI) + if(!AI) + return + for(var/mob/living/silicon/robot/R in AI.connected_robots) + R.sync() + log_and_message_admins("has syncronized [AI]'s laws with its borgs.") diff --git a/nano/templates/law_manager.tmpl b/nano/templates/law_manager.tmpl deleted file mode 100644 index 1b66d194267..00000000000 --- a/nano/templates/law_manager.tmpl +++ /dev/null @@ -1,267 +0,0 @@ - - -{{if data.isSlaved && data.isAdmin}} - This unit is law synced to {{:data.isSlaved}}. -{{/if}} - -{{if data.isMalf || data.isAIMalf}} -
-
- {{:helper.link('Law Management', null, {'set_view' : 0}, data.view == 0 ? 'selected' : null)}} - {{:helper.link('Law Sets', null, {'set_view' : 1}, data.view == 1 ? 'selected' : null)}} -
-
-{{/if}} - -{{if data.view == 0}} - {{if data.has_zeroth_laws}} - - - {{if data.isMalf}} - - - {{/if}} - - -
- ERR_NULL_VALUE Laws: -
- {{for data.zeroth_laws}} - - - - - {{if data.isMalf}} - - - {{/if}} - - {{/for}} -
IndexLawStateEditDelete
{{:value.index}}.{{:value.law}}{{:helper.link('Yes', null, {'ref': value.ref, 'state_law' : 1}, value.state == 1 ? 'selected' : null)}}{{:helper.link('No', null, {'ref': value.ref, 'state_law' : 0}, value.state == 0 ? 'selected' : null)}}{{:helper.link('Edit', null, {'edit_law': value.ref}, data.isAdmin ? null : 'disabled')}}{{:helper.link('Delete', null, {'delete_law': value.ref}, data.isAdmin ? null : 'disabled', data.isAdmin ? 'redButton' : null)}}
- {{/if}} - - {{if data.has_ion_laws}} - - - {{if data.isMalf}} - - - {{/if}} - - -
- {{:data.ion_law_nr}} Laws: -
- {{for data.ion_laws}} - - - - - {{if data.isMalf}} - - - {{/if}} - - {{/for}} -
IndexLawStateEditDelete
{{:value.index}}.{{:value.law}}{{:helper.link('Yes', null, {'ref': value.ref, 'state_law' : 1}, value.state == 1 ? 'selected' : null)}}{{:helper.link('No', null, {'ref': value.ref, 'state_law' : 0}, value.state == 0 ? 'selected' : null)}}{{:helper.link('Edit', null, {'edit_law': value.ref})}}{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}
- {{/if}} - - {{if data.has_inherent_laws}} - - - {{if data.isMalf}} - - - {{/if}} - - -
- Inherent Laws: -
- - {{for data.inherent_laws}} - - - - - {{if data.isMalf}} - - - {{/if}} - - {{/for}} -
IndexLawStateEditDelete
{{:value.index}}.{{:value.law}}{{:helper.link('Yes', null, {'ref': value.ref, 'state_law' : 1}, value.state == 1 ? 'selected' : null)}}{{:helper.link('No', null, {'ref': value.ref, 'state_law' : 0}, value.state == 0 ? 'selected' : null)}}{{:helper.link('Edit', null, {'edit_law': value.ref})}}{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}
- {{/if}} - - {{if data.has_supplied_laws}} - - - {{if data.isMalf}} - - - {{/if}} - - -
- Supplied Laws: -
- {{for data.supplied_laws}} - - - - - {{if data.isMalf}} - - - {{/if}} - - {{/for}} -
IndexLawStateEditDelete
{{:value.index}}.{{:value.law}}{{:helper.link('Yes', null, {'ref': value.ref, 'state_law' : 1}, value.state == 1 ? 'selected' : null)}}{{:helper.link('No', null, {'ref': value.ref, 'state_law' : 0}, value.state == 0 ? 'selected' : null)}}{{:helper.link('Edit', null, {'edit_law': value.ref})}}{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}
- {{/if}} - -
-
- Statement Channel: -
-
- {{for data.channels}} - {{:helper.link(value.channel, null, {'law_channel' : value.channel}, value.channel == data.channel ? 'selected' : null)}} - {{/for}} -
-
- -
-
- State Laws: -
-
- {{:helper.link('State Laws', null, {'state_laws' : 1})}} -
-
- - {{if data.isMalf}} -
-
- Add Laws: -
-
- - - {{if data.isAdmin && !data.has_zeroth_laws}} - - {{/if}} - - - -
TypeLawIndexEditAdd
Zero{{:data.zeroth_law}}N/A{{:helper.link('Edit', null, {'change_zeroth_law' : 1})}}{{:helper.link('Add', null, {'add_zeroth_law' : 1})}}
Ion{{:data.ion_law}}N/A{{:helper.link('Edit', null, {'change_ion_law' : 1})}}{{:helper.link('Add', null, {'add_ion_law' : 1})}}
Inherent{{:data.inherent_law}}N/A{{:helper.link('Edit', null, {'change_inherent_law' : 1})}}{{:helper.link('Add', null, {'add_inherent_law' : 1})}}
Supplied{{:data.supplied_law}}{{:helper.link(data.supplied_law_position, null, {'change_supplied_law_position' : 1})}}{{:helper.link('Edit', null, {'change_supplied_law' : 1})}}{{:helper.link('Add', null, {'add_supplied_law' : 1})}}
-
-
- {{/if}} - - {{if data.isAI}} -
-
- Law Notification: -
-
- {{:helper.link('Notify', null, {'notify_laws' : 1})}} -
-
- {{/if}} -{{else data.view == 1}} - {{for data.law_sets}} -
-
-

{{:value.name}}

{{:value.header}} -
- - {{if value.laws.has_ion_laws}} - - - {{for value.laws.ion_laws :lawValue:lawindex}} - - - - - {{/for}} -
IndexLaw
{{:lawValue.index}}.{{:lawValue.law}}
- {{/if}} - - {{if value.laws.has_zeroth_laws || value.laws.has_inherent_laws}} - - - {{for value.laws.zeroth_laws :lawValue:lawindex}} - - - - - {{/for}} - {{for value.laws.inherent_laws :lawValue:lawindex}} - - - - - {{/for}} -
IndexLaw
{{:lawValue.index}}.{{:lawValue.law}}
{{:lawValue.index}}.{{:lawValue.law}}
- {{/if}} - - {{if value.laws.has_supplied_laws}} - - - {{for value.laws.supplied_laws :lawValue:lawindex}} - - - - - {{/for}} -
IndexLaw
{{:lawValue.index}}.{{:lawValue.law}}
- {{/if}} - -
-
- {{:helper.link('Load Laws', null, {'transfer_laws' : value.ref}, data.isSlaved ? 'disabled' : null)}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}} -
-
- {{/for}} -{{/if}} diff --git a/paradise.dme b/paradise.dme index 3d014cc9f6a..419b5332d6b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2099,7 +2099,6 @@ #include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\zlevel.dm" #include "code\modules\nano\modules\human_appearance.dm" -#include "code\modules\nano\modules\law_manager.dm" #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\newscaster\datums.dm" #include "code\modules\newscaster\defines.dm" @@ -2442,6 +2441,7 @@ #include "code\modules\tgui\modules\atmos_control.dm" #include "code\modules\tgui\modules\crew_monitor.dm" #include "code\modules\tgui\modules\ert_manager.dm" +#include "code\modules\tgui\modules\law_manager.dm" #include "code\modules\tgui\modules\power_monitor.dm" #include "code\modules\tgui\plugins\login.dm" #include "code\modules\tgui\plugins\modal.dm" diff --git a/tgui/packages/tgui/interfaces/LawManager.js b/tgui/packages/tgui/interfaces/LawManager.js new file mode 100644 index 00000000000..ef523b0893d --- /dev/null +++ b/tgui/packages/tgui/interfaces/LawManager.js @@ -0,0 +1,389 @@ +import { Fragment } from 'inferno'; +import { useBackend } from "../backend"; +import { Box, Button, LabeledList, Section, NoticeBox, Table } from "../components"; +import { Window } from "../layouts"; + +export const LawManager = (props, context) => { + const { act, data } = useBackend(context); + const { + isAdmin, + isSlaved, + isMalf, + isAIMalf, + view, + } = data; + + return ( + + + {!!(isAdmin && isSlaved) && ( + + This unit is slaved to {isSlaved}. + + )} + {!!(isMalf || isAIMalf) && ( + +