mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-31 00:58:26 +01:00
[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:
co-authored by
Arkatos1
Azarak
parent
1ebaa97be3
commit
5aeaf080e9
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user