diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 881eb95abb..6635b07061 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -421,8 +421,8 @@ var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in silicon_mob_list if(!S) return - var/datum/nano_module/law_manager/L = new(S) - L.ui_interact(usr, state = admin_state) + var/datum/tgui_module/law_manager/admin/L = new(S) + L.tgui_interact(usr) 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/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index bb84ed3ce3..be6a68591d 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -3,7 +3,7 @@ var/datum/tgui_module/alarm_monitor/all/robot/alarm_monitor var/datum/tgui_module/atmos_control/robot/atmos_control var/datum/tgui_module/crew_monitor/robot/crew_monitor - var/datum/nano_module/law_manager/law_manager + var/datum/tgui_module/law_manager/robot/law_manager var/datum/tgui_module/power_monitor/robot/power_monitor var/datum/tgui_module/rcon/robot/rcon @@ -76,7 +76,7 @@ set name = "Law Manager" set category = "Subystems" - law_manager.ui_interact(usr, state = conscious_state) + law_manager.tgui_interact(usr) /******************** * Power Monitor * diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm deleted file mode 100644 index 3016a00fad..0000000000 --- a/code/modules/nano/modules/law_manager.dm +++ /dev/null @@ -1,225 +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(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 = 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) - - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_malf(user) ? 600 : 400, state = state) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/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_role(user) - -/datum/nano_module/law_manager/proc/is_special_role(var/mob/user) - if(user.mind.special_role) - return TRUE - else - return FALSE - -/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 0000000000..3a9ca9cf88 --- /dev/null +++ b/code/modules/tgui/modules/law_manager.dm @@ -0,0 +1,224 @@ +/datum/tgui_module/law_manager + name = "Law manager" + tgui_id = "LawManager" + 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/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(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, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return TRUE + + switch(action) + if("law_channel") + if(params["law_channel"] in owner.law_channels()) + owner.lawchannel = params["law_channel"] + return TRUE + + 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) + return TRUE + + if("add_zeroth_law") + if(zeroth_law && is_admin(usr) && !owner.laws.zeroth_law) + owner.set_zeroth_law(zeroth_law) + return TRUE + + if("add_ion_law") + if(ion_law && is_malf(usr)) + owner.add_ion_law(ion_law) + return TRUE + + if("add_inherent_law") + if(inherent_law && is_malf(usr)) + owner.add_inherent_law(inherent_law) + return TRUE + + 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) + return TRUE + + if("change_zeroth_law") + var/new_law = sanitize(params["val"]) + if(new_law && new_law != zeroth_law && can_still_topic(usr, state)) + zeroth_law = new_law + return TRUE + + if("change_ion_law") + var/new_law = sanitize(params["val"]) + if(new_law && new_law != ion_law && can_still_topic(usr, state)) + ion_law = new_law + return TRUE + + if("change_inherent_law") + var/new_law = sanitize(params["val"]) + if(new_law && new_law != inherent_law && can_still_topic(usr, state)) + inherent_law = new_law + return TRUE + + if("change_supplied_law") + var/new_law = sanitize(params["val"]) + if(new_law && new_law != supplied_law && can_still_topic(usr, state)) + supplied_law = new_law + return TRUE + + 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) && can_still_topic(usr, state)) + supplied_law_position = CLAMP(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) + return TRUE + + if("edit_law") + if(is_malf(usr)) + var/datum/ai_law/AL = locate(params["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(usr, state)) + log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") + AL.law = new_law + return TRUE + + if("delete_law") + if(is_malf(usr)) + var/datum/ai_law/AL = locate(params["delete_law"]) in owner.laws.all_laws() + if(AL && is_malf(usr)) + owner.delete_law(AL) + return TRUE + + if("state_laws") + owner.statelaws(owner.laws) + return TRUE + + 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) + return TRUE + + 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) + return TRUE + + 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.") + return TRUE + +/datum/tgui_module/law_manager/tgui_interact(mob/user, datum/tgui/ui) + owner.lawsync() + return ..() // 800, is_malf(user) ? 600 : 400 + +/datum/tgui_module/law_manager/tgui_data(mob/user) + var/list/data = ..() + + 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) + + 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_role(user) + +/datum/tgui_module/law_manager/proc/is_special_role(var/mob/user) + if(user.mind.special_role) + return TRUE + else + return FALSE + +/mob/living/silicon/proc/is_slaved() + return 0 + +/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.") + +/datum/tgui_module/law_manager/robot +/datum/tgui_module/law_manager/robot/tgui_state(mob/user) + return GLOB.tgui_self_state + +/datum/tgui_module/law_manager/admin +/datum/tgui_module/law_manager/admin/tgui_state(mob/user) + return GLOB.tgui_admin_state \ No newline at end of file diff --git a/nano/templates/law_manager.tmpl b/nano/templates/law_manager.tmpl deleted file mode 100644 index fa91140881..0000000000 --- a/nano/templates/law_manager.tmpl +++ /dev/null @@ -1,253 +0,0 @@ - - -{{if data.isSlaved}} -
| Index | Law | State | - {{if data.isMalf}} -Edit | -Delete | - {{/if}} -
| {{: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)}} | - {{if data.isMalf}} -{{:helper.link('Edit', null, {'edit_law': value.ref})}} | -{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}} | - {{/if}} -
| Index | Law | State | - {{if data.isMalf}} -Edit | -Delete | - {{/if}} -
| {{: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 != 1 ? 'selected' : null)}} | - {{if data.isMalf}} -{{: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}} -
| {{: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)}} | - {{if data.isMalf}} -{{:helper.link('Edit', null, {'edit_law': value.ref})}} | -{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}} | - {{/if}} -
| Index | Law | State | - {{if data.isMalf}} -Edit | -Delete | - {{/if}} -
| {{: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)}} | - {{if data.isMalf}} -{{:helper.link('Edit', null, {'edit_law': value.ref})}} | -{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}} | - {{/if}} -
| Type | Law | Index | Edit | Add |
| 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})}} |
| Index | Law | - {{for value.laws.ion_laws :lawValue:lawindex}} -
| {{:lawValue.index}}. | -{{:lawValue.law}} | -
| Index | Law | - {{for value.laws.zeroth_laws :lawValue:lawindex}} -
| {{:lawValue.index}}. | -{{:lawValue.law}} | -
| {{:lawValue.index}}. | -{{:lawValue.law}} | -
| Index | Law | - {{for value.laws.supplied_laws :lawValue:lawindex}} -
| {{:lawValue.index}}. | -{{:lawValue.law}} | -