Files
vgstation13/code/ATMOSPHERICS/components/unary/thermal_plate.dm
clusterfack c850a69443 Fixes h/e pipes and thermal plates
Fixes #2864
Fixes #4078

They would radiate and make ultra cold gas under 10 moles, 10 moles is about 10kpa at 20C, which is simply way too high.

They will radiate at less than .001 only, less than the standard moles for a standard 'gasless' tile. And to similarly limit unnecessary gas exchange procs being called pointlessly, will only intermix with at least 1 mole in the atmosphere.
2015-05-20 06:29:41 -05:00

98 lines
3.2 KiB
Plaintext

#define RADIATION_CAPACITY 30000 //Radiation isn't particularly effective (TODO BALANCE)
/obj/machinery/atmospherics/unary/thermal_plate
//Based off Heat Reservoir and Space Heater
//Transfers heat between a pipe system and environment, based on which has a greater thermal energy concentration
icon = 'icons/obj/atmospherics/cold_sink.dmi'
icon_state = "off"
level = 1
name = "Thermal Transfer Plate"
desc = "Transfers heat to and from an area"
/obj/machinery/atmospherics/unary/thermal_plate/update_icon()
var/prefix=""
//var/suffix="_idle" // Also available: _heat, _cool
if(level == 1 && istype(loc, /turf/simulated))
prefix="h"
icon_state = "[prefix]off"
/obj/machinery/atmospherics/unary/thermal_plate/process()
. = ..()
var/datum/gas_mixture/environment = loc.return_air()
//Get processable air sample and thermal info from environment
var/environment_moles = environment.total_moles()
var/transfer_moles = 0.25 * environment_moles
var/datum/gas_mixture/external_removed = environment.remove(transfer_moles)
if(!external_removed)
return radiate()
if(environment_moles < NO_GAS)
return radiate()
else if(environment_moles < SOME_GAS)
return 0
//Get same info from connected gas
var/internal_transfer_moles = 0.25 * air_contents.total_moles()
var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles)
if (!internal_removed)
environment.merge(external_removed)
return
var/combined_heat_capacity = internal_removed.heat_capacity() + external_removed.heat_capacity()
var/combined_energy = internal_removed.temperature * internal_removed.heat_capacity() + external_removed.heat_capacity() * external_removed.temperature
if(!combined_heat_capacity) combined_heat_capacity = 1
var/final_temperature = combined_energy / combined_heat_capacity
external_removed.temperature = final_temperature
environment.merge(external_removed)
internal_removed.temperature = final_temperature
air_contents.merge(internal_removed)
network.update = 1
return 1
/obj/machinery/atmospherics/unary/thermal_plate/hide(var/i) //to make the little pipe section invisible, the icon changes.
var/prefix=""
//var/suffix="_idle" // Also available: _heat, _cool
if(i == 1 && istype(loc, /turf/simulated))
prefix="h"
icon_state = "[prefix]off"
return
/obj/machinery/atmospherics/unary/thermal_plate/proc/radiate()
if(network && network.radiate) //Since each member of a network has the same gases each tick
air_contents.copy_from(network.radiate) //We can cut down on processing time by only calculating radiate() once and then applying the result
return
var/internal_transfer_moles = 0.25 * air_contents.total_moles()
var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles)
if (!internal_removed)
return
var/combined_heat_capacity = internal_removed.heat_capacity() + RADIATION_CAPACITY
var/combined_energy = internal_removed.temperature * internal_removed.heat_capacity() + (RADIATION_CAPACITY * 6.4)
var/final_temperature = combined_energy / combined_heat_capacity
internal_removed.temperature = final_temperature
air_contents.merge(internal_removed)
if (network)
network.update = 1
network.radiate = air_contents
return 1