Merge pull request #14427 from Kyep/tgui_mech_computer

[TGUI] Mech Control Console
This commit is contained in:
AffectedArc07
2020-09-25 22:55:05 +01:00
committed by GitHub
4 changed files with 198 additions and 56 deletions
+75 -54
View File
@@ -8,68 +8,65 @@
circuit = /obj/item/circuitboard/mecha_control
var/list/located = list()
var/screen = 0
var/stored_data
var/stored_data = list()
/obj/machinery/computer/mecha/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/computer/mecha/attack_hand(mob/user)
ui_interact(user)
tgui_interact(user)
/obj/machinery/computer/mecha/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
/obj/machinery/computer/mecha/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "exosuit_control.tmpl", "Exosuit Control Console", 420, 500)
ui = new(user, src, ui_key, "MechaControlConsole", name, 420, 500, master_ui, state)
ui.open()
ui.set_auto_update(1)
/obj/machinery/computer/mecha/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["screen"] = screen
if(screen == 0)
var/list/mechas[0]
var/list/trackerlist = list()
for(var/stompy in GLOB.mechas_list)
var/obj/mecha/MC = stompy
trackerlist += MC.trackers
for(var/thing in trackerlist)
var/obj/item/mecha_parts/mecha_tracking/TR = thing
var/answer = TR.get_mecha_info()
if(answer)
mechas[++mechas.len] = answer
data["mechas"] = mechas
if(screen == 1)
data["log"] = stored_data
/obj/machinery/computer/mecha/tgui_data(mob/user)
var/list/data = list()
data["beacons"] = list()
var/list/trackerlist = list()
for(var/stompy in GLOB.mechas_list)
var/obj/mecha/MC = stompy
trackerlist += MC.trackers
for(var/thing in trackerlist)
var/obj/item/mecha_parts/mecha_tracking/TR = thing
var/list/tr_data = TR.retrieve_data()
if(tr_data)
data["beacons"] += list(tr_data)
data["stored_data"] = stored_data
return data
/obj/machinery/computer/mecha/Topic(href, href_list)
/obj/machinery/computer/mecha/tgui_act(action, params)
if(..())
return 1
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
if(href_list["send_message"])
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("send_message")
var/message = strip_html_simple(input(usr,"Input message","Transmit message") as text)
if(!trim(message) || ..())
return 1
var/obj/mecha/M = MT.in_mecha()
if(M)
M.occupant_message(message)
if(href_list["shock"])
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("shock")
MT.shock()
if(href_list["get_log"])
var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("get_log")
stored_data = MT.get_mecha_log()
screen = 1
if(href_list["return"])
screen = 0
SSnanoui.update_uis(src)
return
return
switch(action)
if("send_message")
var/obj/item/mecha_parts/mecha_tracking/MT = locateUID(params["mt"])
if(istype(MT))
var/message = strip_html_simple(input(usr, "Input message", "Transmit message") as text)
if(!message || !trim(message) || ..())
return FALSE
var/obj/mecha/M = MT.in_mecha()
if(M)
M.occupant_message(message)
return TRUE
if("shock")
var/obj/item/mecha_parts/mecha_tracking/MT = locateUID(params["mt"])
if(istype(MT))
MT.shock()
return TRUE
if("get_log")
var/obj/item/mecha_parts/mecha_tracking/MT = locateUID(params["mt"])
if(istype(MT))
stored_data = MT.get_mecha_log()
return TRUE
if("clear_log")
stored_data = list()
return TRUE
/obj/item/mecha_parts/mecha_tracking
name = "Exosuit tracking beacon"
@@ -103,7 +100,7 @@
if(istype(M, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/RM = M
answer["hascargo"] = 1
answer["cargo"] = RM.cargo.len/RM.cargo_capacity*100
answer["cargo"] = length(RM.cargo) / RM.cargo_capacity * 100
return answer
@@ -122,10 +119,34 @@
<b>Active equipment:</b> [M.selected||"None"]<br>"}
if(istype(M, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/RM = M
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
answer += "<b>Used cargo space:</b> [length(RM.cargo) / RM.cargo_capacity * 100]%<br>"
return answer
/obj/item/mecha_parts/mecha_tracking/proc/retrieve_data()
var/list/data = list()
if(!in_mecha())
return FALSE
var/obj/mecha/M = loc
data["uid"] = UID()
data["charge"] = M.get_charge()
data["name"] = M.name
data["health"] = M.obj_integrity
data["maxHealth"] = M.max_integrity
data["cell"] = M.cell
if(M.cell)
data["cellCharge"] = M.cell.charge
data["cellMaxCharge"] = M.cell.charge
data["airtank"] = M.return_pressure()
data["pilot"] = M.occupant
data["location"] = get_area(M)
data["active"] = M.selected
if(istype(M, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/RM = M
data["cargoUsed"] = length(RM.cargo)
data["cargoMax"] = RM.cargo_capacity
return data
/obj/item/mecha_parts/mecha_tracking/emp_act()
qdel(src)
@@ -142,9 +163,9 @@
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
if(!in_mecha())
return 0
return list()
var/obj/mecha/M = loc
return M.get_log_html()
return M.get_log_tgui()
/obj/item/mecha_parts/mecha_tracking/ai_control
name = "exosuit AI control beacon"
+8
View File
@@ -158,6 +158,14 @@
output += "</body></html>"
return output
/obj/mecha/proc/get_log_tgui()
var/list/data = list()
for(var/list/entry in log)
data.Add(list(list(
"time" = time2text(entry["time"], "hh:mm:ss"),
"message" = entry["message"],
)))
return data
/obj/mecha/proc/output_access_dialog(obj/item/card/id/id_card, mob/user)
if(!id_card || !user) return
@@ -0,0 +1,113 @@
import { round } from 'common/math';
import { Fragment } from 'inferno';
import { useBackend } from "../backend";
import { Box, Button, Flex, Icon, Modal, LabeledList, ProgressBar, Section, NoticeBox } from "../components";
import { Window } from "../layouts";
import { toTitleCase, decodeHtmlEntities } from 'common/string';
export const MechaControlConsole = (props, context) => {
const { act, data } = useBackend(context);
const {
beacons,
stored_data,
} = data;
if (stored_data.length) {
return (
<Window resizable>
<Window.Content scrollable>
<Section title="Log" buttons={
<Button icon="window-close"
onClick={() => act("clear_log")} />
}>
{stored_data.map(data => (
<Box key={data.time}>
<Box color="label">({data.time})</Box>
<Box>{decodeHtmlEntities(data.message)}</Box>
</Box>
))}
</Section>
</Window.Content>
</Window>
);
}
return (
<Window resizable>
<Window.Content scrollable>
{beacons.length && beacons.map(beacon => (
<Section key={beacon.name} title={beacon.name} buttons={
<Fragment>
<Button
icon="comment"
onClick={() => act("send_message", { mt: beacon.uid })}>
Message
</Button>
<Button
icon="eye"
onClick={() => act("get_log", { mt: beacon.uid })}>
View Log
</Button>
<Button.Confirm
color="red"
content="EMP"
icon="bomb"
onClick={() => act("shock", { mt: beacon.uid })} />
</Fragment>
}>
<LabeledList>
<LabeledList.Item label="Health">
<ProgressBar
ranges={{
good: [beacon.maxHealth * 0.75, Infinity],
average: [beacon.maxHealth * 0.5, beacon.maxHealth * 0.75],
bad: [-Infinity, beacon.maxHealth * 0.5],
}}
value={beacon.health}
maxValue={beacon.maxHealth} />
</LabeledList.Item>
<LabeledList.Item label="Cell Charge">
{beacon.cell && (
<ProgressBar
ranges={{
good: [beacon.cellMaxCharge * 0.75, Infinity],
average: [beacon.cellMaxCharge * 0.5,
beacon.cellMaxCharge * 0.75],
bad: [-Infinity, beacon.cellMaxCharge * 0.5],
}}
value={beacon.cellCharge}
maxValue={beacon.cellMaxCharge} />
) || <NoticeBox>No Cell Installed</NoticeBox>}
</LabeledList.Item>
<LabeledList.Item label="Air Tank">
{beacon.airtank}kPa
</LabeledList.Item>
<LabeledList.Item label="Pilot">
{beacon.pilot || "Unoccupied"}
</LabeledList.Item>
<LabeledList.Item label="Location">
{toTitleCase(beacon.location) || "Unknown"}
</LabeledList.Item>
<LabeledList.Item label="Active Equipment">
{beacon.active || "None"}
</LabeledList.Item>
{beacon.cargoMax && (
<LabeledList.Item label="Cargo Space">
<ProgressBar
ranges={{
bad: [beacon.cargoMax * 0.75, Infinity],
average: [beacon.cargoMax * 0.5, beacon.cargoMax * 0.75],
good: [-Infinity, beacon.cargoMax * 0.5],
}}
value={beacon.cargoUsed}
maxValue={beacon.cargoMax} />
</LabeledList.Item>
) || null}
</LabeledList>
</Section>
)) || (
<NoticeBox>No mecha beacons found.</NoticeBox>
)}
</Window.Content>
</Window>
);
};
File diff suppressed because one or more lines are too long