diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm
index 6ed2174cba..43f810213a 100644
--- a/code/modules/admin/modify_robot.dm
+++ b/code/modules/admin/modify_robot.dm
@@ -6,12 +6,14 @@
return
var/datum/eventkit/modify_robot/modify_robot = new()
- modify_robot.target = target
+ modify_robot.target = isrobot(target) ? target : null
+ modify_robot.selected_ai = target.is_slaved()
modify_robot.tgui_interact(src.mob)
/datum/eventkit/modify_robot
var/mob/living/silicon/robot/target
var/mob/living/silicon/robot/source
+ var/mob/living/silicon/ai/selected_ai
var/ion_law = "IonLaw"
var/zeroth_law = "ZerothLaw"
var/inherent_law = "InherentLaw"
@@ -49,6 +51,7 @@
.["target"]["name"] = target.name
.["target"]["ckey"] = target.ckey
.["target"]["module"] = target.module
+ .["target"]["emagged"] = target.emagged
.["target"]["crisis_override"] = target.crisis_override
.["target"]["active_restrictions"] = target.restrict_modules_to
var/list/possible_restrictions = list()
@@ -121,6 +124,15 @@
package_laws(., "supplied_laws", target.laws.supplied_laws)
.["isAI"] = isAI(target)
+ .["isMalf"] = is_malf(user)
+ .["isSlaved"] = target.is_slaved()
+ var/list/active_ais = list()
+ for(var/mob/living/silicon/ai/ai in active_ais())
+ if(!ai.loc)
+ continue
+ active_ais += list(list("displayText" = "[ai]", "value" = "\ref[ai]"))
+ .["active_ais"] = active_ais
+ .["selected_ai"] = selected_ai ? selected_ai.name : null
var/list/channels = list()
for(var/ch_name in target.law_channels())
@@ -144,8 +156,10 @@
target.real_name = params["new_name"]
return TRUE
if("select_target")
- target = locate(params["new_target"])
- log_and_message_admins("changed robot modifictation target to [target]")
+ var/new_target = locate(params["new_target"])
+ if(new_target != target)
+ target = locate(params["new_target"])
+ log_and_message_admins("changed robot modifictation target to [target]")
return TRUE
if("toggle_crisis")
target.crisis_override = !target.crisis_override
@@ -498,6 +512,41 @@
if(usr != target)
to_chat(usr, "Laws displayed.")
return TRUE
+ if("select_ai")
+ selected_ai = locate(params["new_ai"])
+ return TRUE
+ if("swap_sync")
+ var/new_ai = selected_ai ? selected_ai : select_active_ai_with_fewest_borgs()
+ if(new_ai)
+ target.lawupdate = 1
+ target.connect_to_ai(new_ai)
+ return TRUE
+ if("disconnect_ai")
+ if(target.is_slaved())
+ target.disconnect_from_ai()
+ target.lawupdate = 0
+ return TRUE
+ if("toggle_emag")
+ if(target.emagged)
+ target.emagged = 0
+ target.clear_supplied_laws()
+ target.clear_inherent_laws()
+ target.laws = new global.using_map.default_law_type
+ target.laws.show_laws(target)
+ target.hud_used.update_robot_modules_display()
+ else
+ target.emagged = 1
+ target.lawupdate = 0
+ target.disconnect_from_ai()
+ target.clear_supplied_laws()
+ target.clear_inherent_laws()
+ target.laws = new /datum/ai_laws/syndicate_override
+ if(target.bolt)
+ if(!target.bolt.malfunction)
+ target.bolt.malfunction = MALFUNCTION_PERMANENT
+ target.laws.show_laws(target)
+ target.hud_used.update_robot_modules_display()
+ return TRUE
/datum/eventkit/modify_robot/proc/get_target_items(var/mob/user)
var/list/target_items = list()
@@ -650,3 +699,9 @@
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/eventkit/modify_robot/proc/is_malf(var/mob/user)
+ return (is_admin(user) && !target.is_slaved()) || is_special_role(user)
+
+/datum/eventkit/modify_robot/proc/is_special_role(var/mob/user)
+ return user.mind.special_role ? TRUE : FALSE
diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx
index a5780f93e3..9234107589 100644
--- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx
+++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx
@@ -29,7 +29,7 @@ export const ModifyRobotAccess = (props: {
return (
<>
{!target.active && }
-
+
{!target.active && }
-
+
{!target.active && }
-
+
Robot to salvage
diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx
index 1662c8053c..a0cadfb4ec 100644
--- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx
+++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx
@@ -27,7 +27,7 @@ export const ModifyRobotPKA = (props: { target: Target }) => {
{!target.pka ? (
{target.name} has no PKA installed.
) : (
-
+
Remaining Capacity: {target.pka.capacity}
diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx
index 5af3a8cd06..02a6828c9d 100644
--- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx
+++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx
@@ -25,7 +25,7 @@ export const ModifyRobotRadio = (props: { target: Target }) => {
return (
<>
{!target.active && }
-
+
{
/>
-
+
{
has_inherent_laws,
has_supplied_laws,
isAI,
+ isMalf,
+ isSlaved,
+ active_ais,
+ selected_ai,
channel,
channels,
law_sets,
@@ -90,9 +94,8 @@ export const ModifyRobot = (props) => {
tabs[6] = (
{
has_inherent_laws={has_inherent_laws}
has_supplied_laws={has_supplied_laws}
isAI={isAI}
+ isMalf={isMalf}
channel={channel}
channels={channels}
/>
);
tabs[7] = (
-
+
{
<>
setRobotName(value)}
/>
@@ -162,7 +166,7 @@ export const ModifyRobot = (props) => {
+
+
+
+
>
)}
+
+ {!!target?.module && (
+
+
+
+ act('select_ai', {
+ new_ai: value,
+ })
+ }
+ />
+
+
+
+
+
+
+
+
+ )}
+
{!!target &&
diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts
index d5bb7aeadf..5191e38422 100644
--- a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts
+++ b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts
@@ -24,9 +24,13 @@ export type Data = {
has_inherent_laws: number;
has_supplied_laws: number;
isAI: BooleanLike;
+ isMalf: BooleanLike;
+ isSlaved: string | null;
channel: string;
channels: { channel: string }[];
law_sets: law_pack[];
+ active_ais: DropdownEntry[];
+ selected_ai: string | null;
};
export type DropdownEntry = {
@@ -38,6 +42,7 @@ export type Target = {
name: string;
ckey: string;
module: string;
+ emagged: BooleanLike;
active: BooleanLike;
crisis_override: BooleanLike;
active_restrictions: string[];