diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index f4cbd75b758..e7f1fe3f9d2 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -15,18 +15,28 @@
max_integrity = 250
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10)
circuit = /obj/item/circuitboard/machine/space_heater
- /// We don't use area power, we always use the cell
+ //We don't use area power, we always use the cell
use_power = NO_POWER_USE
+ ///The cell we spawn with
var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell
+ ///Is the machine on?
var/on = FALSE
+ ///What is the mode we are in now?
var/mode = HEATER_MODE_STANDBY
- var/setMode = HEATER_MODE_AUTO // Anything other than "heat" or "cool" is considered auto.
- var/targetTemperature = T20C
- var/heatingPower = 20000
+ ///Anything other than "heat" or "cool" is considered auto.
+ var/set_mode = HEATER_MODE_AUTO
+ ///The temperature we trying to get to
+ var/target_temperature = T20C
+ ///How much heat/cold we can deliver
+ var/heating_power = 40000
+ ///How efficiently we can deliver that heat/cold (higher indicates less cell consumption)
var/efficiency = 20000
- var/temperatureTolerance = 1
- var/settableTemperatureMedian = 30 + T0C
- var/settableTemperatureRange = 30
+ ///The amount of degrees above and below the target temperature for us to change mode to heater or cooler
+ var/temperature_tolerance = 1
+ ///What's the middle point of our settable temperature (30 °C)
+ var/settable_temperature_median = 30 + T0C
+ ///Range of temperatures above and below the median that we can set our target temperature (increase by upgrading the capacitors)
+ var/settable_temperature_range = 30
/obj/machinery/space_heater/get_cell()
return cell
@@ -37,13 +47,6 @@
cell = new cell(src)
update_appearance()
-/obj/machinery/space_heater/on_construction()
- qdel(cell)
- cell = null
- panel_open = TRUE
- update_appearance()
- return ..()
-
/obj/machinery/space_heater/on_deconstruction()
if(cell)
LAZYADD(component_parts, cell)
@@ -58,12 +61,11 @@
else
. += "There is no power cell installed."
if(in_range(user, src) || isobserver(user))
- . += "The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [siunit(heatingPower, "W", 1)].
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25%
+ . += "The status display reads: Temperature range at [settable_temperature_range]°C.
Heating power at [siunit(heating_power, "W", 1)].
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25%
/obj/machinery/space_heater/update_icon_state()
- icon_state = "[base_icon_state]-[on ? mode : "off"]"
. = ..()
- return
+ icon_state = "[base_icon_state]-[on ? mode : "off"]"
/obj/machinery/space_heater/update_overlays()
. = ..()
@@ -76,48 +78,48 @@
on = FALSE
return PROCESS_KILL
- if(cell && cell.charge > 0)
- var/turf/L = loc
- if(!istype(L))
- if(mode != HEATER_MODE_STANDBY)
- mode = HEATER_MODE_STANDBY
- update_appearance()
- return
-
- var/datum/gas_mixture/env = L.return_air()
-
- var/newMode = HEATER_MODE_STANDBY
- if(setMode != HEATER_MODE_COOL && env.temperature < targetTemperature - temperatureTolerance)
- newMode = HEATER_MODE_HEAT
- else if(setMode != HEATER_MODE_HEAT && env.temperature > targetTemperature + temperatureTolerance)
- newMode = HEATER_MODE_COOL
-
- if(mode != newMode)
- mode = newMode
- update_appearance()
-
- if(mode == HEATER_MODE_STANDBY)
- return
-
- var/heat_capacity = env.heat_capacity()
- var/requiredEnergy = abs(env.temperature - targetTemperature) * heat_capacity
- requiredEnergy = min(requiredEnergy, heatingPower * delta_time)
-
- if(requiredEnergy < 1)
- return
-
- var/deltaTemperature = requiredEnergy / heat_capacity
- if(mode == HEATER_MODE_COOL)
- deltaTemperature *= -1
- if(deltaTemperature)
- env.temperature += deltaTemperature
- air_update_turf(FALSE, FALSE)
- cell.use(requiredEnergy / efficiency)
- else
+ if(!cell || cell.charge <= 0)
on = FALSE
update_appearance()
return PROCESS_KILL
+ var/turf/local_turf = loc
+ if(!istype(local_turf))
+ if(mode != HEATER_MODE_STANDBY)
+ mode = HEATER_MODE_STANDBY
+ update_appearance()
+ return
+
+ var/datum/gas_mixture/enviroment = local_turf.return_air()
+
+ var/new_mode = HEATER_MODE_STANDBY
+ if(set_mode != HEATER_MODE_COOL && enviroment.temperature < target_temperature - temperature_tolerance)
+ new_mode = HEATER_MODE_HEAT
+ else if(set_mode != HEATER_MODE_HEAT && enviroment.temperature > target_temperature + temperature_tolerance)
+ new_mode = HEATER_MODE_COOL
+
+ if(mode != new_mode)
+ mode = new_mode
+ update_appearance()
+
+ if(mode == HEATER_MODE_STANDBY)
+ return
+
+ var/heat_capacity = enviroment.heat_capacity()
+ var/required_energy = abs(enviroment.temperature - target_temperature) * heat_capacity
+ required_energy = min(required_energy, heating_power * delta_time)
+
+ if(required_energy < 1)
+ return
+
+ var/delta_temperature = required_energy / heat_capacity
+ if(mode == HEATER_MODE_COOL)
+ delta_temperature *= -1
+ if(delta_temperature)
+ enviroment.temperature += delta_temperature
+ air_update_turf(FALSE, FALSE)
+ cell.use(required_energy / efficiency)
+
/obj/machinery/space_heater/RefreshParts()
var/laser = 0
var/cap = 0
@@ -126,14 +128,14 @@
for(var/obj/item/stock_parts/capacitor/M in component_parts)
cap += M.rating
- heatingPower = laser * 20000
+ heating_power = laser * 40000
- settableTemperatureRange = cap * 30
+ settable_temperature_range = cap * 30
efficiency = (cap + 1) * 10000
- targetTemperature = clamp(targetTemperature,
- max(settableTemperatureMedian - settableTemperatureRange, TCMB),
- settableTemperatureMedian + settableTemperatureRange)
+ target_temperature = clamp(target_temperature,
+ max(settable_temperature_median - settable_temperature_range, TCMB),
+ settable_temperature_median + settable_temperature_range)
/obj/machinery/space_heater/emp_act(severity)
. = ..()
@@ -143,32 +145,34 @@
cell.emp_act(severity)
/obj/machinery/space_heater/attackby(obj/item/I, mob/user, params)
+ . = ..()
add_fingerprint(user)
- if(default_unfasten_wrench(user, I))
- return
- else if(istype(I, /obj/item/stock_parts/cell))
- if(panel_open)
- if(cell)
- to_chat(user, "There is already a power cell inside!")
- return
- else if(!user.transferItemToLoc(I, src))
- return
- cell = I
- I.add_fingerprint(usr)
- user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].")
- SStgui.update_uis(src)
- else
- to_chat(user, "The hatch must be open to insert a power cell!")
- return
- else if(I.tool_behaviour == TOOL_SCREWDRIVER)
- panel_open = !panel_open
+ if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
user.visible_message("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src].", "You [panel_open ? "open" : "close"] the hatch on \the [src].")
update_appearance()
- else if(default_deconstruction_crowbar(I))
- return
- else
- return ..()
+ return TRUE
+
+ if(default_unfasten_wrench(user, I))
+ return TRUE
+
+ if(default_deconstruction_crowbar(I))
+ return TRUE
+
+ if(istype(I, /obj/item/stock_parts/cell))
+ if(!panel_open)
+ to_chat(user, "The hatch must be open to insert a power cell!")
+ return
+ if(cell)
+ to_chat(user, "There is already a power cell inside!")
+ return
+ if(!user.transferItemToLoc(I, src))
+ return
+ cell = I
+ I.add_fingerprint(usr)
+ user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].")
+ SStgui.update_uis(src)
+ return TRUE
/obj/machinery/space_heater/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
@@ -180,26 +184,26 @@
var/list/data = list()
data["open"] = panel_open
data["on"] = on
- data["mode"] = setMode
+ data["mode"] = set_mode
data["hasPowercell"] = !!cell
data["chemHacked"] = FALSE
if(cell)
data["powerLevel"] = round(cell.percent(), 1)
- data["targetTemp"] = round(targetTemperature - T0C, 1)
- data["minTemp"] = max(settableTemperatureMedian - settableTemperatureRange, TCMB) - T0C
- data["maxTemp"] = settableTemperatureMedian + settableTemperatureRange - T0C
+ data["targetTemp"] = round(target_temperature - T0C, 1)
+ data["minTemp"] = max(settable_temperature_median - settable_temperature_range, TCMB) - T0C
+ data["maxTemp"] = settable_temperature_median + settable_temperature_range - T0C
- var/turf/L = get_turf(loc)
- var/curTemp
- if(istype(L))
- var/datum/gas_mixture/env = L.return_air()
- curTemp = env.temperature
- else if(isturf(L))
- curTemp = L.temperature
- if(isnull(curTemp))
+ var/turf/local_turf = get_turf(loc)
+ var/current_temperature
+ if(istype(local_turf))
+ var/datum/gas_mixture/enviroment = local_turf.return_air()
+ current_temperature = enviroment.temperature
+ else if(isturf(local_turf))
+ current_temperature = local_turf.temperature
+ if(isnull(current_temperature))
data["currentTemp"] = "N/A"
else
- data["currentTemp"] = round(curTemp - T0C, 1)
+ data["currentTemp"] = round(current_temperature - T0C, 1)
return data
/obj/machinery/space_heater/ui_act(action, params)
@@ -217,7 +221,7 @@
START_PROCESSING(SSmachines, src)
. = TRUE
if("mode")
- setMode = params["mode"]
+ set_mode = params["mode"]
. = TRUE
if("target")
if(!panel_open)
@@ -227,15 +231,23 @@
target= text2num(target) + T0C
. = TRUE
if(.)
- targetTemperature = clamp(round(target),
- max(settableTemperatureMedian - settableTemperatureRange, TCMB),
- settableTemperatureMedian + settableTemperatureRange)
+ target_temperature = clamp(round(target),
+ max(settable_temperature_median - settable_temperature_range, TCMB),
+ settable_temperature_median + settable_temperature_range)
if("eject")
if(panel_open && cell)
cell.forceMove(drop_location())
cell = null
. = TRUE
+/obj/machinery/space_heater/constructed
+ cell = null
+
+/obj/machinery/space_heater/constructed/Initialize()
+ . = ..()
+ panel_open = TRUE
+ update_appearance()
+
///For use with heating reagents in a ghetto way
/obj/machinery/space_heater/improvised_chem_heater
icon = 'icons/obj/chemical.dmi'
@@ -270,21 +282,21 @@
if(beaker.reagents.total_volume)
var/power_mod = 0.1 * chem_heating_power
- switch(setMode)
+ switch(set_mode)
if(HEATER_MODE_AUTO)
power_mod *= 0.5
- beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
+ beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
beaker.reagents.handle_reactions()
if(HEATER_MODE_HEAT)
- if(targetTemperature < beaker.reagents.chem_temp)
+ if(target_temperature < beaker.reagents.chem_temp)
return
- beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
+ beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
if(HEATER_MODE_COOL)
- if(targetTemperature > beaker.reagents.chem_temp)
+ if(target_temperature > beaker.reagents.chem_temp)
return
- beaker.reagents.adjust_thermal_energy((targetTemperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
- var/requiredEnergy = heatingPower * delta_time * (power_mod * 4)
- cell.use(requiredEnergy / efficiency)
+ beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * power_mod * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
+ var/required_energy = heating_power * delta_time * (power_mod * 4)
+ cell.use(required_energy / efficiency)
beaker.reagents.handle_reactions()
update_appearance()
@@ -376,10 +388,10 @@
if(!on || !beaker || !cell)
icon_state = "sheater-off"
return
- if(targetTemperature < beaker.reagents.chem_temp)
+ if(target_temperature < beaker.reagents.chem_temp)
icon_state = "sheater-cool"
return
- if(targetTemperature > beaker.reagents.chem_temp)
+ if(target_temperature > beaker.reagents.chem_temp)
icon_state = "sheater-heat"
return
icon_state = "sheater-off"
@@ -392,14 +404,14 @@
for(var/obj/item/stock_parts/capacitor/capacitor in component_parts)
capacitors_rating += capacitor.rating
- heatingPower = lasers_rating * 20000
+ heating_power = lasers_rating * 20000
- settableTemperatureRange = capacitors_rating * 50 //-20 - 80 at base
+ settable_temperature_range = capacitors_rating * 50 //-20 - 80 at base
efficiency = (capacitors_rating + 1) * 10000
- targetTemperature = clamp(targetTemperature,
- max(settableTemperatureMedian - settableTemperatureRange, TCMB),
- settableTemperatureMedian + settableTemperatureRange)
+ target_temperature = clamp(target_temperature,
+ max(settable_temperature_median - settable_temperature_range, TCMB),
+ settable_temperature_median + settable_temperature_range)
chem_heating_power = efficiency/20000 //1-2.5
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 54f4a535e13..df5f8387947 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -474,7 +474,7 @@
/obj/item/circuitboard/machine/space_heater
name = "Space Heater (Machine Board)"
icon_state = "generic"
- build_path = /obj/machinery/space_heater
+ build_path = /obj/machinery/space_heater/constructed
req_components = list(
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/capacitor = 1,