diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
index 506258cdf9..b7c80761a9 100644
--- a/code/WorkInProgress/Mini/atmos_control.dm
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -13,9 +13,19 @@
var/overridden = 0 //not set yet, can't think of a good way to do it
req_access = list(access_ce)
+
+/obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob)
+ return interact(user)
+
+/obj/machinery/computer/atmoscontrol/attack_paw(var/mob/user as mob)
+ return interact(user)
+
/obj/machinery/computer/atmoscontrol/attack_hand(mob/user)
if(..())
return
+ return interact(user)
+
+/obj/machinery/computer/atmoscontrol/interact(mob/user)
user.set_machine(src)
if(allowed(user))
overridden = 1
@@ -62,7 +72,6 @@
return
if(href_list["reset"])
current = null
- src.updateUsrDialog()
if(href_list["alarm"])
current = locate(href_list["alarm"])
if(href_list["command"])
@@ -129,6 +138,11 @@
selected[2] = selected[4]
if(selected[3] > selected[4])
selected[3] = selected[4]
+
+ //Sets the temperature the built-in heater/cooler tries to maintain.
+ if(env == "temperature")
+ current.target_temperature = (selected[2] + selected[3])/2
+
spawn(1)
updateUsrDialog()
return
@@ -167,7 +181,7 @@
spawn(5)
src.updateUsrDialog()
return
- src.updateUsrDialog()
+ updateUsrDialog()
//copypasta from alarm code, changed to work with this without derping hard
//---START COPYPASTA----
@@ -185,7 +199,7 @@
output += {"
Scrubbers Control
Vents Control
-Set envirenomentals mode
+Set environmental mode
Sensor Control
"}
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index cede9d6bf8..ea06ad8729 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -31,7 +31,7 @@
#define AALARM_MODE_SCRUBBING 1
#define AALARM_MODE_REPLACEMENT 2 //like scrubbing, but faster.
#define AALARM_MODE_PANIC 3 //constantly sucks all air
-#define AALARM_MODE_CYCLE 4 //sucks off all air, then refill and swithes to scrubbing
+#define AALARM_MODE_CYCLE 4 //sucks off all air, then refill and switches to scrubbing
#define AALARM_MODE_FILL 5 //emergency fill
#define AALARM_SCREEN_MAIN 1
@@ -46,6 +46,9 @@
#define RCON_AUTO 2
#define RCON_YES 3
+//1000 joules equates to about 1 degree every 2 seconds for a single tile of air.
+#define MAX_ENERGY_CHANGE 2000
+
//all air alarms in area are connected via magic
/area
var/obj/machinery/alarm/master_air_alarm
@@ -82,6 +85,9 @@
var/area/alarm_area
var/danger_level = 0
+ var/target_temperature = T0C+20
+ var/regulating_temperature = 0
+
var/datum/radio_frequency/radio_connection
var/list/TLV = list()
@@ -95,6 +101,7 @@
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
TLV["pressure"] = list(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */
TLV["temperature"] = list(20, 40, 140, 160) // K
+ target_temperature = 90
New()
..()
@@ -111,7 +118,7 @@
TLV["plasma"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
TLV["pressure"] = list(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20) /* kpa */
- TLV["temperature"] = list(T0C, T0C+10, T0C+40, T0C+66) // K
+ TLV["temperature"] = list(T0C-26, T0C, T0C+40, T0C+66) // K
initialize()
set_frequency(frequency)
@@ -151,6 +158,41 @@
current_settings = TLV["temperature"]
var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings)
+ //Handle temperature adjustment here.
+ if(temperature_dangerlevel || regulating_temperature)
+ //If it goes too far, we should adjust ourselves back before stopping.
+ if(!regulating_temperature)
+ regulating_temperature = 1
+ visible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\
+ "You hear a click and a faint electronic hum.")
+
+ if(target_temperature > T0C + 90)
+ target_temperature = T0C + 90
+
+ if(target_temperature < T0C - 40)
+ target_temperature = T0C - 40
+
+ var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles)
+ var/heat_capacity = gas.heat_capacity()
+ var/energy_used = max( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE)
+
+ //Use power. Assuming that each power unit represents 1000 watts....
+ use_power(energy_used/1000, ENVIRON)
+
+ //We need to cool ourselves.
+ if(environment.temperature > target_temperature)
+ gas.temperature -= energy_used/heat_capacity
+ else
+ gas.temperature -= energy_used/heat_capacity
+
+ environment.merge(gas)
+
+ if(abs(environment.temperature - target_temperature) <= 0.5)
+ regulating_temperature = 0
+ visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\
+ "You hear a click as a faint electronic humming stops.")
+
+
var/old_danger_level = danger_level
danger_level = max(pressure_dangerlevel,
oxygen_dangerlevel,
@@ -513,11 +555,16 @@
//END HACKING//
///////////////
+ attack_ai(mob/user)
+ return interact(user)
attack_hand(mob/user)
. = ..()
if (.)
return
+ return interact(user)
+
+ interact(mob/user)
user.set_machine(src)
if ( (get_dist(src, user) > 1 ))
@@ -900,6 +947,11 @@ table tr:first-child th:first-child { border: none;}
selected[2] = selected[4]
if(selected[3] > selected[4])
selected[3] = selected[4]
+
+ //Sets the temperature the built-in heater/cooler tries to maintain.
+ if(env == "temperature")
+ target_temperature = (selected[2] + selected[3])/2
+
apply_mode()
if(href_list["screen"])
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index a27544b47c..9a6849dcdf 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -83,6 +83,10 @@
attack_hand(mob/user as mob)
src.add_fingerprint(user)
+ interact(user)
+
+ interact(mob/user as mob)
+
if(open)
var/dat
@@ -127,7 +131,7 @@
var/value = text2num(href_list["val"])
// limit to 20-90 degC
- set_temperature = dd_range(20, 90, set_temperature + value)
+ set_temperature = dd_range(0, 90, set_temperature + value)
if("cellremove")
if(open && cell && !usr.get_active_hand())
@@ -164,7 +168,7 @@
var/turf/simulated/L = loc
if(istype(L))
var/datum/gas_mixture/env = L.return_air()
- if(env.temperature < (set_temperature+T0C))
+ if(env.temperature != set_temperature + T0C)
var/transfer_moles = 0.25 * env.total_moles()
@@ -176,10 +180,12 @@
var/heat_capacity = removed.heat_capacity()
//world << "heating ([heat_capacity])"
- if(heat_capacity == 0 || heat_capacity == null) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
- heat_capacity = 1
- removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
- cell.use(heating_power/20000)
+ if(heat_capacity) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
+ if(removed.temperature < set_temperature + T0C)
+ removed.temperature = min(removed.temperature + heating_power/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
+ else
+ removed.temperature = max(removed.temperature - heating_power/heat_capacity, TCMB)
+ cell.use(heating_power/20000)
//world << "now at [removed.temperature]"