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[];