mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 12:37:26 +01:00
Merge pull request #14427 from Kyep/tgui_mech_computer
[TGUI] Mech Control Console
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user