From 7d0bfcd2fee18f328a4c2c299575006dd3dbd924 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Sun, 14 Mar 2021 15:07:54 +0100
Subject: [PATCH] [MIRROR] Space heater little buff + smol refactor and docs
(#4151)
* spess (#57321)
Increased base power from 20000 to 40000, is still pretty slow at t1, but not painful anymore, every tier power has been doubled as effect
Refactored the construction of the spess heater to a more sane one (no more create cell and delete it afterwards), now the players will create a subtype of the heater already without the cell, while the main one is the admin and map spawned one with the default cell
Refactored attackby to use default procs and early returns
Variables now uses snake cases
* Space heater little buff + smol refactor and docs
Co-authored-by: Ghilker <42839747+Ghilker@users.noreply.github.com>
---
code/game/machinery/spaceheater.dm | 240 +++++++++---------
.../circuitboards/machine_circuitboards.dm | 2 +-
2 files changed, 127 insertions(+), 115 deletions(-)
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,