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,