[MIRROR] tgui: Mass Driver Control (#774)

* tgui: Mass Driver Control

* Update tgui.bundle.js

Co-authored-by: Arkatos1 <43862960+Arkatos1@users.noreply.github.com>
Co-authored-by: Azarak <azarak10@gmail.com>
This commit is contained in:
SkyratBot
2020-09-13 03:52:21 +02:00
committed by GitHub
co-authored by Arkatos1 Azarak
parent 1ebaa97be3
commit 5aeaf080e9
6 changed files with 193 additions and 69 deletions
+78 -65
View File
@@ -1,21 +1,37 @@
/obj/machinery/computer/pod
name = "mass driver launch control"
desc = "A combined blastdoor and mass driver control unit."
processing_flags = START_PROCESSING_MANUALLY
/// Connected mass driver
var/obj/machinery/mass_driver/connected = null
var/title = "Mass Driver Controls"
/// ID of the launch control
var/id = 1
var/timing = 0
/// If the launch timer counts down
var/timing = FALSE
/// Time before auto launch
var/time = 30
/// Range in which we search for a mass drivers and poddoors nearby
var/range = 4
/// Countdown timer for the mass driver's delayed launch functionality.
COOLDOWN_DECLARE(massdriver_countdown)
/obj/machinery/computer/pod/Initialize()
. = ..()
for(var/obj/machinery/mass_driver/M in range(range, src))
if(M.id == id)
connected = M
break
/obj/machinery/computer/pod/process(delta_time)
if(COOLDOWN_FINISHED(src, massdriver_countdown))
timing = FALSE
// alarm() sleeps, so we want to end processing first and can't rely on return PROCESS_KILL
end_processing()
alarm()
/**
* Initiates launching sequence by checking if all components are functional, opening poddoors, firing mass drivers and then closing poddoors
*/
/obj/machinery/computer/pod/proc/alarm()
if(machine_stat & (NOPOWER|BROKEN))
return
@@ -39,84 +55,82 @@
if(M.id == id)
M.close()
/obj/machinery/computer/pod/ui_interact(mob/user)
. = ..()
if(!allowed(user))
to_chat(user, "<span class='warning'>Access denied.</span>")
return
/obj/machinery/computer/pod/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "MassDriverControl", name)
ui.open()
var/dat = ""
if(connected)
var/d2
if(timing) //door controls do not need timers.
d2 = "<A href='?src=[REF(src)];time=0'>Stop Time Launch</A>"
else
d2 = "<A href='?src=[REF(src)];time=1'>Initiate Time Launch</A>"
dat += "<HR>\nTimer System: [d2]\nTime Left: [DisplayTimeText((time SECONDS))] <A href='?src=[REF(src)];tp=-30'>-</A> <A href='?src=[REF(src)];tp=-1'>-</A> <A href='?src=[REF(src)];tp=1'>+</A> <A href='?src=[REF(src)];tp=30'>+</A>"
var/temp = ""
var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 )
for(var/t in L)
if(t == connected.power)
temp += "[t] "
else
temp += "<A href = '?src=[REF(src)];power=[t]'>[t]</A> "
dat += "<HR>\nPower Level: [temp]<BR>\n<A href = '?src=[REF(src)];alarm=1'>Firing Sequence</A><BR>\n<A href = '?src=[REF(src)];drive=1'>Test Fire Driver</A><BR>\n<A href = '?src=[REF(src)];door=1'>Toggle Outer Door</A><BR>"
else
dat += "<BR>\n<A href = '?src=[REF(src)];door=1'>Toggle Outer Door</A><BR>"
dat += "<BR><BR><A href='?src=[REF(user)];mach_close=computer'>Close</A>"
add_fingerprint(usr)
var/datum/browser/popup = new(user, "computer", title, 400, 500)
popup.set_content(dat)
popup.open()
/obj/machinery/computer/pod/ui_data(mob/user)
var/list/data = list()
// If the cooldown has finished, just display the time. If the cooldown hasn't finished, display the cooldown.
var/display_time = COOLDOWN_FINISHED(src, massdriver_countdown) ? time : COOLDOWN_TIMELEFT(src, massdriver_countdown) * 0.1
data["connected"] = connected ? TRUE : FALSE
data["seconds"] = round(display_time % 60)
data["minutes"] = round((display_time - data["seconds"]) / 60)
data["timing"] = timing
data["power"] = connected ? connected.power : 0.25
data["poddoor"] = FALSE
for(var/obj/machinery/door/poddoor/door in range(range, src))
if(door.id == id)
data["poddoor"] = TRUE
break
return data
/obj/machinery/computer/pod/process()
if(!..())
return
if(timing)
if(time > 0)
time = round(time) - 1
else
alarm()
time = 0
timing = 0
updateDialog()
/obj/machinery/computer/pod/Topic(href, href_list)
/obj/machinery/computer/pod/ui_act(action, list/params)
if(..())
return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
usr.set_machine(src)
if(href_list["power"])
var/t = text2num(href_list["power"])
t = min(max(0.25, t), 16)
if(connected)
connected.power = t
if(href_list["alarm"])
if(!allowed(usr))
to_chat(usr, "<span class='warning'>Access denied.</span>")
return
switch(action)
if("set_power")
if(!connected)
return
var/value = text2num(params["power"])
if(!value)
return
value = clamp(value, 0.25, 16)
connected.power = value
return TRUE
if("launch")
alarm()
if(href_list["time"])
timing = text2num(href_list["time"])
if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
time = min(max(round(time), 0), 120)
if(href_list["door"])
return TRUE
if("time")
timing = !timing
if(timing)
COOLDOWN_START(src, massdriver_countdown, time SECONDS)
begin_processing()
else
time = COOLDOWN_TIMELEFT(src, massdriver_countdown) * 0.1
COOLDOWN_RESET(src, massdriver_countdown)
end_processing()
return TRUE
if("input")
var/value = text2num(params["adjust"])
if(!value)
return
value = round(time + value)
time = clamp(value, 0, 120)
return TRUE
if("door")
for(var/obj/machinery/door/poddoor/M in range(range, src))
if(M.id == id)
if(M.density)
M.open()
else
M.close()
if(href_list["drive"])
return TRUE
if("driver_test")
for(var/obj/machinery/mass_driver/M in range(range, src))
if(M.id == id)
M.power = connected.power
M.power = connected?.power
M.drive()
updateUsrDialog()
return TRUE
/obj/machinery/computer/pod/old
name = "\improper DoorMex control console"
title = "Door Controls"
icon_state = "oldcomp"
icon_screen = "library"
icon_keyboard = "no_keyboard"
@@ -124,7 +138,6 @@
/obj/machinery/computer/pod/old/syndicate
name = "\improper ProComp Executive IIc"
desc = "The Syndicate operate on a tight budget. Operates external airlocks."
title = "External Airlock Controls"
req_access = list(ACCESS_SYNDICATE)
/obj/machinery/computer/pod/old/swf
+6 -1
View File
@@ -11,6 +11,12 @@
var/id = 1
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
/obj/machinery/mass_driver/Destroy()
for(var/obj/machinery/computer/pod/control in GLOB.machines)
if(control.id == id)
control.connected = null
return ..()
/obj/machinery/mass_driver/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
id = "[idnum][id]"
@@ -32,7 +38,6 @@
O.throw_at(target, drive_range * power, power)
flick("mass_driver1", src)
/obj/machinery/mass_driver/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
@@ -0,0 +1,106 @@
import { Fragment } from 'inferno';
import { useBackend } from '../backend';
import { Box, Button, Section, LabeledList, NumberInput } from '../components';
import { Window } from '../layouts';
export const MassDriverControl = (props, context) => {
const { act, data } = useBackend(context);
const {
connected,
minutes,
seconds,
timing,
power,
poddoor,
} = data;
return (
<Window
width={300}
height={connected ? 215 : 107}>
<Window.Content>
<Fragment>
{!!connected && (
<Section
title="Auto Launch"
buttons={(
<Button
icon={"clock-o"}
content={timing ? 'Stop' : 'Start'}
selected={timing}
onClick={() => act('time')} />
)}>
<Button
icon="fast-backward"
disabled={timing}
onClick={() => act('input', { adjust: -30 })} />
<Button
icon="backward"
disabled={timing}
onClick={() => act('input', { adjust: -1 })} />
{' '}
{String(minutes).padStart(2, '0')}:
{String(seconds).padStart(2, '0')}
{' '}
<Button
icon="forward"
disabled={timing}
onClick={() => act('input', { adjust: 1 })} />
<Button
icon="fast-forward"
disabled={timing}
onClick={() => act('input', { adjust: 30 })} />
</Section>
)}
<Section
title="Controls"
buttons={(
<Button
icon={"toggle-on"}
content="Toggle Outer Door"
disabled={timing || !poddoor}
onClick={() => act('door')} />
)}>
{!!connected && (
<Fragment>
<LabeledList>
<LabeledList.Item
label="Power Level"
buttons={
<Button
icon={"bomb"}
content="Test Fire"
disabled={timing}
onClick={() => act('driver_test')} />
}>
<NumberInput
value={power}
width="40px"
minValue={0.25}
maxValue={16}
onChange={(e, value) => {
return act('set_power', {
power: value,
});
}} />
</LabeledList.Item>
</LabeledList>
<Button
fluid
content="Launch"
disabled={timing}
mt={1.5}
icon="arrow-up"
textAlign="center"
onClick={() => act('launch')} />
</Fragment>
) || (
<Box color="bad">
No connected mass driver
</Box>
)}
</Section>
</Fragment>
</Window.Content>
</Window>
);
};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long