TGUI Mulebot

This commit is contained in:
ShadowLarkens
2020-08-12 11:13:52 -07:00
parent 6f9545ea63
commit dd088ae636
2 changed files with 172 additions and 45 deletions

View File

@@ -61,72 +61,57 @@
load(C) load(C)
/mob/living/bot/mulebot/attack_hand(var/mob/user) /mob/living/bot/mulebot/attack_hand(var/mob/user)
interact(user) tgui_interact(user)
/mob/living/bot/mulebot/proc/interact(var/mob/user) /mob/living/bot/mulebot/tgui_interact(mob/user, datum/tgui/ui)
var/dat ui = SStgui.try_update_ui(user, src, ui)
dat += "<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>" if(!ui)
dat += "ID: [suffix]<BR>" ui = new(user, src, "MuleBot", "Mulebot [suffix ? "([suffix])" : ""]")
dat += "Power: [on ? "On" : "Off"]<BR>" ui.open()
if(!open) /mob/living/bot/mulebot/tgui_data(mob/user)
dat += "<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>" var/list/data = list(
"suffix" = suffix,
"power" = on,
"issilicon" = issilicon(user),
"load" = load,
"locked" = locked,
"auto_return" = auto_return,
"crates_only" = crates_only,
"hatch" = open,
"safety" = safety,
)
return data
if(locked) /mob/living/bot/mulebot/tgui_act(action, params)
dat += "<HR>Controls are locked"
else
dat += "<HR>Controls are unlocked<BR><BR>"
if(!locked || issilicon(user))
dat += "<A href='byond://?src=\ref[src];op=power'>Toggle power</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=stop'>Stop</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=go'>Proceed</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=home'>Return to home</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=destination'>Set destination</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=sethome'>Set home</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=autoret'>Toggle auto return home</A> ([auto_return ? "On" : "Off"])<BR>"
dat += "<A href='byond://?src=\ref[src];op=cargotypes'>Toggle non-standard cargo</A> ([crates_only ? "Off" : "On"])<BR>"
if(load)
dat += "<A href='byond://?src=\ref[src];op=unload'>Unload now</A><BR>"
dat += "<HR>The maintenance hatch is closed.<BR>"
else
if(!issilicon(user))
dat += "The maintenance hatch is open.<BR><BR>"
dat += "<A href='byond://?src=\ref[src];op=safety'>Toggle safety</A> ([safety ? "On" : "Off - DANGER"])<BR>"
else
dat += "The bot is in maintenance mode and cannot be controlled.<BR>"
user << browse("<HEAD><TITLE>Mulebot [suffix ? "([suffix])" : ""]</TITLE></HEAD>[dat]", "window=mulebot;size=350x500")
onclose(user, "mulebot")
return
/mob/living/bot/mulebot/Topic(href, href_list)
if(..()) if(..())
return return TRUE
usr.set_machine(src)
add_fingerprint(usr) add_fingerprint(usr)
switch(href_list["op"]) switch(action)
if("power") if("power")
if(on) if(on)
turn_off() turn_off()
else else
turn_on() turn_on()
visible_message("[usr] switches [on ? "on" : "off"] [src].") visible_message("[usr] switches [on ? "on" : "off"] [src].")
. = TRUE
if("stop") if("stop")
obeyCommand("Stop") obeyCommand("Stop")
. = TRUE
if("go") if("go")
obeyCommand("GoTD") obeyCommand("GoTD")
. = TRUE
if("home") if("home")
obeyCommand("Home") obeyCommand("Home")
. = TRUE
if("destination") if("destination")
obeyCommand("SetD") obeyCommand("SetD")
. = TRUE
if("sethome") if("sethome")
var/new_dest var/new_dest
@@ -138,20 +123,23 @@
if(new_dest) if(new_dest)
home = get_turf(beaconlist[new_dest]) home = get_turf(beaconlist[new_dest])
homeName = new_dest homeName = new_dest
. = TRUE
if("unload") if("unload")
unload() unload()
. = TRUE
if("autoret") if("autoret")
auto_return = !auto_return auto_return = !auto_return
. = TRUE
if("cargotypes") if("cargotypes")
crates_only = !crates_only crates_only = !crates_only
. = TRUE
if("safety") if("safety")
safety = !safety safety = !safety
. = TRUE
interact(usr)
/mob/living/bot/mulebot/attackby(var/obj/item/O, var/mob/user) /mob/living/bot/mulebot/attackby(var/obj/item/O, var/mob/user)
..() ..()

View File

@@ -0,0 +1,139 @@
import { round } from 'common/math';
import { Fragment } from 'inferno';
import { useBackend } from "../backend";
import { Box, Button, Flex, Icon, LabeledList, ProgressBar, Section } from "../components";
import { Window } from "../layouts";
export const MuleBot = (props, context) => {
const { act, data } = useBackend(context);
const {
suffix,
power,
load,
locked,
issilicon,
auto_return,
crates_only,
hatch,
safety,
} = data;
return (
<Window width={350} height={500}>
<Window.Content>
<Section title="Multiple Utility Load Effector Mk. III">
<LabeledList>
<LabeledList.Item label="ID">
{suffix}
</LabeledList.Item>
<LabeledList.Item label="Current Load" buttons={
<Button
icon="eject"
content="Unload Now"
disabled={!load}
onClick={() => act("unload")} />
}>
{load ? load : "None."}
</LabeledList.Item>
</LabeledList>
{hatch ? <MuleBotOpen /> : <MuleBotClosed />}
</Section>
</Window.Content>
</Window>
);
};
const MuleBotClosed = (props, context) => {
const { act, data } = useBackend(context);
const {
suffix,
power,
load,
locked,
issilicon,
auto_return,
crates_only,
open,
safety,
} = data;
return (
<Section level={2} title="Controls" buttons={
<Button
icon="power-off"
content={power ? "On" : "Off"}
selected={power}
disabled={locked && !issilicon}
onClick={() => act("power")} />
}>
{(locked && !issilicon) ? (
<Box color="bad">This interface is currently locked.</Box>
) : (
<Fragment>
<Button
fluid
icon="stop"
content="Stop"
onClick={() => act("stop")} />
<Button
fluid
icon="truck-monster"
content="Proceed"
onClick={() => act("go")} />
<Button
fluid
icon="home"
content="Return Home"
onClick={() => act("home")} />
<Button
fluid
icon="map-marker-alt"
content="Set Destination"
onClick={() => act("destination")} />
<Button
fluid
icon="cog"
content="Set Home"
onClick={() => act("sethome")} />
<Button
fluid
icon="home"
selected={auto_return}
content={"Auto Return Home: " + (auto_return ? "Enabled" : "Disabled")}
onClick={() => act("autoret")} />
<Button
fluid
icon="biking"
selected={!crates_only}
content={"Non-standard Cargo: " + (crates_only ? "Disabled" : "Enabled")}
onClick={() => act("cargotypes")} />
</Fragment>
)}
</Section>
);
};
const MuleBotOpen = (props, context) => {
const { act, data } = useBackend(context);
const {
suffix,
power,
load,
locked,
issilicon,
auto_return,
crates_only,
open,
safety,
} = data;
return (
<Section level={2} title="Maintenance Panel">
<Button
fluid
icon="skull-crossbones"
color={safety ? "green" : "red"}
content={"Safety: " + (safety ? "Engaged" : "Disengaged (DANGER)")}
onClick={() => act("safety")} />
</Section>
);
};