Files
Katherine Kiefer 16a490ee5c update auxmos
2023-08-18 22:13:30 +10:00

178 lines
5.2 KiB
Plaintext

#define GASMINER_POWER_NONE 0
#define GASMINER_POWER_STATIC 1
#define GASMINER_POWER_MOLES 2 //Scaled from here on down.
#define GASMINER_POWER_KPA 3
#define GASMINER_POWER_FULLSCALE 4
/obj/machinery/atmospherics/miner
name = "gas miner"
desc = "Gasses mined from the gas giant below (above?) flow out through this massive vent."
icon = 'icons/obj/atmospherics/components/miners.dmi'
icon_state = "miner"
density = FALSE
resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF
var/spawn_id = null
var/spawn_temp = T20C
var/spawn_mol = MOLES_CELLSTANDARD * 10
var/max_ext_mol = INFINITY
var/max_ext_kpa = 6500
var/overlay_color = "#FFFFFF"
var/active = TRUE
var/power_draw = 0
var/power_draw_static = 2000
var/power_draw_dynamic_mol_coeff = 5 //DO NOT USE DYNAMIC SETTINGS UNTIL SOMEONE MAKES A USER INTERFACE/CONTROLLER FOR THIS!
var/power_draw_dynamic_kpa_coeff = 0.5
var/broken = FALSE
var/broken_message = "ERROR"
idle_power_usage = 150
active_power_usage = 2000
/obj/machinery/atmospherics/miner/Initialize(mapload)
. = ..()
set_active(active) //Force overlay update.
/obj/machinery/atmospherics/miner/examine(mob/user)
. = ..()
if(broken)
. += "Its debug output is printing \"[broken_message]\"."
/obj/machinery/atmospherics/miner/proc/check_operation()
if(!active)
return FALSE
var/turf/T = get_turf(src)
if(!isopenturf(T))
broken_message = "<span class='boldnotice'>VENT BLOCKED</span>"
set_broken(TRUE)
return FALSE
var/turf/open/OT = T
if(OT.planetary_atmos)
broken_message = "<span class='boldwarning'>DEVICE NOT ENCLOSED IN A PRESSURIZED ENVIRONMENT</span>"
set_broken(TRUE)
return FALSE
if(isspaceturf(T))
broken_message = "<span class='boldnotice'>AIR VENTING TO SPACE</span>"
set_broken(TRUE)
return FALSE
var/datum/gas_mixture/G = OT.return_air()
if(G.return_pressure() > (max_ext_kpa - ((spawn_mol*spawn_temp*R_IDEAL_GAS_EQUATION)/(CELL_VOLUME))))
broken_message = "<span class='boldwarning'>EXTERNAL PRESSURE OVER THRESHOLD</span>"
set_broken(TRUE)
return FALSE
if(G.total_moles() > max_ext_mol)
broken_message = "<span class='boldwarning'>EXTERNAL AIR CONCENTRATION OVER THRESHOLD</span>"
set_broken(TRUE)
return FALSE
if(broken)
set_broken(FALSE)
broken_message = ""
return TRUE
/obj/machinery/atmospherics/miner/proc/set_active(setting)
if(active != setting)
active = setting
update_icon()
/obj/machinery/atmospherics/miner/proc/set_broken(setting)
if(broken != setting)
broken = setting
update_icon()
/obj/machinery/atmospherics/miner/proc/update_power()
if(!active)
active_power_usage = idle_power_usage
var/turf/T = get_turf(src)
var/datum/gas_mixture/G = T.return_air()
var/P = G.return_pressure()
switch(power_draw)
if(GASMINER_POWER_NONE)
active_power_usage = 0
if(GASMINER_POWER_STATIC)
active_power_usage = power_draw_static
if(GASMINER_POWER_MOLES)
active_power_usage = spawn_mol * power_draw_dynamic_mol_coeff
if(GASMINER_POWER_KPA)
active_power_usage = P * power_draw_dynamic_kpa_coeff
if(GASMINER_POWER_FULLSCALE)
active_power_usage = (spawn_mol * power_draw_dynamic_mol_coeff) + (P * power_draw_dynamic_kpa_coeff)
/obj/machinery/atmospherics/miner/proc/do_use_power(amount)
var/turf/T = get_turf(src)
if(T && istype(T))
var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked
if(C && C.powernet && (C.powernet.avail > amount))
C.powernet.load += amount
return TRUE
if(powered())
use_power(amount)
return TRUE
return FALSE
/obj/machinery/atmospherics/miner/update_icon()
cut_overlays()
if(broken)
add_overlay("broken")
else if(active)
var/mutable_appearance/on_overlay = mutable_appearance(icon, "on")
on_overlay.color = overlay_color
add_overlay(on_overlay)
/obj/machinery/atmospherics/miner/process_atmos()
update_power()
check_operation()
if(active && !broken)
if(isnull(spawn_id))
return FALSE
if(do_use_power(active_power_usage))
mine_gas()
/obj/machinery/atmospherics/miner/proc/mine_gas()
var/turf/open/O = get_turf(src)
if(!isopenturf(O))
return FALSE
var/datum/gas_mixture/merger = new
merger.set_moles(spawn_id, spawn_mol)
merger.set_temperature(spawn_temp)
O.assume_air(merger)
O.air_update_turf(TRUE)
/obj/machinery/atmospherics/miner/attack_ai(mob/living/silicon/user)
if(broken)
to_chat(user, "[src] seems to be broken. Its debug interface outputs: [broken_message]")
..()
/obj/machinery/atmospherics/miner/n2o
name = "\improper N2O Gas Miner"
overlay_color = "#FFCCCC"
spawn_id = GAS_NITROUS
/obj/machinery/atmospherics/miner/nitrogen
name = "\improper N2 Gas Miner"
overlay_color = "#CCFFCC"
spawn_id = GAS_N2
/obj/machinery/atmospherics/miner/oxygen
name = "\improper O2 Gas Miner"
overlay_color = "#007FFF"
spawn_id = GAS_O2
/obj/machinery/atmospherics/miner/toxins
name = "\improper Plasma Gas Miner"
overlay_color = "#FF0000"
spawn_id = GAS_PLASMA
/obj/machinery/atmospherics/miner/carbon_dioxide
name = "\improper CO2 Gas Miner"
overlay_color = "#CDCDCD"
spawn_id = GAS_CO2
/obj/machinery/atmospherics/miner/bz
name = "\improper BZ Gas Miner"
overlay_color = "#FAFF00"
spawn_id = GAS_BZ
/obj/machinery/atmospherics/miner/water_vapor
name = "\improper Water Vapor Gas Miner"
overlay_color = "#99928E"
spawn_id = GAS_H2O