diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm index 07db7c88335..a6ecf11e56e 100644 --- a/code/__DEFINES/devices.dm +++ b/code/__DEFINES/devices.dm @@ -7,10 +7,8 @@ #define CART_CLOWN (1<<5) #define CART_MIME (1<<6) #define CART_REAGENT_SCANNER (1<<7) -#define CART_STATUS_DISPLAY (1<<8) -#define CART_QUARTERMASTER (1<<9) -#define CART_DRONEPHONE (1<<10) -#define CART_DRONEACCESS (1<<11) +#define CART_STATUS_DISPLAY (1<<10) +#define CART_QUARTERMASTER (1<<11) /// PDA ui menu defines #define PDA_UI_HUB 0 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ee90b5cd241..a2ef23449fc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -350,11 +350,6 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • [PDAIMG(reagent)][scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner
  • " if (cartridge.access & CART_ATMOS) dat += "
  • [PDAIMG(reagent)][scanmode == 5 ? "Disable" : "Enable"] Gas Scanner
  • " - if (cartridge.access & CART_DRONEPHONE) - dat += "
  • [PDAIMG(dronephone)]Drone Phone
  • " - if (cartridge.access & CART_DRONEACCESS) - var/blacklist_state = GLOB.drone_machine_blacklist_enabled - dat += "
  • [PDAIMG(droneblacklist)][blacklist_state ? "Disable" : "Enable"] Drone Blacklist
  • " dat += "
  • [PDAIMG(atmos)]Atmospheric Scan
  • " dat += "
  • [PDAIMG(flashlight)][light_on ? "Disable" : "Enable"] Flashlight
  • " if (pai) @@ -601,26 +596,6 @@ GLOBAL_LIST_EMPTY(PDAs) scanmode = PDA_SCANNER_GAS if(!silent) playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) - if("Drone Phone") - var/alert_s = tgui_input_list(U, "Alert severity level", "Ping Drones", list("Low","Medium","High","Critical")) - if(isnull(alert_s)) - return - var/area/A = get_area(U) - if(A && !QDELETED(U)) - var/msg = span_boldnotice("NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!") - _alert_drones(msg, TRUE, U) - to_chat(U, msg) - if(!silent) - playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE) - if("Drone Access") - var/mob/living/simple_animal/drone/drone_user = U - if(isdrone(U) && drone_user.shy) - to_chat(U, span_warning("Your laws prevent this action.")) - return - var/new_state = text2num(href_list["drone_blacklist"]) - GLOB.drone_machine_blacklist_enabled = new_state - if(!silent) - playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE) //NOTEKEEPER FUNCTIONS=================================== diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index df8c2f8c927..560fd492c96 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -36,7 +36,7 @@ /obj/item/cartridge/engineering name = "\improper Power-ON cartridge" icon_state = "cart-e" - access = CART_ENGINE | CART_DRONEPHONE + access = CART_ENGINE bot_access = list( FLOOR_BOT, ) @@ -44,7 +44,7 @@ /obj/item/cartridge/atmos name = "\improper BreatheDeep cartridge" icon_state = "cart-a" - access = CART_ATMOS | CART_DRONEPHONE + access = CART_ATMOS bot_access = list( FLOOR_BOT, FIRE_BOT, @@ -93,7 +93,6 @@ /obj/item/cartridge/roboticist name = "\improper B.O.O.P. Remote Control cartridge" desc = "Packed with heavy duty quad-bot interlink!" - access = CART_DRONEPHONE bot_access = list( FLOOR_BOT, CLEAN_BOT, @@ -133,7 +132,7 @@ /obj/item/cartridge/hop name = "\improper HumanResources9001 cartridge" icon_state = "cart-h" - access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_QUARTERMASTER | CART_DRONEPHONE + access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_QUARTERMASTER bot_access = list( MULE_BOT, CLEAN_BOT, @@ -153,7 +152,7 @@ /obj/item/cartridge/ce name = "\improper Power-On DELUXE cartridge" icon_state = "cart-ce" - access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_ENGINE | CART_ATMOS | CART_DRONEPHONE | CART_DRONEACCESS + access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_ENGINE | CART_ATMOS bot_access = list( FLOOR_BOT, FIRE_BOT, @@ -170,7 +169,7 @@ /obj/item/cartridge/rd name = "\improper Signal Ace DELUXE cartridge" icon_state = "cart-rd" - access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS | CART_DRONEPHONE + access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_REAGENT_SCANNER | CART_ATMOS bot_access = list( FLOOR_BOT, CLEAN_BOT, diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index f35abf25235..e7d7e89ae30 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -13,6 +13,12 @@ var/botcount = 0 ///Access granted by the used to summon robots. var/list/current_access = list() + var/list/drone_ping_types = list( + "Low", + "Medium", + "High", + "Critical", + ) /datum/computer_file/program/robocontrol/ui_data(mob/user) var/list/data = get_header_data() @@ -61,9 +67,24 @@ newbot["mule_check"] = TRUE botlist += list(newbot) + for(var/mob/living/simple_animal/drone/all_drones as anything in GLOB.drones_list) + if(all_drones.hacked) + continue + if(all_drones.z != zlevel) + continue + var/list/drone_data = list( + "name" = all_drones.name, + "status" = all_drones.stat, + "drone_ref" = REF(all_drones), + ) + data["drones"] += list(drone_data) + + data["bots"] = botlist data["mules"] = mulelist data["botcount"] = botlist.len + data["droneaccess"] = GLOB.drone_machine_blacklist_enabled + data["dronepingtypes"] = drone_ping_types return data @@ -114,4 +135,21 @@ card_slot.try_eject(current_user) else playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE) - return + if("changedroneaccess") + if(!computer || !card_slot || !id_card) + to_chat(current_user, span_notice("No ID found, authorization failed.")) + return + if(!(ACCESS_CE in id_card.access)) + to_chat(current_user, span_notice("Required access not found on ID.")) + return + GLOB.drone_machine_blacklist_enabled = !GLOB.drone_machine_blacklist_enabled + if("ping_drones") + if(!(params["ping_type"]) || !(params["ping_type"] in drone_ping_types)) + return + var/area/current_area = get_area(current_user) + if(!current_area || QDELETED(current_user)) + return + var/msg = span_boldnotice("NON-DRONE PING: [current_user.name]: [params["ping_type"]] priority alert in [current_area.name]!") + _alert_drones(msg, TRUE, current_user) + to_chat(current_user, msg) + playsound(src, 'sound/machines/terminal_success.ogg', 15, TRUE) diff --git a/tgui/packages/tgui/interfaces/NtosRoboControl.js b/tgui/packages/tgui/interfaces/NtosRoboControl.js index 45d8039dae2..ba4c3b836f7 100644 --- a/tgui/packages/tgui/interfaces/NtosRoboControl.js +++ b/tgui/packages/tgui/interfaces/NtosRoboControl.js @@ -1,5 +1,5 @@ -import { useBackend } from '../backend'; -import { Button, LabeledList, ProgressBar, Section, Stack } from '../components'; +import { useBackend, useSharedState } from '../backend'; +import { Box, Button, Dropdown, LabeledList, ProgressBar, Section, Stack, Tabs } from '../components'; import { NtosWindow } from '../layouts'; const getMuleByRef = (mules, ref) => { @@ -8,10 +8,14 @@ const getMuleByRef = (mules, ref) => { export const NtosRoboControl = (props, context) => { const { act, data } = useBackend(context); + const [tab_main, setTab_main] = useSharedState(context, 'tab_main', 1); const { bots, + drones, id_owner, has_id, + droneaccess, + dronepingtypes, } = data; return ( { onClick={() => act('ejectcard')} /> )} - - {data.botcount} - - {bots?.map(robot => ( - - ))} + + + setTab_main(1)}> + Bots + + setTab_main(2)}> + Drones + + + + {tab_main === 1 && ( + +
    + + + {data.botcount} + + +
    + {bots?.map(robot => ( + + ))} +
    + )} + {tab_main === 2 && ( + +
    +
    + {drones?.map(drone => ( + + ))} +
    + )}
    ); }; -const RobotInfo = (props, context) => { +export const RobotInfo = (props, context) => { const { robot } = props; const { act, data } = useBackend(context); const mules = data.mules || []; @@ -206,3 +260,32 @@ const RobotInfo = (props, context) => { ); }; + +export const DroneInfo = (props, context) => { + const { drone } = props; + const { act, data } = useBackend(context); + const color = 'rgba(74, 59, 140, 1)'; + + return ( +
    + + + + + + {drone.status + ? "Not Responding" + : 'Nominal'} + + + + + +
    + ); +}; +