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 && (
- act('unload')}
- />
- )}
- {!!pai_inserted && (
- act('eject_pai')}
- />
- )}
- >
- }
- >
-
-
- act('setid')} />
-
-
- act('sethome')} />
-
-
- act('destination', { value })}
- />
-
-
- act('stop')}
- />
- act('go')}
- />
- act('home')}
- />
-
-
- act('autored')}
- />
-
- act('autopick')}
- />
-
- act('report')}
- />
-
- {allow_possession && (
- act('toggle_personality')}
- />
- )}
-
-
-
- )}
-
-
- );
-};
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 && (
+ act('unload')}>
+ Unload
+
+ )}
+ {!!paiInserted && (
+ act('eject_pai')}>
+ Eject PAI
+
+ )}
+ >
+ }
+ >
+
+
+ act('setid')}>{botId}
+
+
+ act('sethome')}>{homeDestination}
+
+
+ act('destination', { value })}
+ />
+
+
+
+
+ act('autored')}>
+ Auto-Return
+
+
+ act('autopick')}>
+ Auto-Pickup
+
+
+ act('report')}>
+ Report-Delivery
+
+
+ {!!allowPossession && (
+ act('toggle_personality')}
+ >
+ Download Personality
+
+ )}
+
+
+
+
+ act('stop')}
+ >
+ Stop
+
+
+
+ act('go')}
+ >
+ Go
+
+
+
+ act('home')}>
+ Home
+
+
+
+
+ >
+ );
+};
+
+export const Mule = (props) => {
+ const { act, data } = useBackend();
+ const {
+ powerStatus,
+ cellPercent,
+ load,
+ mode,
+ modeStatus,
+ locked,
+ siliconUser,
+ } = data;
+
+ const mulebotLocked = locked && !siliconUser;
+
+ return (
+
+
+
+
+ act('rename')}>
+ Rename
+
+ {!mulebotLocked && (
+ act('on')}
+ >
+ {powerStatus ? 'On' : 'Off'}
+
+ )}
+ >
+ }
+ >
+
+
+
+
+
+ {mode}
+
+
+
+
+
+
+ {load || 'None'}
+
+
+
+
+
+ {!mulebotLocked && }
+
+
+ );
+};