TGUI Law Manager

This commit is contained in:
ShadowLarkens
2020-08-26 20:31:39 -07:00
parent 61a961a512
commit eac9e46615
8 changed files with 559 additions and 491 deletions
+2 -2
View File
@@ -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!
+2 -2
View File
@@ -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 *
-225
View File
@@ -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, "<span class='danger'>Law Notice</span>")
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, "<span class='danger'>Law Notice</span>")
R.laws.show_laws(R)
if(usr != owner)
to_chat(usr, "<span class='notice'>Laws displayed.</span>")
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.")
+224
View File
@@ -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, "<span class='danger'>Law Notice</span>")
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, "<span class='danger'>Law Notice</span>")
R.laws.show_laws(R)
if(usr != owner)
to_chat(usr, "<span class='notice'>Laws displayed.</span>")
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
-253
View File
@@ -1,253 +0,0 @@
<style type="text/css">
table.borders {
width:95%;
margin-left:2.4%;
margin-right:2.4%;
}
table.borders, table.borders tr {
border: 1px solid White;
}
td.law_index {
width: 50px;
}
td.state {
width: 63px;
text-align:center;
}
td.add {
width: 36px;
}
td.edit {
width: 36px;
text-align:center;
}
td.delete {
width: 53px;
text-align:center;
}
td.law_type {
width: 65px;
}
td.position {
width: 37px;
}
</style>
{{if data.isSlaved}}
<div class='notice'>Law synced to {{:data.isSlaved}}.</div>
{{/if}}
<div class="item">
<div class="itemContentWidest">
{{: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)}}
</div>
</div>
{{if data.view == 0}}
{{if data.has_ion_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td><td class='state'>State</td>
{{if data.isMalf}}
<td class='edit'>Edit</td>
<td class='delete'>Delete</td>
{{/if}}
</tr>
<div class="itemLabelNarrow">
{{:data.ion_law_nr}} Laws:
</div>
{{for data.ion_laws}}
<tr>
<td valign="top">{{:value.index}}.</td>
<td>{{:value.law}}</td>
<td>{{: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)}}</td>
{{if data.isMalf}}
<td class='edit'>{{:helper.link('Edit', null, {'edit_law': value.ref})}}</td>
<td class='delete'>{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}</td>
{{/if}}
</tr>
{{/for}}
</table>
{{/if}}
{{if data.has_inherent_laws || data.has_zeroth_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td><td class='state'>State</td>
{{if data.isMalf}}
<td class='edit'>Edit</td>
<td class='delete'>Delete</td>
{{/if}}
</tr>
<div class="itemLabelNarrow">
Inherent Laws:
</div>
{{for data.zeroth_laws}}
<tr>
<td valign="top">{{:value.index}}.</td>
<td><span class='bad'>{{:value.law}}</span></td>
<td>{{: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)}}</td>
{{if data.isMalf}}
<td class='edit'>{{:helper.link('Edit', null, {'edit_law': value.ref}, data.isAdmin ? null : 'disabled')}}</td>
<td class='delete'>{{:helper.link('Delete', null, {'delete_law': value.ref}, data.isAdmin ? null : 'disabled', data.isAdmin ? 'redButton' : null)}}</td>
{{/if}}
</tr>
{{/for}}
{{for data.inherent_laws}}
<tr>
<td valign="top">{{:value.index}}.</td>
<td>{{:value.law}}</td>
<td>{{: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)}}</td>
{{if data.isMalf}}
<td class='edit'>{{:helper.link('Edit', null, {'edit_law': value.ref})}}</td>
<td class='delete'>{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}</td>
{{/if}}
</tr>
{{/for}}
</table>
{{/if}}
{{if data.has_supplied_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td><td class='state'>State</td>
{{if data.isMalf}}
<td class='edit'>Edit</td>
<td class='delete'>Delete</td>
{{/if}}
</tr>
<div class="itemLabelNarrow">
Supplied Laws:
</div>
{{for data.supplied_laws}}
<tr>
<td valign="top">{{:value.index}}.</td>
<td>{{:value.law}}</td>
<td>{{: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)}}</td>
{{if data.isMalf}}
<td class='edit'>{{:helper.link('Edit', null, {'edit_law': value.ref})}}</td>
<td class='delete'>{{:helper.link('Delete', null, {'delete_law': value.ref}, null, 'redButton')}}</td>
{{/if}}
</tr>
{{/for}}
</table>
{{/if}}
<div class="item">
<div class="itemLabelNarrow">
Statement Channel:
</div>
<div class="itemContentWide">
{{for data.channels}}
{{:helper.link(value.channel, null, {'law_channel' : value.channel}, value.channel == data.channel ? 'selected' : null)}}
{{/for}}
</div>
</div>
<div class="item">
<div class="itemLabelNarrow">
State Laws:
</div>
<div class="itemContent">
{{:helper.link('State Laws', null, {'state_laws' : 1})}}
</div>
</div>
{{if data.isMalf}}
<div class="item">
<div class="itemLabelNarrow">
Add Laws:
</div>
<div class="itemContent">
<table class='borders'>
<tr><td class='law_type'>Type</td><td>Law</td><td class='position'>Index</td><td class='edit'>Edit</td><td class='add'>Add</td></tr>
{{if data.isAdmin && !data.has_zeroth_laws}}
<tr><td class='law_type'>Zero</td><td>{{:data.zeroth_law}}</td><td class='position'>N/A</td><td class='edit'>{{:helper.link('Edit', null, {'change_zeroth_law' : 1})}}</td><td class='add'>{{:helper.link('Add', null, {'add_zeroth_law' : 1})}}</td></tr>
{{/if}}
<tr><td class='law_type'>Ion</td><td>{{:data.ion_law}}</td><td class='position'>N/A</td><td class='edit'>{{:helper.link('Edit', null, {'change_ion_law' : 1})}}</td><td class='add'>{{:helper.link('Add', null, {'add_ion_law' : 1})}}</td></tr>
<tr><td class='law_type'>Inherent</td><td>{{:data.inherent_law}}</td><td class='position'>N/A</td><td class='edit'>{{:helper.link('Edit', null, {'change_inherent_law' : 1})}}</td><td class='add'>{{:helper.link('Add', null, {'add_inherent_law' : 1})}}</td></tr>
<tr><td class='law_type'>Supplied</td><td>{{:data.supplied_law}}</td><td class='position'>{{:helper.link(data.supplied_law_position, null, {'change_supplied_law_position' : 1})}}</td><td class='edit'>{{:helper.link('Edit', null, {'change_supplied_law' : 1})}}</td><td class='add'>{{:helper.link('Add', null, {'add_supplied_law' : 1})}}</td></tr>
</table>
</div>
</div>
{{/if}}
{{if data.isAI}}
<div class="item">
<div class="itemLabelNarrow">
Law Notification:
</div>
<div class="itemContent">
{{:helper.link('Notify', null, {'notify_laws' : 1})}}
</div>
</div>
{{/if}}
{{else data.view == 1}}
<div class='notice'>Remember: Stating laws other than those currently loaded may be grounds for decommissioning - NanoTrasen</div>
{{for data.law_sets}}
<div class="item">
<div class="itemLabelWide">
<H2>{{:value.name}}</H2>{{:value.header}}
</div>
{{if value.laws.has_ion_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td>
{{for value.laws.ion_laws :lawValue:lawindex}}
<tr>
<td valign="top">{{:lawValue.index}}.</td>
<td>{{:lawValue.law}}</td>
</tr>
{{/for}}
</table>
{{/if}}
{{if value.laws.has_zeroth_laws || value.laws.has_inherent_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td>
{{for value.laws.zeroth_laws :lawValue:lawindex}}
<tr>
<td valign="top">{{:lawValue.index}}.</td>
<td><span class='bad'>{{:lawValue.law}}</span></td>
</tr>
{{/for}}
{{for value.laws.inherent_laws :lawValue:lawindex}}
<tr>
<td valign="top">{{:lawValue.index}}.</td>
<td>{{:lawValue.law}}</td>
</tr>
{{/for}}
</table>
{{/if}}
{{if value.laws.has_supplied_laws}}
<table class='borders'>
<tr><td class='law_index'>Index</td><td>Law</td>
{{for value.laws.supplied_laws :lawValue:lawindex}}
<tr>
<td valign="top">{{:lawValue.index}}.</td>
<td>{{:lawValue.law}}</td>
</tr>
{{/for}}
</table>
{{/if}}
<div class="itemContent">
<br>
{{:helper.link('Load Laws', null, {'transfer_laws' : value.ref}, data.isMalf ? null : 'disabled')}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}}
</div>
</div>
{{/for}}
{{/if}}
+322
View File
@@ -0,0 +1,322 @@
import { round } from 'common/math';
import { Fragment } from 'inferno';
import { useBackend, useLocalState, useSharedState } from "../backend";
import { Box, Button, Flex, Icon, LabeledList, ProgressBar, Section, Tabs, NoticeBox, Table, Input } from "../components";
import { Window } from "../layouts";
export const LawManager = (props, context) => {
const { act, data } = useBackend(context);
const {
isSlaved,
} = data;
return (
<Window width={800} height={600} resizable>
<Window.Content scrollable>
{isSlaved && <NoticeBox info>Law-synced to {isSlaved}</NoticeBox> || null}
<LawManagerContent />
</Window.Content>
</Window>
);
};
const LawManagerContent = (props, context) => {
const [tabIndex, setTabIndex] = useSharedState(context, 'lawsTabIndex', 0);
return (
<Fragment>
<Tabs>
<Tabs.Tab
selected={tabIndex === 0}
onClick={() => setTabIndex(0)}>
Law Management
</Tabs.Tab>
<Tabs.Tab
selected={tabIndex === 1}
onClick={() => setTabIndex(1)}>
Law Sets
</Tabs.Tab>
</Tabs>
{tabIndex === 0 && <LawManagerLaws /> || null}
{tabIndex === 1 && <LawManagerLawSets /> || null}
</Fragment>
);
};
const LawManagerLaws = (props, context) => {
const { act, data } = useBackend(context);
const {
ion_law_nr,
ion_law,
zeroth_law,
inherent_law,
supplied_law,
supplied_law_position,
zeroth_laws,
has_zeroth_laws,
ion_laws,
has_ion_laws,
inherent_laws,
has_inherent_laws,
supplied_laws,
has_supplied_laws,
isAI,
isMalf,
isAdmin,
channel,
channels,
} = data;
let allLaws = zeroth_laws.map(law => { law.zero = true; return law; }).concat(inherent_laws);
return (
<Section>
{has_ion_laws && (
<LawsTable laws={ion_laws} title={ion_law_nr + " Laws:"} mt={-2} />
) || null}
{(has_zeroth_laws || has_inherent_laws) && (
<LawsTable laws={allLaws} title="Inherent Laws" mt={-2} />
) || null}
{has_supplied_laws && (
<LawsTable laws={supplied_laws} title="Supplied Laws" mt={-2} />
) || null}
<Section level={2} title="Controls" mt={-2}>
<LabeledList>
<LabeledList.Item label="Statement Channel">
{channels.map(chan => (
<Button
key={chan.channel}
content={chan.channel}
selected={channel === chan.channel}
onClick={() => act("law_channel", { law_channel: chan.channel })} />
))}
</LabeledList.Item>
<LabeledList.Item label="State Laws">
<Button
icon="volume-up"
onClick={() => act("state_laws")}>
State Laws
</Button>
</LabeledList.Item>
{isAI && (
<LabeledList.Item label="Law Notification">
<Button
icon="exclamation"
onClick={() => act("notify_laws")}>
Notify
</Button>
</LabeledList.Item>
) || null}
</LabeledList>
</Section>
{isMalf && (
<Section level={2} title="Add Laws" mt={-2}>
<Table>
<Table.Row header>
<Table.Cell collapsing>Type</Table.Cell>
<Table.Cell>Law</Table.Cell>
<Table.Cell collapsing>Index</Table.Cell>
<Table.Cell collapsing>Add</Table.Cell>
</Table.Row>
{isAdmin && !has_zeroth_laws && (
<Table.Row>
<Table.Cell collapsing>Zero</Table.Cell>
<Table.Cell>
<Input
value={zeroth_law}
fluid
onChange={(e, val) => act("change_zeroth_law", { val: val })} />
</Table.Cell>
<Table.Cell>N/A</Table.Cell>
<Table.Cell collapsing>
<Button icon="plus" onClick={() => act("add_zeroth_law")}>
Add
</Button>
</Table.Cell>
</Table.Row>
) || null}
<Table.Row>
<Table.Cell collapsing>Ion</Table.Cell>
<Table.Cell>
<Input
value={ion_law}
fluid
onChange={(e, val) => act("change_ion_law", { val: val })} />
</Table.Cell>
<Table.Cell>N/A</Table.Cell>
<Table.Cell collapsing>
<Button icon="plus" onClick={() => act("add_ion_law")}>
Add
</Button>
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Inherent</Table.Cell>
<Table.Cell>
<Input
value={inherent_law}
fluid
onChange={(e, val) => act("change_inherent_law", { val: val })} />
</Table.Cell>
<Table.Cell>N/A</Table.Cell>
<Table.Cell>
<Button icon="plus" onClick={() => act("add_inherent_law")}>
Add
</Button>
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Supplied</Table.Cell>
<Table.Cell>
<Input
value={supplied_law}
fluid
onChange={(e, val) => act("change_supplied_law", { val: val })} />
</Table.Cell>
<Table.Cell>
<Button icon="pen" onClick={() => act("change_supplied_law_position")}>
{supplied_law_position}
</Button>
</Table.Cell>
<Table.Cell>
<Button icon="plus" onClick={() => act("add_supplied_law")}>
Add
</Button>
</Table.Cell>
</Table.Row>
</Table>
</Section>
) || null}
</Section>
);
};
const LawsTable = (props, context) => {
const { act, data } = useBackend(context);
const {
isMalf,
isAdmin,
} = data;
const {
laws,
title,
noButtons,
...rest
} = props;
return (
<Section level={2} title={title} {...rest}>
<Table>
<Table.Row header>
<Table.Cell collapsing>Index</Table.Cell>
<Table.Cell>Law</Table.Cell>
{!noButtons && (
<Table.Cell collapsing>State</Table.Cell>
) || null}
{isMalf && !noButtons && (
<Fragment>
<Table.Cell collapsing>Edit</Table.Cell>
<Table.Cell collapsing>Delete</Table.Cell>
</Fragment>
) || null}
</Table.Row>
{laws.map(law => (
<Table.Row key={law.index}>
<Table.Cell collapsing>{law.index}.</Table.Cell>
<Table.Cell color={law.zero ? "bad" : null}>{law.law}</Table.Cell>
{!noButtons && (
<Table.Cell collapsing>
<Button
fluid
icon="volume-up"
selected={law.state}
onClick={() => act("state_law", { ref: law.ref, state_law: !law.state })}>
{law.state ? "Yes" : "No"}
</Button>
</Table.Cell>
) || null}
{isMalf && !noButtons && (
<Fragment>
<Table.Cell collapsing>
<Button
disabled={law.zero && !isAdmin}
icon="pen"
onClick={() => act("edit_law", { edit_law: law.ref })}>
Edit
</Button>
</Table.Cell>
<Table.Cell collapsing>
<Button
disabled={law.zero && !isAdmin}
color="bad"
icon="trash"
onClick={() => act("delete_law", { delete_law: law.ref })}>
Delete
</Button>
</Table.Cell>
</Fragment>
) || null}
</Table.Row>
))}
</Table>
</Section>
);
};
const LawManagerLawSets = (props, context) => {
const { act, data } = useBackend(context);
const {
isMalf,
law_sets,
} = data;
return (
<Fragment>
<NoticeBox>
Remember: Stating laws other than those currently loaded may be grounds for decommissioning! - NanoTrasen
</NoticeBox>
{law_sets.length && law_sets.map(laws => (
<Section key={laws.name} title={laws.name} buttons={
<Fragment>
<Button
disabled={!isMalf}
icon="sync"
onClick={() => act("transfer_laws", { transfer_laws: laws.ref })}>
Load Laws
</Button>
<Button
icon="volume-up"
onClick={() => act("state_law_set", { state_law_set: laws.ref })}>
State Laws
</Button>
</Fragment>
}>
{laws.laws.has_ion_laws && (
<LawsTable
noButtons
laws={laws.laws.ion_laws}
title={laws.laws.ion_law_nr + " Laws:"} />
) || null}
{(laws.laws.has_zeroth_laws || laws.laws.has_inherent_laws) && (
<LawsTable
noButtons
laws={laws.laws.zeroth_laws.concat(laws.laws.inherent_laws)}
title={laws.header} />
) || null}
{laws.laws.has_supplied_laws && (
<LawsTable
noButtons
laws={laws.laws.supplied_laws}
title="Supplied Laws" />
) || null}
</Section>
)) || null}
</Fragment>
);
};
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -2954,7 +2954,6 @@
#include "code\modules\nano\interaction\remote.dm"
#include "code\modules\nano\interaction\self.dm"
#include "code\modules\nano\interaction\zlevel.dm"
#include "code\modules\nano\modules\law_manager.dm"
#include "code\modules\nano\modules\nano_module.dm"
#include "code\modules\nifsoft\nif.dm"
#include "code\modules\nifsoft\nif_softshop.dm"
@@ -3512,6 +3511,7 @@
#include "code\modules\tgui\modules\atmos_control.dm"
#include "code\modules\tgui\modules\camera.dm"
#include "code\modules\tgui\modules\crew_monitor.dm"
#include "code\modules\tgui\modules\law_manager.dm"
#include "code\modules\tgui\modules\overmap.dm"
#include "code\modules\tgui\modules\power_monitor.dm"
#include "code\modules\tgui\modules\rcon.dm"