mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
@@ -1,3 +1,5 @@
|
||||
#define SHEET_VOLUME 1000 //cm3
|
||||
|
||||
//Baseline portable generator. Has all the default handling. Not intended to be used on it's own (since it generates unlimited power).
|
||||
/obj/machinery/power/port_gen
|
||||
name = "Placeholder Generator" //seriously, don't use this. It can't be anchored without VV magic.
|
||||
@@ -239,7 +241,7 @@
|
||||
var/temp_loss = (temperature - cooling_temperature)/TEMPERATURE_DIVISOR
|
||||
temp_loss = between(2, round(temp_loss, 1), TEMPERATURE_CHANGE_MAX)
|
||||
temperature = max(temperature - temp_loss, cooling_temperature)
|
||||
SSnanoui.update_uis(src)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
if(overheating)
|
||||
overheating--
|
||||
@@ -280,7 +282,7 @@
|
||||
to_chat(user, "<span class='notice'>You add [amount] sheet\s to the [src.name].</span>")
|
||||
sheets += amount
|
||||
addstack.use(amount)
|
||||
SSnanoui.update_uis(src)
|
||||
SStgui.update_uis(src)
|
||||
return
|
||||
else if(!active)
|
||||
if(istype(O, /obj/item/wrench))
|
||||
@@ -312,78 +314,69 @@
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
|
||||
..()
|
||||
if(!anchored)
|
||||
return
|
||||
ui_interact(user)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attack_ai(var/mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return src.attack_hand(user)
|
||||
add_hiddenprint(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attack_ghost(var/mob/user)
|
||||
return src.attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
if(IsBroken())
|
||||
return
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
/obj/machinery/power/port_gen/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, "pacman.tmpl", src.name, 500, 560)
|
||||
ui = new(user, src, ui_key, "Pacman", name, 500, 260)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
|
||||
var/data[0]
|
||||
/obj/machinery/power/port_gen/pacman/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["active"] = active
|
||||
if(istype(user, /mob/living/silicon/ai))
|
||||
data["is_ai"] = 1
|
||||
data["is_ai"] = TRUE
|
||||
else if(istype(user, /mob/living/silicon/robot) && !Adjacent(user))
|
||||
data["is_ai"] = 1
|
||||
data["is_ai"] = TRUE
|
||||
else
|
||||
data["is_ai"] = 0
|
||||
data["is_ai"] = FALSE
|
||||
|
||||
data["anchored"] = anchored
|
||||
data["broken"] = IsBroken()
|
||||
data["output_set"] = power_output
|
||||
data["output_max"] = max_power_output
|
||||
data["output_safe"] = max_safe_output
|
||||
data["output_watts"] = power_output * power_gen
|
||||
data["temperature_current"] = src.temperature
|
||||
data["temperature_max"] = src.max_temperature
|
||||
data["temperature_overheat"] = overheating
|
||||
// 1 sheet = 1000cm3?
|
||||
data["fuel_stored"] = round((sheets * 1000) + (sheet_left * 1000))
|
||||
data["fuel_capacity"] = round(max_sheets * 1000, 0.1)
|
||||
data["fuel_usage"] = active ? round((power_output / time_per_sheet) * 1000) : 0
|
||||
data["power_gen"] = power_gen
|
||||
data["tmp_current"] = temperature
|
||||
data["tmp_max"] = max_temperature
|
||||
data["tmp_overheat"] = overheating
|
||||
data["fuel_stored"] = round((sheets * SHEET_VOLUME) + (sheet_left * SHEET_VOLUME))
|
||||
data["fuel_cap"] = round(max_sheets * SHEET_VOLUME, 0.1)
|
||||
data["fuel_usage"] = active ? round((power_output / time_per_sheet) * SHEET_VOLUME) : 0
|
||||
data["fuel_type"] = sheet_name
|
||||
data["has_fuel"] = HasFuel()
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/Topic(href, href_list)
|
||||
/obj/machinery/power/port_gen/pacman/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["action"])
|
||||
if(href_list["action"] == "enable")
|
||||
if(!active && HasFuel() && !IsBroken())
|
||||
active = 1
|
||||
update_icon()
|
||||
if(href_list["action"] == "disable")
|
||||
if(active)
|
||||
active = 0
|
||||
update_icon()
|
||||
if(href_list["action"] == "eject")
|
||||
if(!active)
|
||||
DropFuel()
|
||||
if(href_list["action"] == "lower_power")
|
||||
if(power_output > 1)
|
||||
power_output--
|
||||
if(href_list["action"] == "higher_power")
|
||||
if(power_output < max_power_output || (emagged && power_output < round(max_power_output*2.5)))
|
||||
power_output++
|
||||
add_fingerprint(usr)
|
||||
|
||||
SSnanoui.update_uis(src)
|
||||
. = TRUE
|
||||
|
||||
switch(action)
|
||||
if("toggle_power")
|
||||
if(!powernet) //only a warning, process will disable
|
||||
atom_say("Not connected to powernet.")
|
||||
active = !active
|
||||
update_icon()
|
||||
if("eject_fuel")
|
||||
DropFuel()
|
||||
if("change_power")
|
||||
var/newPower = text2num(params["change_power"])
|
||||
if(newPower)
|
||||
power_output = clamp(newPower, 1, max_power_output)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/super
|
||||
name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator"
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
<h3>Status</h3>
|
||||
<div class='item'>
|
||||
<div class="itemLabel">
|
||||
Generator Status:
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{if data.active}}
|
||||
<span class="good">Online</span>
|
||||
{{else}}
|
||||
<span class="average">Offline</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
Generator Control:
|
||||
</div>
|
||||
<div class = "itemContent">
|
||||
{{if data.active}}
|
||||
{{:helper.link('STOP', 'power-off', {'action' : "disable"})}}
|
||||
{{else}}
|
||||
{{:helper.link('START', 'power-off', {'action' : "enable"})}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<h3>Fuel</h3>
|
||||
<div class='item'>
|
||||
<div class="itemLabel">
|
||||
Fuel Type:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="good">{{:data.fuel_type}}</span>
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
Fuel Level:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if data.fuel_stored >= 5000}}
|
||||
{{:helper.displayBar(data.fuel_stored, 0, data.fuel_capacity, 'good')}}
|
||||
<br><span class="good">{{:helper.smoothRound(data.fuel_stored)}}/{{:data.fuel_capacity}} cm3</span>
|
||||
{{else data.fuel_stored >= 1000}}
|
||||
{{:helper.displayBar(data.fuel_stored, 0, data.fuel_capacity, 'average')}}
|
||||
<br><span class="average">{{:helper.smoothRound(data.fuel_stored)}}/{{:data.fuel_capacity}} cm3</span>
|
||||
{{else}}
|
||||
{{:helper.displayBar(data.fuel_stored, 0, data.fuel_capacity, 'bad')}}
|
||||
<br><span class="bad">{{:helper.smoothRound(data.fuel_stored)}}/{{:data.fuel_capacity}} cm3</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
Fuel Usage:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class="good">{{:helper.smoothRound(data.fuel_usage)}} cm3/s</span>
|
||||
</div>
|
||||
{{if !data.is_ai}}
|
||||
<div class="itemLabel">
|
||||
Control:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('EJECT FUEL', 'arrow-down', {'action' : "eject"}, data.active ? 'disabled' : null)}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<h3>Output</h3>
|
||||
<div class='item'>
|
||||
<div class="itemLabel">
|
||||
Power setting:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if data.output_set > data.output_safe}}
|
||||
<span class="bad">{{:data.output_set}} / {{:data.output_max}} ({{:data.output_watts}} W)</span>
|
||||
{{else}}
|
||||
<span class="good">{{:data.output_set}} / {{:data.output_max}} ({{:data.output_watts}} W)</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
Control:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:helper.link('+', null, {'action' : "higher_power"})}}
|
||||
{{:helper.link('-', null, {'action' : "lower_power"})}}
|
||||
</div>
|
||||
</div>
|
||||
<h3>Temperature</h3>
|
||||
<div class='item'>
|
||||
<div class="itemLabel">
|
||||
Temperature:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if data.temperature_current < (data.temperature_max * 0.8)}}
|
||||
{{:helper.displayBar(data.temperature_current, 0, (data.temperature_max * 1.5), 'good')}}
|
||||
<br><span class="good">{{:helper.smoothRound(data.temperature_current)}} C</span>
|
||||
{{else data.temperature_current < data.temperature_max}}
|
||||
{{:helper.displayBar(data.temperature_current, 0, (data.temperature_max * 1.5), 'average')}}
|
||||
<br><span class="average">{{:helper.smoothRound(data.temperature_current)}} C</span>
|
||||
{{else}}
|
||||
{{:helper.displayBar(data.temperature_current, 0, (data.temperature_max * 1.5), 'bad')}}
|
||||
<br><span class="bad">{{:helper.smoothRound(data.temperature_current)}} C</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="itemLabel">
|
||||
Generator Status:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if data.temperature_overheat > 50}}
|
||||
<span class="bad">DANGER: CRITICAL OVERHEAT! Deactivate generator immediately!</span>
|
||||
{{else data.temperature_overheat > 20}}
|
||||
<span class="average">WARNING: Overheating!</span>
|
||||
{{else data.temperature_overheat > 1}}
|
||||
<span class="average">Temperature High</span>
|
||||
{{else}}
|
||||
<span class="good">Optimal</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,163 @@
|
||||
import { useBackend } from "../backend";
|
||||
import { Button, Box, Section, ProgressBar, LabeledList, Knob, NumberInput, Flex, Grid } from "../components";
|
||||
import { Window } from "../layouts";
|
||||
import { formatPower } from '../format';
|
||||
|
||||
export const Pacman = (props, context) => {
|
||||
const { act, data } = useBackend(context);
|
||||
const {
|
||||
broken,
|
||||
anchored,
|
||||
active,
|
||||
fuel_type,
|
||||
fuel_usage,
|
||||
fuel_stored, // current fuel level
|
||||
fuel_cap, // fuel_capacity
|
||||
is_ai,
|
||||
tmp_current, // temperature_current
|
||||
tmp_max, // temperature_max
|
||||
tmp_overheat, // temperature_overheat
|
||||
output_max,
|
||||
power_gen,
|
||||
output_set,
|
||||
has_fuel,
|
||||
} = data;
|
||||
let fuelRatio = fuel_stored / fuel_cap;
|
||||
let tmpRatio = tmp_current / tmp_max; // temperature ratio
|
||||
let output_watts = output_set * power_gen;
|
||||
let fuel_sec = Math.round(fuel_stored / fuel_usage);
|
||||
let fuel_min = Math.round(fuel_sec / 60);
|
||||
let usage = fuel_sec > 120
|
||||
? `${fuel_min} minutes`
|
||||
: `${fuel_sec} seconds`;
|
||||
return (
|
||||
<Window>
|
||||
<Window.Content>
|
||||
{((broken || !anchored) && (
|
||||
<Section title="Status">
|
||||
{!!broken && (
|
||||
<Box color="orange">
|
||||
The generator is malfunctioning!
|
||||
</Box>
|
||||
)}
|
||||
{!broken && !anchored && (
|
||||
<Box color="orange">
|
||||
The generator needs to be anchored to the floor with a wrench.
|
||||
</Box>
|
||||
)}
|
||||
</Section>
|
||||
))}
|
||||
{((!broken && !!anchored) && (
|
||||
<div>
|
||||
<Section
|
||||
title="Status"
|
||||
buttons={(<Button
|
||||
icon={active ? 'power-off' : 'times'}
|
||||
content={active ? 'On' : 'Off'}
|
||||
tooltip="Toggles the generator on/off. Requires fuel."
|
||||
tooltipPosition="left"
|
||||
disabled={!has_fuel}
|
||||
selected={active}
|
||||
onClick={() => act('toggle_power')} />
|
||||
)}>
|
||||
<Flex direction="row">
|
||||
<Flex.Item width="50%" className="ml-1">
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Power setting">
|
||||
<NumberInput
|
||||
value={output_set}
|
||||
minValue={1}
|
||||
maxValue={output_max}
|
||||
step={1}
|
||||
className="mt-1"
|
||||
onDrag={(e, value) => act('change_power', {
|
||||
change_power: value,
|
||||
})}
|
||||
/>
|
||||
({formatPower(output_watts)})
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Flex.Item>
|
||||
<Flex.Item width="50%">
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Temperature">
|
||||
<ProgressBar
|
||||
value={tmpRatio}
|
||||
ranges={{
|
||||
green: [-Infinity, 0.33],
|
||||
orange: [0.33, 0.66],
|
||||
red: [0.66, Infinity],
|
||||
}}>
|
||||
{tmp_current} ℃
|
||||
</ProgressBar>
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Status">
|
||||
{tmp_overheat > 50 && (
|
||||
<Box color="red">CRITICAL OVERHEAT!</Box>
|
||||
)}
|
||||
{tmp_overheat > 20 && tmp_overheat <= 50 && (
|
||||
<Box color="orange">WARNING: Overheating!</Box>
|
||||
)}
|
||||
{tmp_overheat > 1 && tmp_overheat <= 20 && (
|
||||
<Box color="orange">Temperature High</Box>
|
||||
)}
|
||||
{tmp_overheat === 0 && (
|
||||
<Box color="green">Optimal</Box>
|
||||
)}
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Flex.Item>
|
||||
</Flex>
|
||||
</Section>
|
||||
<Section title="Fuel" buttons={(
|
||||
<Button
|
||||
icon="eject"
|
||||
content="Eject Fuel"
|
||||
tooltip="Ejects fuel. Generator needs to be offline."
|
||||
tooltipPosition="left"
|
||||
disabled={active || is_ai || !has_fuel}
|
||||
onClick={() => act('eject_fuel')} />
|
||||
)} >
|
||||
<Grid>
|
||||
<Grid.Column>
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Type">
|
||||
{fuel_type}
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Fuel level">
|
||||
<ProgressBar
|
||||
value={fuelRatio}
|
||||
ranges={{
|
||||
red: [-Infinity, 0.33],
|
||||
orange: [0.33, 0.66],
|
||||
green: [0.66, Infinity],
|
||||
}} >
|
||||
{Math.round(fuel_stored / 1000)} dm³
|
||||
</ProgressBar>
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Grid.Column>
|
||||
<Grid.Column>
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Fuel usage">
|
||||
{fuel_usage / 1000} dm³/s
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Fuel depletion">
|
||||
{!!has_fuel && (fuel_usage
|
||||
? usage
|
||||
: "N/A")}
|
||||
{!has_fuel && (
|
||||
<Box color="red">
|
||||
Out of fuel
|
||||
</Box>)}
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Grid.Column>
|
||||
</Grid>
|
||||
</Section>
|
||||
</div>
|
||||
))}
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user