diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 5361161301d..f135635b185 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -185,17 +185,17 @@ DEFINE_BITFIELD(bot_cover_flags, list( /// Medibots - Healing people #define BOT_HEALING "Healing" /// MULEbot - Moving to deliver -#define BOT_DELIVER "Navigating to Delivery Location" +#define BOT_DELIVER "Delivering" /// MULEbot - Returning to home -#define BOT_GO_HOME "Proceeding to work site" +#define BOT_GO_HOME "Returning" /// MULEbot - Blocked -#define BOT_BLOCKED "No Route" +#define BOT_BLOCKED "Blocked" /// MULEbot - Computing navigation -#define BOT_NAV "Unable to reach destination" +#define BOT_NAV "Unreachable" /// MULEbot - Waiting for nav computation -#define BOT_WAIT_FOR_NAV "Calculating navigation path" +#define BOT_WAIT_FOR_NAV "Calculating" /// MULEbot - No destination beacon found (or no route) -#define BOT_NO_ROUTE "Navigating to Home" +#define BOT_NO_ROUTE "Returning Home" //Secbot and ED209 judgement criteria bitflag values #define JUDGE_EMAGGED (1<<0) @@ -266,7 +266,18 @@ DEFINE_BITFIELD(firebot_mode_flags, list( "FIREBOT_EXTINGUISH_FLAMES" = FIREBOT_EXTINGUISH_FLAMES, )) +///auto return to home after delivery +#define MULEBOT_RETURN_MODE (1<<0) +///autopickups at beacons +#define MULEBOT_AUTO_PICKUP_MODE (1<<1) +///announce every delivery we make +#define MULEBOT_REPORT_DELIVERY_MODE (1<<2) +DEFINE_BITFIELD(mulebot_delivery_flags, list( + "MULEBOT_RETURN_MODE" = MULEBOT_RETURN_MODE, + "MULEBOT_AUTO_PICKUP_MODE" = MULEBOT_AUTO_PICKUP_MODE, + "MULEBOT_REPORT_DELIVERY_MODE" = MULEBOT_REPORT_DELIVERY_MODE, +)) //cleanBOT defines on what to clean #define CLEANBOT_CLEAN_BLOOD (1<<0) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 68db0e2546b..512facc2443 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -48,9 +48,8 @@ ///Number of times retried a blocked path var/blockcount = 0 - var/auto_return = TRUE /// true if auto return to home beacon after unload - var/auto_pickup = TRUE /// true if auto-pickup at beacon - var/report_delivery = TRUE /// true if bot will announce an arrival to a location. + ///flags of mulebot mode + var/mulebot_delivery_flags = MULEBOT_RETURN_MODE | MULEBOT_AUTO_PICKUP_MODE | MULEBOT_REPORT_DELIVERY_MODE var/obj/item/stock_parts/power_store/cell /// Internal Powercell var/cell_move_power_usage = 1///How much power we use when we move. @@ -261,7 +260,7 @@ /mob/living/simple_animal/bot/mulebot/ui_data(mob/user) var/list/data = list() - data["on"] = bot_mode_flags & BOT_MODE_ON + data["powerStatus"] = bot_mode_flags & BOT_MODE_ON data["locked"] = bot_cover_flags & BOT_COVER_LOCKED data["siliconUser"] = HAS_SILICON_ACCESS(user) data["mode"] = mode ? "[mode]" : "Ready" @@ -274,18 +273,17 @@ if(BOT_NO_ROUTE) data["modeStatus"] = "bad" data["load"] = get_load_name() - data["destination"] = destination ? destination : null - data["home"] = home_destination - data["destinations"] = GLOB.deliverybeacontags - data["cell"] = cell ? TRUE : FALSE - data["cellPercent"] = cell ? cell.percent() : null - data["autoReturn"] = auto_return - data["autoPickup"] = auto_pickup - data["reportDelivery"] = report_delivery - data["id"] = id - data["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT - data["possession_enabled"] = can_be_possessed - data["pai_inserted"] = !!paicard + data["destination"] = destination + data["homeDestination"] = home_destination + data["destinationsList"] = GLOB.deliverybeacontags + data["cellPercent"] = cell?.percent() + data["autoReturn"] = mulebot_delivery_flags & MULEBOT_RETURN_MODE + data["autoPickup"] = mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE + data["reportDelivery"] = mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE + data["botId"] = id + data["allowPossession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT + data["possessionEnabled"] = can_be_possessed + data["paiInserted"] = !!paicard return data /mob/living/simple_animal/bot/mulebot/ui_act(action, params) @@ -351,11 +349,11 @@ else unload(0) if("autoret") - auto_return = !auto_return + mulebot_delivery_flags ^= MULEBOT_RETURN_MODE if("autopick") - auto_pickup = !auto_pickup + mulebot_delivery_flags ^= MULEBOT_AUTO_PICKUP_MODE if("report") - report_delivery = !report_delivery + mulebot_delivery_flags ^= MULEBOT_REPORT_DELIVERY_MODE /mob/living/simple_animal/bot/mulebot/proc/buzz(type) switch(type) @@ -636,12 +634,12 @@ radio_channel = RADIO_CHANNEL_AI_PRIVATE //Report on AI Private instead if the AI is controlling us. if(load) // if loaded, unload at target - if(report_delivery) + if(mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) speak("Destination [RUNECHAT_BOLD("[destination]")] reached. Unloading [load].",radio_channel) unload(loaddir) else // not loaded - if(auto_pickup) // find a crate + if(mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE) // find a crate var/atom/movable/AM if(wires.is_cut(WIRE_LOADCHECK)) // if hacked, load first unanchored thing we find for(var/atom/movable/A in get_step(loc, loaddir)) @@ -652,11 +650,11 @@ AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir) if(AM?.Adjacent(src)) load(AM) - if(report_delivery) + if(mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) speak("Now loading [load] at [RUNECHAT_BOLD("[get_area_name(src)]")].", radio_channel) // whatever happened, check to see if we return home - if(auto_return && home_destination && destination != home_destination) + if((mulebot_delivery_flags & MULEBOT_RETURN_MODE) && home_destination && destination != home_destination) // auto return set and not at home already start_home() mode = BOT_BLOCKED diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 314048c5149..694c84eaeea 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -53,9 +53,9 @@ "dest" = simple_mulebot.destination, "power" = simple_mulebot.cell ? simple_mulebot.cell.percent() : 0, "home" = simple_mulebot.home_destination, - "autoReturn" = simple_mulebot.auto_return, - "autoPickup" = simple_mulebot.auto_pickup, - "reportDelivery" = simple_mulebot.report_delivery, + "autoReturn" = simple_mulebot.mulebot_delivery_flags & MULEBOT_RETURN_MODE, + "autoPickup" = simple_mulebot.mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE, + "reportDelivery" = simple_mulebot.mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE, "mule_ref" = REF(simple_mulebot), "load" = simple_mulebot.get_load_name(), )) diff --git a/tgui/packages/tgui/interfaces/Mule.jsx b/tgui/packages/tgui/interfaces/Mule.jsx deleted file mode 100644 index 1b289be2743..00000000000 --- a/tgui/packages/tgui/interfaces/Mule.jsx +++ /dev/null @@ -1,173 +0,0 @@ -import { useBackend } from '../backend'; -import { - Button, - Dropdown, - Flex, - LabeledList, - ProgressBar, - Section, -} from '../components'; -import { Window } from '../layouts'; -import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; - -export const Mule = (props) => { - const { act, data } = useBackend(); - const { - on, - cell, - cellPercent, - load, - mode, - modeStatus, - autoReturn, - autoPickup, - reportDelivery, - destination, - home, - id, - allow_possession, - possession_enabled, - pai_inserted, - destinations = [], - } = data; - const locked = data.locked && !data.siliconUser; - return ( - - - -
-
- {!locked && ( -
- {!!load && ( -
- )} -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/Mule.tsx b/tgui/packages/tgui/interfaces/Mule.tsx new file mode 100644 index 00000000000..91c1dfffedb --- /dev/null +++ b/tgui/packages/tgui/interfaces/Mule.tsx @@ -0,0 +1,208 @@ +import { BooleanLike } from 'common/react'; + +import { useBackend } from '../backend'; +import { + Button, + Dropdown, + LabeledList, + ProgressBar, + Section, + Stack, +} from '../components'; +import { Window } from '../layouts'; +import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; + +type Data = { + powerStatus: BooleanLike; + cellPercent: number | null; + load: BooleanLike; + locked: BooleanLike; + siliconUser: BooleanLike; + mode: string; + modeStatus: string; + autoReturn: BooleanLike; + autoPickup: BooleanLike; + reportDelivery: BooleanLike; + destination: string | null; + destinationsList: string[]; + homeDestination: string | null; + botId: string; + allowPossession: BooleanLike; + possessionEnabled: BooleanLike; + paiInserted: BooleanLike; +}; + +const MuleControls = (props) => { + const { act, data } = useBackend(); + const { + load, + autoReturn, + autoPickup, + reportDelivery, + destination, + homeDestination, + botId, + allowPossession, + possessionEnabled, + paiInserted, + destinationsList = [], + } = data; + + return ( + <> +
+ {!!load && ( + + )} + {!!paiInserted && ( + + )} + + } + > + + + + + + + + + act('destination', { value })} + /> + + +
+
+ act('autored')}> + Auto-Return + +
+ act('autopick')}> + Auto-Pickup + +
+ act('report')}> + Report-Delivery + +
+ {!!allowPossession && ( + act('toggle_personality')} + > + Download Personality + + )} +
+
+ + + + + + + + + + + +
+ + ); +}; + +export const Mule = (props) => { + const { act, data } = useBackend(); + const { + powerStatus, + cellPercent, + load, + mode, + modeStatus, + locked, + siliconUser, + } = data; + + const mulebotLocked = locked && !siliconUser; + + return ( + + + +
+ + {!mulebotLocked && ( + + )} + + } + > + + + + + + {mode} + + + + + + + {load || 'None'} + + + + +
+ {!mulebotLocked && } +
+
+ ); +};