Merge pull request #14378 from RedWolfie/pacman

[TGUI] Pacman
This commit is contained in:
AffectedArc07
2020-09-22 18:42:16 +01:00
committed by GitHub
4 changed files with 208 additions and 165 deletions
+42 -49
View File
@@ -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"
-113
View File
@@ -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>
+163
View File
@@ -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} &#8451;
</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&sup3;
</ProgressBar>
</LabeledList.Item>
</LabeledList>
</Grid.Column>
<Grid.Column>
<LabeledList>
<LabeledList.Item label="Fuel usage">
{fuel_usage / 1000} dm&sup3;/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