From a965645d513fcd5aec013a308e9aaa1b481d7e72 Mon Sep 17 00:00:00 2001 From: Fluffy <65877598+FluffyGhoster@users.noreply.github.com> Date: Sun, 28 May 2023 22:45:02 +0200 Subject: [PATCH] Port+Changelog (#16291) --- aurorastation.dme | 1 + .../circuitboards/machinery/miscboards.dm | 15 +- .../binary_devices/binary_atmos_base.dm | 11 +- .../binary_devices/oxyregenerator.dm | 193 ++++++++++++++++++ .../designs/circuit/machine_circuits.dm | 7 +- .../fluffyghost-portoxyregenerator.yml | 42 ++++ icons/atmos/oxyregenerator.dmi | Bin 0 -> 8585 bytes nano/templates/oxyregenerator.tmpl | 136 ++++++++++++ 8 files changed, 397 insertions(+), 8 deletions(-) create mode 100644 code/modules/atmospherics/components/binary_devices/oxyregenerator.dm create mode 100644 html/changelogs/fluffyghost-portoxyregenerator.yml create mode 100644 icons/atmos/oxyregenerator.dmi create mode 100644 nano/templates/oxyregenerator.tmpl diff --git a/aurorastation.dme b/aurorastation.dme index 005fa13f1de..6ec0b12b4aa 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1380,6 +1380,7 @@ #include "code\modules\atmospherics\components\valve.dm" #include "code\modules\atmospherics\components\binary_devices\binary_atmos_base.dm" #include "code\modules\atmospherics\components\binary_devices\circulator.dm" +#include "code\modules\atmospherics\components\binary_devices\oxyregenerator.dm" #include "code\modules\atmospherics\components\binary_devices\passive_gate.dm" #include "code\modules\atmospherics\components\binary_devices\pump.dm" #include "code\modules\atmospherics\components\binary_devices\volume_pump.dm" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm index 5510a9bd9e2..b80fe75a2b8 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif //Stuff that doesn't fit into any category goes here @@ -167,7 +167,7 @@ desc = "The circuitboard for a holopad." build_path = /obj/machinery/hologram/holopad origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2) - board_type = "machine" + board_type = "machine" req_components = list( "/obj/item/stock_parts/capacitor" = 2, "/obj/item/stock_parts/scanning_module" = 1) @@ -193,4 +193,13 @@ "/obj/item/reagent_containers/syringe" = 1, "/obj/item/stock_parts/matter_bin" = 1, "/obj/item/stock_parts/manipulator" = 1, - "/obj/item/stock_parts/scanning_module" = 1) \ No newline at end of file + "/obj/item/stock_parts/scanning_module" = 1) +/obj/item/circuitboard/oxyregenerator + name = "circuit board (oxygen regenerator)" + build_path = /obj/machinery/atmospherics/binary/oxyregenerator + board_type = "machine" + origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + req_components = list( + "/obj/item/stock_parts/micro_laser" = 1, + "/obj/item/stock_parts/manipulator" = 1, + "/obj/item/stock_parts/matter_bin" = 1) diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index 8ee54f0dd8d..1099704f6ea 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -133,7 +133,10 @@ return null /obj/machinery/atmospherics/binary/AltClick(var/mob/user) - if(!allowed(user)) - to_chat(user, SPAN_WARNING("Access denied.")) - return - Topic(src, list("power" = "1")) + if(src.anchored) + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) + return + Topic(src, list("power" = "1")) + else + . = ..() diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm new file mode 100644 index 00000000000..7e2427362ff --- /dev/null +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -0,0 +1,193 @@ +/obj/machinery/atmospherics/binary/oxyregenerator + name ="oxygen regenerator" + desc = "A machine for breaking bonds in carbon dioxide and releasing pure oxygen." + icon = 'icons/atmos/oxyregenerator.dmi' + icon_state = "off" + level = 1 + density = TRUE + use_power = POWER_USE_OFF + obj_flags = OBJ_FLAG_ROTATABLE + idle_power_usage = 200 //internal circuitry, friction losses and stuff + power_rating = 10000 + + component_types = list( + /obj/item/circuitboard/oxyregenerator, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/micro_laser, + ) + + var/target_pressure = 10*ONE_ATMOSPHERE + var/id = null + var/power_setting = 1 //power consumption setting, 1 through five + var/carbon_stored = 0 + var/carbon_efficiency = 0.5 + var/intake_power_efficiency = 1 + var/const/carbon_moles_per_piece = 50 //One 12g per mole * 50 = 600 g chunk of coal + var/phase = "filling"//"filling", "processing", "releasing" + var/datum/gas_mixture/inner_tank = new + var/tank_volume = 400//Litres + +/obj/machinery/atmospherics/binary/oxyregenerator/Initialize() + . = ..() + anchored = TRUE + RefreshParts() + anchor_helper() + +/obj/machinery/atmospherics/binary/oxyregenerator/RefreshParts() + carbon_efficiency = initial(carbon_efficiency) + intake_power_efficiency = initial(intake_power_efficiency) + power_rating = 1 + + for(var/obj/item/stock_parts/P in component_parts) + if(ismatterbin(P)) + carbon_efficiency += (0.25 * P.rating) - 0.25 + else if(ismanipulator(P)) + intake_power_efficiency -= (0.1 * P.rating) - 0.1 + else if(ismicrolaser(P)) + power_rating -= (0.05 * P.rating) - 0.05 + + carbon_efficiency = clamp(carbon_efficiency, initial(carbon_efficiency), 5) + intake_power_efficiency = clamp(intake_power_efficiency, 0.1, initial(intake_power_efficiency)) + power_rating = clamp(power_rating, 0.1, 1) + power_rating *= initial(power_rating) + ..() + +/obj/machinery/atmospherics/binary/oxyregenerator/examine(user) + . = ..() + to_chat(user,"Its outlet port is to the [dir2text(dir)]") + +/obj/machinery/atmospherics/binary/oxyregenerator/attackby(obj/item/O as obj, mob/user as mob) + if(O.iswrench()) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + anchored = !anchored + user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ + "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.", \ + "You hear a ratchet") + + anchor_helper() + +/obj/machinery/atmospherics/binary/oxyregenerator/proc/anchor_helper() + if(anchored) + if(dir & (NORTH|SOUTH)) + initialize_directions = NORTH|SOUTH + else if(dir & (EAST|WEST)) + initialize_directions = EAST|WEST + + atmos_init() + build_network() + if (node1) + node1.atmos_init() + node1.build_network() + if (node2) + node2.atmos_init() + node2.build_network() + else + if(node1) + node1.disconnect(src) + qdel(network1) + if(node2) + node2.disconnect(src) + qdel(network2) + +/obj/machinery/atmospherics/binary/oxyregenerator/attack_hand(mob/user) + . = ..() + ui_interact(user) + +/obj/machinery/atmospherics/binary/oxyregenerator/process() + . = ..() + if((inoperable()) || !use_power) + return + + var/power_draw = -1 + last_power_draw = 0 + //TODO Add overlay with F-P-R letter to display current state + if (phase == "filling")//filling tank + var/pressure_delta = target_pressure - inner_tank.return_pressure() + if (pressure_delta > 0.01 && air1.temperature > 0) + var/transfer_moles = calculate_transfer_moles(air1, inner_tank, pressure_delta) + power_draw = pump_gas(src, air1, inner_tank, transfer_moles, power_rating*power_setting) * intake_power_efficiency + if (power_draw >= 0) + last_power_draw = power_draw + use_power_oneoff(power_draw) + if(network1) + network1.update = 1 + if (air1.return_pressure() < 0.1 * ONE_ATMOSPHERE || inner_tank.return_pressure() >= target_pressure * 0.95)//if pipe is good as empty or tank is full + phase = "processing" + + if (phase == "processing")//processing CO2 in tank + if (inner_tank.gas[GAS_CO2]) + var/co2_intake = clamp(inner_tank.gas[GAS_CO2], 0, power_setting * 0.1) + last_flow_rate = co2_intake + inner_tank.adjust_gas(GAS_CO2, -co2_intake, 1) + var/datum/gas_mixture/new_oxygen = new + new_oxygen.adjust_gas(GAS_OXYGEN, co2_intake) + new_oxygen.temperature = T20C+30 //it's sort of hot after molecular bond breaking + inner_tank.merge(new_oxygen) + carbon_stored += co2_intake * carbon_efficiency + while (carbon_stored >= carbon_moles_per_piece) + carbon_stored -= carbon_moles_per_piece + var/material/M = SSmaterials.get_material_by_name(MATERIAL_GRAPHITE) + M.place_sheet(get_turf(src), 1, M.name) + power_draw = power_rating * co2_intake + last_power_draw = power_draw + use_power_oneoff(power_draw) + else + phase = "releasing" + + if (phase == "releasing")//releasing processed gas mix + power_draw = -1 + var/pressure_delta = target_pressure - air2.return_pressure() + if (pressure_delta > 0.01 && inner_tank.temperature > 0) + var/transfer_moles = calculate_transfer_moles(inner_tank, air2, pressure_delta, (network2)? network2.volume : 0) + power_draw = pump_gas(src, inner_tank, air2, transfer_moles, power_rating*power_setting) + if (power_draw >= 0) + last_power_draw = power_draw + use_power_oneoff(power_draw) + if(network2) + network2.update = 1 + else//can't push outside harder than target pressure. Device is not intended to be used as a pump after all + phase = "filling" + if (inner_tank.return_pressure() <= 0.1) + phase = "filling" + +/obj/machinery/atmospherics/binary/oxyregenerator/update_icon() + if(stat & (BROKEN|NOPOWER)) + icon_state = "off" + else + icon_state = "[use_power ? "on" : "off"]" + +/obj/machinery/atmospherics/binary/oxyregenerator/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + var/data[0] + data["on"] = use_power ? 1 : 0 + data["powerSetting"] = power_setting + data["gasProcessed"] = last_flow_rate + data["air1Pressure"] = round(air1.return_pressure()) + data["air2Pressure"] = round(air2.return_pressure()) + data["tankPressure"] = round(inner_tank.return_pressure()) + data["targetPressure"] = round(target_pressure) + data["phase"] = phase + if (inner_tank.total_moles > 0) + data["co2"] = round(100 * inner_tank.gas[GAS_CO2]/inner_tank.total_moles) + data["o2"] = round(100 * inner_tank.gas[GAS_OXYGEN]/inner_tank.total_moles) + else + data["co2"] = 0 + data["o2"] = 0 + // update the ui if it exists, returns null if no ui is passed/found + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "oxyregenerator.tmpl", "Oxygen Regeneration System", 440, 300) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/atmospherics/binary/oxyregenerator/Topic(href, href_list) + if(..()) + return 1 + if(href_list["power"]) + update_use_power(!use_power) + update_icon() + return 1 + if(href_list["setPower"]) //setting power to 0 is redundant anyways + power_setting = clamp(text2num(href_list["setPower"]), 1, 5) + return 1 diff --git a/code/modules/research/designs/circuit/machine_circuits.dm b/code/modules/research/designs/circuit/machine_circuits.dm index e4441053b22..90976f4f112 100644 --- a/code/modules/research/designs/circuit/machine_circuits.dm +++ b/code/modules/research/designs/circuit/machine_circuits.dm @@ -235,4 +235,9 @@ /datum/design/circuit/machine/iv_drip name = "IV drip" req_tech = list(TECH_DATA = 1, TECH_BIO = 2) - build_path = /obj/item/circuitboard/iv_drip \ No newline at end of file + build_path = /obj/item/circuitboard/iv_drip + +/datum/design/circuit/oxyregenerator + name = "oxygen regenerator" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/circuitboard/oxyregenerator diff --git a/html/changelogs/fluffyghost-portoxyregenerator.yml b/html/changelogs/fluffyghost-portoxyregenerator.yml new file mode 100644 index 00000000000..54c3f2319c9 --- /dev/null +++ b/html/changelogs/fluffyghost-portoxyregenerator.yml @@ -0,0 +1,42 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: Fluffyghost + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Ported oxygen regenerator from Bay." + - bugfix: "Resolved an issue where binary atmos items could not be rotated with alt-click despite the description saying so." diff --git a/icons/atmos/oxyregenerator.dmi b/icons/atmos/oxyregenerator.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f40b94096e106e0ce61f51ef027fa887ccf20ad5 GIT binary patch literal 8585 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 c>BW(uhZIh8R@sx6f!>1jvk literal 0 HcmV?d00001 diff --git a/nano/templates/oxyregenerator.tmpl b/nano/templates/oxyregenerator.tmpl new file mode 100644 index 00000000000..19cb4fdd7c9 --- /dev/null +++ b/nano/templates/oxyregenerator.tmpl @@ -0,0 +1,136 @@ +
+
+ Status: +
+
+ {{:helper.link('On', 'power', {'power' : 1}, data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', {'power' : 1}, data.on ? null : 'selected')}} +
+
+ +
+
+ Power Level: +
+
+ {{:helper.link('1', null, {'setPower' : 1}, (data.powerSetting == 1)? 'selected' : null)}} + {{:helper.link('2', null, {'setPower' : 2}, (data.powerSetting == 2)? 'selected' : null)}} + {{:helper.link('3', null, {'setPower' : 3}, (data.powerSetting == 3)? 'selected' : null)}} + {{:helper.link('4', null, {'setPower' : 4}, (data.powerSetting == 4)? 'selected' : null)}} + {{:helper.link('5', null, {'setPower' : 5}, (data.powerSetting == 5)? 'selected' : null)}} +
+
+ + +{{if data.phase == "filling"}} +
+
+ Processing phase: +
+
+ filling inner tank +
+
+
+
+ Input pressure: +
+
+ {{:data.air1Pressure}} kPa +
+
+
+
+ Tank pressure: +
+
+ {{:data.tankPressure}} kPa +
+
+
+
+ Target tank pressure: +
+
+ {{:data.targetPressure}} kPa +
+
+{{/if}} + +{{if data.phase == "processing"}} +
+
+ Processing phase: +
+
+ processing gas mix +
+
+
+
+ Processing rate: +
+
+ {{:data.gasProcessed}} moles +
+
+
+
+ Tank pressure: +
+
+ {{:data.tankPressure}} kPa +
+
+
+
+ CO2 content: +
+
+ {{:data.co2}} % +
+
+
+
+ O2 content: +
+
+ {{:data.o2}} % +
+
+{{/if}} + + +{{if data.phase == "releasing"}} +
+
+ Processing phase: +
+
+ releasing processed gas mix +
+
+
+
+ Tank pressure: +
+
+ {{:data.tankPressure}} kPa +
+
+
+
+ Output Pressure: +
+
+ {{:data.air2Pressure}} kPa +
+
+
+
+ Target release pressure: +
+
+ {{:data.targetPressure}} kPa +
+
+{{/if}}